@toclocoinc/lattice-grid 1.8.0 → 1.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +88 -14
- package/docs/API.html +263 -21
- package/docs/CHART-CODES.md +381 -0
- package/docs/api-detail.html +1 -1
- package/lattice-grid.d.ts +486 -8
- package/lattice-grid.esm.min.js +2527 -170
- package/lattice-grid.min.cjs +2524 -170
- package/lattice-grid.min.css +1 -1
- package/lattice-grid.min.js +2524 -170
- package/modules/charts.esm.min.js +671 -65
- package/modules/devtools.esm.min.js +2 -2
- package/modules/dhtmlx-compat.esm.min.js +2524 -170
- package/modules/htmx.esm.min.js +2521 -170
- package/modules/htmx.min.cjs +2521 -170
- package/modules/htmx.min.js +2521 -170
- package/modules/react.esm.min.js +2 -2
- package/modules/svelte.esm.min.js +2 -2
- package/modules/vue.esm.min.js +2 -2
- package/modules/webcomponent.esm.min.js +2524 -170
- package/package.json +5 -2
package/lattice-grid.esm.min.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* Lattice Grid 1.
|
|
2
|
+
* Lattice Grid 1.9.1 — core + DOM renderer
|
|
3
3
|
* Copyright (c) 2026 TOCLOCO Inc. All rights reserved.
|
|
4
4
|
* https://latticegrid.dev
|
|
5
5
|
*/
|
|
@@ -51,7 +51,7 @@ Object.defineProperty(__exports,"cancelFrame",{enumerable:true,get:function(){re
|
|
|
51
51
|
Object.defineProperty(__exports,"frameBatched",{enumerable:true,get:function(){return frameBatched;}});
|
|
52
52
|
Object.defineProperty(__exports,"whenIdle",{enumerable:true,get:function(){return whenIdle;}});
|
|
53
53
|
Object.defineProperty(__exports,"uid",{enumerable:true,get:function(){return uid;}});
|
|
54
|
-
const VERSION='1.
|
|
54
|
+
const VERSION='1.9.0';
|
|
55
55
|
const warned=new Set();
|
|
56
56
|
const reported=[];
|
|
57
57
|
const REPORT_LIMIT=500;
|
|
@@ -909,7 +909,14 @@ STDEV:(a)=>spread(numbers(a),true),
|
|
|
909
909
|
STDEVP:(a)=>spread(numbers(a),false),
|
|
910
910
|
VAR:(a)=>{const sd=spread(numbers(a),true);return sd*sd;},
|
|
911
911
|
VARP:(a)=>{const sd=spread(numbers(a),false);return sd*sd;},
|
|
912
|
-
COUNTDISTINCT:(a)=>
|
|
912
|
+
COUNTDISTINCT:(a)=>{
|
|
913
|
+
const seen=new Set();
|
|
914
|
+
for(const arg of a){
|
|
915
|
+
const values=Array.isArray(arg)?arg:[arg];
|
|
916
|
+
for(const v of values)if(v!==null&&v!==undefined&&v!=='')seen.add(v);
|
|
917
|
+
}
|
|
918
|
+
return seen.size;
|
|
919
|
+
},
|
|
913
920
|
IQR:(a)=>{
|
|
914
921
|
const values=numbers(a);
|
|
915
922
|
return percentileOf(values,0.75)-percentileOf(values,0.25);
|
|
@@ -3396,9 +3403,65 @@ other:'{count} cells updated',
|
|
|
3396
3403
|
'panel.quickFilter':'Quick filter',
|
|
3397
3404
|
'panel.formatting':'Formatting',
|
|
3398
3405
|
'panel.statistics':'Statistics',
|
|
3406
|
+
'panel.compare':'Compare',
|
|
3407
|
+
'compare.first':'First column',
|
|
3408
|
+
'compare.second':'Second column',
|
|
3409
|
+
'compare.needTwo':'Two numeric columns are needed to compare',
|
|
3410
|
+
'compare.noPairs':'No rows have a value in both',
|
|
3411
|
+
'compare.pairs':'{count} pairs',
|
|
3412
|
+
'compare.pearson':'Correlation (Pearson)',
|
|
3413
|
+
'compare.spearman':'Rank correlation (Spearman)',
|
|
3414
|
+
'compare.kendall':'Kendall’s tau',
|
|
3415
|
+
'compare.covariance':'Covariance',
|
|
3416
|
+
'compare.slope':'Slope',
|
|
3417
|
+
'compare.intercept':'Intercept',
|
|
3418
|
+
'compare.r2':'R²',
|
|
3419
|
+
'compare.stdError':'Standard error',
|
|
3420
|
+
'compare.weighted':'Weighted average',
|
|
3399
3421
|
'panel.zone.group':'row groups',
|
|
3400
3422
|
'panel.zone.values':'values',
|
|
3401
3423
|
'panel.zone.pivot':'pivot columns',
|
|
3424
|
+
'total.sum':'Sum',
|
|
3425
|
+
'total.avg':'Average',
|
|
3426
|
+
'total.min':'Min',
|
|
3427
|
+
'total.max':'Max',
|
|
3428
|
+
'total.count':'Count',
|
|
3429
|
+
'total.countValues':'Count of values',
|
|
3430
|
+
'total.first':'First',
|
|
3431
|
+
'total.last':'Last',
|
|
3432
|
+
'total.median':'Median',
|
|
3433
|
+
'total.p25':'25th percentile',
|
|
3434
|
+
'total.p75':'75th percentile',
|
|
3435
|
+
'total.p90':'90th percentile',
|
|
3436
|
+
'total.p95':'95th percentile',
|
|
3437
|
+
'total.p99':'99th percentile',
|
|
3438
|
+
'total.iqr':'Interquartile range',
|
|
3439
|
+
'total.mad':'Median absolute deviation',
|
|
3440
|
+
'total.variance':'Variance',
|
|
3441
|
+
'total.varianceP':'Variance (population)',
|
|
3442
|
+
'total.stddev':'Standard deviation',
|
|
3443
|
+
'total.stddevP':'Standard deviation (population)',
|
|
3444
|
+
'total.range':'Range',
|
|
3445
|
+
'total.distinct':'Distinct',
|
|
3446
|
+
'total.mode':'Mode',
|
|
3447
|
+
'total.skewness':'Skewness',
|
|
3448
|
+
'total.kurtosis':'Kurtosis',
|
|
3449
|
+
'total.geomean':'Geometric mean',
|
|
3450
|
+
'total.harmean':'Harmonic mean',
|
|
3451
|
+
'total.sumSquares':'Sum of squares',
|
|
3452
|
+
'total.weightedAvg':'Weighted average',
|
|
3453
|
+
'total.argmin':'Lowest by',
|
|
3454
|
+
'total.argmax':'Highest by',
|
|
3455
|
+
'total.hhi':'Concentration (HHI)',
|
|
3456
|
+
'total.entropy':'Entropy',
|
|
3457
|
+
'total.evenness':'Evenness',
|
|
3458
|
+
'total.top3Share':'Top 3 share',
|
|
3459
|
+
'total.top10Share':'Top 10 share',
|
|
3460
|
+
'total.gini':'Gini coefficient',
|
|
3461
|
+
'total.trimmedMean':'Trimmed mean',
|
|
3462
|
+
'total.winsorizedMean':'Winsorized mean',
|
|
3463
|
+
'total.robustOutliers':'Outliers (robust)',
|
|
3464
|
+
'total.jarqueBera':'Jarque–Bera',
|
|
3402
3465
|
'stats.column':'Column',
|
|
3403
3466
|
'stats.choose':'Choose a column to profile',
|
|
3404
3467
|
'stats.noColumns':'No numeric columns to profile',
|
|
@@ -3418,6 +3481,15 @@ other:'{count} cells updated',
|
|
|
3418
3481
|
'stats.outliers':'Outliers',
|
|
3419
3482
|
'stats.distribution':'Distribution',
|
|
3420
3483
|
'stats.bin':'{count} between {from} and {to}',
|
|
3484
|
+
'stats.section.shape':'Shape',
|
|
3485
|
+
'stats.section.robust':'Robust',
|
|
3486
|
+
'stats.section.concentration':'Concentration',
|
|
3487
|
+
'stats.section.capability':'Capability',
|
|
3488
|
+
'stats.cp':'Cp',
|
|
3489
|
+
'stats.cpk':'Cpk',
|
|
3490
|
+
'stats.pp':'Pp',
|
|
3491
|
+
'stats.ppk':'Ppk',
|
|
3492
|
+
'stats.outOfSpec':'Out of specification',
|
|
3421
3493
|
'stats.filtered':'Over the {count} filtered rows',
|
|
3422
3494
|
'menu.sortAscending':'Sort ascending',
|
|
3423
3495
|
'menu.sortDescending':'Sort descending',
|
|
@@ -4184,6 +4256,69 @@ unit('gon',Math.PI/200,['grad','gradian','gradians'],{auto:false}),
|
|
|
4184
4256
|
unit('rad',1,['radian','radians']),
|
|
4185
4257
|
unit('turn',2*Math.PI,['rev','revolution','revolutions'],{auto:false}),
|
|
4186
4258
|
]),
|
|
4259
|
+
angularVelocity:Object.freeze([
|
|
4260
|
+
unit('°/s',Math.PI/180,['degps','deg/s','degrees/s'],{auto:false}),
|
|
4261
|
+
unit('rad/s',1,['radps','radians/s']),
|
|
4262
|
+
unit('rpm',(2*Math.PI)/60,['rev/min','r/min','revolutions/min'],{auto:false}),
|
|
4263
|
+
unit('rps',2*Math.PI,['rev/s','r/s','revolutions/s'],{auto:false}),
|
|
4264
|
+
]),
|
|
4265
|
+
fraction:Object.freeze([
|
|
4266
|
+
unit('ppt',1e-12,['partspertrillion'],{auto:false}),
|
|
4267
|
+
unit('ppb',1e-9,['partsperbillion']),
|
|
4268
|
+
unit('ppm',1e-6,['partspermillion']),
|
|
4269
|
+
unit('bp',1e-4,['bps-finance','basispoint','basispoints','bips'],{auto:false}),
|
|
4270
|
+
unit('‰',1e-3,['permille','permil'],{auto:false}),
|
|
4271
|
+
unit('%',1e-2,['pct','percent']),
|
|
4272
|
+
unit('×',1,['x','ratio','times']),
|
|
4273
|
+
]),
|
|
4274
|
+
molarity:Object.freeze([
|
|
4275
|
+
unit('pM',1e-12,['picomolar','picomolarity']),
|
|
4276
|
+
unit('nM',1e-9,['nanomolar','nanomolarity']),
|
|
4277
|
+
unit('µM',1e-6,['um-molar','micromolar','micromolarity']),
|
|
4278
|
+
unit('mM',1e-3,['millimolar','millimolarity']),
|
|
4279
|
+
unit('M',1,['molar','mol/l','mol/L','molarity']),
|
|
4280
|
+
unit('mol/m³',1e-3,['mol/m3'],{auto:false}),
|
|
4281
|
+
]),
|
|
4282
|
+
massFlow:Object.freeze([
|
|
4283
|
+
unit('mg/s',1e-6,['milligrams/s']),
|
|
4284
|
+
unit('g/s',1e-3,['grams/s']),
|
|
4285
|
+
unit('kg/h',1/3600,['kilograms/h','kgph'],{auto:false}),
|
|
4286
|
+
unit('kg/s',1,['kilograms/s','kgps']),
|
|
4287
|
+
unit('t/h',1000/3600,['tonnes/h','tph'],{auto:false}),
|
|
4288
|
+
unit('lb/h',0.45359237/3600,['pounds/h','pph'],{auto:false}),
|
|
4289
|
+
unit('t/s',1000,['tonnes/s'],{auto:false}),
|
|
4290
|
+
]),
|
|
4291
|
+
viscosity:Object.freeze([
|
|
4292
|
+
unit('µPa·s',1e-6,['upas','micropascalsecond']),
|
|
4293
|
+
unit('cP',1e-3,['centipoise'],{auto:false}),
|
|
4294
|
+
unit('mPa·s',1e-3,['mpas','millipascalsecond']),
|
|
4295
|
+
unit('P',0.1,['poise'],{auto:false}),
|
|
4296
|
+
unit('Pa·s',1,['pas','pascalsecond']),
|
|
4297
|
+
]),
|
|
4298
|
+
kinematicViscosity:Object.freeze([
|
|
4299
|
+
unit('cSt',1e-6,['centistokes','centistoke']),
|
|
4300
|
+
unit('mm²/s',1e-6,['mm2/s'],{auto:false}),
|
|
4301
|
+
unit('St',1e-4,['stokes','stoke'],{auto:false}),
|
|
4302
|
+
unit('m²/s',1,['m2/s']),
|
|
4303
|
+
]),
|
|
4304
|
+
thermalConductivity:Object.freeze([
|
|
4305
|
+
unit('mW/(m·K)',1e-3,['mw/mk']),
|
|
4306
|
+
unit('W/(m·K)',1,['w/mk','wmk']),
|
|
4307
|
+
unit('kW/(m·K)',1e3,['kw/mk'],{auto:false}),
|
|
4308
|
+
unit('BTU/(hr·ft·°F)',1.730734666,['btu/hrftf'],{auto:false}),
|
|
4309
|
+
]),
|
|
4310
|
+
specificHeat:Object.freeze([
|
|
4311
|
+
unit('J/(kg·K)',1,['j/kgk','jkgk']),
|
|
4312
|
+
unit('kJ/(kg·K)',1e3,['kj/kgk']),
|
|
4313
|
+
unit('cal/(g·°C)',4184,['cal/gc'],{auto:false}),
|
|
4314
|
+
]),
|
|
4315
|
+
doseRate:Object.freeze([
|
|
4316
|
+
unit('nSv/h',1e-9,['nsvh']),
|
|
4317
|
+
unit('µSv/h',1e-6,['usv/h','usvh']),
|
|
4318
|
+
unit('mSv/h',1e-3,['msvh']),
|
|
4319
|
+
unit('Sv/h',1,['svh']),
|
|
4320
|
+
unit('mSv/a',1e-3/8766,['msv/year','msvpa'],{auto:false}),
|
|
4321
|
+
]),
|
|
4187
4322
|
});
|
|
4188
4323
|
const AMBIGUOUS=Symbol('ambiguous');
|
|
4189
4324
|
const indexes=new Map();
|
|
@@ -4304,6 +4439,7 @@ return out;
|
|
|
4304
4439
|
}
|
|
4305
4440
|
const SPACES=/[\s ]/g;
|
|
4306
4441
|
const NUMBER_HEAD=/^[+-]?[\d '’ .,]*(?:[eE][+-]?\d+)?/;
|
|
4442
|
+
const LEADING_SYMBOL=/^[^\d+\-(.,\s]+\s*/;
|
|
4307
4443
|
const PLAIN_NUMBER=/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?$/;
|
|
4308
4444
|
function parseLocaleNumber(text,locale){
|
|
4309
4445
|
const{group,decimal}=localeSeparators(locale);
|
|
@@ -4343,11 +4479,18 @@ let s=String(text).trim();
|
|
|
4343
4479
|
if(s==='')return null;
|
|
4344
4480
|
let negative=false;
|
|
4345
4481
|
if(s.startsWith('(')&&s.endsWith(')')){negative=true;s=s.slice(1,-1).trim();}
|
|
4482
|
+
let leading=null;
|
|
4483
|
+
const front=LEADING_SYMBOL.exec(s);
|
|
4484
|
+
if(front&&front[0]){
|
|
4485
|
+
const candidate=resolveToken(front[0].trim(),ctx.index,ctx.binary);
|
|
4486
|
+
if(candidate){leading=candidate;s=s.slice(front[0].length).trim();}
|
|
4487
|
+
}
|
|
4346
4488
|
const head=NUMBER_HEAD.exec(s)[0];
|
|
4347
4489
|
const n=parseLocaleNumber(head,opts&&opts.locale);
|
|
4348
4490
|
if(n===null)return null;
|
|
4349
4491
|
const suffix=s.slice(head.length).trim();
|
|
4350
|
-
|
|
4492
|
+
if(leading&&suffix!=='')return null;
|
|
4493
|
+
const from=leading||(suffix===''?ctx.base:resolveToken(suffix,ctx.index,ctx.binary));
|
|
4351
4494
|
if(!from)return null;
|
|
4352
4495
|
const value=convert(n,from,ctx.base);
|
|
4353
4496
|
return negative?-value:value;
|
|
@@ -4427,7 +4570,10 @@ min=significantDecimals(shown,figures);
|
|
|
4427
4570
|
max=min;
|
|
4428
4571
|
}
|
|
4429
4572
|
const text=numberFormat(cfg.locale,min,max,cfg.group!==false).format(shown);
|
|
4430
|
-
|
|
4573
|
+
const gap=cfg.space??' ';
|
|
4574
|
+
return cfg.placement==='prefix'
|
|
4575
|
+
?`${target.symbol}${cfg.space??''}${text}`
|
|
4576
|
+
:`${text}${gap}${target.symbol}`;
|
|
4431
4577
|
}
|
|
4432
4578
|
function compareUnit(a,b){
|
|
4433
4579
|
const an=isNil(a)||Number.isNaN(a)?null:Number(a);
|
|
@@ -4555,6 +4701,21 @@ system:'angle',unit:'rad',maxDecimals:4,totals:angularTotals(2*Math.PI),
|
|
|
4555
4701
|
degrees:createUnitType({
|
|
4556
4702
|
system:'angle',unit:'°',maxDecimals:2,totals:angularTotals(360),
|
|
4557
4703
|
}),
|
|
4704
|
+
rpm:createUnitType({system:'angularVelocity',unit:'rpm',maxDecimals:0}),
|
|
4705
|
+
angularVelocity:createUnitType({system:'angularVelocity',unit:'rad/s',maxDecimals:3}),
|
|
4706
|
+
ppm:createUnitType({system:'fraction',unit:'ppm',maxDecimals:2}),
|
|
4707
|
+
ppb:createUnitType({system:'fraction',unit:'ppb',maxDecimals:2}),
|
|
4708
|
+
basisPoints:createUnitType({system:'fraction',unit:'bp',maxDecimals:1}),
|
|
4709
|
+
molarity:createUnitType({system:'molarity',unit:'M',display:'auto',maxDecimals:3}),
|
|
4710
|
+
massFlow:createUnitType({system:'massFlow',unit:'kg/s',maxDecimals:3}),
|
|
4711
|
+
tonnesPerHour:createUnitType({system:'massFlow',unit:'t/h',maxDecimals:2}),
|
|
4712
|
+
viscosity:createUnitType({system:'viscosity',unit:'Pa·s',display:'auto',maxDecimals:3}),
|
|
4713
|
+
kinematicViscosity:createUnitType({system:'kinematicViscosity',unit:'cSt',maxDecimals:2}),
|
|
4714
|
+
thermalConductivity:createUnitType({
|
|
4715
|
+
system:'thermalConductivity',unit:'W/(m·K)',maxDecimals:3,
|
|
4716
|
+
}),
|
|
4717
|
+
specificHeat:createUnitType({system:'specificHeat',unit:'J/(kg·K)',maxDecimals:1}),
|
|
4718
|
+
doseRate:createUnitType({system:'doseRate',unit:'µSv/h',display:'auto',maxDecimals:2}),
|
|
4558
4719
|
});
|
|
4559
4720
|
});
|
|
4560
4721
|
__def("packages/core/src/columns/types/si.js",function(__exports,__req){
|
|
@@ -4651,6 +4812,7 @@ extra:[defineUnit('G',1e-4,['gauss'],{auto:false})],
|
|
|
4651
4812
|
}),
|
|
4652
4813
|
luminousFlux:createSiType('luminousFlux',{base:'lm',name:'lumen',prefixes:['m','','k']}),
|
|
4653
4814
|
illuminance:createSiType('illuminance',{base:'lx',name:'lux',prefixes:['m','','k']}),
|
|
4815
|
+
luminousIntensity:createSiType('luminousIntensity',{base:'cd',name:'candela',prefixes:['m','','k']}),
|
|
4654
4816
|
substance:createSiType('substance',{
|
|
4655
4817
|
base:'mol',name:'mole',prefixes:['n','µ','m','','k'],
|
|
4656
4818
|
}),
|
|
@@ -6550,17 +6712,35 @@ compute:(deps,ctx)=>{
|
|
|
6550
6712
|
const api=ctx.grid&&ctx.grid.statistics;
|
|
6551
6713
|
if(!api)return null;
|
|
6552
6714
|
const key=(ctx.row&&ctx.row.key)||api.keyOf(ctx.data);
|
|
6553
|
-
return key?api.shadow(watched,spec.kind,key):null;
|
|
6715
|
+
return key?api.shadow(watched,spec.kind,key,spec.scope):null;
|
|
6554
6716
|
},
|
|
6555
6717
|
};
|
|
6556
6718
|
}
|
|
6719
|
+
if(def.running&&!isFunction(m.value&&m.value.compute)){
|
|
6720
|
+
const spec=typeof def.running==='string'?{kind:def.running}:def.running;
|
|
6721
|
+
const source=spec.of||def.field||id;
|
|
6722
|
+
m.value={
|
|
6723
|
+
...(m.value||{}),
|
|
6724
|
+
deps:[source],
|
|
6725
|
+
pure:false,
|
|
6726
|
+
compute:(deps,ctx)=>{
|
|
6727
|
+
const api=ctx.grid&&ctx.grid.statistics;
|
|
6728
|
+
if(!api||!isFunction(api.running))return null;
|
|
6729
|
+
const key=(ctx.row&&ctx.row.key)||api.keyOf(ctx.data);
|
|
6730
|
+
return key?api.running(source,spec.kind||'total',key):null;
|
|
6731
|
+
},
|
|
6732
|
+
};
|
|
6733
|
+
if(def.sort===undefined)m.sort={...(m.sort||{}),enabled:false};
|
|
6734
|
+
}
|
|
6557
6735
|
const field=def.field??(isFunction(m.value&&m.value.compute)?null:(def.id??null));
|
|
6558
6736
|
const computed=isFunction(m.value&&m.value.compute);
|
|
6559
6737
|
const column={
|
|
6560
6738
|
id,
|
|
6561
6739
|
field,
|
|
6562
6740
|
shadow:def.shadow||null,
|
|
6563
|
-
|
|
6741
|
+
running:def.running||null,
|
|
6742
|
+
spec:def.spec||null,
|
|
6743
|
+
volatile:!!(def.shadow||def.running),
|
|
6564
6744
|
title:m.title??humanise(field||id),
|
|
6565
6745
|
type:typeName,
|
|
6566
6746
|
dataType:type,
|
|
@@ -7196,6 +7376,7 @@ class ShadowTracker{
|
|
|
7196
7376
|
#max;
|
|
7197
7377
|
#now;
|
|
7198
7378
|
#summary=null;
|
|
7379
|
+
#filtered=null;
|
|
7199
7380
|
constructor(opts){
|
|
7200
7381
|
this.#colId=opts.colId;
|
|
7201
7382
|
this.#depth=Math.max(2,opts.depth||DEFAULT_DEPTH);
|
|
@@ -7210,6 +7391,7 @@ const value=toNumber(raw);
|
|
|
7210
7391
|
if(value===null)return;
|
|
7211
7392
|
if(!this.#latest.has(key)){
|
|
7212
7393
|
this.#summary=null;
|
|
7394
|
+
this.#filtered=null;
|
|
7213
7395
|
this.#evictIfFull();
|
|
7214
7396
|
this.#baseline.set(key,value);
|
|
7215
7397
|
this.#latest.set(key,value);
|
|
@@ -7222,6 +7404,7 @@ return;
|
|
|
7222
7404
|
const previous=this.#latest.get(key);
|
|
7223
7405
|
if(previous===value)return;
|
|
7224
7406
|
this.#summary=null;
|
|
7407
|
+
this.#filtered=null;
|
|
7225
7408
|
this.#latest.set(key,value);
|
|
7226
7409
|
this.#counts.set(key,(this.#counts.get(key)||0)+1);
|
|
7227
7410
|
this.#stamps.set(key,this.#now());
|
|
@@ -7248,6 +7431,7 @@ this.#forgotten++;
|
|
|
7248
7431
|
rebase(){
|
|
7249
7432
|
for(const[key,value]of this.#latest)this.#baseline.set(key,value);
|
|
7250
7433
|
this.#summary=null;
|
|
7434
|
+
this.#filtered=null;
|
|
7251
7435
|
}
|
|
7252
7436
|
reset(){
|
|
7253
7437
|
this.#baseline.clear();
|
|
@@ -7258,6 +7442,7 @@ this.#history.clear();
|
|
|
7258
7442
|
this.#streaks.clear();
|
|
7259
7443
|
this.#forgotten=0;
|
|
7260
7444
|
this.#summary=null;
|
|
7445
|
+
this.#filtered=null;
|
|
7261
7446
|
}
|
|
7262
7447
|
retain(keys){
|
|
7263
7448
|
const living=keys instanceof Set?keys:new Set(keys);
|
|
@@ -7272,10 +7457,10 @@ this.#history.delete(key);
|
|
|
7272
7457
|
this.#streaks.delete(key);
|
|
7273
7458
|
dropped++;
|
|
7274
7459
|
}
|
|
7275
|
-
if(dropped)this.#summary=null;
|
|
7460
|
+
if(dropped){this.#summary=null;this.#filtered=null;}
|
|
7276
7461
|
return dropped;
|
|
7277
7462
|
}
|
|
7278
|
-
read(kind,key){
|
|
7463
|
+
read(kind,key,only){
|
|
7279
7464
|
switch(kind){
|
|
7280
7465
|
case'updates':
|
|
7281
7466
|
return this.#counts.has(key)?this.#counts.get(key):0;
|
|
@@ -7312,12 +7497,27 @@ return this.#history.has(key)?[...this.#history.get(key)]:null;
|
|
|
7312
7497
|
case'streak':
|
|
7313
7498
|
return this.#streaks.has(key)?this.#streaks.get(key):0;
|
|
7314
7499
|
default:
|
|
7315
|
-
return POSITIONAL_KINDS.includes(kind)?this.#position(kind,key):null;
|
|
7500
|
+
return POSITIONAL_KINDS.includes(kind)?this.#position(kind,key,only):null;
|
|
7501
|
+
}
|
|
7316
7502
|
}
|
|
7503
|
+
#view(only){
|
|
7504
|
+
if(only){
|
|
7505
|
+
if(this.#filtered&&this.#filtered.only===only)return this.#filtered.view;
|
|
7506
|
+
const view=this.#build(only);
|
|
7507
|
+
this.#filtered={only,view};
|
|
7508
|
+
return view;
|
|
7317
7509
|
}
|
|
7318
|
-
#view(){
|
|
7319
7510
|
if(this.#summary)return this.#summary;
|
|
7320
|
-
|
|
7511
|
+
this.#summary=this.#build(null);
|
|
7512
|
+
return this.#summary;
|
|
7513
|
+
}
|
|
7514
|
+
#build(only){
|
|
7515
|
+
const values=[];
|
|
7516
|
+
for(const[key,value]of this.#latest){
|
|
7517
|
+
if(only&&!only.has(key))continue;
|
|
7518
|
+
values.push(value);
|
|
7519
|
+
}
|
|
7520
|
+
const sorted=values.sort((a,b)=>a-b);
|
|
7321
7521
|
let n=0;
|
|
7322
7522
|
let mean=0;
|
|
7323
7523
|
let m2=0;
|
|
@@ -7329,19 +7529,24 @@ const delta=x-mean;
|
|
|
7329
7529
|
mean+=delta/n;
|
|
7330
7530
|
m2+=delta*(x-mean);
|
|
7331
7531
|
}
|
|
7332
|
-
|
|
7532
|
+
const baseline=[];
|
|
7533
|
+
for(const[key,value]of this.#baseline){
|
|
7534
|
+
if(only&&!only.has(key))continue;
|
|
7535
|
+
baseline.push(value);
|
|
7536
|
+
}
|
|
7537
|
+
return{
|
|
7333
7538
|
sorted,
|
|
7334
|
-
baseline:
|
|
7539
|
+
baseline:baseline.sort((a,b)=>a-b),
|
|
7335
7540
|
sum,
|
|
7336
7541
|
mean:n?mean:0,
|
|
7337
7542
|
sd:n>1?Math.sqrt(m2/(n-1)):0,
|
|
7338
7543
|
};
|
|
7339
|
-
return this.#summary;
|
|
7340
7544
|
}
|
|
7341
|
-
#position(kind,key){
|
|
7545
|
+
#position(kind,key,only){
|
|
7342
7546
|
if(!this.#latest.has(key))return null;
|
|
7547
|
+
if(only&&!only.has(key))return null;
|
|
7343
7548
|
const value=this.#latest.get(key);
|
|
7344
|
-
const view=this.#view();
|
|
7549
|
+
const view=this.#view(only);
|
|
7345
7550
|
const n=view.sorted.length;
|
|
7346
7551
|
if(!n)return null;
|
|
7347
7552
|
switch(kind){
|
|
@@ -7601,8 +7806,15 @@ return v===null||v===undefined||(typeof v==='number'&&Number.isNaN(v));
|
|
|
7601
7806
|
});
|
|
7602
7807
|
__def("packages/core/src/compute/statistics.js",function(__exports,__req){
|
|
7603
7808
|
'use strict';
|
|
7809
|
+
Object.defineProperty(__exports,"KENDALL_LIMIT",{enumerable:true,get:function(){return KENDALL_LIMIT;}});
|
|
7604
7810
|
Object.defineProperty(__exports,"MAINTENANCE",{enumerable:true,get:function(){return MAINTENANCE;}});
|
|
7605
7811
|
Object.defineProperty(__exports,"numbers",{enumerable:true,get:function(){return numbers;}});
|
|
7812
|
+
Object.defineProperty(__exports,"frequencies",{enumerable:true,get:function(){return frequencies;}});
|
|
7813
|
+
Object.defineProperty(__exports,"herfindahl",{enumerable:true,get:function(){return herfindahl;}});
|
|
7814
|
+
Object.defineProperty(__exports,"entropy",{enumerable:true,get:function(){return entropy;}});
|
|
7815
|
+
Object.defineProperty(__exports,"evenness",{enumerable:true,get:function(){return evenness;}});
|
|
7816
|
+
Object.defineProperty(__exports,"topShare",{enumerable:true,get:function(){return topShare;}});
|
|
7817
|
+
Object.defineProperty(__exports,"gini",{enumerable:true,get:function(){return gini;}});
|
|
7606
7818
|
Object.defineProperty(__exports,"moments",{enumerable:true,get:function(){return moments;}});
|
|
7607
7819
|
Object.defineProperty(__exports,"quantileSorted",{enumerable:true,get:function(){return quantileSorted;}});
|
|
7608
7820
|
Object.defineProperty(__exports,"quantile",{enumerable:true,get:function(){return quantile;}});
|
|
@@ -7611,11 +7823,28 @@ Object.defineProperty(__exports,"STAT_LABELS",{enumerable:true,get:function(){re
|
|
|
7611
7823
|
Object.defineProperty(__exports,"weightedAverage",{enumerable:true,get:function(){return weightedAverage;}});
|
|
7612
7824
|
Object.defineProperty(__exports,"extremeRow",{enumerable:true,get:function(){return extremeRow;}});
|
|
7613
7825
|
Object.defineProperty(__exports,"correlation",{enumerable:true,get:function(){return correlation;}});
|
|
7826
|
+
Object.defineProperty(__exports,"trimmedMean",{enumerable:true,get:function(){return trimmedMean;}});
|
|
7827
|
+
Object.defineProperty(__exports,"winsorizedMean",{enumerable:true,get:function(){return winsorizedMean;}});
|
|
7828
|
+
Object.defineProperty(__exports,"modifiedZOutliers",{enumerable:true,get:function(){return modifiedZOutliers;}});
|
|
7829
|
+
Object.defineProperty(__exports,"jarqueBera",{enumerable:true,get:function(){return jarqueBera;}});
|
|
7830
|
+
Object.defineProperty(__exports,"weightedQuantile",{enumerable:true,get:function(){return weightedQuantile;}});
|
|
7831
|
+
Object.defineProperty(__exports,"pairs",{enumerable:true,get:function(){return pairs;}});
|
|
7832
|
+
Object.defineProperty(__exports,"covariance",{enumerable:true,get:function(){return covariance;}});
|
|
7833
|
+
Object.defineProperty(__exports,"regression",{enumerable:true,get:function(){return regression;}});
|
|
7834
|
+
Object.defineProperty(__exports,"spearman",{enumerable:true,get:function(){return spearman;}});
|
|
7835
|
+
Object.defineProperty(__exports,"kendall",{enumerable:true,get:function(){return kendall;}});
|
|
7836
|
+
Object.defineProperty(__exports,"seriesStats",{enumerable:true,get:function(){return seriesStats;}});
|
|
7837
|
+
Object.defineProperty(__exports,"D2_N2",{enumerable:true,get:function(){return D2_N2;}});
|
|
7838
|
+
Object.defineProperty(__exports,"withinSigma",{enumerable:true,get:function(){return withinSigma;}});
|
|
7839
|
+
Object.defineProperty(__exports,"capability",{enumerable:true,get:function(){return capability;}});
|
|
7840
|
+
Object.defineProperty(__exports,"controlLimits",{enumerable:true,get:function(){return controlLimits;}});
|
|
7841
|
+
Object.defineProperty(__exports,"controlViolations",{enumerable:true,get:function(){return controlViolations;}});
|
|
7614
7842
|
Object.defineProperty(__exports,"countOutside",{enumerable:true,get:function(){return countOutside;}});
|
|
7615
7843
|
Object.defineProperty(__exports,"histogram",{enumerable:true,get:function(){return histogram;}});
|
|
7616
7844
|
const __m0=__req("packages/core/src/compute/handle.js");
|
|
7617
7845
|
const presenceReader=__m0["presenceReader"];
|
|
7618
7846
|
const valueReader=__m0["valueReader"];
|
|
7847
|
+
const KENDALL_LIMIT=5000;
|
|
7619
7848
|
const MAINTENANCE=Object.freeze({
|
|
7620
7849
|
variance:'maintained',
|
|
7621
7850
|
varianceP:'maintained',
|
|
@@ -7640,6 +7869,16 @@ harmean:'rescan',
|
|
|
7640
7869
|
mad:'rescan',
|
|
7641
7870
|
argmin:'rescan',
|
|
7642
7871
|
argmax:'rescan',
|
|
7872
|
+
hhi:'rescan',
|
|
7873
|
+
entropy:'rescan',
|
|
7874
|
+
evenness:'rescan',
|
|
7875
|
+
top3Share:'rescan',
|
|
7876
|
+
top10Share:'rescan',
|
|
7877
|
+
gini:'rescan',
|
|
7878
|
+
trimmedMean:'rescan',
|
|
7879
|
+
winsorizedMean:'rescan',
|
|
7880
|
+
robustOutliers:'rescan',
|
|
7881
|
+
jarqueBera:'rescan',
|
|
7643
7882
|
});
|
|
7644
7883
|
function numbers(handle,indices){
|
|
7645
7884
|
const n=indices.length;
|
|
@@ -7668,6 +7907,68 @@ out[count++]=v;
|
|
|
7668
7907
|
}
|
|
7669
7908
|
return out.subarray(0,count);
|
|
7670
7909
|
}
|
|
7910
|
+
function frequencies(handle,indices){
|
|
7911
|
+
const seen=new Map();
|
|
7912
|
+
const read=valueReader(handle);
|
|
7913
|
+
let total=0;
|
|
7914
|
+
for(let i=0;i<indices.length;i++){
|
|
7915
|
+
const raw=read(indices[i]);
|
|
7916
|
+
if(raw===null||raw===undefined||raw==='')continue;
|
|
7917
|
+
if(typeof raw==='number'&&Number.isNaN(raw))continue;
|
|
7918
|
+
const key=typeof raw==='object'?String(raw):raw;
|
|
7919
|
+
seen.set(key,(seen.get(key)||0)+1);
|
|
7920
|
+
total++;
|
|
7921
|
+
}
|
|
7922
|
+
const counts=[...seen.values()].sort((a,b)=>b-a);
|
|
7923
|
+
return{counts,total,distinct:counts.length};
|
|
7924
|
+
}
|
|
7925
|
+
function sharesOf(freq){
|
|
7926
|
+
return freq.total>0?freq.counts.map((c)=>c/freq.total):[];
|
|
7927
|
+
}
|
|
7928
|
+
function herfindahl(handle,indices){
|
|
7929
|
+
const freq=frequencies(handle,indices);
|
|
7930
|
+
if(!freq.total)return null;
|
|
7931
|
+
let sum=0;
|
|
7932
|
+
for(const share of sharesOf(freq))sum+=share*share;
|
|
7933
|
+
return sum;
|
|
7934
|
+
}
|
|
7935
|
+
function entropy(handle,indices){
|
|
7936
|
+
const freq=frequencies(handle,indices);
|
|
7937
|
+
if(!freq.total)return null;
|
|
7938
|
+
let sum=0;
|
|
7939
|
+
for(const share of sharesOf(freq))if(share>0)sum-=share*Math.log2(share);
|
|
7940
|
+
return sum;
|
|
7941
|
+
}
|
|
7942
|
+
function evenness(handle,indices){
|
|
7943
|
+
const freq=frequencies(handle,indices);
|
|
7944
|
+
if(!freq.total||freq.distinct<2)return freq.total?1:null;
|
|
7945
|
+
let sum=0;
|
|
7946
|
+
for(const share of sharesOf(freq))if(share>0)sum-=share*Math.log2(share);
|
|
7947
|
+
return sum/Math.log2(freq.distinct);
|
|
7948
|
+
}
|
|
7949
|
+
function topShare(handle,indices,n=3){
|
|
7950
|
+
const freq=frequencies(handle,indices);
|
|
7951
|
+
if(!freq.total)return null;
|
|
7952
|
+
const take=Math.max(1,Math.floor(n));
|
|
7953
|
+
let held=0;
|
|
7954
|
+
for(let i=0;i<Math.min(take,freq.counts.length);i++)held+=freq.counts[i];
|
|
7955
|
+
return held/freq.total;
|
|
7956
|
+
}
|
|
7957
|
+
function gini(handle,indices){
|
|
7958
|
+
const values=numbers(handle,indices);
|
|
7959
|
+
const n=values.length;
|
|
7960
|
+
if(!n)return null;
|
|
7961
|
+
const sorted=values.slice().sort();
|
|
7962
|
+
if(sorted[0]<0)return null;
|
|
7963
|
+
let total=0;
|
|
7964
|
+
let weighted=0;
|
|
7965
|
+
for(let i=0;i<n;i++){
|
|
7966
|
+
total+=sorted[i];
|
|
7967
|
+
weighted+=(i+1)*sorted[i];
|
|
7968
|
+
}
|
|
7969
|
+
if(total===0)return 0;
|
|
7970
|
+
return(2*weighted)/(n*total)-(n+1)/n;
|
|
7971
|
+
}
|
|
7671
7972
|
function moments(values){
|
|
7672
7973
|
let n=0;
|
|
7673
7974
|
let mean=0;
|
|
@@ -7697,6 +7998,16 @@ const sorted=values.slice().sort();
|
|
|
7697
7998
|
return quantileSorted(sorted,p);
|
|
7698
7999
|
}
|
|
7699
8000
|
const STAT_FNS=Object.freeze({
|
|
8001
|
+
hhi:(h,i)=>herfindahl(h,i),
|
|
8002
|
+
entropy:(h,i)=>entropy(h,i),
|
|
8003
|
+
evenness:(h,i)=>evenness(h,i),
|
|
8004
|
+
top3Share:(h,i)=>topShare(h,i,3),
|
|
8005
|
+
top10Share:(h,i)=>topShare(h,i,10),
|
|
8006
|
+
gini:(h,i)=>gini(h,i),
|
|
8007
|
+
trimmedMean:(h,i)=>trimmedMean(numbers(h,i),0.1),
|
|
8008
|
+
winsorizedMean:(h,i)=>winsorizedMean(numbers(h,i),0.1),
|
|
8009
|
+
robustOutliers:(h,i)=>modifiedZOutliers(numbers(h,i),3.5),
|
|
8010
|
+
jarqueBera:(h,i)=>jarqueBera(numbers(h,i)),
|
|
7700
8011
|
variance:(h,i)=>{
|
|
7701
8012
|
const{n,m2}=moments(numbers(h,i));
|
|
7702
8013
|
return n>1?m2/(n-1):null;
|
|
@@ -7839,6 +8150,16 @@ return sum;
|
|
|
7839
8150
|
},
|
|
7840
8151
|
});
|
|
7841
8152
|
const STAT_LABELS=Object.freeze({
|
|
8153
|
+
hhi:'Concentration (HHI)',
|
|
8154
|
+
entropy:'Entropy',
|
|
8155
|
+
evenness:'Evenness',
|
|
8156
|
+
top3Share:'Top 3 share',
|
|
8157
|
+
top10Share:'Top 10 share',
|
|
8158
|
+
gini:'Gini coefficient',
|
|
8159
|
+
trimmedMean:'Trimmed mean',
|
|
8160
|
+
winsorizedMean:'Winsorized mean',
|
|
8161
|
+
robustOutliers:'Outliers (robust)',
|
|
8162
|
+
jarqueBera:'Jarque–Bera',
|
|
7842
8163
|
median:'Median',
|
|
7843
8164
|
p25:'25th percentile',
|
|
7844
8165
|
p75:'75th percentile',
|
|
@@ -7921,6 +8242,393 @@ if(bottom===0)return null;
|
|
|
7921
8242
|
const r=top/bottom;
|
|
7922
8243
|
return Math.max(-1,Math.min(1,r));
|
|
7923
8244
|
}
|
|
8245
|
+
function trimmedMean(values,share=0.1){
|
|
8246
|
+
const n=values.length;
|
|
8247
|
+
if(!n)return null;
|
|
8248
|
+
const sorted=Array.from(values).sort((a,b)=>a-b);
|
|
8249
|
+
const cut=Math.floor(n*Math.min(0.49,Math.max(0,share)));
|
|
8250
|
+
const kept=sorted.slice(cut,n-cut);
|
|
8251
|
+
if(!kept.length)return quantileSorted(sorted,0.5);
|
|
8252
|
+
let sum=0;
|
|
8253
|
+
for(const v of kept)sum+=v;
|
|
8254
|
+
return sum/kept.length;
|
|
8255
|
+
}
|
|
8256
|
+
function winsorizedMean(values,share=0.1){
|
|
8257
|
+
const n=values.length;
|
|
8258
|
+
if(!n)return null;
|
|
8259
|
+
const sorted=Array.from(values).sort((a,b)=>a-b);
|
|
8260
|
+
const cut=Math.floor(n*Math.min(0.49,Math.max(0,share)));
|
|
8261
|
+
const low=sorted[cut];
|
|
8262
|
+
const high=sorted[n-1-cut];
|
|
8263
|
+
let sum=0;
|
|
8264
|
+
for(const v of sorted)sum+=Math.min(high,Math.max(low,v));
|
|
8265
|
+
return sum/n;
|
|
8266
|
+
}
|
|
8267
|
+
function modifiedZOutliers(values,threshold=3.5){
|
|
8268
|
+
const n=values.length;
|
|
8269
|
+
if(!n)return null;
|
|
8270
|
+
const sorted=Array.from(values).sort((a,b)=>a-b);
|
|
8271
|
+
const middle=quantileSorted(sorted,0.5);
|
|
8272
|
+
const deviations=sorted.map((v)=>Math.abs(v-middle)).sort((a,b)=>a-b);
|
|
8273
|
+
const mad=quantileSorted(deviations,0.5);
|
|
8274
|
+
if(mad===0)return null;
|
|
8275
|
+
let count=0;
|
|
8276
|
+
for(const v of sorted)if(Math.abs((0.6745*(v-middle))/mad)>threshold)count++;
|
|
8277
|
+
return count;
|
|
8278
|
+
}
|
|
8279
|
+
function jarqueBera(values){
|
|
8280
|
+
const n=values.length;
|
|
8281
|
+
if(n<8)return null;
|
|
8282
|
+
let mean=0;
|
|
8283
|
+
for(const v of values)mean+=v;
|
|
8284
|
+
mean/=n;
|
|
8285
|
+
let m2=0;
|
|
8286
|
+
let m3=0;
|
|
8287
|
+
let m4=0;
|
|
8288
|
+
for(const v of values){
|
|
8289
|
+
const d=v-mean;
|
|
8290
|
+
m2+=d*d;
|
|
8291
|
+
m3+=d*d*d;
|
|
8292
|
+
m4+=d*d*d*d;
|
|
8293
|
+
}
|
|
8294
|
+
m2/=n;
|
|
8295
|
+
m3/=n;
|
|
8296
|
+
m4/=n;
|
|
8297
|
+
if(m2===0)return null;
|
|
8298
|
+
const skew=m3/m2**1.5;
|
|
8299
|
+
const excess=m4/(m2*m2)-3;
|
|
8300
|
+
return(n/6)*(skew*skew+(excess*excess)/4);
|
|
8301
|
+
}
|
|
8302
|
+
function weightedQuantile(values,weights,p){
|
|
8303
|
+
const paired=[];
|
|
8304
|
+
let total=0;
|
|
8305
|
+
for(let i=0;i<values.length;i++){
|
|
8306
|
+
const v=Number(values[i]);
|
|
8307
|
+
const w=Number(weights[i]);
|
|
8308
|
+
if(!Number.isFinite(v)||!Number.isFinite(w)||w<=0)continue;
|
|
8309
|
+
paired.push([v,w]);
|
|
8310
|
+
total+=w;
|
|
8311
|
+
}
|
|
8312
|
+
if(!paired.length||total<=0)return null;
|
|
8313
|
+
paired.sort((a,b)=>a[0]-b[0]);
|
|
8314
|
+
if(paired.length===1)return paired[0][0];
|
|
8315
|
+
const at=[];
|
|
8316
|
+
let seen=0;
|
|
8317
|
+
for(const[,w]of paired){
|
|
8318
|
+
at.push((seen+w/2)/total);
|
|
8319
|
+
seen+=w;
|
|
8320
|
+
}
|
|
8321
|
+
const target=Math.max(0,Math.min(1,p));
|
|
8322
|
+
if(target<=at[0])return paired[0][0];
|
|
8323
|
+
if(target>=at[at.length-1])return paired[paired.length-1][0];
|
|
8324
|
+
for(let i=1;i<at.length;i++){
|
|
8325
|
+
if(target>at[i])continue;
|
|
8326
|
+
const span=at[i]-at[i-1];
|
|
8327
|
+
const within=span>0?(target-at[i-1])/span:0;
|
|
8328
|
+
return paired[i-1][0]+(paired[i][0]-paired[i-1][0])*within;
|
|
8329
|
+
}
|
|
8330
|
+
return paired[paired.length-1][0];
|
|
8331
|
+
}
|
|
8332
|
+
function pairs(a,b,indices){
|
|
8333
|
+
const readA=valueReader(a);
|
|
8334
|
+
const readB=valueReader(b);
|
|
8335
|
+
const xs=new Float64Array(indices.length);
|
|
8336
|
+
const ys=new Float64Array(indices.length);
|
|
8337
|
+
let n=0;
|
|
8338
|
+
for(let i=0;i<indices.length;i++){
|
|
8339
|
+
const row=indices[i];
|
|
8340
|
+
const x=Number(readA(row));
|
|
8341
|
+
const y=Number(readB(row));
|
|
8342
|
+
if(!Number.isFinite(x)||!Number.isFinite(y))continue;
|
|
8343
|
+
xs[n]=x;
|
|
8344
|
+
ys[n]=y;
|
|
8345
|
+
n++;
|
|
8346
|
+
}
|
|
8347
|
+
return{xs:xs.subarray(0,n),ys:ys.subarray(0,n),n};
|
|
8348
|
+
}
|
|
8349
|
+
function covariance(a,b,indices,population=false){
|
|
8350
|
+
const{xs,ys,n}=pairs(a,b,indices);
|
|
8351
|
+
if(n<2)return null;
|
|
8352
|
+
let mx=0;
|
|
8353
|
+
let my=0;
|
|
8354
|
+
for(let i=0;i<n;i++){mx+=xs[i];my+=ys[i];}
|
|
8355
|
+
mx/=n;
|
|
8356
|
+
my/=n;
|
|
8357
|
+
let sum=0;
|
|
8358
|
+
for(let i=0;i<n;i++)sum+=(xs[i]-mx)*(ys[i]-my);
|
|
8359
|
+
return sum/(population?n:n-1);
|
|
8360
|
+
}
|
|
8361
|
+
function regression(a,b,indices){
|
|
8362
|
+
const{xs,ys,n}=pairs(a,b,indices);
|
|
8363
|
+
if(n<2)return null;
|
|
8364
|
+
let mx=0;
|
|
8365
|
+
let my=0;
|
|
8366
|
+
for(let i=0;i<n;i++){mx+=xs[i];my+=ys[i];}
|
|
8367
|
+
mx/=n;
|
|
8368
|
+
my/=n;
|
|
8369
|
+
let sxx=0;
|
|
8370
|
+
let sxy=0;
|
|
8371
|
+
let syy=0;
|
|
8372
|
+
for(let i=0;i<n;i++){
|
|
8373
|
+
const dx=xs[i]-mx;
|
|
8374
|
+
const dy=ys[i]-my;
|
|
8375
|
+
sxx+=dx*dx;
|
|
8376
|
+
sxy+=dx*dy;
|
|
8377
|
+
syy+=dy*dy;
|
|
8378
|
+
}
|
|
8379
|
+
if(sxx===0)return null;
|
|
8380
|
+
const slope=sxy/sxx;
|
|
8381
|
+
const intercept=my-slope*mx;
|
|
8382
|
+
const r2=syy===0?1:Math.max(0,Math.min(1,(sxy*sxy)/(sxx*syy)));
|
|
8383
|
+
const residual=Math.max(0,syy-slope*sxy);
|
|
8384
|
+
const stdError=n>2?Math.sqrt(residual/(n-2)/sxx):0;
|
|
8385
|
+
return{slope,intercept,r2,stdError,n};
|
|
8386
|
+
}
|
|
8387
|
+
function ranksOf(values){
|
|
8388
|
+
const n=values.length;
|
|
8389
|
+
const order=Array.from({length:n},(unused,i)=>i)
|
|
8390
|
+
.sort((i,j)=>values[i]-values[j]);
|
|
8391
|
+
const ranks=new Float64Array(n);
|
|
8392
|
+
let i=0;
|
|
8393
|
+
while(i<n){
|
|
8394
|
+
let j=i;
|
|
8395
|
+
while(j+1<n&&values[order[j+1]]===values[order[i]])j++;
|
|
8396
|
+
const shared=(i+j)/2+1;
|
|
8397
|
+
for(let k=i;k<=j;k++)ranks[order[k]]=shared;
|
|
8398
|
+
i=j+1;
|
|
8399
|
+
}
|
|
8400
|
+
return ranks;
|
|
8401
|
+
}
|
|
8402
|
+
function spearman(a,b,indices){
|
|
8403
|
+
const{xs,ys,n}=pairs(a,b,indices);
|
|
8404
|
+
if(n<2)return null;
|
|
8405
|
+
const rx=ranksOf(xs);
|
|
8406
|
+
const ry=ranksOf(ys);
|
|
8407
|
+
let mx=0;
|
|
8408
|
+
let my=0;
|
|
8409
|
+
for(let i=0;i<n;i++){mx+=rx[i];my+=ry[i];}
|
|
8410
|
+
mx/=n;
|
|
8411
|
+
my/=n;
|
|
8412
|
+
let sxy=0;
|
|
8413
|
+
let sxx=0;
|
|
8414
|
+
let syy=0;
|
|
8415
|
+
for(let i=0;i<n;i++){
|
|
8416
|
+
const dx=rx[i]-mx;
|
|
8417
|
+
const dy=ry[i]-my;
|
|
8418
|
+
sxy+=dx*dy;
|
|
8419
|
+
sxx+=dx*dx;
|
|
8420
|
+
syy+=dy*dy;
|
|
8421
|
+
}
|
|
8422
|
+
if(sxx===0||syy===0)return null;
|
|
8423
|
+
return Math.max(-1,Math.min(1,sxy/Math.sqrt(sxx*syy)));
|
|
8424
|
+
}
|
|
8425
|
+
function kendall(a,b,indices){
|
|
8426
|
+
const{xs,ys,n}=pairs(a,b,indices);
|
|
8427
|
+
if(n<2||n>KENDALL_LIMIT)return null;
|
|
8428
|
+
let concordant=0;
|
|
8429
|
+
let discordant=0;
|
|
8430
|
+
let tiedXOnly=0;
|
|
8431
|
+
let tiedYOnly=0;
|
|
8432
|
+
for(let i=0;i<n;i++){
|
|
8433
|
+
for(let j=i+1;j<n;j++){
|
|
8434
|
+
const dx=Math.sign(xs[i]-xs[j]);
|
|
8435
|
+
const dy=Math.sign(ys[i]-ys[j]);
|
|
8436
|
+
const product=dx*dy;
|
|
8437
|
+
if(product>0)concordant++;
|
|
8438
|
+
else if(product<0)discordant++;
|
|
8439
|
+
else if(dx===0&&dy===0){}
|
|
8440
|
+
else if(dx===0)tiedXOnly++;
|
|
8441
|
+
else tiedYOnly++;
|
|
8442
|
+
}
|
|
8443
|
+
}
|
|
8444
|
+
const orderedByX=concordant+discordant+tiedYOnly;
|
|
8445
|
+
const orderedByY=concordant+discordant+tiedXOnly;
|
|
8446
|
+
if(orderedByX===0||orderedByY===0)return null;
|
|
8447
|
+
return(concordant-discordant)/Math.sqrt(orderedByX*orderedByY);
|
|
8448
|
+
}
|
|
8449
|
+
function seriesStats(ordered,opts={}){
|
|
8450
|
+
const n=ordered.length;
|
|
8451
|
+
if(n<2)return null;
|
|
8452
|
+
const first=ordered[0];
|
|
8453
|
+
const last=ordered[n-1];
|
|
8454
|
+
const returns=[];
|
|
8455
|
+
for(let i=1;i<n;i++){
|
|
8456
|
+
const previous=ordered[i-1];
|
|
8457
|
+
if(previous===0)continue;
|
|
8458
|
+
returns.push((ordered[i]-previous)/Math.abs(previous));
|
|
8459
|
+
}
|
|
8460
|
+
let volatility=null;
|
|
8461
|
+
if(returns.length>1){
|
|
8462
|
+
let mean=0;
|
|
8463
|
+
for(const r of returns)mean+=r;
|
|
8464
|
+
mean/=returns.length;
|
|
8465
|
+
let m2=0;
|
|
8466
|
+
for(const r of returns)m2+=(r-mean)**2;
|
|
8467
|
+
volatility=Math.sqrt(m2/(returns.length-1));
|
|
8468
|
+
}
|
|
8469
|
+
const periods=Number(opts.periodsPerYear)>0?Number(opts.periodsPerYear):null;
|
|
8470
|
+
let peak=ordered[0];
|
|
8471
|
+
let peakAt=0;
|
|
8472
|
+
let worst=0;
|
|
8473
|
+
let worstFrom=0;
|
|
8474
|
+
let worstTo=0;
|
|
8475
|
+
for(let i=1;i<n;i++){
|
|
8476
|
+
if(ordered[i]>peak){peak=ordered[i];peakAt=i;continue;}
|
|
8477
|
+
if(peak<=0)continue;
|
|
8478
|
+
const fall=(peak-ordered[i])/peak;
|
|
8479
|
+
if(fall>worst){worst=fall;worstFrom=peakAt;worstTo=i;}
|
|
8480
|
+
}
|
|
8481
|
+
let autocorrelation=null;
|
|
8482
|
+
if(n>2){
|
|
8483
|
+
let mean=0;
|
|
8484
|
+
for(let i=0;i<n;i++)mean+=ordered[i];
|
|
8485
|
+
mean/=n;
|
|
8486
|
+
let top=0;
|
|
8487
|
+
let bottom=0;
|
|
8488
|
+
for(let i=0;i<n;i++){
|
|
8489
|
+
const d=ordered[i]-mean;
|
|
8490
|
+
bottom+=d*d;
|
|
8491
|
+
if(i>0)top+=d*(ordered[i-1]-mean);
|
|
8492
|
+
}
|
|
8493
|
+
autocorrelation=bottom>0?top/bottom:null;
|
|
8494
|
+
}
|
|
8495
|
+
let up=0;
|
|
8496
|
+
let down=0;
|
|
8497
|
+
for(const r of returns){if(r>0)up++;else if(r<0)down++;}
|
|
8498
|
+
let growth=null;
|
|
8499
|
+
if(first>0&&last>0){
|
|
8500
|
+
const perPeriod=(last/first)**(1/(n-1))-1;
|
|
8501
|
+
growth=periods?(1+perPeriod)**periods-1:perPeriod;
|
|
8502
|
+
}
|
|
8503
|
+
return{
|
|
8504
|
+
n,
|
|
8505
|
+
first,
|
|
8506
|
+
last,
|
|
8507
|
+
change:last-first,
|
|
8508
|
+
changePercent:first===0?null:((last-first)/Math.abs(first))*100,
|
|
8509
|
+
volatility,
|
|
8510
|
+
annualisedVolatility:volatility!==null&&periods?volatility*Math.sqrt(periods):null,
|
|
8511
|
+
growth,
|
|
8512
|
+
maxDrawdown:worst,
|
|
8513
|
+
maxDrawdownFrom:worstFrom,
|
|
8514
|
+
maxDrawdownTo:worstTo,
|
|
8515
|
+
autocorrelation,
|
|
8516
|
+
upDays:up,
|
|
8517
|
+
downDays:down,
|
|
8518
|
+
};
|
|
8519
|
+
}
|
|
8520
|
+
const D2_N2=1.128;
|
|
8521
|
+
function withinSigma(ordered){
|
|
8522
|
+
const n=ordered.length;
|
|
8523
|
+
if(n<2)return null;
|
|
8524
|
+
let total=0;
|
|
8525
|
+
for(let i=1;i<n;i++)total+=Math.abs(ordered[i]-ordered[i-1]);
|
|
8526
|
+
const meanRange=total/(n-1);
|
|
8527
|
+
return{sigma:meanRange/D2_N2,meanRange};
|
|
8528
|
+
}
|
|
8529
|
+
function capability(ordered,spec){
|
|
8530
|
+
const n=ordered.length;
|
|
8531
|
+
if(n<2||!spec)return null;
|
|
8532
|
+
const lower=Number.isFinite(Number(spec.lower))?Number(spec.lower):null;
|
|
8533
|
+
const upper=Number.isFinite(Number(spec.upper))?Number(spec.upper):null;
|
|
8534
|
+
if(lower===null&&upper===null)return null;
|
|
8535
|
+
let mean=0;
|
|
8536
|
+
for(let i=0;i<n;i++)mean+=ordered[i];
|
|
8537
|
+
mean/=n;
|
|
8538
|
+
let m2=0;
|
|
8539
|
+
for(let i=0;i<n;i++)m2+=(ordered[i]-mean)**2;
|
|
8540
|
+
const overall=Math.sqrt(m2/(n-1));
|
|
8541
|
+
const within=withinSigma(ordered);
|
|
8542
|
+
const sigmaWithin=within?within.sigma:null;
|
|
8543
|
+
const indices=(sigma)=>{
|
|
8544
|
+
if(!sigma||sigma<=0)return{index:null,k:null};
|
|
8545
|
+
const both=lower!==null&&upper!==null;
|
|
8546
|
+
const index=both?(upper-lower)/(6*sigma):null;
|
|
8547
|
+
const upperSide=upper!==null?(upper-mean)/(3*sigma):Infinity;
|
|
8548
|
+
const lowerSide=lower!==null?(mean-lower)/(3*sigma):Infinity;
|
|
8549
|
+
return{index,k:Math.min(upperSide,lowerSide)};
|
|
8550
|
+
};
|
|
8551
|
+
const short=indices(sigmaWithin);
|
|
8552
|
+
const long=indices(overall);
|
|
8553
|
+
let outOfSpec=0;
|
|
8554
|
+
for(let i=0;i<n;i++){
|
|
8555
|
+
if(lower!==null&&ordered[i]<lower){outOfSpec++;continue;}
|
|
8556
|
+
if(upper!==null&&ordered[i]>upper)outOfSpec++;
|
|
8557
|
+
}
|
|
8558
|
+
return{
|
|
8559
|
+
n,
|
|
8560
|
+
mean,
|
|
8561
|
+
lower,
|
|
8562
|
+
upper,
|
|
8563
|
+
target:Number.isFinite(Number(spec.target))?Number(spec.target):null,
|
|
8564
|
+
sigmaWithin,
|
|
8565
|
+
sigmaOverall:overall,
|
|
8566
|
+
cp:short.index,
|
|
8567
|
+
cpk:short.k,
|
|
8568
|
+
pp:long.index,
|
|
8569
|
+
ppk:long.k,
|
|
8570
|
+
outOfSpec,
|
|
8571
|
+
defectRate:n?outOfSpec/n:null,
|
|
8572
|
+
};
|
|
8573
|
+
}
|
|
8574
|
+
function controlLimits(ordered){
|
|
8575
|
+
const n=ordered.length;
|
|
8576
|
+
if(n<2)return null;
|
|
8577
|
+
const within=withinSigma(ordered);
|
|
8578
|
+
if(!within||!(within.sigma>0))return null;
|
|
8579
|
+
let centre=0;
|
|
8580
|
+
for(let i=0;i<n;i++)centre+=ordered[i];
|
|
8581
|
+
centre/=n;
|
|
8582
|
+
return{
|
|
8583
|
+
centre,
|
|
8584
|
+
sigma:within.sigma,
|
|
8585
|
+
upper:centre+3*within.sigma,
|
|
8586
|
+
lower:centre-3*within.sigma,
|
|
8587
|
+
};
|
|
8588
|
+
}
|
|
8589
|
+
function controlViolations(ordered,limits){
|
|
8590
|
+
if(!limits||!(limits.sigma>0))return[];
|
|
8591
|
+
const n=ordered.length;
|
|
8592
|
+
const{centre,sigma}=limits;
|
|
8593
|
+
const z=(i)=>(ordered[i]-centre)/sigma;
|
|
8594
|
+
const out=[];
|
|
8595
|
+
for(let i=0;i<n;i++){
|
|
8596
|
+
if(Math.abs(z(i))>3){
|
|
8597
|
+
out.push({index:i,rule:1,description:'beyond three sigma'});
|
|
8598
|
+
}
|
|
8599
|
+
if(i>=2){
|
|
8600
|
+
for(const side of[1,-1]){
|
|
8601
|
+
let hits=0;
|
|
8602
|
+
for(let k=i-2;k<=i;k++)if(z(k)*side>2)hits++;
|
|
8603
|
+
if(hits>=2){
|
|
8604
|
+
out.push({index:i,rule:2,description:'two of three past two sigma'});
|
|
8605
|
+
break;
|
|
8606
|
+
}
|
|
8607
|
+
}
|
|
8608
|
+
}
|
|
8609
|
+
if(i>=4){
|
|
8610
|
+
for(const side of[1,-1]){
|
|
8611
|
+
let hits=0;
|
|
8612
|
+
for(let k=i-4;k<=i;k++)if(z(k)*side>1)hits++;
|
|
8613
|
+
if(hits>=4){
|
|
8614
|
+
out.push({index:i,rule:3,description:'four of five past one sigma'});
|
|
8615
|
+
break;
|
|
8616
|
+
}
|
|
8617
|
+
}
|
|
8618
|
+
}
|
|
8619
|
+
if(i>=7){
|
|
8620
|
+
for(const side of[1,-1]){
|
|
8621
|
+
let all=true;
|
|
8622
|
+
for(let k=i-7;k<=i;k++)if(z(k)*side<=0){all=false;break;}
|
|
8623
|
+
if(all){
|
|
8624
|
+
out.push({index:i,rule:4,description:'eight in a row on one side'});
|
|
8625
|
+
break;
|
|
8626
|
+
}
|
|
8627
|
+
}
|
|
8628
|
+
}
|
|
8629
|
+
}
|
|
8630
|
+
return out;
|
|
8631
|
+
}
|
|
7924
8632
|
function countOutside(values,low,high){
|
|
7925
8633
|
let count=0;
|
|
7926
8634
|
for(let i=0;i<values.length;i++){
|
|
@@ -12243,14 +12951,22 @@ return this.#keyIndex.get(key);
|
|
|
12243
12951
|
#changedColumns(previous,next){
|
|
12244
12952
|
const changed=[];
|
|
12245
12953
|
for(const colId of this.#queryColumns()){
|
|
12246
|
-
|
|
12247
|
-
if(!column)continue;
|
|
12248
|
-
const before=isFunction(column.getValue)?column.getValue(previous):undefined;
|
|
12249
|
-
const after=isFunction(column.getValue)?column.getValue(next):undefined;
|
|
12250
|
-
if(!Object.is(before,after))changed.push(colId);
|
|
12954
|
+
if(this.#column(colId)&&this.#moved(colId,previous,next,new Set()))changed.push(colId);
|
|
12251
12955
|
}
|
|
12252
12956
|
return changed;
|
|
12253
12957
|
}
|
|
12958
|
+
#moved(colId,previous,next,seen){
|
|
12959
|
+
if(seen.has(colId))return false;
|
|
12960
|
+
seen.add(colId);
|
|
12961
|
+
const column=this.#column(colId);
|
|
12962
|
+
if(!column)return false;
|
|
12963
|
+
const deps=column.value&&column.value.deps;
|
|
12964
|
+
if(Array.isArray(deps)&&deps.length){
|
|
12965
|
+
return deps.some((dep)=>this.#moved(String(dep),previous,next,seen));
|
|
12966
|
+
}
|
|
12967
|
+
if(!isFunction(column.getValue))return false;
|
|
12968
|
+
return!Object.is(column.getValue(previous),column.getValue(next));
|
|
12969
|
+
}
|
|
12254
12970
|
#queryColumns(){
|
|
12255
12971
|
const ids=new Set();
|
|
12256
12972
|
for(const entry of this.#state('sort',[]))ids.add(entry.col);
|
|
@@ -12399,7 +13115,16 @@ handleFor(colId){
|
|
|
12399
13115
|
return this.#handles.handle(colId);
|
|
12400
13116
|
}
|
|
12401
13117
|
#runSort(filtered){
|
|
12402
|
-
const entries=this.#state('sort',[])
|
|
13118
|
+
const entries=this.#state('sort',[]).filter((entry)=>{
|
|
13119
|
+
const column=this.#column(entry.col);
|
|
13120
|
+
if(!column||!column.running)return true;
|
|
13121
|
+
warnOnce(
|
|
13122
|
+
`source.sort.running.${entry.col}`,
|
|
13123
|
+
`sort ignores "${entry.col}": a running total is a function of the sort order, `
|
|
13124
|
+
+'so it cannot also decide it. Sort by the column it runs over instead.',
|
|
13125
|
+
);
|
|
13126
|
+
return false;
|
|
13127
|
+
});
|
|
12403
13128
|
if(!entries.length)return filtered;
|
|
12404
13129
|
const locale=(this.#ctx.config||{}).locale;
|
|
12405
13130
|
if(entries.length===1){
|
|
@@ -24449,132 +25174,143 @@ const ShadowTracker=__m8["ShadowTracker"];
|
|
|
24449
25174
|
const shadowsIn=__m8["shadowsIn"];
|
|
24450
25175
|
const __m9=__req("packages/core/src/compute/total.js");
|
|
24451
25176
|
const total=__m9["total"];
|
|
24452
|
-
const __m10=__req("packages/core/src/compute/
|
|
24453
|
-
const
|
|
24454
|
-
const
|
|
24455
|
-
const
|
|
24456
|
-
const
|
|
24457
|
-
const
|
|
24458
|
-
const
|
|
24459
|
-
const
|
|
24460
|
-
const
|
|
24461
|
-
const __m11
|
|
24462
|
-
const
|
|
24463
|
-
const
|
|
24464
|
-
const
|
|
24465
|
-
const
|
|
24466
|
-
const
|
|
24467
|
-
const
|
|
24468
|
-
const
|
|
24469
|
-
const
|
|
24470
|
-
const
|
|
24471
|
-
const
|
|
24472
|
-
const
|
|
24473
|
-
const
|
|
24474
|
-
const
|
|
24475
|
-
const
|
|
24476
|
-
const
|
|
24477
|
-
const
|
|
24478
|
-
const
|
|
24479
|
-
const
|
|
24480
|
-
const
|
|
24481
|
-
const
|
|
24482
|
-
const
|
|
24483
|
-
const
|
|
24484
|
-
const
|
|
24485
|
-
const
|
|
24486
|
-
const
|
|
24487
|
-
const
|
|
24488
|
-
const
|
|
24489
|
-
const
|
|
24490
|
-
const
|
|
24491
|
-
const
|
|
24492
|
-
const
|
|
24493
|
-
const
|
|
24494
|
-
const
|
|
24495
|
-
const
|
|
24496
|
-
const
|
|
24497
|
-
const
|
|
24498
|
-
const
|
|
24499
|
-
const
|
|
24500
|
-
const
|
|
24501
|
-
const
|
|
24502
|
-
const
|
|
24503
|
-
const
|
|
24504
|
-
const
|
|
24505
|
-
const
|
|
24506
|
-
const
|
|
24507
|
-
const
|
|
24508
|
-
const
|
|
24509
|
-
const
|
|
24510
|
-
const
|
|
24511
|
-
const
|
|
24512
|
-
const
|
|
24513
|
-
const
|
|
24514
|
-
const
|
|
24515
|
-
const
|
|
24516
|
-
const
|
|
24517
|
-
const
|
|
24518
|
-
const
|
|
24519
|
-
const
|
|
24520
|
-
const
|
|
24521
|
-
const
|
|
24522
|
-
const
|
|
24523
|
-
const
|
|
24524
|
-
const
|
|
24525
|
-
const
|
|
24526
|
-
const
|
|
24527
|
-
const
|
|
24528
|
-
const
|
|
24529
|
-
const
|
|
24530
|
-
const
|
|
24531
|
-
const
|
|
24532
|
-
const
|
|
24533
|
-
const
|
|
24534
|
-
const
|
|
24535
|
-
const
|
|
24536
|
-
const
|
|
24537
|
-
const
|
|
24538
|
-
const
|
|
24539
|
-
const
|
|
24540
|
-
const
|
|
24541
|
-
const
|
|
24542
|
-
const
|
|
24543
|
-
const
|
|
24544
|
-
const
|
|
24545
|
-
const
|
|
24546
|
-
const
|
|
24547
|
-
const
|
|
24548
|
-
const
|
|
24549
|
-
const
|
|
24550
|
-
const
|
|
24551
|
-
const
|
|
24552
|
-
const
|
|
24553
|
-
const
|
|
24554
|
-
const
|
|
24555
|
-
const
|
|
24556
|
-
const
|
|
24557
|
-
const
|
|
24558
|
-
const
|
|
24559
|
-
const
|
|
24560
|
-
const
|
|
24561
|
-
const
|
|
24562
|
-
const
|
|
24563
|
-
const
|
|
24564
|
-
const
|
|
24565
|
-
const
|
|
24566
|
-
const
|
|
24567
|
-
const
|
|
24568
|
-
const
|
|
24569
|
-
const
|
|
24570
|
-
const
|
|
24571
|
-
const
|
|
24572
|
-
const
|
|
24573
|
-
const
|
|
24574
|
-
const
|
|
24575
|
-
const
|
|
24576
|
-
const
|
|
24577
|
-
const
|
|
25177
|
+
const __m10=__req("packages/core/src/compute/handle.js");
|
|
25178
|
+
const statValueReader=__m10["valueReader"];
|
|
25179
|
+
const __m11=__req("packages/core/src/compute/statistics.js");
|
|
25180
|
+
const MAINTENANCE=__m11["MAINTENANCE"];
|
|
25181
|
+
const statCorrelation=__m11["correlation"];
|
|
25182
|
+
const statMoments=__m11["moments"];
|
|
25183
|
+
const countOutside=__m11["countOutside"];
|
|
25184
|
+
const statCapability=__m11["capability"];
|
|
25185
|
+
const statControlLimits=__m11["controlLimits"];
|
|
25186
|
+
const statControlViolations=__m11["controlViolations"];
|
|
25187
|
+
const statCovariance=__m11["covariance"];
|
|
25188
|
+
const statHistogram=__m11["histogram"];
|
|
25189
|
+
const statKendall=__m11["kendall"];
|
|
25190
|
+
const statRegression=__m11["regression"];
|
|
25191
|
+
const statSeries=__m11["seriesStats"];
|
|
25192
|
+
const statSpearman=__m11["spearman"];
|
|
25193
|
+
const statWeightedQuantile=__m11["weightedQuantile"];
|
|
25194
|
+
const statNumbers=__m11["numbers"];
|
|
25195
|
+
const statQuantileSorted=__m11["quantileSorted"];
|
|
25196
|
+
const statWeightedAverage=__m11["weightedAverage"];
|
|
25197
|
+
const __m12=__req("packages/core/src/columns/detailcolumn.js");
|
|
25198
|
+
const createDetailColumn=__m12["createDetailColumn"];
|
|
25199
|
+
const DETAIL_COLUMN_ID=__m12["DETAIL_COLUMN_ID"];
|
|
25200
|
+
const __m13=__req("packages/core/src/columns/treecolumn.js");
|
|
25201
|
+
const createTreeColumn=__m13["createTreeColumn"];
|
|
25202
|
+
const TREE_COLUMN_ID=__m13["TREE_COLUMN_ID"];
|
|
25203
|
+
const __m14=__req("packages/core/src/columns/pivotcolumns.js");
|
|
25204
|
+
const createPivotColumns=__m14["createPivotColumns"];
|
|
25205
|
+
const __m15=__req("packages/core/src/compute/pivot.js");
|
|
25206
|
+
const pivotKey=__m15["pivotKey"];
|
|
25207
|
+
const DEFAULT_PATH_SEPARATOR=__m15["DEFAULT_PATH_SEPARATOR"];
|
|
25208
|
+
const __m16=__req("packages/core/src/columns/value.js");
|
|
25209
|
+
const ValuePipeline=__m16["ValuePipeline"];
|
|
25210
|
+
const __m17=__req("packages/core/src/store/columnstore.js");
|
|
25211
|
+
const ColumnStore=__m17["ColumnStore"];
|
|
25212
|
+
const __m18=__req("packages/core/src/store/pool.js");
|
|
25213
|
+
const MaskPool=__m18["MaskPool"];
|
|
25214
|
+
const __m19=__req("packages/core/src/compute/index.js");
|
|
25215
|
+
const compute=__m19;
|
|
25216
|
+
const __m20=__req("packages/core/src/source/index.js");
|
|
25217
|
+
const createSource=__m20["createSource"];
|
|
25218
|
+
const __m21=__req("packages/core/src/source/rows.js");
|
|
25219
|
+
const pinnedRow=__m21["pinnedRow"];
|
|
25220
|
+
const DEFAULT_ROW_HEIGHT=__m21["DEFAULT_ROW_HEIGHT"];
|
|
25221
|
+
const __m22=__req("packages/core/src/model/rowkey.js");
|
|
25222
|
+
const createRowKey=__m22["createRowKey"];
|
|
25223
|
+
const __m23=__req("packages/core/src/model/rowmodel.js");
|
|
25224
|
+
const RowModel=__m23["RowModel"];
|
|
25225
|
+
const createRow=__m23["createRow"];
|
|
25226
|
+
const __m24=__req("packages/core/src/model/selection.js");
|
|
25227
|
+
const SelectionModel=__m24["SelectionModel"];
|
|
25228
|
+
const RangeModel=__m24["RangeModel"];
|
|
25229
|
+
const summarise=__m24["summarise"];
|
|
25230
|
+
const __m25=__req("packages/core/src/model/history.js");
|
|
25231
|
+
const HistoryModel=__m25["HistoryModel"];
|
|
25232
|
+
const __m26=__req("packages/core/src/model/diff.js");
|
|
25233
|
+
const DiffModel=__m26["DiffModel"];
|
|
25234
|
+
const readValue=__m26["readValue"];
|
|
25235
|
+
const __m27=__req("packages/core/src/model/views.js");
|
|
25236
|
+
const ViewStore=__m27["ViewStore"];
|
|
25237
|
+
const __m28=__req("packages/core/src/model/highlight.js");
|
|
25238
|
+
const HighlightModel=__m28["HighlightModel"];
|
|
25239
|
+
const __m29=__req("packages/core/src/model/redaction.js");
|
|
25240
|
+
const RedactionModel=__m29["RedactionModel"];
|
|
25241
|
+
const __m30=__req("packages/core/src/model/presentation.js");
|
|
25242
|
+
const PresentationModel=__m30["PresentationModel"];
|
|
25243
|
+
const __m31=__req("packages/core/src/model/timeline.js");
|
|
25244
|
+
const Timeline=__m31["Timeline"];
|
|
25245
|
+
const __m32=__req("packages/core/src/model/facets.js");
|
|
25246
|
+
const FacetModel=__m32["FacetModel"];
|
|
25247
|
+
const DEFAULT_DEBOUNCE=__m32["DEFAULT_DEBOUNCE"];
|
|
25248
|
+
const DEFAULT_ROW_CEILING=__m32["DEFAULT_ROW_CEILING"];
|
|
25249
|
+
const DEFAULT_FACET_HEIGHT=__m32["DEFAULT_FACET_HEIGHT"];
|
|
25250
|
+
const __m33=__req("packages/core/src/model/comments.js");
|
|
25251
|
+
const CommentModel=__m33["CommentModel"];
|
|
25252
|
+
const parseCommentKey=__m33["parseCellKey"];
|
|
25253
|
+
const DEFAULT_INDEX_DEBOUNCE=__m33["DEFAULT_INDEX_DEBOUNCE"];
|
|
25254
|
+
const DEFAULT_INDEX_LIMIT=__m33["DEFAULT_INDEX_LIMIT"];
|
|
25255
|
+
const __m34=__req("packages/core/src/model/diagnostics.js");
|
|
25256
|
+
const Diagnostics=__m34["Diagnostics"];
|
|
25257
|
+
const WARNING_IDS=__m34["WARNING_IDS"];
|
|
25258
|
+
const instrument=__m34["instrument"];
|
|
25259
|
+
const instrumentProvider=__m34["instrumentProvider"];
|
|
25260
|
+
const __m35=__req("packages/core/src/model/presence.js");
|
|
25261
|
+
const PresenceModel=__m35["PresenceModel"];
|
|
25262
|
+
const DEFAULT_THROTTLE_MS=__m35["DEFAULT_THROTTLE_MS"];
|
|
25263
|
+
const DEFAULT_IDLE_MS=__m35["DEFAULT_IDLE_MS"];
|
|
25264
|
+
const DEFAULT_REMOVE_MS=__m35["DEFAULT_REMOVE_MS"];
|
|
25265
|
+
const DEFAULT_LOCK_MS=__m35["DEFAULT_LOCK_MS"];
|
|
25266
|
+
const __m36=__req("packages/core/src/compute/facet.js");
|
|
25267
|
+
const facetKind=__m36["facetKind"];
|
|
25268
|
+
const DEFAULT_BUCKETS=__m36["DEFAULT_BUCKETS"];
|
|
25269
|
+
const DEFAULT_CARDINALITY_LIMIT=__m36["DEFAULT_CARDINALITY_LIMIT"];
|
|
25270
|
+
const __m37=__req("packages/worker/src/host.js");
|
|
25271
|
+
const createWorkerHost=__m37["createWorkerHost"];
|
|
25272
|
+
const __m38=__req("packages/core/src/i18n/index.js");
|
|
25273
|
+
const Messages=__m38["Messages"];
|
|
25274
|
+
const MESSAGE_KEYS=__m38["MESSAGE_KEYS"];
|
|
25275
|
+
const __m39=__req("packages/core/src/model/pending.js");
|
|
25276
|
+
const PendingWrites=__m39["PendingWrites"];
|
|
25277
|
+
const __m40=__req("packages/core/src/registry/licence.js");
|
|
25278
|
+
const setSharedLicence=__m40["setLicence"];
|
|
25279
|
+
const licenceInfo=__m40["licenceInfo"];
|
|
25280
|
+
const licenceWatermark=__m40["watermark"];
|
|
25281
|
+
const licenceState=__m40["licenceState"];
|
|
25282
|
+
const sharedLicence=__m40["sharedLicence"];
|
|
25283
|
+
const __m41=__req("packages/core/src/columns/permissions.js");
|
|
25284
|
+
const PermissionModel=__m41["PermissionModel"];
|
|
25285
|
+
const __m42=__req("packages/core/src/ai/schema.js");
|
|
25286
|
+
const describeGrid=__m42["describeGrid"];
|
|
25287
|
+
const promptText=__m42["promptText"];
|
|
25288
|
+
const toolDefinition=__m42["toolDefinition"];
|
|
25289
|
+
const __m43=__req("packages/core/src/ai/intent.js");
|
|
25290
|
+
const planIntent=__m43["planIntent"];
|
|
25291
|
+
const applyPlan=__m43["applyPlan"];
|
|
25292
|
+
const buildPrompt=__m43["buildPrompt"];
|
|
25293
|
+
const __m44=__req("packages/core/src/model/edit.js");
|
|
25294
|
+
const EditModel=__m44["EditModel"];
|
|
25295
|
+
const __m45=__req("packages/core/src/model/changes.js");
|
|
25296
|
+
const ChangeModel=__m45["ChangeModel"];
|
|
25297
|
+
const __m46=__req("packages/core/src/model/state.js");
|
|
25298
|
+
const StateModel=__m46["StateModel"];
|
|
25299
|
+
const __m47=__req("packages/core/src/formatting/model.js");
|
|
25300
|
+
const FormattingModel=__m47["FormattingModel"];
|
|
25301
|
+
const GRID_SCOPE=__m47["GRID_SCOPE"];
|
|
25302
|
+
const __m48=__req("packages/core/src/formatting/rules.js");
|
|
25303
|
+
const summariseColumn=__m48["summariseColumn"];
|
|
25304
|
+
const __m49=__req("packages/core/src/export/index.js");
|
|
25305
|
+
const exportCsv=__m49["exportCsv"];
|
|
25306
|
+
const exportExcel=__m49["exportExcel"];
|
|
25307
|
+
const copyToClipboard=__m49["copyToClipboard"];
|
|
25308
|
+
const writeClipboardText=__m49["writeClipboardText"];
|
|
25309
|
+
const printGrid=__m49["printGrid"];
|
|
25310
|
+
const buildClipboardText=__m49["buildClipboardText"];
|
|
25311
|
+
const pasteIntoRange=__m49["pasteIntoRange"];
|
|
25312
|
+
const writeHookFor=__m49["writeHookFor"];
|
|
25313
|
+
const parseClipboardText=__m49["parseClipboardText"];
|
|
24578
25314
|
const QUICK_MODES=['contains','words','fuzzy','regex'];
|
|
24579
25315
|
function canonicalise(column,value){
|
|
24580
25316
|
const lookup=column&&column.lookup;
|
|
@@ -24718,6 +25454,8 @@ pageSize:0,
|
|
|
24718
25454
|
#renderer=null;
|
|
24719
25455
|
#destroyed=false;
|
|
24720
25456
|
#shadows=new Map();
|
|
25457
|
+
#running=new Map();
|
|
25458
|
+
#filteredKeyCache=null;
|
|
24721
25459
|
#ready=false;
|
|
24722
25460
|
#teardown=new Set();
|
|
24723
25461
|
constructor(config={}){
|
|
@@ -25526,6 +26264,75 @@ return this.#store?this.#store.column(colId):undefined;
|
|
|
25526
26264
|
const handle=this.#handleFor(colId);
|
|
25527
26265
|
return handle?statNumbers(handle,this.#statIndices()):new Float64Array(0);
|
|
25528
26266
|
}
|
|
26267
|
+
#filteredKeys(){
|
|
26268
|
+
const indices=this.#statIndices();
|
|
26269
|
+
if(this.#filteredKeyCache&&this.#filteredKeyCache.indices===indices){
|
|
26270
|
+
return this.#filteredKeyCache.keys;
|
|
26271
|
+
}
|
|
26272
|
+
const keys=new Set();
|
|
26273
|
+
const all=isFunction(this.#source.rows)?this.#source.rows():null;
|
|
26274
|
+
for(let i=0;i<indices.length;i++){
|
|
26275
|
+
const data=all?all[indices[i]]:null;
|
|
26276
|
+
const key=data==null?null:this.#rowKey(data);
|
|
26277
|
+
if(key!==null&&key!==undefined)keys.add(String(key));
|
|
26278
|
+
}
|
|
26279
|
+
this.#filteredKeyCache={indices,keys};
|
|
26280
|
+
return keys;
|
|
26281
|
+
}
|
|
26282
|
+
#runningValues(colId,kind){
|
|
26283
|
+
const rows=this.#displayRows();
|
|
26284
|
+
const cached=this.#running.get(colId);
|
|
26285
|
+
if(cached&&cached.rows===rows&&cached.kind===kind)return cached.values;
|
|
26286
|
+
const values=new Map();
|
|
26287
|
+
let total=0;
|
|
26288
|
+
let grand=0;
|
|
26289
|
+
if(kind==='percent'){
|
|
26290
|
+
for(const row of rows){
|
|
26291
|
+
if(!row||row.kind)continue;
|
|
26292
|
+
const v=Number(this.#values.value(this.#columns.get(colId),row.data,row));
|
|
26293
|
+
if(Number.isFinite(v))grand+=v;
|
|
26294
|
+
}
|
|
26295
|
+
}
|
|
26296
|
+
for(const row of rows){
|
|
26297
|
+
if(!row||row.kind)continue;
|
|
26298
|
+
const v=Number(this.#values.value(this.#columns.get(colId),row.data,row));
|
|
26299
|
+
if(Number.isFinite(v))total+=v;
|
|
26300
|
+
const key=row.key===undefined||row.key===null?null:String(row.key);
|
|
26301
|
+
if(!key)continue;
|
|
26302
|
+
values.set(key,kind==='percent'?(grand?(total/grand)*100:null):total);
|
|
26303
|
+
}
|
|
26304
|
+
this.#running.set(colId,{rows,kind,values});
|
|
26305
|
+
return values;
|
|
26306
|
+
}
|
|
26307
|
+
#orderedValues(colId,by){
|
|
26308
|
+
const values=this.#handleFor(colId);
|
|
26309
|
+
if(!values)return null;
|
|
26310
|
+
const indices=this.#statIndices();
|
|
26311
|
+
const readValue=statValueReader(values);
|
|
26312
|
+
if(!by){
|
|
26313
|
+
const out=[];
|
|
26314
|
+
for(let i=0;i<indices.length;i++){
|
|
26315
|
+
const v=Number(readValue(indices[i]));
|
|
26316
|
+
if(Number.isFinite(v))out.push(v);
|
|
26317
|
+
}
|
|
26318
|
+
return out;
|
|
26319
|
+
}
|
|
26320
|
+
const order=this.#handleFor(by);
|
|
26321
|
+
if(!order)return null;
|
|
26322
|
+
const readOrder=statValueReader(order);
|
|
26323
|
+
const rows=[];
|
|
26324
|
+
for(let i=0;i<indices.length;i++){
|
|
26325
|
+
const row=indices[i];
|
|
26326
|
+
const v=Number(readValue(row));
|
|
26327
|
+
const raw=readOrder(row);
|
|
26328
|
+
const at=raw instanceof Date?raw.getTime()
|
|
26329
|
+
:(typeof raw==='number'?raw:Date.parse(String(raw)));
|
|
26330
|
+
if(!Number.isFinite(v)||!Number.isFinite(at))continue;
|
|
26331
|
+
rows.push([at,v]);
|
|
26332
|
+
}
|
|
26333
|
+
rows.sort((x,y)=>x[0]-y[0]);
|
|
26334
|
+
return rows.map((r)=>r[1]);
|
|
26335
|
+
}
|
|
25529
26336
|
#statIndices(){
|
|
25530
26337
|
const source=this.#source;
|
|
25531
26338
|
if(isFunction(source.filteredIndices))return source.filteredIndices();
|
|
@@ -26527,6 +27334,36 @@ return summarise(grid.#ranges.cells((i)=>grid.rows.get(i)).map(
|
|
|
26527
27334
|
({key,colId})=>grid.rows.value(key,colId),
|
|
26528
27335
|
));
|
|
26529
27336
|
},
|
|
27337
|
+
statistics(){
|
|
27338
|
+
const cells=grid.#ranges.cells((i)=>grid.rows.get(i));
|
|
27339
|
+
if(!cells.length)return null;
|
|
27340
|
+
const raw=cells.map(({key,colId})=>grid.rows.value(key,colId));
|
|
27341
|
+
const base=summarise(raw);
|
|
27342
|
+
const numbers=[];
|
|
27343
|
+
const seen=new Set();
|
|
27344
|
+
for(const v of raw){
|
|
27345
|
+
if(v===null||v===undefined||v==='')continue;
|
|
27346
|
+
seen.add(typeof v==='object'?String(v):v);
|
|
27347
|
+
const n=typeof v==='number'?v:Number(v);
|
|
27348
|
+
if(Number.isFinite(n))numbers.push(n);
|
|
27349
|
+
}
|
|
27350
|
+
if(!numbers.length)return{...base,cells:cells.length,distinct:seen.size};
|
|
27351
|
+
const sorted=numbers.slice().sort((a,b)=>a-b);
|
|
27352
|
+
const{n,mean,m2}=statMoments(Float64Array.from(sorted));
|
|
27353
|
+
const q1=statQuantileSorted(sorted,0.25);
|
|
27354
|
+
const q3=statQuantileSorted(sorted,0.75);
|
|
27355
|
+
return{
|
|
27356
|
+
...base,
|
|
27357
|
+
cells:cells.length,
|
|
27358
|
+
distinct:seen.size,
|
|
27359
|
+
median:statQuantileSorted(sorted,0.5),
|
|
27360
|
+
q1,
|
|
27361
|
+
q3,
|
|
27362
|
+
iqr:q3-q1,
|
|
27363
|
+
stddev:n>1?Math.sqrt(m2/(n-1)):null,
|
|
27364
|
+
outliers:countOutside(Float64Array.from(sorted),q1-1.5*(q3-q1),q3+1.5*(q3-q1)),
|
|
27365
|
+
};
|
|
27366
|
+
},
|
|
26530
27367
|
};
|
|
26531
27368
|
}
|
|
26532
27369
|
get filters(){
|
|
@@ -27352,9 +28189,9 @@ get active(){return grid.#redaction.active;},
|
|
|
27352
28189
|
get statistics(){
|
|
27353
28190
|
const grid=this;
|
|
27354
28191
|
return{
|
|
27355
|
-
shadow(colId,kind,rowKey){
|
|
28192
|
+
shadow(colId,kind,rowKey,scope){
|
|
27356
28193
|
const tracker=grid.#shadows.get(colId);
|
|
27357
|
-
return tracker?tracker.read(kind,rowKey):null;
|
|
28194
|
+
return tracker?tracker.read(kind,rowKey,scope==='filtered'?grid.#filteredKeys():undefined):null;
|
|
27358
28195
|
},
|
|
27359
28196
|
rebase(colId){
|
|
27360
28197
|
if(colId){
|
|
@@ -27412,6 +28249,79 @@ const second=grid.#handleFor(b);
|
|
|
27412
28249
|
if(!first||!second)return null;
|
|
27413
28250
|
return statCorrelation(first,second,grid.#statIndices());
|
|
27414
28251
|
},
|
|
28252
|
+
covariance(a,b,opts={}){
|
|
28253
|
+
const first=grid.#handleFor(a);
|
|
28254
|
+
const second=grid.#handleFor(b);
|
|
28255
|
+
if(!first||!second)return null;
|
|
28256
|
+
return statCovariance(first,second,grid.#statIndices(),opts.population===true);
|
|
28257
|
+
},
|
|
28258
|
+
regression(a,b){
|
|
28259
|
+
const first=grid.#handleFor(a);
|
|
28260
|
+
const second=grid.#handleFor(b);
|
|
28261
|
+
if(!first||!second)return null;
|
|
28262
|
+
return statRegression(first,second,grid.#statIndices());
|
|
28263
|
+
},
|
|
28264
|
+
spearman(a,b){
|
|
28265
|
+
const first=grid.#handleFor(a);
|
|
28266
|
+
const second=grid.#handleFor(b);
|
|
28267
|
+
if(!first||!second)return null;
|
|
28268
|
+
return statSpearman(first,second,grid.#statIndices());
|
|
28269
|
+
},
|
|
28270
|
+
kendall(a,b){
|
|
28271
|
+
const first=grid.#handleFor(a);
|
|
28272
|
+
const second=grid.#handleFor(b);
|
|
28273
|
+
if(!first||!second)return null;
|
|
28274
|
+
return statKendall(first,second,grid.#statIndices());
|
|
28275
|
+
},
|
|
28276
|
+
weightedQuantile(colId,weightId,p=0.5){
|
|
28277
|
+
const values=grid.#handleFor(colId);
|
|
28278
|
+
const weights=grid.#handleFor(weightId);
|
|
28279
|
+
if(!values||!weights)return null;
|
|
28280
|
+
const indices=grid.#statIndices();
|
|
28281
|
+
const readV=statValueReader(values);
|
|
28282
|
+
const readW=statValueReader(weights);
|
|
28283
|
+
const vs=[];
|
|
28284
|
+
const ws=[];
|
|
28285
|
+
for(let i=0;i<indices.length;i++){
|
|
28286
|
+
vs.push(Number(readV(indices[i])));
|
|
28287
|
+
ws.push(Number(readW(indices[i])));
|
|
28288
|
+
}
|
|
28289
|
+
return statWeightedQuantile(vs,ws,p);
|
|
28290
|
+
},
|
|
28291
|
+
running(colId,kind,rowKey){
|
|
28292
|
+
const values=grid.#runningValues(colId,kind);
|
|
28293
|
+
return values&&values.has(rowKey)?values.get(rowKey):null;
|
|
28294
|
+
},
|
|
28295
|
+
capability(colId,opts={}){
|
|
28296
|
+
const handle=grid.#handleFor(colId);
|
|
28297
|
+
if(!handle)return null;
|
|
28298
|
+
const column=grid.#columns.get(colId);
|
|
28299
|
+
const declared=(column&&column.spec)||{};
|
|
28300
|
+
const spec={
|
|
28301
|
+
lower:opts.lower===undefined?declared.lower:opts.lower,
|
|
28302
|
+
upper:opts.upper===undefined?declared.upper:opts.upper,
|
|
28303
|
+
target:opts.target===undefined?declared.target:opts.target,
|
|
28304
|
+
};
|
|
28305
|
+
const ordered=grid.#orderedValues(colId,opts.by);
|
|
28306
|
+
if(!ordered)return null;
|
|
28307
|
+
const result=statCapability(ordered,spec);
|
|
28308
|
+
if(!result)return null;
|
|
28309
|
+
const from=Number(opts.baseline)>1
|
|
28310
|
+
?ordered.slice(0,Math.min(ordered.length,Math.floor(Number(opts.baseline))))
|
|
28311
|
+
:ordered;
|
|
28312
|
+
const limits=statControlLimits(from);
|
|
28313
|
+
return{
|
|
28314
|
+
...result,
|
|
28315
|
+
limits,
|
|
28316
|
+
baseline:from.length,
|
|
28317
|
+
violations:limits?statControlViolations(ordered,limits):[],
|
|
28318
|
+
};
|
|
28319
|
+
},
|
|
28320
|
+
series(colId,opts){
|
|
28321
|
+
if(!opts||!opts.by)return null;
|
|
28322
|
+
const ordered=grid.#orderedValues(colId,opts.by);
|
|
28323
|
+
return ordered?statSeries(ordered,opts):null;
|
|
28324
|
+
},
|
|
27415
28325
|
weightedAverage(colId,weightId){
|
|
27416
28326
|
const values=grid.#handleFor(colId);
|
|
27417
28327
|
const weights=grid.#handleFor(weightId);
|
|
@@ -27740,6 +28650,8 @@ Object.defineProperty(__exports,"RADIX_PRESETS",{enumerable:true,get:function(){
|
|
|
27740
28650
|
Object.defineProperty(__exports,"parseRadix",{enumerable:true,get:function(){return parseRadix;}});
|
|
27741
28651
|
Object.defineProperty(__exports,"formatRadix",{enumerable:true,get:function(){return formatRadix;}});
|
|
27742
28652
|
Object.defineProperty(__exports,"createUnitType",{enumerable:true,get:function(){return createUnitType;}});
|
|
28653
|
+
Object.defineProperty(__exports,"registerUnitSystem",{enumerable:true,get:function(){return registerUnitSystem;}});
|
|
28654
|
+
Object.defineProperty(__exports,"defineUnit",{enumerable:true,get:function(){return defineUnit;}});
|
|
27743
28655
|
Object.defineProperty(__exports,"UNIT_SYSTEMS",{enumerable:true,get:function(){return UNIT_SYSTEMS;}});
|
|
27744
28656
|
Object.defineProperty(__exports,"parseUnit",{enumerable:true,get:function(){return parseUnit;}});
|
|
27745
28657
|
Object.defineProperty(__exports,"formatUnit",{enumerable:true,get:function(){return formatUnit;}});
|
|
@@ -27750,6 +28662,8 @@ const RADIX_PRESETS=__m0["RADIX_PRESETS"];
|
|
|
27750
28662
|
const parseRadix=__m0["parseRadix"];
|
|
27751
28663
|
const formatRadix=__m0["formatRadix"];
|
|
27752
28664
|
const createUnitType=__m0["createUnitType"];
|
|
28665
|
+
const registerUnitSystem=__m0["registerUnitSystem"];
|
|
28666
|
+
const defineUnit=__m0["defineUnit"];
|
|
27753
28667
|
const UNIT_SYSTEMS=__m0["UNIT_SYSTEMS"];
|
|
27754
28668
|
const parseUnit=__m0["parseUnit"];
|
|
27755
28669
|
const formatUnit=__m0["formatUnit"];
|
|
@@ -27899,6 +28813,62 @@ other:'{count} cellules mises à jour',
|
|
|
27899
28813
|
'panel.quickFilter':'Filtre rapide',
|
|
27900
28814
|
'panel.formatting':'Mise en forme',
|
|
27901
28815
|
'panel.statistics':'Statistiques',
|
|
28816
|
+
'panel.compare':'Comparer',
|
|
28817
|
+
'compare.first':'Première colonne',
|
|
28818
|
+
'compare.second':'Deuxième colonne',
|
|
28819
|
+
'compare.needTwo':'Deux colonnes numériques sont nécessaires',
|
|
28820
|
+
'compare.noPairs':'Aucune ligne n’a de valeur dans les deux',
|
|
28821
|
+
'compare.pairs':'{count} paires',
|
|
28822
|
+
'compare.pearson':'Corrélation (Pearson)',
|
|
28823
|
+
'compare.spearman':'Corrélation des rangs (Spearman)',
|
|
28824
|
+
'compare.kendall':'Tau de Kendall',
|
|
28825
|
+
'compare.covariance':'Covariance',
|
|
28826
|
+
'compare.slope':'Pente',
|
|
28827
|
+
'compare.intercept':'Ordonnée à l’origine',
|
|
28828
|
+
'compare.r2':'R²',
|
|
28829
|
+
'compare.stdError':'Erreur type',
|
|
28830
|
+
'compare.weighted':'Moyenne pondérée',
|
|
28831
|
+
'total.sum':'Somme',
|
|
28832
|
+
'total.avg':'Moyenne',
|
|
28833
|
+
'total.min':'Min',
|
|
28834
|
+
'total.max':'Max',
|
|
28835
|
+
'total.count':'Nombre',
|
|
28836
|
+
'total.countValues':'Nombre de valeurs',
|
|
28837
|
+
'total.first':'Premier',
|
|
28838
|
+
'total.last':'Dernier',
|
|
28839
|
+
'total.median':'Médiane',
|
|
28840
|
+
'total.p25':'25e centile',
|
|
28841
|
+
'total.p75':'75e centile',
|
|
28842
|
+
'total.p90':'90e centile',
|
|
28843
|
+
'total.p95':'95e centile',
|
|
28844
|
+
'total.p99':'99e centile',
|
|
28845
|
+
'total.iqr':'Écart interquartile',
|
|
28846
|
+
'total.mad':'Écart absolu médian',
|
|
28847
|
+
'total.variance':'Variance',
|
|
28848
|
+
'total.varianceP':'Variance (population)',
|
|
28849
|
+
'total.stddev':'Écart type',
|
|
28850
|
+
'total.stddevP':'Écart type (population)',
|
|
28851
|
+
'total.range':'Étendue',
|
|
28852
|
+
'total.distinct':'Valeurs distinctes',
|
|
28853
|
+
'total.mode':'Mode',
|
|
28854
|
+
'total.skewness':'Asymétrie',
|
|
28855
|
+
'total.kurtosis':'Aplatissement',
|
|
28856
|
+
'total.geomean':'Moyenne géométrique',
|
|
28857
|
+
'total.harmean':'Moyenne harmonique',
|
|
28858
|
+
'total.sumSquares':'Somme des carrés',
|
|
28859
|
+
'total.weightedAvg':'Moyenne pondérée',
|
|
28860
|
+
'total.argmin':'Plus bas selon',
|
|
28861
|
+
'total.argmax':'Plus haut selon',
|
|
28862
|
+
'total.hhi':'Concentration (IHH)',
|
|
28863
|
+
'total.entropy':'Entropie',
|
|
28864
|
+
'total.evenness':'Régularité',
|
|
28865
|
+
'total.top3Share':'Part des 3 premiers',
|
|
28866
|
+
'total.top10Share':'Part des 10 premiers',
|
|
28867
|
+
'total.gini':'Coefficient de Gini',
|
|
28868
|
+
'total.trimmedMean':'Moyenne tronquée',
|
|
28869
|
+
'total.winsorizedMean':'Moyenne winsorisée',
|
|
28870
|
+
'total.robustOutliers':'Valeurs aberrantes (robuste)',
|
|
28871
|
+
'total.jarqueBera':'Jarque–Bera',
|
|
27902
28872
|
'stats.column':'Colonne',
|
|
27903
28873
|
'stats.choose':'Choisissez une colonne à analyser',
|
|
27904
28874
|
'stats.noColumns':'Aucune colonne numérique à analyser',
|
|
@@ -27918,6 +28888,15 @@ other:'{count} cellules mises à jour',
|
|
|
27918
28888
|
'stats.outliers':'Valeurs aberrantes',
|
|
27919
28889
|
'stats.distribution':'Distribution',
|
|
27920
28890
|
'stats.bin':'{count} entre {from} et {to}',
|
|
28891
|
+
'stats.section.shape':'Forme',
|
|
28892
|
+
'stats.section.robust':'Robuste',
|
|
28893
|
+
'stats.section.concentration':'Concentration',
|
|
28894
|
+
'stats.section.capability':'Capabilité',
|
|
28895
|
+
'stats.cp':'Cp',
|
|
28896
|
+
'stats.cpk':'Cpk',
|
|
28897
|
+
'stats.pp':'Pp',
|
|
28898
|
+
'stats.ppk':'Ppk',
|
|
28899
|
+
'stats.outOfSpec':'Hors spécification',
|
|
27921
28900
|
'stats.filtered':'Sur {count} lignes filtrées',
|
|
27922
28901
|
'panel.zone.group':'les regroupements de lignes',
|
|
27923
28902
|
'panel.zone.values':'les valeurs',
|
|
@@ -28310,6 +29289,62 @@ other:'{count} celle aggiornate',
|
|
|
28310
29289
|
'panel.quickFilter':'Filtro rapido',
|
|
28311
29290
|
'panel.formatting':'Formattazione',
|
|
28312
29291
|
'panel.statistics':'Statistiche',
|
|
29292
|
+
'panel.compare':'Confronta',
|
|
29293
|
+
'compare.first':'Prima colonna',
|
|
29294
|
+
'compare.second':'Seconda colonna',
|
|
29295
|
+
'compare.needTwo':'Servono due colonne numeriche',
|
|
29296
|
+
'compare.noPairs':'Nessuna riga ha un valore in entrambe',
|
|
29297
|
+
'compare.pairs':'{count} coppie',
|
|
29298
|
+
'compare.pearson':'Correlazione (Pearson)',
|
|
29299
|
+
'compare.spearman':'Correlazione per ranghi (Spearman)',
|
|
29300
|
+
'compare.kendall':'Tau di Kendall',
|
|
29301
|
+
'compare.covariance':'Covarianza',
|
|
29302
|
+
'compare.slope':'Pendenza',
|
|
29303
|
+
'compare.intercept':'Intercetta',
|
|
29304
|
+
'compare.r2':'R²',
|
|
29305
|
+
'compare.stdError':'Errore standard',
|
|
29306
|
+
'compare.weighted':'Media ponderata',
|
|
29307
|
+
'total.sum':'Somma',
|
|
29308
|
+
'total.avg':'Media',
|
|
29309
|
+
'total.min':'Min',
|
|
29310
|
+
'total.max':'Max',
|
|
29311
|
+
'total.count':'Conteggio',
|
|
29312
|
+
'total.countValues':'Conteggio valori',
|
|
29313
|
+
'total.first':'Primo',
|
|
29314
|
+
'total.last':'Ultimo',
|
|
29315
|
+
'total.median':'Mediana',
|
|
29316
|
+
'total.p25':'25° percentile',
|
|
29317
|
+
'total.p75':'75° percentile',
|
|
29318
|
+
'total.p90':'90° percentile',
|
|
29319
|
+
'total.p95':'95° percentile',
|
|
29320
|
+
'total.p99':'99° percentile',
|
|
29321
|
+
'total.iqr':'Scarto interquartile',
|
|
29322
|
+
'total.mad':'Deviazione assoluta mediana',
|
|
29323
|
+
'total.variance':'Varianza',
|
|
29324
|
+
'total.varianceP':'Varianza (popolazione)',
|
|
29325
|
+
'total.stddev':'Deviazione standard',
|
|
29326
|
+
'total.stddevP':'Deviazione standard (popolazione)',
|
|
29327
|
+
'total.range':'Intervallo',
|
|
29328
|
+
'total.distinct':'Distinti',
|
|
29329
|
+
'total.mode':'Moda',
|
|
29330
|
+
'total.skewness':'Asimmetria',
|
|
29331
|
+
'total.kurtosis':'Curtosi',
|
|
29332
|
+
'total.geomean':'Media geometrica',
|
|
29333
|
+
'total.harmean':'Media armonica',
|
|
29334
|
+
'total.sumSquares':'Somma dei quadrati',
|
|
29335
|
+
'total.weightedAvg':'Media ponderata',
|
|
29336
|
+
'total.argmin':'Più basso per',
|
|
29337
|
+
'total.argmax':'Più alto per',
|
|
29338
|
+
'total.hhi':'Concentrazione (HHI)',
|
|
29339
|
+
'total.entropy':'Entropia',
|
|
29340
|
+
'total.evenness':'Uniformità',
|
|
29341
|
+
'total.top3Share':'Quota primi 3',
|
|
29342
|
+
'total.top10Share':'Quota primi 10',
|
|
29343
|
+
'total.gini':'Coefficiente di Gini',
|
|
29344
|
+
'total.trimmedMean':'Media troncata',
|
|
29345
|
+
'total.winsorizedMean':'Media winsorizzata',
|
|
29346
|
+
'total.robustOutliers':'Valori anomali (robusto)',
|
|
29347
|
+
'total.jarqueBera':'Jarque–Bera',
|
|
28313
29348
|
'stats.column':'Colonna',
|
|
28314
29349
|
'stats.choose':'Scegli una colonna da analizzare',
|
|
28315
29350
|
'stats.noColumns':'Nessuna colonna numerica da analizzare',
|
|
@@ -28329,6 +29364,15 @@ other:'{count} celle aggiornate',
|
|
|
28329
29364
|
'stats.outliers':'Valori anomali',
|
|
28330
29365
|
'stats.distribution':'Distribuzione',
|
|
28331
29366
|
'stats.bin':'{count} tra {from} e {to}',
|
|
29367
|
+
'stats.section.shape':'Forma',
|
|
29368
|
+
'stats.section.robust':'Robusto',
|
|
29369
|
+
'stats.section.concentration':'Concentrazione',
|
|
29370
|
+
'stats.section.capability':'Capacità',
|
|
29371
|
+
'stats.cp':'Cp',
|
|
29372
|
+
'stats.cpk':'Cpk',
|
|
29373
|
+
'stats.pp':'Pp',
|
|
29374
|
+
'stats.ppk':'Ppk',
|
|
29375
|
+
'stats.outOfSpec':'Fuori specifica',
|
|
28332
29376
|
'stats.filtered':'Su {count} righe filtrate',
|
|
28333
29377
|
'panel.zone.group':'i raggruppamenti di righe',
|
|
28334
29378
|
'panel.zone.values':'i valori',
|
|
@@ -28706,6 +29750,62 @@ other:'{count} celdas actualizadas',
|
|
|
28706
29750
|
'panel.quickFilter':'Filtro rápido',
|
|
28707
29751
|
'panel.formatting':'Formato',
|
|
28708
29752
|
'panel.statistics':'Estadísticas',
|
|
29753
|
+
'panel.compare':'Comparar',
|
|
29754
|
+
'compare.first':'Primera columna',
|
|
29755
|
+
'compare.second':'Segunda columna',
|
|
29756
|
+
'compare.needTwo':'Se necesitan dos columnas numéricas',
|
|
29757
|
+
'compare.noPairs':'Ninguna fila tiene valor en ambas',
|
|
29758
|
+
'compare.pairs':'{count} pares',
|
|
29759
|
+
'compare.pearson':'Correlación (Pearson)',
|
|
29760
|
+
'compare.spearman':'Correlación de rangos (Spearman)',
|
|
29761
|
+
'compare.kendall':'Tau de Kendall',
|
|
29762
|
+
'compare.covariance':'Covarianza',
|
|
29763
|
+
'compare.slope':'Pendiente',
|
|
29764
|
+
'compare.intercept':'Intersección',
|
|
29765
|
+
'compare.r2':'R²',
|
|
29766
|
+
'compare.stdError':'Error típico',
|
|
29767
|
+
'compare.weighted':'Media ponderada',
|
|
29768
|
+
'total.sum':'Suma',
|
|
29769
|
+
'total.avg':'Promedio',
|
|
29770
|
+
'total.min':'Mín',
|
|
29771
|
+
'total.max':'Máx',
|
|
29772
|
+
'total.count':'Recuento',
|
|
29773
|
+
'total.countValues':'Recuento de valores',
|
|
29774
|
+
'total.first':'Primero',
|
|
29775
|
+
'total.last':'Último',
|
|
29776
|
+
'total.median':'Mediana',
|
|
29777
|
+
'total.p25':'Percentil 25',
|
|
29778
|
+
'total.p75':'Percentil 75',
|
|
29779
|
+
'total.p90':'Percentil 90',
|
|
29780
|
+
'total.p95':'Percentil 95',
|
|
29781
|
+
'total.p99':'Percentil 99',
|
|
29782
|
+
'total.iqr':'Rango intercuartílico',
|
|
29783
|
+
'total.mad':'Desviación absoluta mediana',
|
|
29784
|
+
'total.variance':'Varianza',
|
|
29785
|
+
'total.varianceP':'Varianza (población)',
|
|
29786
|
+
'total.stddev':'Desviación típica',
|
|
29787
|
+
'total.stddevP':'Desviación típica (población)',
|
|
29788
|
+
'total.range':'Rango',
|
|
29789
|
+
'total.distinct':'Distintos',
|
|
29790
|
+
'total.mode':'Moda',
|
|
29791
|
+
'total.skewness':'Asimetría',
|
|
29792
|
+
'total.kurtosis':'Curtosis',
|
|
29793
|
+
'total.geomean':'Media geométrica',
|
|
29794
|
+
'total.harmean':'Media armónica',
|
|
29795
|
+
'total.sumSquares':'Suma de cuadrados',
|
|
29796
|
+
'total.weightedAvg':'Media ponderada',
|
|
29797
|
+
'total.argmin':'Menor por',
|
|
29798
|
+
'total.argmax':'Mayor por',
|
|
29799
|
+
'total.hhi':'Concentración (HHI)',
|
|
29800
|
+
'total.entropy':'Entropía',
|
|
29801
|
+
'total.evenness':'Uniformidad',
|
|
29802
|
+
'total.top3Share':'Cuota de los 3 mayores',
|
|
29803
|
+
'total.top10Share':'Cuota de los 10 mayores',
|
|
29804
|
+
'total.gini':'Coeficiente de Gini',
|
|
29805
|
+
'total.trimmedMean':'Media recortada',
|
|
29806
|
+
'total.winsorizedMean':'Media winsorizada',
|
|
29807
|
+
'total.robustOutliers':'Valores atípicos (robusto)',
|
|
29808
|
+
'total.jarqueBera':'Jarque–Bera',
|
|
28709
29809
|
'stats.column':'Columna',
|
|
28710
29810
|
'stats.choose':'Elija una columna para analizar',
|
|
28711
29811
|
'stats.noColumns':'No hay columnas numéricas que analizar',
|
|
@@ -28725,6 +29825,15 @@ other:'{count} celdas actualizadas',
|
|
|
28725
29825
|
'stats.outliers':'Valores atípicos',
|
|
28726
29826
|
'stats.distribution':'Distribución',
|
|
28727
29827
|
'stats.bin':'{count} entre {from} y {to}',
|
|
29828
|
+
'stats.section.shape':'Forma',
|
|
29829
|
+
'stats.section.robust':'Robusto',
|
|
29830
|
+
'stats.section.concentration':'Concentración',
|
|
29831
|
+
'stats.section.capability':'Capacidad',
|
|
29832
|
+
'stats.cp':'Cp',
|
|
29833
|
+
'stats.cpk':'Cpk',
|
|
29834
|
+
'stats.pp':'Pp',
|
|
29835
|
+
'stats.ppk':'Ppk',
|
|
29836
|
+
'stats.outOfSpec':'Fuera de especificación',
|
|
28728
29837
|
'stats.filtered':'De las {count} filas filtradas',
|
|
28729
29838
|
'panel.zone.group':'las agrupaciones de filas',
|
|
28730
29839
|
'panel.zone.values':'los valores',
|
|
@@ -29129,6 +30238,62 @@ other:'{count} células atualizadas',
|
|
|
29129
30238
|
'panel.quickFilter':'Filtro rápido',
|
|
29130
30239
|
'panel.formatting':'Formatação',
|
|
29131
30240
|
'panel.statistics':'Estatísticas',
|
|
30241
|
+
'panel.compare':'Comparar',
|
|
30242
|
+
'compare.first':'Primeira coluna',
|
|
30243
|
+
'compare.second':'Segunda coluna',
|
|
30244
|
+
'compare.needTwo':'São necessárias duas colunas numéricas',
|
|
30245
|
+
'compare.noPairs':'Nenhuma linha tem valor em ambas',
|
|
30246
|
+
'compare.pairs':'{count} pares',
|
|
30247
|
+
'compare.pearson':'Correlação (Pearson)',
|
|
30248
|
+
'compare.spearman':'Correlação de postos (Spearman)',
|
|
30249
|
+
'compare.kendall':'Tau de Kendall',
|
|
30250
|
+
'compare.covariance':'Covariância',
|
|
30251
|
+
'compare.slope':'Inclinação',
|
|
30252
|
+
'compare.intercept':'Intercepto',
|
|
30253
|
+
'compare.r2':'R²',
|
|
30254
|
+
'compare.stdError':'Erro padrão',
|
|
30255
|
+
'compare.weighted':'Média ponderada',
|
|
30256
|
+
'total.sum':'Soma',
|
|
30257
|
+
'total.avg':'Média',
|
|
30258
|
+
'total.min':'Mín',
|
|
30259
|
+
'total.max':'Máx',
|
|
30260
|
+
'total.count':'Contagem',
|
|
30261
|
+
'total.countValues':'Contagem de valores',
|
|
30262
|
+
'total.first':'Primeiro',
|
|
30263
|
+
'total.last':'Último',
|
|
30264
|
+
'total.median':'Mediana',
|
|
30265
|
+
'total.p25':'Percentil 25',
|
|
30266
|
+
'total.p75':'Percentil 75',
|
|
30267
|
+
'total.p90':'Percentil 90',
|
|
30268
|
+
'total.p95':'Percentil 95',
|
|
30269
|
+
'total.p99':'Percentil 99',
|
|
30270
|
+
'total.iqr':'Intervalo interquartil',
|
|
30271
|
+
'total.mad':'Desvio absoluto mediano',
|
|
30272
|
+
'total.variance':'Variância',
|
|
30273
|
+
'total.varianceP':'Variância (população)',
|
|
30274
|
+
'total.stddev':'Desvio padrão',
|
|
30275
|
+
'total.stddevP':'Desvio padrão (população)',
|
|
30276
|
+
'total.range':'Amplitude',
|
|
30277
|
+
'total.distinct':'Distintos',
|
|
30278
|
+
'total.mode':'Moda',
|
|
30279
|
+
'total.skewness':'Assimetria',
|
|
30280
|
+
'total.kurtosis':'Curtose',
|
|
30281
|
+
'total.geomean':'Média geométrica',
|
|
30282
|
+
'total.harmean':'Média harmônica',
|
|
30283
|
+
'total.sumSquares':'Soma dos quadrados',
|
|
30284
|
+
'total.weightedAvg':'Média ponderada',
|
|
30285
|
+
'total.argmin':'Menor por',
|
|
30286
|
+
'total.argmax':'Maior por',
|
|
30287
|
+
'total.hhi':'Concentração (HHI)',
|
|
30288
|
+
'total.entropy':'Entropia',
|
|
30289
|
+
'total.evenness':'Uniformidade',
|
|
30290
|
+
'total.top3Share':'Participação dos 3 maiores',
|
|
30291
|
+
'total.top10Share':'Participação dos 10 maiores',
|
|
30292
|
+
'total.gini':'Coeficiente de Gini',
|
|
30293
|
+
'total.trimmedMean':'Média aparada',
|
|
30294
|
+
'total.winsorizedMean':'Média winsorizada',
|
|
30295
|
+
'total.robustOutliers':'Valores atípicos (robusto)',
|
|
30296
|
+
'total.jarqueBera':'Jarque–Bera',
|
|
29132
30297
|
'stats.column':'Coluna',
|
|
29133
30298
|
'stats.choose':'Escolha uma coluna para analisar',
|
|
29134
30299
|
'stats.noColumns':'Nenhuma coluna numérica para analisar',
|
|
@@ -29148,6 +30313,15 @@ other:'{count} células atualizadas',
|
|
|
29148
30313
|
'stats.outliers':'Valores atípicos',
|
|
29149
30314
|
'stats.distribution':'Distribuição',
|
|
29150
30315
|
'stats.bin':'{count} entre {from} e {to}',
|
|
30316
|
+
'stats.section.shape':'Forma',
|
|
30317
|
+
'stats.section.robust':'Robusto',
|
|
30318
|
+
'stats.section.concentration':'Concentração',
|
|
30319
|
+
'stats.section.capability':'Capacidade',
|
|
30320
|
+
'stats.cp':'Cp',
|
|
30321
|
+
'stats.cpk':'Cpk',
|
|
30322
|
+
'stats.pp':'Pp',
|
|
30323
|
+
'stats.ppk':'Ppk',
|
|
30324
|
+
'stats.outOfSpec':'Fora da especificação',
|
|
29151
30325
|
'stats.filtered':'De {count} linhas filtradas',
|
|
29152
30326
|
'panel.zone.group':'os agrupamentos de linhas',
|
|
29153
30327
|
'panel.zone.values':'os valores',
|
|
@@ -29552,6 +30726,62 @@ other:'{count} Zellen aktualisiert',
|
|
|
29552
30726
|
'panel.quickFilter':'Schnellfilter',
|
|
29553
30727
|
'panel.formatting':'Formatierung',
|
|
29554
30728
|
'panel.statistics':'Statistik',
|
|
30729
|
+
'panel.compare':'Vergleichen',
|
|
30730
|
+
'compare.first':'Erste Spalte',
|
|
30731
|
+
'compare.second':'Zweite Spalte',
|
|
30732
|
+
'compare.needTwo':'Zum Vergleich sind zwei numerische Spalten nötig',
|
|
30733
|
+
'compare.noPairs':'Keine Zeile hat in beiden einen Wert',
|
|
30734
|
+
'compare.pairs':'{count} Paare',
|
|
30735
|
+
'compare.pearson':'Korrelation (Pearson)',
|
|
30736
|
+
'compare.spearman':'Rangkorrelation (Spearman)',
|
|
30737
|
+
'compare.kendall':'Kendalls Tau',
|
|
30738
|
+
'compare.covariance':'Kovarianz',
|
|
30739
|
+
'compare.slope':'Steigung',
|
|
30740
|
+
'compare.intercept':'Achsenabschnitt',
|
|
30741
|
+
'compare.r2':'R²',
|
|
30742
|
+
'compare.stdError':'Standardfehler',
|
|
30743
|
+
'compare.weighted':'Gewichteter Mittelwert',
|
|
30744
|
+
'total.sum':'Summe',
|
|
30745
|
+
'total.avg':'Durchschnitt',
|
|
30746
|
+
'total.min':'Min',
|
|
30747
|
+
'total.max':'Max',
|
|
30748
|
+
'total.count':'Anzahl',
|
|
30749
|
+
'total.countValues':'Anzahl Werte',
|
|
30750
|
+
'total.first':'Erster',
|
|
30751
|
+
'total.last':'Letzter',
|
|
30752
|
+
'total.median':'Median',
|
|
30753
|
+
'total.p25':'25. Perzentil',
|
|
30754
|
+
'total.p75':'75. Perzentil',
|
|
30755
|
+
'total.p90':'90. Perzentil',
|
|
30756
|
+
'total.p95':'95. Perzentil',
|
|
30757
|
+
'total.p99':'99. Perzentil',
|
|
30758
|
+
'total.iqr':'Interquartilsabstand',
|
|
30759
|
+
'total.mad':'Mittlere absolute Abweichung',
|
|
30760
|
+
'total.variance':'Varianz',
|
|
30761
|
+
'total.varianceP':'Varianz (Grundgesamtheit)',
|
|
30762
|
+
'total.stddev':'Standardabweichung',
|
|
30763
|
+
'total.stddevP':'Standardabweichung (Grundgesamtheit)',
|
|
30764
|
+
'total.range':'Spannweite',
|
|
30765
|
+
'total.distinct':'Eindeutige',
|
|
30766
|
+
'total.mode':'Modus',
|
|
30767
|
+
'total.skewness':'Schiefe',
|
|
30768
|
+
'total.kurtosis':'Wölbung',
|
|
30769
|
+
'total.geomean':'Geometrisches Mittel',
|
|
30770
|
+
'total.harmean':'Harmonisches Mittel',
|
|
30771
|
+
'total.sumSquares':'Quadratsumme',
|
|
30772
|
+
'total.weightedAvg':'Gewichteter Mittelwert',
|
|
30773
|
+
'total.argmin':'Niedrigster nach',
|
|
30774
|
+
'total.argmax':'Höchster nach',
|
|
30775
|
+
'total.hhi':'Konzentration (HHI)',
|
|
30776
|
+
'total.entropy':'Entropie',
|
|
30777
|
+
'total.evenness':'Gleichmäßigkeit',
|
|
30778
|
+
'total.top3Share':'Anteil Top 3',
|
|
30779
|
+
'total.top10Share':'Anteil Top 10',
|
|
30780
|
+
'total.gini':'Gini-Koeffizient',
|
|
30781
|
+
'total.trimmedMean':'Getrimmtes Mittel',
|
|
30782
|
+
'total.winsorizedMean':'Winsorisiertes Mittel',
|
|
30783
|
+
'total.robustOutliers':'Ausreißer (robust)',
|
|
30784
|
+
'total.jarqueBera':'Jarque–Bera',
|
|
29555
30785
|
'stats.column':'Spalte',
|
|
29556
30786
|
'stats.choose':'Spalte zum Analysieren wählen',
|
|
29557
30787
|
'stats.noColumns':'Keine numerischen Spalten zum Analysieren',
|
|
@@ -29571,6 +30801,15 @@ other:'{count} Zellen aktualisiert',
|
|
|
29571
30801
|
'stats.outliers':'Ausreißer',
|
|
29572
30802
|
'stats.distribution':'Verteilung',
|
|
29573
30803
|
'stats.bin':'{count} zwischen {from} und {to}',
|
|
30804
|
+
'stats.section.shape':'Form',
|
|
30805
|
+
'stats.section.robust':'Robust',
|
|
30806
|
+
'stats.section.concentration':'Konzentration',
|
|
30807
|
+
'stats.section.capability':'Fähigkeit',
|
|
30808
|
+
'stats.cp':'Cp',
|
|
30809
|
+
'stats.cpk':'Cpk',
|
|
30810
|
+
'stats.pp':'Pp',
|
|
30811
|
+
'stats.ppk':'Ppk',
|
|
30812
|
+
'stats.outOfSpec':'Außerhalb der Spezifikation',
|
|
29574
30813
|
'stats.filtered':'Von {count} gefilterten Zeilen',
|
|
29575
30814
|
'panel.zone.group':'Zeilengruppen',
|
|
29576
30815
|
'panel.zone.values':'Werte',
|
|
@@ -29975,6 +31214,62 @@ other:'{count} cellen bijgewerkt',
|
|
|
29975
31214
|
'panel.quickFilter':'Snelfilter',
|
|
29976
31215
|
'panel.formatting':'Opmaak',
|
|
29977
31216
|
'panel.statistics':'Statistiek',
|
|
31217
|
+
'panel.compare':'Vergelijken',
|
|
31218
|
+
'compare.first':'Eerste kolom',
|
|
31219
|
+
'compare.second':'Tweede kolom',
|
|
31220
|
+
'compare.needTwo':'Er zijn twee numerieke kolommen nodig',
|
|
31221
|
+
'compare.noPairs':'Geen rij heeft een waarde in beide',
|
|
31222
|
+
'compare.pairs':'{count} paren',
|
|
31223
|
+
'compare.pearson':'Correlatie (Pearson)',
|
|
31224
|
+
'compare.spearman':'Rangcorrelatie (Spearman)',
|
|
31225
|
+
'compare.kendall':'Kendalls tau',
|
|
31226
|
+
'compare.covariance':'Covariantie',
|
|
31227
|
+
'compare.slope':'Helling',
|
|
31228
|
+
'compare.intercept':'Snijpunt',
|
|
31229
|
+
'compare.r2':'R²',
|
|
31230
|
+
'compare.stdError':'Standaardfout',
|
|
31231
|
+
'compare.weighted':'Gewogen gemiddelde',
|
|
31232
|
+
'total.sum':'Som',
|
|
31233
|
+
'total.avg':'Gemiddelde',
|
|
31234
|
+
'total.min':'Min',
|
|
31235
|
+
'total.max':'Max',
|
|
31236
|
+
'total.count':'Aantal',
|
|
31237
|
+
'total.countValues':'Aantal waarden',
|
|
31238
|
+
'total.first':'Eerste',
|
|
31239
|
+
'total.last':'Laatste',
|
|
31240
|
+
'total.median':'Mediaan',
|
|
31241
|
+
'total.p25':'25e percentiel',
|
|
31242
|
+
'total.p75':'75e percentiel',
|
|
31243
|
+
'total.p90':'90e percentiel',
|
|
31244
|
+
'total.p95':'95e percentiel',
|
|
31245
|
+
'total.p99':'99e percentiel',
|
|
31246
|
+
'total.iqr':'Interkwartielafstand',
|
|
31247
|
+
'total.mad':'Mediane absolute afwijking',
|
|
31248
|
+
'total.variance':'Variantie',
|
|
31249
|
+
'total.varianceP':'Variantie (populatie)',
|
|
31250
|
+
'total.stddev':'Standaardafwijking',
|
|
31251
|
+
'total.stddevP':'Standaardafwijking (populatie)',
|
|
31252
|
+
'total.range':'Bereik',
|
|
31253
|
+
'total.distinct':'Unieke waarden',
|
|
31254
|
+
'total.mode':'Modus',
|
|
31255
|
+
'total.skewness':'Scheefheid',
|
|
31256
|
+
'total.kurtosis':'Kurtosis',
|
|
31257
|
+
'total.geomean':'Meetkundig gemiddelde',
|
|
31258
|
+
'total.harmean':'Harmonisch gemiddelde',
|
|
31259
|
+
'total.sumSquares':'Kwadratensom',
|
|
31260
|
+
'total.weightedAvg':'Gewogen gemiddelde',
|
|
31261
|
+
'total.argmin':'Laagste op',
|
|
31262
|
+
'total.argmax':'Hoogste op',
|
|
31263
|
+
'total.hhi':'Concentratie (HHI)',
|
|
31264
|
+
'total.entropy':'Entropie',
|
|
31265
|
+
'total.evenness':'Gelijkmatigheid',
|
|
31266
|
+
'total.top3Share':'Aandeel top 3',
|
|
31267
|
+
'total.top10Share':'Aandeel top 10',
|
|
31268
|
+
'total.gini':'Gini-coëfficiënt',
|
|
31269
|
+
'total.trimmedMean':'Getrimd gemiddelde',
|
|
31270
|
+
'total.winsorizedMean':'Gewinsoriseerd gemiddelde',
|
|
31271
|
+
'total.robustOutliers':'Uitschieters (robuust)',
|
|
31272
|
+
'total.jarqueBera':'Jarque–Bera',
|
|
29978
31273
|
'stats.column':'Kolom',
|
|
29979
31274
|
'stats.choose':'Kies een kolom om te analyseren',
|
|
29980
31275
|
'stats.noColumns':'Geen numerieke kolommen om te analyseren',
|
|
@@ -29994,6 +31289,15 @@ other:'{count} cellen bijgewerkt',
|
|
|
29994
31289
|
'stats.outliers':'Uitschieters',
|
|
29995
31290
|
'stats.distribution':'Verdeling',
|
|
29996
31291
|
'stats.bin':'{count} tussen {from} en {to}',
|
|
31292
|
+
'stats.section.shape':'Vorm',
|
|
31293
|
+
'stats.section.robust':'Robuust',
|
|
31294
|
+
'stats.section.concentration':'Concentratie',
|
|
31295
|
+
'stats.section.capability':'Capabiliteit',
|
|
31296
|
+
'stats.cp':'Cp',
|
|
31297
|
+
'stats.cpk':'Cpk',
|
|
31298
|
+
'stats.pp':'Pp',
|
|
31299
|
+
'stats.ppk':'Ppk',
|
|
31300
|
+
'stats.outOfSpec':'Buiten specificatie',
|
|
29997
31301
|
'stats.filtered':'Van {count} gefilterde rijen',
|
|
29998
31302
|
'panel.zone.group':'de rijgroepen',
|
|
29999
31303
|
'panel.zone.values':'de waarden',
|
|
@@ -30398,6 +31702,62 @@ other:'{count} celler uppdaterade',
|
|
|
30398
31702
|
'panel.quickFilter':'Snabbfilter',
|
|
30399
31703
|
'panel.formatting':'Formatering',
|
|
30400
31704
|
'panel.statistics':'Statistik',
|
|
31705
|
+
'panel.compare':'Jämför',
|
|
31706
|
+
'compare.first':'Första kolumnen',
|
|
31707
|
+
'compare.second':'Andra kolumnen',
|
|
31708
|
+
'compare.needTwo':'Två numeriska kolumner krävs',
|
|
31709
|
+
'compare.noPairs':'Ingen rad har värde i båda',
|
|
31710
|
+
'compare.pairs':'{count} par',
|
|
31711
|
+
'compare.pearson':'Korrelation (Pearson)',
|
|
31712
|
+
'compare.spearman':'Rangkorrelation (Spearman)',
|
|
31713
|
+
'compare.kendall':'Kendalls tau',
|
|
31714
|
+
'compare.covariance':'Kovarians',
|
|
31715
|
+
'compare.slope':'Lutning',
|
|
31716
|
+
'compare.intercept':'Intercept',
|
|
31717
|
+
'compare.r2':'R²',
|
|
31718
|
+
'compare.stdError':'Standardfel',
|
|
31719
|
+
'compare.weighted':'Viktat medelvärde',
|
|
31720
|
+
'total.sum':'Summa',
|
|
31721
|
+
'total.avg':'Medelvärde',
|
|
31722
|
+
'total.min':'Min',
|
|
31723
|
+
'total.max':'Max',
|
|
31724
|
+
'total.count':'Antal',
|
|
31725
|
+
'total.countValues':'Antal värden',
|
|
31726
|
+
'total.first':'Första',
|
|
31727
|
+
'total.last':'Sista',
|
|
31728
|
+
'total.median':'Median',
|
|
31729
|
+
'total.p25':'25:e percentilen',
|
|
31730
|
+
'total.p75':'75:e percentilen',
|
|
31731
|
+
'total.p90':'90:e percentilen',
|
|
31732
|
+
'total.p95':'95:e percentilen',
|
|
31733
|
+
'total.p99':'99:e percentilen',
|
|
31734
|
+
'total.iqr':'Kvartilavstånd',
|
|
31735
|
+
'total.mad':'Median absolutavvikelse',
|
|
31736
|
+
'total.variance':'Varians',
|
|
31737
|
+
'total.varianceP':'Varians (population)',
|
|
31738
|
+
'total.stddev':'Standardavvikelse',
|
|
31739
|
+
'total.stddevP':'Standardavvikelse (population)',
|
|
31740
|
+
'total.range':'Variationsbredd',
|
|
31741
|
+
'total.distinct':'Unika',
|
|
31742
|
+
'total.mode':'Typvärde',
|
|
31743
|
+
'total.skewness':'Skevhet',
|
|
31744
|
+
'total.kurtosis':'Toppighet',
|
|
31745
|
+
'total.geomean':'Geometriskt medelvärde',
|
|
31746
|
+
'total.harmean':'Harmoniskt medelvärde',
|
|
31747
|
+
'total.sumSquares':'Kvadratsumma',
|
|
31748
|
+
'total.weightedAvg':'Viktat medelvärde',
|
|
31749
|
+
'total.argmin':'Lägst efter',
|
|
31750
|
+
'total.argmax':'Högst efter',
|
|
31751
|
+
'total.hhi':'Koncentration (HHI)',
|
|
31752
|
+
'total.entropy':'Entropi',
|
|
31753
|
+
'total.evenness':'Jämnhet',
|
|
31754
|
+
'total.top3Share':'Andel topp 3',
|
|
31755
|
+
'total.top10Share':'Andel topp 10',
|
|
31756
|
+
'total.gini':'Ginikoefficient',
|
|
31757
|
+
'total.trimmedMean':'Trimmat medelvärde',
|
|
31758
|
+
'total.winsorizedMean':'Winsoriserat medelvärde',
|
|
31759
|
+
'total.robustOutliers':'Avvikande värden (robust)',
|
|
31760
|
+
'total.jarqueBera':'Jarque–Bera',
|
|
30401
31761
|
'stats.column':'Kolumn',
|
|
30402
31762
|
'stats.choose':'Välj en kolumn att analysera',
|
|
30403
31763
|
'stats.noColumns':'Inga numeriska kolumner att analysera',
|
|
@@ -30417,6 +31777,15 @@ other:'{count} celler uppdaterade',
|
|
|
30417
31777
|
'stats.outliers':'Avvikande värden',
|
|
30418
31778
|
'stats.distribution':'Fördelning',
|
|
30419
31779
|
'stats.bin':'{count} mellan {from} och {to}',
|
|
31780
|
+
'stats.section.shape':'Form',
|
|
31781
|
+
'stats.section.robust':'Robust',
|
|
31782
|
+
'stats.section.concentration':'Koncentration',
|
|
31783
|
+
'stats.section.capability':'Duglighet',
|
|
31784
|
+
'stats.cp':'Cp',
|
|
31785
|
+
'stats.cpk':'Cpk',
|
|
31786
|
+
'stats.pp':'Pp',
|
|
31787
|
+
'stats.ppk':'Ppk',
|
|
31788
|
+
'stats.outOfSpec':'Utanför specifikation',
|
|
30420
31789
|
'stats.filtered':'Av {count} filtrerade rader',
|
|
30421
31790
|
'panel.zone.group':'radgrupperna',
|
|
30422
31791
|
'panel.zone.values':'värdena',
|
|
@@ -30821,6 +32190,62 @@ other:'{count} celler opdateret',
|
|
|
30821
32190
|
'panel.quickFilter':'Hurtigfilter',
|
|
30822
32191
|
'panel.formatting':'Formatering',
|
|
30823
32192
|
'panel.statistics':'Statistik',
|
|
32193
|
+
'panel.compare':'Sammenlign',
|
|
32194
|
+
'compare.first':'Første kolonne',
|
|
32195
|
+
'compare.second':'Anden kolonne',
|
|
32196
|
+
'compare.needTwo':'Der kræves to numeriske kolonner',
|
|
32197
|
+
'compare.noPairs':'Ingen rækker har værdi i begge',
|
|
32198
|
+
'compare.pairs':'{count} par',
|
|
32199
|
+
'compare.pearson':'Korrelation (Pearson)',
|
|
32200
|
+
'compare.spearman':'Rangkorrelation (Spearman)',
|
|
32201
|
+
'compare.kendall':'Kendalls tau',
|
|
32202
|
+
'compare.covariance':'Kovarians',
|
|
32203
|
+
'compare.slope':'Hældning',
|
|
32204
|
+
'compare.intercept':'Skæring',
|
|
32205
|
+
'compare.r2':'R²',
|
|
32206
|
+
'compare.stdError':'Standardfejl',
|
|
32207
|
+
'compare.weighted':'Vægtet gennemsnit',
|
|
32208
|
+
'total.sum':'Sum',
|
|
32209
|
+
'total.avg':'Gennemsnit',
|
|
32210
|
+
'total.min':'Min',
|
|
32211
|
+
'total.max':'Maks',
|
|
32212
|
+
'total.count':'Antal',
|
|
32213
|
+
'total.countValues':'Antal værdier',
|
|
32214
|
+
'total.first':'Første',
|
|
32215
|
+
'total.last':'Sidste',
|
|
32216
|
+
'total.median':'Median',
|
|
32217
|
+
'total.p25':'25. percentil',
|
|
32218
|
+
'total.p75':'75. percentil',
|
|
32219
|
+
'total.p90':'90. percentil',
|
|
32220
|
+
'total.p95':'95. percentil',
|
|
32221
|
+
'total.p99':'99. percentil',
|
|
32222
|
+
'total.iqr':'Interkvartilbredde',
|
|
32223
|
+
'total.mad':'Median absolut afvigelse',
|
|
32224
|
+
'total.variance':'Varians',
|
|
32225
|
+
'total.varianceP':'Varians (population)',
|
|
32226
|
+
'total.stddev':'Standardafvigelse',
|
|
32227
|
+
'total.stddevP':'Standardafvigelse (population)',
|
|
32228
|
+
'total.range':'Spændvidde',
|
|
32229
|
+
'total.distinct':'Unikke',
|
|
32230
|
+
'total.mode':'Typetal',
|
|
32231
|
+
'total.skewness':'Skævhed',
|
|
32232
|
+
'total.kurtosis':'Kurtosis',
|
|
32233
|
+
'total.geomean':'Geometrisk gennemsnit',
|
|
32234
|
+
'total.harmean':'Harmonisk gennemsnit',
|
|
32235
|
+
'total.sumSquares':'Kvadratsum',
|
|
32236
|
+
'total.weightedAvg':'Vægtet gennemsnit',
|
|
32237
|
+
'total.argmin':'Laveste efter',
|
|
32238
|
+
'total.argmax':'Højeste efter',
|
|
32239
|
+
'total.hhi':'Koncentration (HHI)',
|
|
32240
|
+
'total.entropy':'Entropi',
|
|
32241
|
+
'total.evenness':'Jævnhed',
|
|
32242
|
+
'total.top3Share':'Top 3-andel',
|
|
32243
|
+
'total.top10Share':'Top 10-andel',
|
|
32244
|
+
'total.gini':'Gini-koefficient',
|
|
32245
|
+
'total.trimmedMean':'Trimmet gennemsnit',
|
|
32246
|
+
'total.winsorizedMean':'Winsoriseret gennemsnit',
|
|
32247
|
+
'total.robustOutliers':'Outliere (robust)',
|
|
32248
|
+
'total.jarqueBera':'Jarque–Bera',
|
|
30824
32249
|
'stats.column':'Kolonne',
|
|
30825
32250
|
'stats.choose':'Vælg en kolonne at analysere',
|
|
30826
32251
|
'stats.noColumns':'Ingen numeriske kolonner at analysere',
|
|
@@ -30840,6 +32265,15 @@ other:'{count} celler opdateret',
|
|
|
30840
32265
|
'stats.outliers':'Outliere',
|
|
30841
32266
|
'stats.distribution':'Fordeling',
|
|
30842
32267
|
'stats.bin':'{count} mellem {from} og {to}',
|
|
32268
|
+
'stats.section.shape':'Form',
|
|
32269
|
+
'stats.section.robust':'Robust',
|
|
32270
|
+
'stats.section.concentration':'Koncentration',
|
|
32271
|
+
'stats.section.capability':'Kapabilitet',
|
|
32272
|
+
'stats.cp':'Cp',
|
|
32273
|
+
'stats.cpk':'Cpk',
|
|
32274
|
+
'stats.pp':'Pp',
|
|
32275
|
+
'stats.ppk':'Ppk',
|
|
32276
|
+
'stats.outOfSpec':'Uden for specifikation',
|
|
30843
32277
|
'stats.filtered':'Ud af {count} filtrerede rækker',
|
|
30844
32278
|
'panel.zone.group':'rækkegrupperne',
|
|
30845
32279
|
'panel.zone.values':'værdierne',
|
|
@@ -31244,6 +32678,62 @@ other:'{count} celler oppdatert',
|
|
|
31244
32678
|
'panel.quickFilter':'Hurtigfilter',
|
|
31245
32679
|
'panel.formatting':'Formatering',
|
|
31246
32680
|
'panel.statistics':'Statistikk',
|
|
32681
|
+
'panel.compare':'Sammenlign',
|
|
32682
|
+
'compare.first':'Første kolonne',
|
|
32683
|
+
'compare.second':'Andre kolonne',
|
|
32684
|
+
'compare.needTwo':'Det trengs to numeriske kolonner',
|
|
32685
|
+
'compare.noPairs':'Ingen rader har verdi i begge',
|
|
32686
|
+
'compare.pairs':'{count} par',
|
|
32687
|
+
'compare.pearson':'Korrelasjon (Pearson)',
|
|
32688
|
+
'compare.spearman':'Rangkorrelasjon (Spearman)',
|
|
32689
|
+
'compare.kendall':'Kendalls tau',
|
|
32690
|
+
'compare.covariance':'Kovarians',
|
|
32691
|
+
'compare.slope':'Stigningstall',
|
|
32692
|
+
'compare.intercept':'Skjæringspunkt',
|
|
32693
|
+
'compare.r2':'R²',
|
|
32694
|
+
'compare.stdError':'Standardfeil',
|
|
32695
|
+
'compare.weighted':'Vektet gjennomsnitt',
|
|
32696
|
+
'total.sum':'Sum',
|
|
32697
|
+
'total.avg':'Gjennomsnitt',
|
|
32698
|
+
'total.min':'Min',
|
|
32699
|
+
'total.max':'Maks',
|
|
32700
|
+
'total.count':'Antall',
|
|
32701
|
+
'total.countValues':'Antall verdier',
|
|
32702
|
+
'total.first':'Første',
|
|
32703
|
+
'total.last':'Siste',
|
|
32704
|
+
'total.median':'Median',
|
|
32705
|
+
'total.p25':'25. persentil',
|
|
32706
|
+
'total.p75':'75. persentil',
|
|
32707
|
+
'total.p90':'90. persentil',
|
|
32708
|
+
'total.p95':'95. persentil',
|
|
32709
|
+
'total.p99':'99. persentil',
|
|
32710
|
+
'total.iqr':'Kvartilbredde',
|
|
32711
|
+
'total.mad':'Median absolutt avvik',
|
|
32712
|
+
'total.variance':'Varians',
|
|
32713
|
+
'total.varianceP':'Varians (populasjon)',
|
|
32714
|
+
'total.stddev':'Standardavvik',
|
|
32715
|
+
'total.stddevP':'Standardavvik (populasjon)',
|
|
32716
|
+
'total.range':'Variasjonsbredde',
|
|
32717
|
+
'total.distinct':'Unike',
|
|
32718
|
+
'total.mode':'Typetall',
|
|
32719
|
+
'total.skewness':'Skjevhet',
|
|
32720
|
+
'total.kurtosis':'Kurtose',
|
|
32721
|
+
'total.geomean':'Geometrisk gjennomsnitt',
|
|
32722
|
+
'total.harmean':'Harmonisk gjennomsnitt',
|
|
32723
|
+
'total.sumSquares':'Kvadratsum',
|
|
32724
|
+
'total.weightedAvg':'Vektet gjennomsnitt',
|
|
32725
|
+
'total.argmin':'Laveste etter',
|
|
32726
|
+
'total.argmax':'Høyeste etter',
|
|
32727
|
+
'total.hhi':'Konsentrasjon (HHI)',
|
|
32728
|
+
'total.entropy':'Entropi',
|
|
32729
|
+
'total.evenness':'Jevnhet',
|
|
32730
|
+
'total.top3Share':'Topp 3-andel',
|
|
32731
|
+
'total.top10Share':'Topp 10-andel',
|
|
32732
|
+
'total.gini':'Gini-koeffisient',
|
|
32733
|
+
'total.trimmedMean':'Trimmet gjennomsnitt',
|
|
32734
|
+
'total.winsorizedMean':'Winsorisert gjennomsnitt',
|
|
32735
|
+
'total.robustOutliers':'Uteliggere (robust)',
|
|
32736
|
+
'total.jarqueBera':'Jarque–Bera',
|
|
31247
32737
|
'stats.column':'Kolonne',
|
|
31248
32738
|
'stats.choose':'Velg en kolonne å analysere',
|
|
31249
32739
|
'stats.noColumns':'Ingen numeriske kolonner å analysere',
|
|
@@ -31263,6 +32753,15 @@ other:'{count} celler oppdatert',
|
|
|
31263
32753
|
'stats.outliers':'Uteliggere',
|
|
31264
32754
|
'stats.distribution':'Fordeling',
|
|
31265
32755
|
'stats.bin':'{count} mellom {from} og {to}',
|
|
32756
|
+
'stats.section.shape':'Form',
|
|
32757
|
+
'stats.section.robust':'Robust',
|
|
32758
|
+
'stats.section.concentration':'Konsentrasjon',
|
|
32759
|
+
'stats.section.capability':'Kapabilitet',
|
|
32760
|
+
'stats.cp':'Cp',
|
|
32761
|
+
'stats.cpk':'Cpk',
|
|
32762
|
+
'stats.pp':'Pp',
|
|
32763
|
+
'stats.ppk':'Ppk',
|
|
32764
|
+
'stats.outOfSpec':'Utenfor spesifikasjon',
|
|
31266
32765
|
'stats.filtered':'Av {count} filtrerte rader',
|
|
31267
32766
|
'panel.zone.group':'radgruppene',
|
|
31268
32767
|
'panel.zone.values':'verdiene',
|
|
@@ -31667,6 +33166,62 @@ other:'{count} solua päivitetty',
|
|
|
31667
33166
|
'panel.quickFilter':'Pikasuodatin',
|
|
31668
33167
|
'panel.formatting':'Muotoilu',
|
|
31669
33168
|
'panel.statistics':'Tilastot',
|
|
33169
|
+
'panel.compare':'Vertaa',
|
|
33170
|
+
'compare.first':'Ensimmäinen sarake',
|
|
33171
|
+
'compare.second':'Toinen sarake',
|
|
33172
|
+
'compare.needTwo':'Vertailuun tarvitaan kaksi numeerista saraketta',
|
|
33173
|
+
'compare.noPairs':'Yhdelläkään rivillä ei ole arvoa molemmissa',
|
|
33174
|
+
'compare.pairs':'{count} paria',
|
|
33175
|
+
'compare.pearson':'Korrelaatio (Pearson)',
|
|
33176
|
+
'compare.spearman':'Järjestyskorrelaatio (Spearman)',
|
|
33177
|
+
'compare.kendall':'Kendallin tau',
|
|
33178
|
+
'compare.covariance':'Kovarianssi',
|
|
33179
|
+
'compare.slope':'Kulmakerroin',
|
|
33180
|
+
'compare.intercept':'Vakiotermi',
|
|
33181
|
+
'compare.r2':'R²',
|
|
33182
|
+
'compare.stdError':'Keskivirhe',
|
|
33183
|
+
'compare.weighted':'Painotettu keskiarvo',
|
|
33184
|
+
'total.sum':'Summa',
|
|
33185
|
+
'total.avg':'Keskiarvo',
|
|
33186
|
+
'total.min':'Pienin',
|
|
33187
|
+
'total.max':'Suurin',
|
|
33188
|
+
'total.count':'Lukumäärä',
|
|
33189
|
+
'total.countValues':'Arvojen määrä',
|
|
33190
|
+
'total.first':'Ensimmäinen',
|
|
33191
|
+
'total.last':'Viimeinen',
|
|
33192
|
+
'total.median':'Mediaani',
|
|
33193
|
+
'total.p25':'25. persentiili',
|
|
33194
|
+
'total.p75':'75. persentiili',
|
|
33195
|
+
'total.p90':'90. persentiili',
|
|
33196
|
+
'total.p95':'95. persentiili',
|
|
33197
|
+
'total.p99':'99. persentiili',
|
|
33198
|
+
'total.iqr':'Kvartiiliväli',
|
|
33199
|
+
'total.mad':'Mediaanin absoluuttinen poikkeama',
|
|
33200
|
+
'total.variance':'Varianssi',
|
|
33201
|
+
'total.varianceP':'Varianssi (populaatio)',
|
|
33202
|
+
'total.stddev':'Keskihajonta',
|
|
33203
|
+
'total.stddevP':'Keskihajonta (populaatio)',
|
|
33204
|
+
'total.range':'Vaihteluväli',
|
|
33205
|
+
'total.distinct':'Eri arvoja',
|
|
33206
|
+
'total.mode':'Moodi',
|
|
33207
|
+
'total.skewness':'Vinous',
|
|
33208
|
+
'total.kurtosis':'Huipukkuus',
|
|
33209
|
+
'total.geomean':'Geometrinen keskiarvo',
|
|
33210
|
+
'total.harmean':'Harmoninen keskiarvo',
|
|
33211
|
+
'total.sumSquares':'Neliösumma',
|
|
33212
|
+
'total.weightedAvg':'Painotettu keskiarvo',
|
|
33213
|
+
'total.argmin':'Pienin sarakkeen mukaan',
|
|
33214
|
+
'total.argmax':'Suurin sarakkeen mukaan',
|
|
33215
|
+
'total.hhi':'Keskittyminen (HHI)',
|
|
33216
|
+
'total.entropy':'Entropia',
|
|
33217
|
+
'total.evenness':'Tasaisuus',
|
|
33218
|
+
'total.top3Share':'Kolmen suurimman osuus',
|
|
33219
|
+
'total.top10Share':'Kymmenen suurimman osuus',
|
|
33220
|
+
'total.gini':'Gini-kerroin',
|
|
33221
|
+
'total.trimmedMean':'Typistetty keskiarvo',
|
|
33222
|
+
'total.winsorizedMean':'Winsoroitu keskiarvo',
|
|
33223
|
+
'total.robustOutliers':'Poikkeavat arvot (robusti)',
|
|
33224
|
+
'total.jarqueBera':'Jarque–Bera',
|
|
31670
33225
|
'stats.column':'Sarake',
|
|
31671
33226
|
'stats.choose':'Valitse analysoitava sarake',
|
|
31672
33227
|
'stats.noColumns':'Ei numeerisia sarakkeita analysoitavaksi',
|
|
@@ -31686,6 +33241,15 @@ other:'{count} solua päivitetty',
|
|
|
31686
33241
|
'stats.outliers':'Poikkeavat arvot',
|
|
31687
33242
|
'stats.distribution':'Jakauma',
|
|
31688
33243
|
'stats.bin':'{count} välillä {from}–{to}',
|
|
33244
|
+
'stats.section.shape':'Muoto',
|
|
33245
|
+
'stats.section.robust':'Robusti',
|
|
33246
|
+
'stats.section.concentration':'Keskittyminen',
|
|
33247
|
+
'stats.section.capability':'Suorituskyky',
|
|
33248
|
+
'stats.cp':'Cp',
|
|
33249
|
+
'stats.cpk':'Cpk',
|
|
33250
|
+
'stats.pp':'Pp',
|
|
33251
|
+
'stats.ppk':'Ppk',
|
|
33252
|
+
'stats.outOfSpec':'Spesifikaation ulkopuolella',
|
|
31689
33253
|
'stats.filtered':'{count} suodatetusta rivistä',
|
|
31690
33254
|
'panel.zone.group':'riviryhmiin',
|
|
31691
33255
|
'panel.zone.values':'arvoihin',
|
|
@@ -32114,6 +33678,62 @@ other:'zaktualizowano {count} komórek',
|
|
|
32114
33678
|
'panel.quickFilter':'Szybki filtr',
|
|
32115
33679
|
'panel.formatting':'Formatowanie',
|
|
32116
33680
|
'panel.statistics':'Statystyki',
|
|
33681
|
+
'panel.compare':'Porównaj',
|
|
33682
|
+
'compare.first':'Pierwsza kolumna',
|
|
33683
|
+
'compare.second':'Druga kolumna',
|
|
33684
|
+
'compare.needTwo':'Do porównania potrzebne są dwie kolumny liczbowe',
|
|
33685
|
+
'compare.noPairs':'Żaden wiersz nie ma wartości w obu',
|
|
33686
|
+
'compare.pairs':'Liczba par: {count}',
|
|
33687
|
+
'compare.pearson':'Korelacja (Pearson)',
|
|
33688
|
+
'compare.spearman':'Korelacja rang (Spearman)',
|
|
33689
|
+
'compare.kendall':'Tau Kendalla',
|
|
33690
|
+
'compare.covariance':'Kowariancja',
|
|
33691
|
+
'compare.slope':'Nachylenie',
|
|
33692
|
+
'compare.intercept':'Wyraz wolny',
|
|
33693
|
+
'compare.r2':'R²',
|
|
33694
|
+
'compare.stdError':'Błąd standardowy',
|
|
33695
|
+
'compare.weighted':'Średnia ważona',
|
|
33696
|
+
'total.sum':'Suma',
|
|
33697
|
+
'total.avg':'Średnia',
|
|
33698
|
+
'total.min':'Min',
|
|
33699
|
+
'total.max':'Maks',
|
|
33700
|
+
'total.count':'Liczba',
|
|
33701
|
+
'total.countValues':'Liczba wartości',
|
|
33702
|
+
'total.first':'Pierwszy',
|
|
33703
|
+
'total.last':'Ostatni',
|
|
33704
|
+
'total.median':'Mediana',
|
|
33705
|
+
'total.p25':'25. percentyl',
|
|
33706
|
+
'total.p75':'75. percentyl',
|
|
33707
|
+
'total.p90':'90. percentyl',
|
|
33708
|
+
'total.p95':'95. percentyl',
|
|
33709
|
+
'total.p99':'99. percentyl',
|
|
33710
|
+
'total.iqr':'Rozstęp ćwiartkowy',
|
|
33711
|
+
'total.mad':'Mediana odchyleń bezwzględnych',
|
|
33712
|
+
'total.variance':'Wariancja',
|
|
33713
|
+
'total.varianceP':'Wariancja (populacja)',
|
|
33714
|
+
'total.stddev':'Odchylenie standardowe',
|
|
33715
|
+
'total.stddevP':'Odchylenie standardowe (populacja)',
|
|
33716
|
+
'total.range':'Rozstęp',
|
|
33717
|
+
'total.distinct':'Unikatowe',
|
|
33718
|
+
'total.mode':'Dominanta',
|
|
33719
|
+
'total.skewness':'Skośność',
|
|
33720
|
+
'total.kurtosis':'Kurtoza',
|
|
33721
|
+
'total.geomean':'Średnia geometryczna',
|
|
33722
|
+
'total.harmean':'Średnia harmoniczna',
|
|
33723
|
+
'total.sumSquares':'Suma kwadratów',
|
|
33724
|
+
'total.weightedAvg':'Średnia ważona',
|
|
33725
|
+
'total.argmin':'Najniższy wg',
|
|
33726
|
+
'total.argmax':'Najwyższy wg',
|
|
33727
|
+
'total.hhi':'Koncentracja (HHI)',
|
|
33728
|
+
'total.entropy':'Entropia',
|
|
33729
|
+
'total.evenness':'Równomierność',
|
|
33730
|
+
'total.top3Share':'Udział 3 największych',
|
|
33731
|
+
'total.top10Share':'Udział 10 największych',
|
|
33732
|
+
'total.gini':'Współczynnik Giniego',
|
|
33733
|
+
'total.trimmedMean':'Średnia ucinana',
|
|
33734
|
+
'total.winsorizedMean':'Średnia winsorowska',
|
|
33735
|
+
'total.robustOutliers':'Wartości odstające (odporne)',
|
|
33736
|
+
'total.jarqueBera':'Jarque–Bera',
|
|
32117
33737
|
'stats.column':'Kolumna',
|
|
32118
33738
|
'stats.choose':'Wybierz kolumnę do analizy',
|
|
32119
33739
|
'stats.noColumns':'Brak kolumn liczbowych do analizy',
|
|
@@ -32133,6 +33753,15 @@ other:'zaktualizowano {count} komórek',
|
|
|
32133
33753
|
'stats.outliers':'Wartości odstające',
|
|
32134
33754
|
'stats.distribution':'Rozkład',
|
|
32135
33755
|
'stats.bin':'{count} między {from} a {to}',
|
|
33756
|
+
'stats.section.shape':'Kształt',
|
|
33757
|
+
'stats.section.robust':'Odporne',
|
|
33758
|
+
'stats.section.concentration':'Koncentracja',
|
|
33759
|
+
'stats.section.capability':'Zdolność',
|
|
33760
|
+
'stats.cp':'Cp',
|
|
33761
|
+
'stats.cpk':'Cpk',
|
|
33762
|
+
'stats.pp':'Pp',
|
|
33763
|
+
'stats.ppk':'Ppk',
|
|
33764
|
+
'stats.outOfSpec':'Poza specyfikacją',
|
|
32136
33765
|
'stats.filtered':'Z {count} przefiltrowanych wierszy',
|
|
32137
33766
|
'panel.zone.group':'grupowania wierszy',
|
|
32138
33767
|
'panel.zone.values':'wartości',
|
|
@@ -32565,6 +34194,62 @@ other:'aktualizováno {count} buněk',
|
|
|
32565
34194
|
'panel.quickFilter':'Rychlý filtr',
|
|
32566
34195
|
'panel.formatting':'Formátování',
|
|
32567
34196
|
'panel.statistics':'Statistika',
|
|
34197
|
+
'panel.compare':'Porovnat',
|
|
34198
|
+
'compare.first':'První sloupec',
|
|
34199
|
+
'compare.second':'Druhý sloupec',
|
|
34200
|
+
'compare.needTwo':'K porovnání jsou potřeba dva číselné sloupce',
|
|
34201
|
+
'compare.noPairs':'Žádné řádky nemají hodnotu v obou',
|
|
34202
|
+
'compare.pairs':'Počet dvojic: {count}',
|
|
34203
|
+
'compare.pearson':'Korelace (Pearson)',
|
|
34204
|
+
'compare.spearman':'Pořadová korelace (Spearman)',
|
|
34205
|
+
'compare.kendall':'Kendallovo tau',
|
|
34206
|
+
'compare.covariance':'Kovariance',
|
|
34207
|
+
'compare.slope':'Sklon',
|
|
34208
|
+
'compare.intercept':'Průsečík',
|
|
34209
|
+
'compare.r2':'R²',
|
|
34210
|
+
'compare.stdError':'Standardní chyba',
|
|
34211
|
+
'compare.weighted':'Vážený průměr',
|
|
34212
|
+
'total.sum':'Součet',
|
|
34213
|
+
'total.avg':'Průměr',
|
|
34214
|
+
'total.min':'Minimum',
|
|
34215
|
+
'total.max':'Maximum',
|
|
34216
|
+
'total.count':'Počet',
|
|
34217
|
+
'total.countValues':'Počet hodnot',
|
|
34218
|
+
'total.first':'První',
|
|
34219
|
+
'total.last':'Poslední',
|
|
34220
|
+
'total.median':'Medián',
|
|
34221
|
+
'total.p25':'25. percentil',
|
|
34222
|
+
'total.p75':'75. percentil',
|
|
34223
|
+
'total.p90':'90. percentil',
|
|
34224
|
+
'total.p95':'95. percentil',
|
|
34225
|
+
'total.p99':'99. percentil',
|
|
34226
|
+
'total.iqr':'Mezikvartilové rozpětí',
|
|
34227
|
+
'total.mad':'Mediánová absolutní odchylka',
|
|
34228
|
+
'total.variance':'Rozptyl',
|
|
34229
|
+
'total.varianceP':'Rozptyl (populace)',
|
|
34230
|
+
'total.stddev':'Směrodatná odchylka',
|
|
34231
|
+
'total.stddevP':'Směrodatná odchylka (populace)',
|
|
34232
|
+
'total.range':'Rozpětí',
|
|
34233
|
+
'total.distinct':'Jedinečných',
|
|
34234
|
+
'total.mode':'Modus',
|
|
34235
|
+
'total.skewness':'Šikmost',
|
|
34236
|
+
'total.kurtosis':'Špičatost',
|
|
34237
|
+
'total.geomean':'Geometrický průměr',
|
|
34238
|
+
'total.harmean':'Harmonický průměr',
|
|
34239
|
+
'total.sumSquares':'Součet čtverců',
|
|
34240
|
+
'total.weightedAvg':'Vážený průměr',
|
|
34241
|
+
'total.argmin':'Nejnižší podle',
|
|
34242
|
+
'total.argmax':'Nejvyšší podle',
|
|
34243
|
+
'total.hhi':'Koncentrace (HHI)',
|
|
34244
|
+
'total.entropy':'Entropie',
|
|
34245
|
+
'total.evenness':'Vyrovnanost',
|
|
34246
|
+
'total.top3Share':'Podíl top 3',
|
|
34247
|
+
'total.top10Share':'Podíl top 10',
|
|
34248
|
+
'total.gini':'Giniho koeficient',
|
|
34249
|
+
'total.trimmedMean':'Useknutý průměr',
|
|
34250
|
+
'total.winsorizedMean':'Winsorizovaný průměr',
|
|
34251
|
+
'total.robustOutliers':'Odlehlé hodnoty (robustní)',
|
|
34252
|
+
'total.jarqueBera':'Jarque–Bera',
|
|
32568
34253
|
'stats.column':'Sloupec',
|
|
32569
34254
|
'stats.choose':'Vyberte sloupec k analýze',
|
|
32570
34255
|
'stats.noColumns':'Žádné číselné sloupce k analýze',
|
|
@@ -32584,6 +34269,15 @@ other:'aktualizováno {count} buněk',
|
|
|
32584
34269
|
'stats.outliers':'Odlehlé hodnoty',
|
|
32585
34270
|
'stats.distribution':'Rozdělení',
|
|
32586
34271
|
'stats.bin':'{count} mezi {from} a {to}',
|
|
34272
|
+
'stats.section.shape':'Tvar',
|
|
34273
|
+
'stats.section.robust':'Robustní',
|
|
34274
|
+
'stats.section.concentration':'Koncentrace',
|
|
34275
|
+
'stats.section.capability':'Způsobilost',
|
|
34276
|
+
'stats.cp':'Cp',
|
|
34277
|
+
'stats.cpk':'Cpk',
|
|
34278
|
+
'stats.pp':'Pp',
|
|
34279
|
+
'stats.ppk':'Ppk',
|
|
34280
|
+
'stats.outOfSpec':'Mimo specifikaci',
|
|
32587
34281
|
'stats.filtered':'Z {count} filtrovaných řádků',
|
|
32588
34282
|
'panel.zone.group':'seskupení řádků',
|
|
32589
34283
|
'panel.zone.values':'hodnot',
|
|
@@ -32992,6 +34686,62 @@ other:'{count} cella frissítve',
|
|
|
32992
34686
|
'panel.quickFilter':'Gyorsszűrő',
|
|
32993
34687
|
'panel.formatting':'Formázás',
|
|
32994
34688
|
'panel.statistics':'Statisztika',
|
|
34689
|
+
'panel.compare':'Összehasonlítás',
|
|
34690
|
+
'compare.first':'Első oszlop',
|
|
34691
|
+
'compare.second':'Második oszlop',
|
|
34692
|
+
'compare.needTwo':'Két numerikus oszlop szükséges',
|
|
34693
|
+
'compare.noPairs':'Egyetlen sorban sincs érték mindkettőben',
|
|
34694
|
+
'compare.pairs':'{count} pár',
|
|
34695
|
+
'compare.pearson':'Korreláció (Pearson)',
|
|
34696
|
+
'compare.spearman':'Rangkorreláció (Spearman)',
|
|
34697
|
+
'compare.kendall':'Kendall-féle tau',
|
|
34698
|
+
'compare.covariance':'Kovariancia',
|
|
34699
|
+
'compare.slope':'Meredekség',
|
|
34700
|
+
'compare.intercept':'Tengelymetszet',
|
|
34701
|
+
'compare.r2':'R²',
|
|
34702
|
+
'compare.stdError':'Standard hiba',
|
|
34703
|
+
'compare.weighted':'Súlyozott átlag',
|
|
34704
|
+
'total.sum':'Összeg',
|
|
34705
|
+
'total.avg':'Átlag',
|
|
34706
|
+
'total.min':'Minimum',
|
|
34707
|
+
'total.max':'Maximum',
|
|
34708
|
+
'total.count':'Darabszám',
|
|
34709
|
+
'total.countValues':'Értékek száma',
|
|
34710
|
+
'total.first':'Első',
|
|
34711
|
+
'total.last':'Utolsó',
|
|
34712
|
+
'total.median':'Medián',
|
|
34713
|
+
'total.p25':'25. percentilis',
|
|
34714
|
+
'total.p75':'75. percentilis',
|
|
34715
|
+
'total.p90':'90. percentilis',
|
|
34716
|
+
'total.p95':'95. percentilis',
|
|
34717
|
+
'total.p99':'99. percentilis',
|
|
34718
|
+
'total.iqr':'Interkvartilis terjedelem',
|
|
34719
|
+
'total.mad':'Medián abszolút eltérés',
|
|
34720
|
+
'total.variance':'Variancia',
|
|
34721
|
+
'total.varianceP':'Variancia (sokaság)',
|
|
34722
|
+
'total.stddev':'Szórás',
|
|
34723
|
+
'total.stddevP':'Szórás (sokaság)',
|
|
34724
|
+
'total.range':'Terjedelem',
|
|
34725
|
+
'total.distinct':'Egyedi',
|
|
34726
|
+
'total.mode':'Módusz',
|
|
34727
|
+
'total.skewness':'Ferdeség',
|
|
34728
|
+
'total.kurtosis':'Csúcsosság',
|
|
34729
|
+
'total.geomean':'Mértani átlag',
|
|
34730
|
+
'total.harmean':'Harmonikus átlag',
|
|
34731
|
+
'total.sumSquares':'Négyzetösszeg',
|
|
34732
|
+
'total.weightedAvg':'Súlyozott átlag',
|
|
34733
|
+
'total.argmin':'Legalacsonyabb eszerint',
|
|
34734
|
+
'total.argmax':'Legmagasabb eszerint',
|
|
34735
|
+
'total.hhi':'Koncentráció (HHI)',
|
|
34736
|
+
'total.entropy':'Entrópia',
|
|
34737
|
+
'total.evenness':'Egyenletesség',
|
|
34738
|
+
'total.top3Share':'Top 3 részesedés',
|
|
34739
|
+
'total.top10Share':'Top 10 részesedés',
|
|
34740
|
+
'total.gini':'Gini-együttható',
|
|
34741
|
+
'total.trimmedMean':'Nyesett átlag',
|
|
34742
|
+
'total.winsorizedMean':'Winsorizált átlag',
|
|
34743
|
+
'total.robustOutliers':'Kiugró értékek (robusztus)',
|
|
34744
|
+
'total.jarqueBera':'Jarque–Bera',
|
|
32995
34745
|
'stats.column':'Oszlop',
|
|
32996
34746
|
'stats.choose':'Válasszon oszlopot az elemzéshez',
|
|
32997
34747
|
'stats.noColumns':'Nincs elemezhető numerikus oszlop',
|
|
@@ -33011,6 +34761,15 @@ other:'{count} cella frissítve',
|
|
|
33011
34761
|
'stats.outliers':'Kiugró értékek',
|
|
33012
34762
|
'stats.distribution':'Eloszlás',
|
|
33013
34763
|
'stats.bin':'{count} a(z) {from} és {to} között',
|
|
34764
|
+
'stats.section.shape':'Alak',
|
|
34765
|
+
'stats.section.robust':'Robusztus',
|
|
34766
|
+
'stats.section.concentration':'Koncentráció',
|
|
34767
|
+
'stats.section.capability':'Képesség',
|
|
34768
|
+
'stats.cp':'Cp',
|
|
34769
|
+
'stats.cpk':'Cpk',
|
|
34770
|
+
'stats.pp':'Pp',
|
|
34771
|
+
'stats.ppk':'Ppk',
|
|
34772
|
+
'stats.outOfSpec':'Specifikáción kívül',
|
|
33014
34773
|
'stats.filtered':'A {count} szűrt sorból',
|
|
33015
34774
|
'panel.zone.group':'a sorcsoportokból',
|
|
33016
34775
|
'panel.zone.values':'az értékekből',
|
|
@@ -33427,6 +35186,62 @@ other:'{count} de celule actualizate',
|
|
|
33427
35186
|
'panel.quickFilter':'Filtru rapid',
|
|
33428
35187
|
'panel.formatting':'Formatare',
|
|
33429
35188
|
'panel.statistics':'Statistici',
|
|
35189
|
+
'panel.compare':'Compară',
|
|
35190
|
+
'compare.first':'Prima coloană',
|
|
35191
|
+
'compare.second':'A doua coloană',
|
|
35192
|
+
'compare.needTwo':'Sunt necesare două coloane numerice',
|
|
35193
|
+
'compare.noPairs':'Niciun rând nu are valoare în ambele',
|
|
35194
|
+
'compare.pairs':'{count} perechi',
|
|
35195
|
+
'compare.pearson':'Corelație (Pearson)',
|
|
35196
|
+
'compare.spearman':'Corelație de rang (Spearman)',
|
|
35197
|
+
'compare.kendall':'Tau Kendall',
|
|
35198
|
+
'compare.covariance':'Covarianță',
|
|
35199
|
+
'compare.slope':'Panta',
|
|
35200
|
+
'compare.intercept':'Interceptul',
|
|
35201
|
+
'compare.r2':'R²',
|
|
35202
|
+
'compare.stdError':'Eroare standard',
|
|
35203
|
+
'compare.weighted':'Medie ponderată',
|
|
35204
|
+
'total.sum':'Sumă',
|
|
35205
|
+
'total.avg':'Medie',
|
|
35206
|
+
'total.min':'Min',
|
|
35207
|
+
'total.max':'Max',
|
|
35208
|
+
'total.count':'Număr',
|
|
35209
|
+
'total.countValues':'Număr de valori',
|
|
35210
|
+
'total.first':'Primul',
|
|
35211
|
+
'total.last':'Ultimul',
|
|
35212
|
+
'total.median':'Mediană',
|
|
35213
|
+
'total.p25':'Percentila 25',
|
|
35214
|
+
'total.p75':'Percentila 75',
|
|
35215
|
+
'total.p90':'Percentila 90',
|
|
35216
|
+
'total.p95':'Percentila 95',
|
|
35217
|
+
'total.p99':'Percentila 99',
|
|
35218
|
+
'total.iqr':'Interval intercuartilic',
|
|
35219
|
+
'total.mad':'Abatere absolută mediană',
|
|
35220
|
+
'total.variance':'Varianță',
|
|
35221
|
+
'total.varianceP':'Varianță (populație)',
|
|
35222
|
+
'total.stddev':'Abatere standard',
|
|
35223
|
+
'total.stddevP':'Abatere standard (populație)',
|
|
35224
|
+
'total.range':'Amplitudine',
|
|
35225
|
+
'total.distinct':'Distincte',
|
|
35226
|
+
'total.mode':'Mod',
|
|
35227
|
+
'total.skewness':'Asimetrie',
|
|
35228
|
+
'total.kurtosis':'Boltire',
|
|
35229
|
+
'total.geomean':'Medie geometrică',
|
|
35230
|
+
'total.harmean':'Medie armonică',
|
|
35231
|
+
'total.sumSquares':'Suma pătratelor',
|
|
35232
|
+
'total.weightedAvg':'Medie ponderată',
|
|
35233
|
+
'total.argmin':'Cel mai mic după',
|
|
35234
|
+
'total.argmax':'Cel mai mare după',
|
|
35235
|
+
'total.hhi':'Concentrare (HHI)',
|
|
35236
|
+
'total.entropy':'Entropie',
|
|
35237
|
+
'total.evenness':'Uniformitate',
|
|
35238
|
+
'total.top3Share':'Cota primelor 3',
|
|
35239
|
+
'total.top10Share':'Cota primelor 10',
|
|
35240
|
+
'total.gini':'Coeficient Gini',
|
|
35241
|
+
'total.trimmedMean':'Medie trunchiată',
|
|
35242
|
+
'total.winsorizedMean':'Medie winsorizată',
|
|
35243
|
+
'total.robustOutliers':'Valori aberante (robust)',
|
|
35244
|
+
'total.jarqueBera':'Jarque–Bera',
|
|
33430
35245
|
'stats.column':'Coloană',
|
|
33431
35246
|
'stats.choose':'Alegeți o coloană de analizat',
|
|
33432
35247
|
'stats.noColumns':'Nicio coloană numerică de analizat',
|
|
@@ -33446,6 +35261,15 @@ other:'{count} de celule actualizate',
|
|
|
33446
35261
|
'stats.outliers':'Valori aberante',
|
|
33447
35262
|
'stats.distribution':'Distribuție',
|
|
33448
35263
|
'stats.bin':'{count} între {from} și {to}',
|
|
35264
|
+
'stats.section.shape':'Formă',
|
|
35265
|
+
'stats.section.robust':'Robust',
|
|
35266
|
+
'stats.section.concentration':'Concentrare',
|
|
35267
|
+
'stats.section.capability':'Capabilitate',
|
|
35268
|
+
'stats.cp':'Cp',
|
|
35269
|
+
'stats.cpk':'Cpk',
|
|
35270
|
+
'stats.pp':'Pp',
|
|
35271
|
+
'stats.ppk':'Ppk',
|
|
35272
|
+
'stats.outOfSpec':'În afara specificației',
|
|
33449
35273
|
'stats.filtered':'Din {count} rânduri filtrate',
|
|
33450
35274
|
'panel.zone.group':'grupările de rânduri',
|
|
33451
35275
|
'panel.zone.values':'valorile',
|
|
@@ -33876,6 +35700,62 @@ other:'оновлено {count} комірок',
|
|
|
33876
35700
|
'panel.quickFilter':'Швидкий фільтр',
|
|
33877
35701
|
'panel.formatting':'Форматування',
|
|
33878
35702
|
'panel.statistics':'Статистика',
|
|
35703
|
+
'panel.compare':'Порівняти',
|
|
35704
|
+
'compare.first':'Перший стовпець',
|
|
35705
|
+
'compare.second':'Другий стовпець',
|
|
35706
|
+
'compare.needTwo':'Потрібні два числові стовпці',
|
|
35707
|
+
'compare.noPairs':'Жоден рядок не має значення в обох',
|
|
35708
|
+
'compare.pairs':'{count} пар',
|
|
35709
|
+
'compare.pearson':'Кореляція (Пірсон)',
|
|
35710
|
+
'compare.spearman':'Рангова кореляція (Спірмен)',
|
|
35711
|
+
'compare.kendall':'Тау Кендала',
|
|
35712
|
+
'compare.covariance':'Коваріація',
|
|
35713
|
+
'compare.slope':'Нахил',
|
|
35714
|
+
'compare.intercept':'Перетин',
|
|
35715
|
+
'compare.r2':'R²',
|
|
35716
|
+
'compare.stdError':'Стандартна похибка',
|
|
35717
|
+
'compare.weighted':'Зважене середнє',
|
|
35718
|
+
'total.sum':'Сума',
|
|
35719
|
+
'total.avg':'Середнє',
|
|
35720
|
+
'total.min':'Мінімум',
|
|
35721
|
+
'total.max':'Максимум',
|
|
35722
|
+
'total.count':'Кількість',
|
|
35723
|
+
'total.countValues':'Кількість значень',
|
|
35724
|
+
'total.first':'Перше',
|
|
35725
|
+
'total.last':'Останнє',
|
|
35726
|
+
'total.median':'Медіана',
|
|
35727
|
+
'total.p25':'25-й процентиль',
|
|
35728
|
+
'total.p75':'75-й процентиль',
|
|
35729
|
+
'total.p90':'90-й процентиль',
|
|
35730
|
+
'total.p95':'95-й процентиль',
|
|
35731
|
+
'total.p99':'99-й процентиль',
|
|
35732
|
+
'total.iqr':'Міжквартильний розмах',
|
|
35733
|
+
'total.mad':'Медіанне абсолютне відхилення',
|
|
35734
|
+
'total.variance':'Дисперсія',
|
|
35735
|
+
'total.varianceP':'Дисперсія (генеральна)',
|
|
35736
|
+
'total.stddev':'Стандартне відхилення',
|
|
35737
|
+
'total.stddevP':'Стандартне відхилення (генеральна)',
|
|
35738
|
+
'total.range':'Розмах',
|
|
35739
|
+
'total.distinct':'Унікальних',
|
|
35740
|
+
'total.mode':'Мода',
|
|
35741
|
+
'total.skewness':'Асиметрія',
|
|
35742
|
+
'total.kurtosis':'Ексцес',
|
|
35743
|
+
'total.geomean':'Середнє геометричне',
|
|
35744
|
+
'total.harmean':'Середнє гармонійне',
|
|
35745
|
+
'total.sumSquares':'Сума квадратів',
|
|
35746
|
+
'total.weightedAvg':'Зважене середнє',
|
|
35747
|
+
'total.argmin':'Найменше за',
|
|
35748
|
+
'total.argmax':'Найбільше за',
|
|
35749
|
+
'total.hhi':'Концентрація (HHI)',
|
|
35750
|
+
'total.entropy':'Ентропія',
|
|
35751
|
+
'total.evenness':'Рівномірність',
|
|
35752
|
+
'total.top3Share':'Частка топ-3',
|
|
35753
|
+
'total.top10Share':'Частка топ-10',
|
|
35754
|
+
'total.gini':'Коефіцієнт Джині',
|
|
35755
|
+
'total.trimmedMean':'Зрізане середнє',
|
|
35756
|
+
'total.winsorizedMean':'Вінзоризоване середнє',
|
|
35757
|
+
'total.robustOutliers':'Викиди (стійкі)',
|
|
35758
|
+
'total.jarqueBera':'Жарк–Бера',
|
|
33879
35759
|
'stats.column':'Стовпець',
|
|
33880
35760
|
'stats.choose':'Виберіть стовпець для аналізу',
|
|
33881
35761
|
'stats.noColumns':'Немає числових стовпців для аналізу',
|
|
@@ -33895,6 +35775,15 @@ other:'оновлено {count} комірок',
|
|
|
33895
35775
|
'stats.outliers':'Викиди',
|
|
33896
35776
|
'stats.distribution':'Розподіл',
|
|
33897
35777
|
'stats.bin':'{count} між {from} і {to}',
|
|
35778
|
+
'stats.section.shape':'Форма',
|
|
35779
|
+
'stats.section.robust':'Стійкі',
|
|
35780
|
+
'stats.section.concentration':'Концентрація',
|
|
35781
|
+
'stats.section.capability':'Придатність',
|
|
35782
|
+
'stats.cp':'Cp',
|
|
35783
|
+
'stats.cpk':'Cpk',
|
|
35784
|
+
'stats.pp':'Pp',
|
|
35785
|
+
'stats.ppk':'Ppk',
|
|
35786
|
+
'stats.outOfSpec':'Поза специфікацією',
|
|
33898
35787
|
'stats.filtered':'З {count} відфільтрованих рядків',
|
|
33899
35788
|
'panel.zone.group':'групувань рядків',
|
|
33900
35789
|
'panel.zone.values':'значень',
|
|
@@ -34303,6 +36192,62 @@ other:'ενημερώθηκαν {count} κελιά',
|
|
|
34303
36192
|
'panel.quickFilter':'Γρήγορο φίλτρο',
|
|
34304
36193
|
'panel.formatting':'Μορφοποίηση',
|
|
34305
36194
|
'panel.statistics':'Στατιστικά',
|
|
36195
|
+
'panel.compare':'Σύγκριση',
|
|
36196
|
+
'compare.first':'Πρώτη στήλη',
|
|
36197
|
+
'compare.second':'Δεύτερη στήλη',
|
|
36198
|
+
'compare.needTwo':'Χρειάζονται δύο αριθμητικές στήλες',
|
|
36199
|
+
'compare.noPairs':'Καμία γραμμή δεν έχει τιμή και στις δύο',
|
|
36200
|
+
'compare.pairs':'{count} ζεύγη',
|
|
36201
|
+
'compare.pearson':'Συσχέτιση (Pearson)',
|
|
36202
|
+
'compare.spearman':'Συσχέτιση τάξης (Spearman)',
|
|
36203
|
+
'compare.kendall':'Tau του Kendall',
|
|
36204
|
+
'compare.covariance':'Συνδιακύμανση',
|
|
36205
|
+
'compare.slope':'Κλίση',
|
|
36206
|
+
'compare.intercept':'Τεταγμένη',
|
|
36207
|
+
'compare.r2':'R²',
|
|
36208
|
+
'compare.stdError':'Τυπικό σφάλμα',
|
|
36209
|
+
'compare.weighted':'Σταθμισμένος μέσος',
|
|
36210
|
+
'total.sum':'Άθροισμα',
|
|
36211
|
+
'total.avg':'Μέσος όρος',
|
|
36212
|
+
'total.min':'Ελάχιστο',
|
|
36213
|
+
'total.max':'Μέγιστο',
|
|
36214
|
+
'total.count':'Πλήθος',
|
|
36215
|
+
'total.countValues':'Πλήθος τιμών',
|
|
36216
|
+
'total.first':'Πρώτο',
|
|
36217
|
+
'total.last':'Τελευταίο',
|
|
36218
|
+
'total.median':'Διάμεσος',
|
|
36219
|
+
'total.p25':'25ο εκατοστημόριο',
|
|
36220
|
+
'total.p75':'75ο εκατοστημόριο',
|
|
36221
|
+
'total.p90':'90ό εκατοστημόριο',
|
|
36222
|
+
'total.p95':'95ο εκατοστημόριο',
|
|
36223
|
+
'total.p99':'99ο εκατοστημόριο',
|
|
36224
|
+
'total.iqr':'Ενδοτεταρτημοριακό εύρος',
|
|
36225
|
+
'total.mad':'Διάμεση απόλυτη απόκλιση',
|
|
36226
|
+
'total.variance':'Διακύμανση',
|
|
36227
|
+
'total.varianceP':'Διακύμανση (πληθυσμού)',
|
|
36228
|
+
'total.stddev':'Τυπική απόκλιση',
|
|
36229
|
+
'total.stddevP':'Τυπική απόκλιση (πληθυσμού)',
|
|
36230
|
+
'total.range':'Εύρος',
|
|
36231
|
+
'total.distinct':'Διακριτές',
|
|
36232
|
+
'total.mode':'Επικρατούσα τιμή',
|
|
36233
|
+
'total.skewness':'Ασυμμετρία',
|
|
36234
|
+
'total.kurtosis':'Κύρτωση',
|
|
36235
|
+
'total.geomean':'Γεωμετρικός μέσος',
|
|
36236
|
+
'total.harmean':'Αρμονικός μέσος',
|
|
36237
|
+
'total.sumSquares':'Άθροισμα τετραγώνων',
|
|
36238
|
+
'total.weightedAvg':'Σταθμισμένος μέσος',
|
|
36239
|
+
'total.argmin':'Χαμηλότερο κατά',
|
|
36240
|
+
'total.argmax':'Υψηλότερο κατά',
|
|
36241
|
+
'total.hhi':'Συγκέντρωση (HHI)',
|
|
36242
|
+
'total.entropy':'Εντροπία',
|
|
36243
|
+
'total.evenness':'Ομοιομορφία',
|
|
36244
|
+
'total.top3Share':'Μερίδιο top 3',
|
|
36245
|
+
'total.top10Share':'Μερίδιο top 10',
|
|
36246
|
+
'total.gini':'Συντελεστής Gini',
|
|
36247
|
+
'total.trimmedMean':'Περικομμένος μέσος',
|
|
36248
|
+
'total.winsorizedMean':'Winsorized μέσος',
|
|
36249
|
+
'total.robustOutliers':'Ακραίες τιμές (ανθεκτικό)',
|
|
36250
|
+
'total.jarqueBera':'Jarque–Bera',
|
|
34306
36251
|
'stats.column':'Στήλη',
|
|
34307
36252
|
'stats.choose':'Επιλέξτε στήλη για ανάλυση',
|
|
34308
36253
|
'stats.noColumns':'Δεν υπάρχουν αριθμητικές στήλες για ανάλυση',
|
|
@@ -34322,6 +36267,15 @@ other:'ενημερώθηκαν {count} κελιά',
|
|
|
34322
36267
|
'stats.outliers':'Ακραίες τιμές',
|
|
34323
36268
|
'stats.distribution':'Κατανομή',
|
|
34324
36269
|
'stats.bin':'{count} μεταξύ {from} και {to}',
|
|
36270
|
+
'stats.section.shape':'Σχήμα',
|
|
36271
|
+
'stats.section.robust':'Ανθεκτικά',
|
|
36272
|
+
'stats.section.concentration':'Συγκέντρωση',
|
|
36273
|
+
'stats.section.capability':'Ικανότητα',
|
|
36274
|
+
'stats.cp':'Cp',
|
|
36275
|
+
'stats.cpk':'Cpk',
|
|
36276
|
+
'stats.pp':'Pp',
|
|
36277
|
+
'stats.ppk':'Ppk',
|
|
36278
|
+
'stats.outOfSpec':'Εκτός προδιαγραφής',
|
|
34325
36279
|
'stats.filtered':'Από {count} φιλτραρισμένες γραμμές',
|
|
34326
36280
|
'panel.zone.group':'τις ομαδοποιήσεις γραμμών',
|
|
34327
36281
|
'panel.zone.values':'τις τιμές',
|
|
@@ -34714,6 +36668,62 @@ other:'{count} セルを更新しました',
|
|
|
34714
36668
|
'panel.quickFilter':'クイックフィルター',
|
|
34715
36669
|
'panel.formatting':'書式',
|
|
34716
36670
|
'panel.statistics':'統計',
|
|
36671
|
+
'panel.compare':'比較',
|
|
36672
|
+
'compare.first':'1つ目の列',
|
|
36673
|
+
'compare.second':'2つ目の列',
|
|
36674
|
+
'compare.needTwo':'比較には数値列が2つ必要です',
|
|
36675
|
+
'compare.noPairs':'両方に値のある行がありません',
|
|
36676
|
+
'compare.pairs':'{count} 組',
|
|
36677
|
+
'compare.pearson':'相関(ピアソン)',
|
|
36678
|
+
'compare.spearman':'順位相関(スピアマン)',
|
|
36679
|
+
'compare.kendall':'ケンドールのタウ',
|
|
36680
|
+
'compare.covariance':'共分散',
|
|
36681
|
+
'compare.slope':'傾き',
|
|
36682
|
+
'compare.intercept':'切片',
|
|
36683
|
+
'compare.r2':'R²',
|
|
36684
|
+
'compare.stdError':'標準誤差',
|
|
36685
|
+
'compare.weighted':'加重平均',
|
|
36686
|
+
'total.sum':'合計',
|
|
36687
|
+
'total.avg':'平均',
|
|
36688
|
+
'total.min':'最小',
|
|
36689
|
+
'total.max':'最大',
|
|
36690
|
+
'total.count':'件数',
|
|
36691
|
+
'total.countValues':'値の件数',
|
|
36692
|
+
'total.first':'最初',
|
|
36693
|
+
'total.last':'最後',
|
|
36694
|
+
'total.median':'中央値',
|
|
36695
|
+
'total.p25':'第25パーセンタイル',
|
|
36696
|
+
'total.p75':'第75パーセンタイル',
|
|
36697
|
+
'total.p90':'第90パーセンタイル',
|
|
36698
|
+
'total.p95':'第95パーセンタイル',
|
|
36699
|
+
'total.p99':'第99パーセンタイル',
|
|
36700
|
+
'total.iqr':'四分位範囲',
|
|
36701
|
+
'total.mad':'中央絶対偏差',
|
|
36702
|
+
'total.variance':'分散',
|
|
36703
|
+
'total.varianceP':'分散(母集団)',
|
|
36704
|
+
'total.stddev':'標準偏差',
|
|
36705
|
+
'total.stddevP':'標準偏差(母集団)',
|
|
36706
|
+
'total.range':'範囲',
|
|
36707
|
+
'total.distinct':'一意の値',
|
|
36708
|
+
'total.mode':'最頻値',
|
|
36709
|
+
'total.skewness':'歪度',
|
|
36710
|
+
'total.kurtosis':'尖度',
|
|
36711
|
+
'total.geomean':'幾何平均',
|
|
36712
|
+
'total.harmean':'調和平均',
|
|
36713
|
+
'total.sumSquares':'平方和',
|
|
36714
|
+
'total.weightedAvg':'加重平均',
|
|
36715
|
+
'total.argmin':'最小(基準列)',
|
|
36716
|
+
'total.argmax':'最大(基準列)',
|
|
36717
|
+
'total.hhi':'集中度(HHI)',
|
|
36718
|
+
'total.entropy':'エントロピー',
|
|
36719
|
+
'total.evenness':'均等度',
|
|
36720
|
+
'total.top3Share':'上位3件の割合',
|
|
36721
|
+
'total.top10Share':'上位10件の割合',
|
|
36722
|
+
'total.gini':'ジニ係数',
|
|
36723
|
+
'total.trimmedMean':'トリム平均',
|
|
36724
|
+
'total.winsorizedMean':'ウィンザー化平均',
|
|
36725
|
+
'total.robustOutliers':'外れ値(頑健)',
|
|
36726
|
+
'total.jarqueBera':'ジャック–ベラ',
|
|
34717
36727
|
'stats.column':'列',
|
|
34718
36728
|
'stats.choose':'分析する列を選択',
|
|
34719
36729
|
'stats.noColumns':'分析できる数値列がありません',
|
|
@@ -34733,6 +36743,15 @@ other:'{count} セルを更新しました',
|
|
|
34733
36743
|
'stats.outliers':'外れ値',
|
|
34734
36744
|
'stats.distribution':'分布',
|
|
34735
36745
|
'stats.bin':'{from}~{to} に {count} 件',
|
|
36746
|
+
'stats.section.shape':'形状',
|
|
36747
|
+
'stats.section.robust':'頑健',
|
|
36748
|
+
'stats.section.concentration':'集中度',
|
|
36749
|
+
'stats.section.capability':'工程能力',
|
|
36750
|
+
'stats.cp':'Cp',
|
|
36751
|
+
'stats.cpk':'Cpk',
|
|
36752
|
+
'stats.pp':'Pp',
|
|
36753
|
+
'stats.ppk':'Ppk',
|
|
36754
|
+
'stats.outOfSpec':'規格外',
|
|
34736
36755
|
'stats.filtered':'フィルター後の {count} 行が対象',
|
|
34737
36756
|
'panel.zone.group':'行グループ',
|
|
34738
36757
|
'panel.zone.values':'値',
|
|
@@ -35166,6 +37185,62 @@ other:'تم تحديث {count} خلية',
|
|
|
35166
37185
|
'panel.quickFilter':'تصفية سريعة',
|
|
35167
37186
|
'panel.formatting':'التنسيق',
|
|
35168
37187
|
'panel.statistics':'الإحصاءات',
|
|
37188
|
+
'panel.compare':'قارن',
|
|
37189
|
+
'compare.first':'العمود الأول',
|
|
37190
|
+
'compare.second':'العمود الثاني',
|
|
37191
|
+
'compare.needTwo':'يلزم عمودان رقميان للمقارنة',
|
|
37192
|
+
'compare.noPairs':'لا توجد صفوف بقيمة في كليهما',
|
|
37193
|
+
'compare.pairs':'{count} زوجًا',
|
|
37194
|
+
'compare.pearson':'الارتباط (بيرسون)',
|
|
37195
|
+
'compare.spearman':'ارتباط الرتب (سبيرمان)',
|
|
37196
|
+
'compare.kendall':'تاو كندال',
|
|
37197
|
+
'compare.covariance':'التغاير',
|
|
37198
|
+
'compare.slope':'الميل',
|
|
37199
|
+
'compare.intercept':'التقاطع',
|
|
37200
|
+
'compare.r2':'R²',
|
|
37201
|
+
'compare.stdError':'الخطأ المعياري',
|
|
37202
|
+
'compare.weighted':'المتوسط المرجح',
|
|
37203
|
+
'total.sum':'المجموع',
|
|
37204
|
+
'total.avg':'المتوسط',
|
|
37205
|
+
'total.min':'الأدنى',
|
|
37206
|
+
'total.max':'الأعلى',
|
|
37207
|
+
'total.count':'العدد',
|
|
37208
|
+
'total.countValues':'عدد القيم',
|
|
37209
|
+
'total.first':'الأول',
|
|
37210
|
+
'total.last':'الأخير',
|
|
37211
|
+
'total.median':'الوسيط',
|
|
37212
|
+
'total.p25':'المئين 25',
|
|
37213
|
+
'total.p75':'المئين 75',
|
|
37214
|
+
'total.p90':'المئين 90',
|
|
37215
|
+
'total.p95':'المئين 95',
|
|
37216
|
+
'total.p99':'المئين 99',
|
|
37217
|
+
'total.iqr':'المدى الربيعي',
|
|
37218
|
+
'total.mad':'الانحراف المطلق الوسيط',
|
|
37219
|
+
'total.variance':'التباين',
|
|
37220
|
+
'total.varianceP':'التباين (المجتمع)',
|
|
37221
|
+
'total.stddev':'الانحراف المعياري',
|
|
37222
|
+
'total.stddevP':'الانحراف المعياري (المجتمع)',
|
|
37223
|
+
'total.range':'المدى',
|
|
37224
|
+
'total.distinct':'القيم المميزة',
|
|
37225
|
+
'total.mode':'المنوال',
|
|
37226
|
+
'total.skewness':'الالتواء',
|
|
37227
|
+
'total.kurtosis':'التفلطح',
|
|
37228
|
+
'total.geomean':'المتوسط الهندسي',
|
|
37229
|
+
'total.harmean':'المتوسط التوافقي',
|
|
37230
|
+
'total.sumSquares':'مجموع المربعات',
|
|
37231
|
+
'total.weightedAvg':'المتوسط المرجح',
|
|
37232
|
+
'total.argmin':'الأدنى حسب',
|
|
37233
|
+
'total.argmax':'الأعلى حسب',
|
|
37234
|
+
'total.hhi':'التركز (HHI)',
|
|
37235
|
+
'total.entropy':'الإنتروبيا',
|
|
37236
|
+
'total.evenness':'التجانس',
|
|
37237
|
+
'total.top3Share':'حصة أعلى 3',
|
|
37238
|
+
'total.top10Share':'حصة أعلى 10',
|
|
37239
|
+
'total.gini':'معامل جيني',
|
|
37240
|
+
'total.trimmedMean':'المتوسط المشذب',
|
|
37241
|
+
'total.winsorizedMean':'المتوسط الوينزوري',
|
|
37242
|
+
'total.robustOutliers':'القيم الشاذة (حصينة)',
|
|
37243
|
+
'total.jarqueBera':'جارك–بيرا',
|
|
35169
37244
|
'stats.column':'العمود',
|
|
35170
37245
|
'stats.choose':'اختر عمودًا لتحليله',
|
|
35171
37246
|
'stats.noColumns':'لا توجد أعمدة رقمية للتحليل',
|
|
@@ -35185,6 +37260,15 @@ other:'تم تحديث {count} خلية',
|
|
|
35185
37260
|
'stats.outliers':'القيم الشاذة',
|
|
35186
37261
|
'stats.distribution':'التوزيع',
|
|
35187
37262
|
'stats.bin':'{count} بين {from} و {to}',
|
|
37263
|
+
'stats.section.shape':'الشكل',
|
|
37264
|
+
'stats.section.robust':'حصين',
|
|
37265
|
+
'stats.section.concentration':'التركز',
|
|
37266
|
+
'stats.section.capability':'القدرة',
|
|
37267
|
+
'stats.cp':'Cp',
|
|
37268
|
+
'stats.cpk':'Cpk',
|
|
37269
|
+
'stats.pp':'Pp',
|
|
37270
|
+
'stats.ppk':'Ppk',
|
|
37271
|
+
'stats.outOfSpec':'خارج المواصفة',
|
|
35188
37272
|
'stats.filtered':'من بين {count} صفًا بعد التصفية',
|
|
35189
37273
|
'panel.zone.group':'تجميعات الصفوف',
|
|
35190
37274
|
'panel.zone.values':'القيم',
|
|
@@ -36031,6 +38115,8 @@ Object.defineProperty(__exports,"RADIX_PRESETS",{enumerable:true,get:function(){
|
|
|
36031
38115
|
Object.defineProperty(__exports,"parseRadix",{enumerable:true,get:function(){return __m5["parseRadix"];}});
|
|
36032
38116
|
Object.defineProperty(__exports,"formatRadix",{enumerable:true,get:function(){return __m5["formatRadix"];}});
|
|
36033
38117
|
Object.defineProperty(__exports,"createUnitType",{enumerable:true,get:function(){return __m5["createUnitType"];}});
|
|
38118
|
+
Object.defineProperty(__exports,"registerUnitSystem",{enumerable:true,get:function(){return __m5["registerUnitSystem"];}});
|
|
38119
|
+
Object.defineProperty(__exports,"defineUnit",{enumerable:true,get:function(){return __m5["defineUnit"];}});
|
|
36034
38120
|
Object.defineProperty(__exports,"UNIT_SYSTEMS",{enumerable:true,get:function(){return __m5["UNIT_SYSTEMS"];}});
|
|
36035
38121
|
Object.defineProperty(__exports,"parseUnit",{enumerable:true,get:function(){return __m5["parseUnit"];}});
|
|
36036
38122
|
Object.defineProperty(__exports,"formatUnit",{enumerable:true,get:function(){return __m5["formatUnit"];}});
|
|
@@ -53607,6 +55693,20 @@ const FIGURES=Object.freeze([
|
|
|
53607
55693
|
{key:'stddev',label:'stats.stddev',kind:'value'},
|
|
53608
55694
|
{key:'outliers',label:'stats.outliers',kind:'count'},
|
|
53609
55695
|
]);
|
|
55696
|
+
const SECTIONS=Object.freeze([
|
|
55697
|
+
{
|
|
55698
|
+
label:'stats.section.shape',
|
|
55699
|
+
kernels:['skewness','kurtosis','jarqueBera'],
|
|
55700
|
+
},
|
|
55701
|
+
{
|
|
55702
|
+
label:'stats.section.robust',
|
|
55703
|
+
kernels:['trimmedMean','winsorizedMean','mad','robustOutliers'],
|
|
55704
|
+
},
|
|
55705
|
+
{
|
|
55706
|
+
label:'stats.section.concentration',
|
|
55707
|
+
kernels:['gini','hhi','entropy','evenness','top3Share'],
|
|
55708
|
+
},
|
|
55709
|
+
]);
|
|
53610
55710
|
function readable(value){
|
|
53611
55711
|
if(value===null||value===undefined||!Number.isFinite(value))return'—';
|
|
53612
55712
|
if(Number.isInteger(value))return String(value);
|
|
@@ -53648,6 +55748,12 @@ class:`${CLS.panel}__count`,
|
|
|
53648
55748
|
text:this.t('stats.filtered',{count:profile.rows}),
|
|
53649
55749
|
}));
|
|
53650
55750
|
root.appendChild(this.#figures(profile));
|
|
55751
|
+
for(const section of SECTIONS){
|
|
55752
|
+
const rendered=this.#section(section);
|
|
55753
|
+
if(rendered)root.appendChild(rendered);
|
|
55754
|
+
}
|
|
55755
|
+
const capability=this.#capability();
|
|
55756
|
+
if(capability)root.appendChild(capability);
|
|
53651
55757
|
if(profile.histogram&&profile.histogram.length>1){
|
|
53652
55758
|
root.appendChild(this.#histogram(profile.histogram));
|
|
53653
55759
|
}
|
|
@@ -53677,6 +55783,60 @@ select,
|
|
|
53677
55783
|
],
|
|
53678
55784
|
});
|
|
53679
55785
|
}
|
|
55786
|
+
#section(section){
|
|
55787
|
+
const reduce=this.host.reduceColumn;
|
|
55788
|
+
if(!isFunction(reduce)||!this.column)return null;
|
|
55789
|
+
const rows=[];
|
|
55790
|
+
for(const kernel of section.kernels){
|
|
55791
|
+
const value=reduce(this.column,kernel);
|
|
55792
|
+
if(value===null||value===undefined||Number.isNaN(value))continue;
|
|
55793
|
+
rows.push([kernel,value]);
|
|
55794
|
+
}
|
|
55795
|
+
if(!rows.length)return null;
|
|
55796
|
+
const wrapper=this.doc.createElement('div');
|
|
55797
|
+
wrapper.appendChild(el(this.doc,'h4',{
|
|
55798
|
+
class:`${CLS.panel}__subtitle`,text:this.t(section.label),
|
|
55799
|
+
}));
|
|
55800
|
+
const list=el(this.doc,'dl',{class:`${CLS.panel}__stats`});
|
|
55801
|
+
for(const[kernel,value]of rows){
|
|
55802
|
+
list.appendChild(el(this.doc,'dt',{
|
|
55803
|
+
class:`${CLS.panel}__stat-name`,
|
|
55804
|
+
text:this.t(`total.${kernel}`),
|
|
55805
|
+
}));
|
|
55806
|
+
list.appendChild(el(this.doc,'dd',{
|
|
55807
|
+
class:`${CLS.panel}__stat-value`,
|
|
55808
|
+
text:typeof value==='number'?readable(value):String(value),
|
|
55809
|
+
}));
|
|
55810
|
+
}
|
|
55811
|
+
wrapper.appendChild(list);
|
|
55812
|
+
return wrapper;
|
|
55813
|
+
}
|
|
55814
|
+
#capability(){
|
|
55815
|
+
const read=this.host.columnCapability;
|
|
55816
|
+
if(!isFunction(read)||!this.column)return null;
|
|
55817
|
+
const c=read(this.column);
|
|
55818
|
+
if(!c)return null;
|
|
55819
|
+
const wrapper=this.doc.createElement('div');
|
|
55820
|
+
wrapper.appendChild(el(this.doc,'h4',{
|
|
55821
|
+
class:`${CLS.panel}__subtitle`,text:this.t('stats.section.capability'),
|
|
55822
|
+
}));
|
|
55823
|
+
const list=el(this.doc,'dl',{class:`${CLS.panel}__stats`});
|
|
55824
|
+
const pairs=[
|
|
55825
|
+
['stats.cp',c.cp],['stats.cpk',c.cpk],['stats.pp',c.pp],['stats.ppk',c.ppk],
|
|
55826
|
+
['stats.outOfSpec',c.outOfSpec],
|
|
55827
|
+
];
|
|
55828
|
+
for(const[key,value]of pairs){
|
|
55829
|
+
if(value===null||value===undefined)continue;
|
|
55830
|
+
list.appendChild(el(this.doc,'dt',{
|
|
55831
|
+
class:`${CLS.panel}__stat-name`,text:this.t(key),
|
|
55832
|
+
}));
|
|
55833
|
+
list.appendChild(el(this.doc,'dd',{
|
|
55834
|
+
class:`${CLS.panel}__stat-value`,text:readable(value),
|
|
55835
|
+
}));
|
|
55836
|
+
}
|
|
55837
|
+
wrapper.appendChild(list);
|
|
55838
|
+
return wrapper;
|
|
55839
|
+
}
|
|
53680
55840
|
#figures(profile){
|
|
53681
55841
|
const list=el(this.doc,'dl',{class:`${CLS.panel}__stats`});
|
|
53682
55842
|
for(const figure of FIGURES){
|
|
@@ -53716,6 +55876,122 @@ return chart;
|
|
|
53716
55876
|
}
|
|
53717
55877
|
}
|
|
53718
55878
|
});
|
|
55879
|
+
__def("packages/dom/src/comparepanel.js",function(__exports,__req){
|
|
55880
|
+
'use strict';
|
|
55881
|
+
Object.defineProperty(__exports,"ComparePanel",{enumerable:true,get:function(){return ComparePanel;}});
|
|
55882
|
+
const __m0=__req("packages/dom/src/editors/common.js");
|
|
55883
|
+
const CLS=__m0["CLS"];
|
|
55884
|
+
const el=__m0["el"];
|
|
55885
|
+
const on=__m0["on"];
|
|
55886
|
+
const clear=__m0["clear"];
|
|
55887
|
+
const __m1=__req("packages/core/src/internal/util.js");
|
|
55888
|
+
const isFunction=__m1["isFunction"];
|
|
55889
|
+
const __m2=__req("packages/dom/src/ui/panelbase.js");
|
|
55890
|
+
const ToolPanelBase=__m2["ToolPanelBase"];
|
|
55891
|
+
const FIGURES=Object.freeze([
|
|
55892
|
+
{key:'pearson',label:'compare.pearson'},
|
|
55893
|
+
{key:'spearman',label:'compare.spearman'},
|
|
55894
|
+
{key:'kendall',label:'compare.kendall'},
|
|
55895
|
+
{key:'slope',label:'compare.slope'},
|
|
55896
|
+
{key:'intercept',label:'compare.intercept'},
|
|
55897
|
+
{key:'r2',label:'compare.r2'},
|
|
55898
|
+
{key:'stdError',label:'compare.stdError'},
|
|
55899
|
+
{key:'covariance',label:'compare.covariance'},
|
|
55900
|
+
{key:'weighted',label:'compare.weighted'},
|
|
55901
|
+
]);
|
|
55902
|
+
function readable(value){
|
|
55903
|
+
if(value===null||value===undefined||!Number.isFinite(value))return'—';
|
|
55904
|
+
if(Number.isInteger(value))return String(value);
|
|
55905
|
+
const magnitude=Math.abs(value);
|
|
55906
|
+
if(magnitude!==0&&(magnitude<0.001||magnitude>=1e7))return value.toExponential(2);
|
|
55907
|
+
return String(Number(value.toPrecision(4)));
|
|
55908
|
+
}
|
|
55909
|
+
class ComparePanel extends ToolPanelBase{
|
|
55910
|
+
first=null;
|
|
55911
|
+
second=null;
|
|
55912
|
+
#columns(){
|
|
55913
|
+
return isFunction(this.host.profilableColumns)?this.host.profilableColumns():[];
|
|
55914
|
+
}
|
|
55915
|
+
refresh(){
|
|
55916
|
+
const root=this.root;
|
|
55917
|
+
if(!root)return;
|
|
55918
|
+
for(const off of this.off)off();
|
|
55919
|
+
this.off.length=0;
|
|
55920
|
+
clear(root);
|
|
55921
|
+
const columns=this.#columns();
|
|
55922
|
+
if(columns.length<2){
|
|
55923
|
+
root.appendChild(el(this.doc,'p',{
|
|
55924
|
+
class:`${CLS.panel}__empty`,text:this.t('compare.needTwo'),
|
|
55925
|
+
}));
|
|
55926
|
+
return;
|
|
55927
|
+
}
|
|
55928
|
+
if(!columns.some((c)=>c.id===this.first))this.first=columns[0].id;
|
|
55929
|
+
if(!columns.some((c)=>c.id===this.second)||this.second===this.first){
|
|
55930
|
+
this.second=(columns.find((c)=>c.id!==this.first)||columns[0]).id;
|
|
55931
|
+
}
|
|
55932
|
+
root.appendChild(this.#picker('compare.first',columns,this.first,(id)=>{
|
|
55933
|
+
this.first=id;
|
|
55934
|
+
if(this.second===id){
|
|
55935
|
+
this.second=(columns.find((c)=>c.id!==id)||columns[0]).id;
|
|
55936
|
+
}
|
|
55937
|
+
this.refresh();
|
|
55938
|
+
}));
|
|
55939
|
+
root.appendChild(this.#picker('compare.second',columns,this.second,(id)=>{
|
|
55940
|
+
this.second=id;
|
|
55941
|
+
if(this.first===id){
|
|
55942
|
+
this.first=(columns.find((c)=>c.id!==id)||columns[0]).id;
|
|
55943
|
+
}
|
|
55944
|
+
this.refresh();
|
|
55945
|
+
}));
|
|
55946
|
+
const figures=isFunction(this.host.compareColumns)
|
|
55947
|
+
?this.host.compareColumns(this.first,this.second)
|
|
55948
|
+
:null;
|
|
55949
|
+
if(!figures||!figures.n){
|
|
55950
|
+
root.appendChild(el(this.doc,'p',{
|
|
55951
|
+
class:`${CLS.panel}__empty`,text:this.t('compare.noPairs'),
|
|
55952
|
+
}));
|
|
55953
|
+
return;
|
|
55954
|
+
}
|
|
55955
|
+
root.appendChild(el(this.doc,'p',{
|
|
55956
|
+
class:`${CLS.panel}__count`,
|
|
55957
|
+
text:this.t('compare.pairs',{count:figures.n}),
|
|
55958
|
+
}));
|
|
55959
|
+
const list=el(this.doc,'dl',{class:`${CLS.panel}__stats`});
|
|
55960
|
+
for(const figure of FIGURES){
|
|
55961
|
+
const value=figures[figure.key];
|
|
55962
|
+
if(value===null||value===undefined)continue;
|
|
55963
|
+
list.appendChild(el(this.doc,'dt',{
|
|
55964
|
+
class:`${CLS.panel}__stat-name`,text:this.t(figure.label),
|
|
55965
|
+
}));
|
|
55966
|
+
list.appendChild(el(this.doc,'dd',{
|
|
55967
|
+
class:`${CLS.panel}__stat-value`,text:readable(value),
|
|
55968
|
+
}));
|
|
55969
|
+
}
|
|
55970
|
+
root.appendChild(list);
|
|
55971
|
+
}
|
|
55972
|
+
#picker(label,columns,current,choose){
|
|
55973
|
+
const select=el(this.doc,'select',{
|
|
55974
|
+
class:`${CLS.panel}__select`,
|
|
55975
|
+
attrs:{'aria-label':this.t(label)},
|
|
55976
|
+
});
|
|
55977
|
+
for(const column of columns){
|
|
55978
|
+
select.appendChild(el(this.doc,'option',{
|
|
55979
|
+
text:column.title,
|
|
55980
|
+
attrs:{value:column.id,selected:column.id===current?true:null},
|
|
55981
|
+
}));
|
|
55982
|
+
}
|
|
55983
|
+
(select).value=current;
|
|
55984
|
+
this.off.push(on(select,'change',()=>choose((select).value)));
|
|
55985
|
+
return el(this.doc,'label',{
|
|
55986
|
+
class:`${CLS.panel}__field`,
|
|
55987
|
+
children:[
|
|
55988
|
+
el(this.doc,'span',{class:`${CLS.panel}__label`,text:this.t(label)}),
|
|
55989
|
+
select,
|
|
55990
|
+
],
|
|
55991
|
+
});
|
|
55992
|
+
}
|
|
55993
|
+
}
|
|
55994
|
+
});
|
|
53719
55995
|
__def("packages/dom/src/ui/toolpanel.js",function(__exports,__req){
|
|
53720
55996
|
'use strict';
|
|
53721
55997
|
Object.defineProperty(__exports,"ColumnsPanel",{enumerable:true,get:function(){return ColumnsPanel;}});
|
|
@@ -53748,10 +56024,12 @@ const __m5=__req("packages/dom/src/formattingpanel.js");
|
|
|
53748
56024
|
const FormattingPanel=__m5["FormattingPanel"];
|
|
53749
56025
|
const __m6=__req("packages/dom/src/statisticspanel.js");
|
|
53750
56026
|
const StatisticsPanel=__m6["StatisticsPanel"];
|
|
53751
|
-
const __m7=__req("packages/dom/src/
|
|
53752
|
-
const
|
|
53753
|
-
const __m8=__req("packages/
|
|
53754
|
-
const
|
|
56027
|
+
const __m7=__req("packages/dom/src/comparepanel.js");
|
|
56028
|
+
const ComparePanel=__m7["ComparePanel"];
|
|
56029
|
+
const __m8=__req("packages/dom/src/ui/panelbase.js");
|
|
56030
|
+
const ToolPanelBase=__m8["ToolPanelBase"];
|
|
56031
|
+
const __m9=__req("packages/core/src/compute/total.js");
|
|
56032
|
+
const TOTAL_LABELS=__m9["TOTAL_LABELS"];
|
|
53755
56033
|
class ColumnsPanel extends ToolPanelBase{
|
|
53756
56034
|
dragging=null;
|
|
53757
56035
|
refresh(){
|
|
@@ -53949,7 +56227,7 @@ attrs:{'aria-label':`Calculation for ${this.titleOf(id)}`},
|
|
|
53949
56227
|
});
|
|
53950
56228
|
for(const fn of ColumnsPanel.aggregations){
|
|
53951
56229
|
select.appendChild(el(this.doc,'option',{
|
|
53952
|
-
text:fn.
|
|
56230
|
+
text:this.t(`total.${fn.name}`),
|
|
53953
56231
|
attrs:{value:fn.name,selected:fn.name===current?'':null},
|
|
53954
56232
|
}));
|
|
53955
56233
|
}
|
|
@@ -53979,7 +56257,7 @@ zone.appendChild(body);
|
|
|
53979
56257
|
return zone;
|
|
53980
56258
|
}
|
|
53981
56259
|
static aggregations=Object.freeze(
|
|
53982
|
-
Object.
|
|
56260
|
+
Object.keys(TOTAL_LABELS).map((name)=>({name})),
|
|
53983
56261
|
);
|
|
53984
56262
|
static zoneAbout=Object.freeze({
|
|
53985
56263
|
group:'Rows are grouped by these columns, in order.',
|
|
@@ -54241,6 +56519,7 @@ views:ViewPicker,
|
|
|
54241
56519
|
quick:QuickFilterPanel,
|
|
54242
56520
|
formatting:FormattingPanel,
|
|
54243
56521
|
statistics:StatisticsPanel,
|
|
56522
|
+
compare:ComparePanel,
|
|
54244
56523
|
});
|
|
54245
56524
|
const toolPanelTitles=Object.freeze({
|
|
54246
56525
|
columns:'panel.columns',
|
|
@@ -54249,6 +56528,7 @@ views:'panel.views',
|
|
|
54249
56528
|
quick:'panel.quickFilter',
|
|
54250
56529
|
formatting:'panel.formatting',
|
|
54251
56530
|
statistics:'panel.statistics',
|
|
56531
|
+
compare:'panel.compare',
|
|
54252
56532
|
});
|
|
54253
56533
|
const toolPanelIcons=Object.freeze({
|
|
54254
56534
|
columns:'columns',
|
|
@@ -54257,6 +56537,7 @@ views:'views',
|
|
|
54257
56537
|
quick:'search',
|
|
54258
56538
|
formatting:'palette',
|
|
54259
56539
|
statistics:'chart',
|
|
56540
|
+
compare:'link',
|
|
54260
56541
|
});
|
|
54261
56542
|
class ToolPanel{
|
|
54262
56543
|
panels=[];
|
|
@@ -56649,6 +58930,7 @@ this.#row=null;
|
|
|
56649
58930
|
});
|
|
56650
58931
|
__def("packages/dom/src/toolpanelmount.js",function(__exports,__req){
|
|
56651
58932
|
'use strict';
|
|
58933
|
+
Object.defineProperty(__exports,"mountPanel",{enumerable:true,get:function(){return mountPanel;}});
|
|
56652
58934
|
Object.defineProperty(__exports,"panelHost",{enumerable:true,get:function(){return panelHost;}});
|
|
56653
58935
|
Object.defineProperty(__exports,"ToolPanelDock",{enumerable:true,get:function(){return ToolPanelDock;}});
|
|
56654
58936
|
const __m0=__req("packages/core/src/internal/util.js");
|
|
@@ -56663,10 +58945,48 @@ const __m2=__req("packages/dom/src/filters/index.js");
|
|
|
56663
58945
|
const createFilter=__m2["createFilter"];
|
|
56664
58946
|
const __m3=__req("packages/dom/src/editors/common.js");
|
|
56665
58947
|
const CLS=__m3["CLS"];
|
|
58948
|
+
const documentFor=__m3["documentFor"];
|
|
56666
58949
|
const scannableRows=__m3["scannableRows"];
|
|
56667
58950
|
const __m4=__req("packages/dom/src/filtermenu.js");
|
|
56668
58951
|
const mergeColumnFilter=__m4["mergeColumnFilter"];
|
|
56669
58952
|
const branchFor=__m4["branchFor"];
|
|
58953
|
+
const REPAINT_ON=Object.freeze([
|
|
58954
|
+
'column:visible','column:moved','column:pinned',
|
|
58955
|
+
'column:grouped','column:pivoted','filter:changed','model:changed',
|
|
58956
|
+
'views:changed','sort:changed','history:changed','state:reset',
|
|
58957
|
+
'cell:changed','formatting:changed',
|
|
58958
|
+
]);
|
|
58959
|
+
function mountPanel(opts){
|
|
58960
|
+
const{grid,container}=opts||{};
|
|
58961
|
+
if(!grid)throw new Error('[lattice] mountPanel needs a grid');
|
|
58962
|
+
if(!container||!container.appendChild){
|
|
58963
|
+
throw new Error('[lattice] mountPanel needs a container element');
|
|
58964
|
+
}
|
|
58965
|
+
const Ctor=isFunction(opts.panel)?opts.panel:toolPanels[String(opts.panel)];
|
|
58966
|
+
if(!Ctor){
|
|
58967
|
+
throw new Error(`[lattice] unknown panel "${opts.panel}"; known panels are ${Object.keys(toolPanels).join(', ')}`);
|
|
58968
|
+
}
|
|
58969
|
+
const doc=container.ownerDocument||documentFor(container);
|
|
58970
|
+
const host=panelHost(grid,doc,opts.announce);
|
|
58971
|
+
const panel=new Ctor();
|
|
58972
|
+
panel.init({document:doc,host,grid,props:opts.props||{}});
|
|
58973
|
+
const element=panel.element();
|
|
58974
|
+
container.appendChild(element);
|
|
58975
|
+
const off=[];
|
|
58976
|
+
for(const event of REPAINT_ON){
|
|
58977
|
+
if(isFunction(grid.on))off.push(grid.on(event,()=>panel.refresh()));
|
|
58978
|
+
}
|
|
58979
|
+
return{
|
|
58980
|
+
element,
|
|
58981
|
+
refresh(){panel.refresh();},
|
|
58982
|
+
destroy(){
|
|
58983
|
+
for(const stop of off)stop();
|
|
58984
|
+
off.length=0;
|
|
58985
|
+
if(isFunction(panel.destroy))panel.destroy();
|
|
58986
|
+
if(element&&element.parentNode)element.parentNode.removeChild(element);
|
|
58987
|
+
},
|
|
58988
|
+
};
|
|
58989
|
+
}
|
|
56670
58990
|
const PANEL_WIDTH=260;
|
|
56671
58991
|
const RAIL_WIDTH=30;
|
|
56672
58992
|
const DOCK_CLASS=`${CLS.panel}-dock`;
|
|
@@ -56732,6 +59052,24 @@ profilableColumns:()=>grid.columns.visible()
|
|
|
56732
59052
|
||c.type==='percent'||c.type==='integer'))
|
|
56733
59053
|
.map((c)=>({id:c.id,title:String(c.title??c.id)})),
|
|
56734
59054
|
columnProfile:(colId)=>grid.statistics.profile(colId),
|
|
59055
|
+
reduceColumn:(colId,kernel)=>grid.statistics.reduce(colId,kernel),
|
|
59056
|
+
columnCapability:(colId)=>grid.statistics.capability(colId),
|
|
59057
|
+
compareColumns:(a,b)=>{
|
|
59058
|
+
if(!a||!b||a===b)return null;
|
|
59059
|
+
const fit=grid.statistics.regression(a,b);
|
|
59060
|
+
return{
|
|
59061
|
+
n:fit?fit.n:0,
|
|
59062
|
+
pearson:grid.statistics.correlation(a,b),
|
|
59063
|
+
spearman:grid.statistics.spearman(a,b),
|
|
59064
|
+
kendall:grid.statistics.kendall(a,b),
|
|
59065
|
+
covariance:grid.statistics.covariance(a,b),
|
|
59066
|
+
slope:fit?fit.slope:null,
|
|
59067
|
+
intercept:fit?fit.intercept:null,
|
|
59068
|
+
r2:fit?fit.r2:null,
|
|
59069
|
+
stdError:fit?fit.stdError:null,
|
|
59070
|
+
weighted:grid.statistics.weightedAverage(a,b),
|
|
59071
|
+
};
|
|
59072
|
+
},
|
|
56735
59073
|
addRule:(scope,rule)=>grid.formatting.add(scope,rule),
|
|
56736
59074
|
removeRule:(scope,id)=>grid.formatting.remove(scope,id),
|
|
56737
59075
|
updateRule:(scope,id,patch)=>grid.formatting.update(scope,id,patch),
|
|
@@ -56864,10 +59202,7 @@ const show=this.#panel.show.bind(this.#panel);
|
|
|
56864
59202
|
const hide=this.#panel.hide.bind(this.#panel);
|
|
56865
59203
|
this.#panel.show=(name)=>{const ok=show(name);this.#applyWidth();return ok;};
|
|
56866
59204
|
this.#panel.hide=()=>{hide();this.#applyWidth();};
|
|
56867
|
-
for(const event of[
|
|
56868
|
-
'column:grouped','column:pivoted','filter:changed','model:changed',
|
|
56869
|
-
'views:changed','sort:changed','history:changed','state:reset',
|
|
56870
|
-
'cell:changed','formatting:changed',
|
|
59205
|
+
for(const event of[...REPAINT_ON,
|
|
56871
59206
|
'rows:paused','rows:resumed','rows:queued']){
|
|
56872
59207
|
this.#off.push(this.#grid.on(event,()=>this.#panel.refresh()));
|
|
56873
59208
|
}
|
|
@@ -57355,6 +59690,12 @@ const __m3=__req("packages/dom/src/renderer/textentry.js");
|
|
|
57355
59690
|
const isTextEntry=__m3["isTextEntry"];
|
|
57356
59691
|
const IN_RANGE='lat-cell--range';
|
|
57357
59692
|
const RANGE_EDGE='lat-cell--range-edge';
|
|
59693
|
+
const EDGE_SIDES=Object.freeze({
|
|
59694
|
+
top:'lat-cell--range-top',
|
|
59695
|
+
right:'lat-cell--range-right',
|
|
59696
|
+
bottom:'lat-cell--range-bottom',
|
|
59697
|
+
left:'lat-cell--range-left',
|
|
59698
|
+
});
|
|
57358
59699
|
const DRAG_THRESHOLD=3;
|
|
57359
59700
|
class RangeController{
|
|
57360
59701
|
#grid;
|
|
@@ -57616,7 +59957,13 @@ if(!Number.isFinite(index)||index<0)continue;
|
|
|
57616
59957
|
const inRange=hasRange&&selection.inRange(index,colId);
|
|
57617
59958
|
const inPreview=!!preview&&this.#inFillPreview(index,colId,preview);
|
|
57618
59959
|
cell.classList.toggle(IN_RANGE,inRange||inPreview);
|
|
57619
|
-
|
|
59960
|
+
const edges=(inRange||inPreview)
|
|
59961
|
+
?this.#edgesOf(index,colId,selection)
|
|
59962
|
+
:null;
|
|
59963
|
+
cell.classList.toggle(RANGE_EDGE,!!edges&&edges.any);
|
|
59964
|
+
for(const[side,className]of Object.entries(EDGE_SIDES)){
|
|
59965
|
+
cell.classList.toggle(className,!!edges&&edges[side]);
|
|
59966
|
+
}
|
|
57620
59967
|
}
|
|
57621
59968
|
this.#placeHandle();
|
|
57622
59969
|
}
|
|
@@ -57628,15 +59975,19 @@ if(!columns.has(colId))return false;
|
|
|
57628
59975
|
const last=this.#indexOfKey([...new Set(cells.map((c)=>c.key))].pop());
|
|
57629
59976
|
return index>last&&index<=preview.rowIndex;
|
|
57630
59977
|
}
|
|
57631
|
-
#
|
|
59978
|
+
#edgesOf(index,colId,selection){
|
|
57632
59979
|
const columns=this.#grid.columns.visible().map((c)=>c.id);
|
|
57633
59980
|
const at=columns.indexOf(colId);
|
|
57634
|
-
const
|
|
57635
|
-
const
|
|
57636
|
-
|
|
57637
|
-
|
|
57638
|
-
|
|
57639
|
-
||!
|
|
59981
|
+
const before=at>0?columns[at-1]:null;
|
|
59982
|
+
const after=at>=0&&at<columns.length-1?columns[at+1]:null;
|
|
59983
|
+
const edges={
|
|
59984
|
+
top:!selection.inRange(index-1,colId),
|
|
59985
|
+
bottom:!selection.inRange(index+1,colId),
|
|
59986
|
+
left:!before||!selection.inRange(index,before),
|
|
59987
|
+
right:!after||!selection.inRange(index,after),
|
|
59988
|
+
};
|
|
59989
|
+
edges.any=edges.top||edges.bottom||edges.left||edges.right;
|
|
59990
|
+
return edges;
|
|
57640
59991
|
}
|
|
57641
59992
|
#placeHandle(){
|
|
57642
59993
|
const corner=this.#grid.selection.corner();
|
|
@@ -60739,6 +63090,8 @@ Object.defineProperty(__exports,"RADIX_PRESETS",{enumerable:true,get:function(){
|
|
|
60739
63090
|
Object.defineProperty(__exports,"parseRadix",{enumerable:true,get:function(){return __m4["parseRadix"];}});
|
|
60740
63091
|
Object.defineProperty(__exports,"formatRadix",{enumerable:true,get:function(){return __m4["formatRadix"];}});
|
|
60741
63092
|
Object.defineProperty(__exports,"createUnitType",{enumerable:true,get:function(){return __m4["createUnitType"];}});
|
|
63093
|
+
Object.defineProperty(__exports,"registerUnitSystem",{enumerable:true,get:function(){return __m4["registerUnitSystem"];}});
|
|
63094
|
+
Object.defineProperty(__exports,"defineUnit",{enumerable:true,get:function(){return __m4["defineUnit"];}});
|
|
60742
63095
|
Object.defineProperty(__exports,"UNIT_SYSTEMS",{enumerable:true,get:function(){return __m4["UNIT_SYSTEMS"];}});
|
|
60743
63096
|
Object.defineProperty(__exports,"parseUnit",{enumerable:true,get:function(){return __m4["parseUnit"];}});
|
|
60744
63097
|
Object.defineProperty(__exports,"formatUnit",{enumerable:true,get:function(){return __m4["formatUnit"];}});
|
|
@@ -60828,6 +63181,7 @@ Object.defineProperty(__exports,"layoutState",{enumerable:true,get:function(){re
|
|
|
60828
63181
|
const __m9=__req("packages/dom/src/toolpanelmount.js");
|
|
60829
63182
|
Object.defineProperty(__exports,"ToolPanelDock",{enumerable:true,get:function(){return __m9["ToolPanelDock"];}});
|
|
60830
63183
|
Object.defineProperty(__exports,"panelHost",{enumerable:true,get:function(){return __m9["panelHost"];}});
|
|
63184
|
+
Object.defineProperty(__exports,"mountPanel",{enumerable:true,get:function(){return __m9["mountPanel"];}});
|
|
60831
63185
|
const __m10=__req("packages/dom/src/celledit.js");
|
|
60832
63186
|
Object.defineProperty(__exports,"CellEditController",{enumerable:true,get:function(){return __m10["CellEditController"];}});
|
|
60833
63187
|
const __m11=__req("packages/dom/src/editbar.js");
|
|
@@ -60889,7 +63243,7 @@ createLocalViewStorage,
|
|
|
60889
63243
|
const __default=LatticeGrid;
|
|
60890
63244
|
});
|
|
60891
63245
|
try{
|
|
60892
|
-
__req("packages/worker/src/inline.js").setWorkerSource("(function(root){\n'use strict';\nvar __mods=Object.create(null);\nvar __cache=Object.create(null);\nfunction __def(id,fn){__mods[id]=fn;}\nfunction __req(id){\nvar hit=__cache[id];\nif(hit)return hit;\nvar exports=Object.create(null);\n__cache[id]=exports;\nvar fn=__mods[id];\nif(!fn)throw new Error('[lattice] missing module: '+id);\nfn(exports,__req);\nreturn exports;\n}\n__def(\"packages/core/src/internal/util.js\",function(__exports,__req){\n'use strict';\nObject.defineProperty(__exports,\"VERSION\",{enumerable:true,get:function(){return VERSION;}});\nObject.defineProperty(__exports,\"reportedWarnings\",{enumerable:true,get:function(){return reportedWarnings;}});\nObject.defineProperty(__exports,\"warnOnce\",{enumerable:true,get:function(){return warnOnce;}});\nObject.defineProperty(__exports,\"infoOnce\",{enumerable:true,get:function(){return infoOnce;}});\nObject.defineProperty(__exports,\"resetWarnings\",{enumerable:true,get:function(){return resetWarnings;}});\nObject.defineProperty(__exports,\"fail\",{enumerable:true,get:function(){return fail;}});\nObject.defineProperty(__exports,\"invariant\",{enumerable:true,get:function(){return invariant;}});\nObject.defineProperty(__exports,\"DEV\",{enumerable:true,get:function(){return DEV;}});\nObject.defineProperty(__exports,\"isObject\",{enumerable:true,get:function(){return isObject;}});\nObject.defineProperty(__exports,\"isFunction\",{enumerable:true,get:function(){return isFunction;}});\nObject.defineProperty(__exports,\"isNil\",{enumerable:true,get:function(){return isNil;}});\nObject.defineProperty(__exports,\"isBlank\",{enumerable:true,get:function(){return isBlank;}});\nObject.defineProperty(__exports,\"isCtor\",{enumerable:true,get:function(){return isCtor;}});\nObject.defineProperty(__exports,\"pathGetter\",{enumerable:true,get:function(){return pathGetter;}});\nObject.defineProperty(__exports,\"pathSetter\",{enumerable:true,get:function(){return pathSetter;}});\nObject.defineProperty(__exports,\"getPath\",{enumerable:true,get:function(){return getPath;}});\nObject.defineProperty(__exports,\"setPath\",{enumerable:true,get:function(){return setPath;}});\nObject.defineProperty(__exports,\"humanise\",{enumerable:true,get:function(){return humanise;}});\nObject.defineProperty(__exports,\"escapeHtml\",{enumerable:true,get:function(){return escapeHtml;}});\nObject.defineProperty(__exports,\"titleCase\",{enumerable:true,get:function(){return titleCase;}});\nObject.defineProperty(__exports,\"expand\",{enumerable:true,get:function(){return expand;}});\nObject.defineProperty(__exports,\"toArray\",{enumerable:true,get:function(){return toArray;}});\nObject.defineProperty(__exports,\"merge\",{enumerable:true,get:function(){return merge;}});\nObject.defineProperty(__exports,\"mergeRow\",{enumerable:true,get:function(){return mergeRow;}});\nObject.defineProperty(__exports,\"Lru\",{enumerable:true,get:function(){return Lru;}});\nObject.defineProperty(__exports,\"collator\",{enumerable:true,get:function(){return collator;}});\nObject.defineProperty(__exports,\"defaultCompare\",{enumerable:true,get:function(){return defaultCompare;}});\nObject.defineProperty(__exports,\"now\",{enumerable:true,get:function(){return now;}});\nObject.defineProperty(__exports,\"nextFrame\",{enumerable:true,get:function(){return nextFrame;}});\nObject.defineProperty(__exports,\"cancelFrame\",{enumerable:true,get:function(){return cancelFrame;}});\nObject.defineProperty(__exports,\"frameBatched\",{enumerable:true,get:function(){return frameBatched;}});\nObject.defineProperty(__exports,\"whenIdle\",{enumerable:true,get:function(){return whenIdle;}});\nObject.defineProperty(__exports,\"uid\",{enumerable:true,get:function(){return uid;}});\nconst VERSION='1.8.0';\nconst warned=new Set();\nconst reported=[];\nconst REPORT_LIMIT=500;\nfunction record(key,level,message){\nreported.push({\nkey,\nlevel,\nmessage:message.map((m)=>(typeof m==='string'?m:safeString(m))).join(' '),\nat:Date.now(),\n});\nif(reported.length>REPORT_LIMIT)reported.shift();\n}\nfunction safeString(value){\nif(value instanceof Error)return value.message;\ntry{return JSON.stringify(value);}catch{return String(value);}\n}\nfunction reportedWarnings(){return reported.map((r)=>({...r}));}\nfunction warnOnce(key,...message){\nif(warned.has(key))return;\nwarned.add(key);\nrecord(key,'warn',message);\nconsole.warn('[lattice]',...message);\n}\nfunction infoOnce(key,...message){\nif(warned.has(key))return;\nwarned.add(key);\nrecord(key,'info',message);\nconsole.info('[lattice]',...message);\n}\nfunction resetWarnings(){\nwarned.clear();\nreported.length=0;\n}\nfunction fail(message,extra){\nconst err=new Error(`[lattice] ${message}`);\nif(extra!==undefined)err.cause=extra;\nthrow err;\n}\nfunction invariant(condition,message){\nif(!condition)fail(message);\n}\nconst DEV=(()=>{\ntry{\nreturn!(typeof process!=='undefined'&&process.env\n&&process.env.NODE_ENV==='production');\n}catch{\nreturn true;\n}\n})();\nfunction isObject(v){\nreturn v!==null&&typeof v==='object'&&!Array.isArray(v);\n}\nfunction isFunction(v){\nreturn typeof v==='function';\n}\nfunction isNil(v){\nreturn v===null||v===undefined;\n}\nfunction isBlank(v){\nreturn v===null||v===undefined||v==='';\n}\nfunction isCtor(v){\nif(typeof v!=='function')return false;\nif(/^class[\\s{]/.test(Function.prototype.toString.call(v)))return true;\nreturn!!(v.prototype&&Object.getOwnPropertyNames(v.prototype).length>1);\n}\nconst pathCache=new Map();\nfunction pathGetter(path){\nlet fn=pathCache.get(path);\nif(fn)return fn;\nif(!path.includes('.')){\nfn=(o)=>(o==null?undefined:o[path]);\n}else{\nconst parts=path.split('.');\nconst n=parts.length;\nfn=(o)=>{\nlet cur=o;\nfor(let i=0;i<n;i++){\nif(cur==null)return undefined;\ncur=cur[parts[i]];\n}\nreturn cur;\n};\n}\npathCache.set(path,fn);\nreturn fn;\n}\nconst setterCache=new Map();\nfunction pathSetter(path){\nlet fn=setterCache.get(path);\nif(fn)return fn;\nif(!path.includes('.')){\nfn=(o,v)=>{if(o!=null)o[path]=v;};\n}else{\nconst parts=path.split('.');\nconst last=parts.length-1;\nfn=(o,v)=>{\nlet cur=o;\nfor(let i=0;i<last;i++){\nif(cur==null)return;\nconst k=parts[i];\nif(cur[k]==null)cur[k]={};\ncur=cur[k];\n}\nif(cur!=null)cur[parts[last]]=v;\n};\n}\nsetterCache.set(path,fn);\nreturn fn;\n}\nfunction getPath(obj,path){\nreturn pathGetter(path)(obj);\n}\nfunction setPath(obj,path,value){\npathSetter(path)(obj,value);\n}\nfunction humanise(field){\nif(!field)return'';\nconst leaf=field.includes('.')?field.slice(field.lastIndexOf('.')+1):field;\nreturn leaf\n.replace(/[_-]+/g,' ')\n.replace(/([a-z0-9])([A-Z])/g,'$1 $2')\n.replace(/([A-Z]+)([A-Z][a-z])/g,'$1 $2')\n.replace(/\\s+/g,' ')\n.trim()\n.replace(/^./,(c)=>c.toUpperCase());\n}\nconst ESCAPES={'&':'&','<':'<','>':'>','\"':'"',\"'\":'''};\nfunction escapeHtml(s){\nconst str=s==null?'':String(s);\nreturn/[&<>\"']/.test(str)?str.replace(/[&<>\"']/g,(c)=>ESCAPES[c]):str;\n}\nfunction titleCase(s){\nreturn String(s).replace(/\\w\\S*/g,(t)=>t[0].toUpperCase()+t.slice(1).toLowerCase());\n}\nfunction expand(value,key,whenTrue){\nif(value===undefined)return undefined;\nif(value===true)return{enabled:true,...whenTrue};\nif(value===false)return{enabled:false};\nif(isObject(value))return value;\nreturn{[key]:value,enabled:true};\n}\nfunction toArray(v){\nif(v===undefined||v===null)return[];\nreturn Array.isArray(v)?v:[v];\n}\nfunction merge(a,b){\nif(!isObject(a))return isObject(b)?{...b}:b;\nif(!isObject(b))return b===undefined?a:b;\nconst out={...a};\nfor(const k of Object.keys(b)){\nconst bv=b[k];\nif(bv===undefined)continue;\nout[k]=isObject(bv)&&isObject(out[k])?merge(out[k],bv):bv;\n}\nreturn out;\n}\nfunction mergeRow(previous,patch){\nif(!isObject(previous)||!isObject(patch)||previous===patch)return patch;\nconst out=Object.create(Object.getPrototypeOf(previous));\nObject.assign(out,previous,patch);\nreturn out;\n}\nclass Lru{\n#max;\n#map=new Map();\n#onEvict;\nconstructor(max=256,onEvict=null){\nthis.#max=max;\nthis.#onEvict=onEvict;\n}\nget size(){\nreturn this.#map.size;\n}\nget max(){\nreturn this.#max;\n}\nset max(v){\nthis.#max=v;\nthis.#trim();\n}\nhas(k){\nreturn this.#map.has(k);\n}\nget(k){\nconst m=this.#map;\nif(!m.has(k))return undefined;\nconst v=m.get(k);\nm.delete(k);\nm.set(k,v);\nreturn v;\n}\npeek(k){\nreturn this.#map.get(k);\n}\nset(k,v){\nconst m=this.#map;\nif(m.has(k))m.delete(k);\nm.set(k,v);\nthis.#trim();\nreturn v;\n}\ndelete(k){\nconst v=this.#map.get(k);\nif(this.#map.delete(k)&&this.#onEvict)this.#onEvict(v,k);\nreturn v;\n}\nclear(){\nif(this.#onEvict)for(const[k,v]of this.#map)this.#onEvict(v,k);\nthis.#map.clear();\n}\nkeys(){\nreturn this.#map.keys();\n}\nvalues(){\nreturn this.#map.values();\n}\n#trim(){\nconst m=this.#map;\nwhile(m.size>this.#max){\nconst oldest=m.keys().next().value;\nconst v=m.get(oldest);\nm.delete(oldest);\nif(this.#onEvict)this.#onEvict(v,oldest);\n}\n}\n}\nconst collators=new Map();\nfunction collator(locale,opts){\nconst key=`${locale||''}|${opts?JSON.stringify(opts):''}`;\nlet c=collators.get(key);\nif(!c){\nc=new Intl.Collator(locale||undefined,{\nnumeric:true,sensitivity:'variant',...opts,\n});\ncollators.set(key,c);\n}\nreturn c;\n}\nfunction defaultCompare(a,b){\nif(a===b)return 0;\nif(a===null||a===undefined)return 1;\nif(b===null||b===undefined)return-1;\nif(typeof a==='number'&&typeof b==='number'){\nif(Number.isNaN(a))return Number.isNaN(b)?0:1;\nif(Number.isNaN(b))return-1;\nreturn a<b?-1:a>b?1:0;\n}\nconst sa=String(a);\nconst sb=String(b);\nreturn sa<sb?-1:sa>sb?1:0;\n}\nfunction now(){\nreturn typeof performance!=='undefined'&&performance.now\n?performance.now()\n:Date.now();\n}\nconst hasRaf=typeof requestAnimationFrame==='function';\nfunction nextFrame(fn){\nif(hasRaf)return requestAnimationFrame(fn);\nreturn setTimeout(()=>fn(now()),16);\n}\nfunction cancelFrame(handle){\nif(handle==null)return;\nif(hasRaf)cancelAnimationFrame(handle);\nelse clearTimeout(handle);\n}\nfunction frameBatched(fn){\nlet handle=null;\nlet lastArgs=null;\nconst run=()=>{\nhandle=null;\nconst a=lastArgs;\nlastArgs=null;\nfn(...(a||[]));\n};\nconst wrapped=(...args)=>{\nlastArgs=args;\nif(handle===null)handle=nextFrame(run);\n};\nwrapped.cancel=()=>{\ncancelFrame(handle);\nhandle=null;\nlastArgs=null;\n};\nwrapped.flush=()=>{\nif(handle!==null){\ncancelFrame(handle);\nrun();\n}\n};\nreturn wrapped;\n}\nfunction whenIdle(fn,timeout=50){\nif(typeof requestIdleCallback==='function'){\nreturn requestIdleCallback(fn,{timeout});\n}\nreturn setTimeout(()=>fn({timeRemaining:()=>0,didTimeout:true}),1);\n}\nlet idSeq=0;\nfunction uid(prefix='l'){\nreturn`${prefix}${(++idSeq).toString(36)}`;\n}\n});\n__def(\"packages/worker/src/transport.js\",function(__exports,__req){\n'use strict';\nObject.defineProperty(__exports,\"PROTOCOL\",{enumerable:true,get:function(){return PROTOCOL;}});\nObject.defineProperty(__exports,\"OPS\",{enumerable:true,get:function(){return OPS;}});\nObject.defineProperty(__exports,\"CONTROL\",{enumerable:true,get:function(){return CONTROL;}});\nObject.defineProperty(__exports,\"ERRORS\",{enumerable:true,get:function(){return ERRORS;}});\nObject.defineProperty(__exports,\"packHandle\",{enumerable:true,get:function(){return packHandle;}});\nObject.defineProperty(__exports,\"packHandles\",{enumerable:true,get:function(){return packHandles;}});\nObject.defineProperty(__exports,\"TransportedDictionary\",{enumerable:true,get:function(){return TransportedDictionary;}});\nObject.defineProperty(__exports,\"unpackHandle\",{enumerable:true,get:function(){return unpackHandle;}});\nObject.defineProperty(__exports,\"unpackHandles\",{enumerable:true,get:function(){return unpackHandles;}});\nObject.defineProperty(__exports,\"createMaskPool\",{enumerable:true,get:function(){return createMaskPool;}});\nObject.defineProperty(__exports,\"isTransferable\",{enumerable:true,get:function(){return isTransferable;}});\nObject.defineProperty(__exports,\"collectTransfers\",{enumerable:true,get:function(){return collectTransfers;}});\nObject.defineProperty(__exports,\"isPortable\",{enumerable:true,get:function(){return isPortable;}});\nObject.defineProperty(__exports,\"filterColumnIds\",{enumerable:true,get:function(){return filterColumnIds;}});\nconst __m0=__req(\"packages/core/src/internal/util.js\");\nconst collator=__m0[\"collator\"];\nconst isFunction=__m0[\"isFunction\"];\nconst PROTOCOL=1;\nconst OPS=Object.freeze({\nSORT_COLUMN:'sortColumn',\nSORT_MULTI:'sortMulti',\nEVALUATE_FILTERS:'evaluateFilters',\nCOMPACT:'compact',\nGROUP_BY_COLUMNS:'groupByColumns',\nTOTAL:'total',\nPIVOT:'pivot',\nFACET:'facet',\n});\nconst CONTROL=Object.freeze({\nREADY:'ready',\nCANCEL:'cancel',\nPING:'ping',\n});\nconst ERRORS=Object.freeze({\nNO_COMPUTE:'E_NO_COMPUTE',\nNO_KERNEL:'E_NO_KERNEL',\nABORTED:'E_ABORTED',\nKERNEL:'E_KERNEL',\nPROTOCOL:'E_PROTOCOL',\n});\nfunction packHandle(handle){\nif(handle==null)return null;\nconst presence=handle.presence;\nreturn{\nid:handle.id,\nkind:handle.kind,\nnullable:!!handle.nullable,\nvalues:handle.values??null,\npresence:presence?(presence.words??presence):null,\npresenceBits:presence?(presence.size??(presence.words??presence).length*8):0,\ndict:handle.dict?sliceDictionary(handle.dict):null,\noffsets:handle.offsets??null,\nversion:handle.version??0,\n};\n}\nfunction sliceDictionary(dict){\nif(Array.isArray(dict))return dict;\nif(isFunction(dict.values))return dict.values();\nreturn[];\n}\nfunction packHandles(handles){\nconst out=new Array(handles.length);\nfor(let i=0;i<handles.length;i++)out[i]=packHandle(handles[i]);\nreturn out;\n}\nclass TransportedBitset{\n#words;\n#bits;\nconstructor(words,bits){\nthis.#words=words;\nthis.#bits=bits;\n}\nget words(){return this.#words;}\nget size(){return this.#bits;}\nget(i){return(this.#words[i>>>3]&(1<<(i&7)))!==0;}\ncount(){\nconst w=this.#words;\nlet n=0;\nfor(let i=0;i<w.length;i++){\nlet v=w[i];\nwhile(v){v&=v-1;n++;}\n}\nreturn n;\n}\n}\nclass TransportedDictionary{\n#values;\n#index=null;\n#version=0;\n#ranks=new Map();\nconstructor(values){\nthis.#values=values||[];\n}\nget size(){return this.#values.length;}\nget version(){return this.#version;}\ncodeOf(value){\nif(this.#index===null){\nthis.#index=new Map();\nfor(let i=0;i<this.#values.length;i++)this.#index.set(this.#values[i],i);\n}\nconst found=this.#index.get(value);\nif(found!==undefined)return found;\nconst code=this.#values.length;\nthis.#values.push(value);\nthis.#index.set(value,code);\nthis.#version++;\nreturn code;\n}\nvalueOf(code){return this.#values[code];}\nvalues(){return this.#values;}\nranks(locale){\nconst key=locale||'';\nconst cached=this.#ranks.get(key);\nif(cached&&cached.version===this.#version)return cached.ranks;\nconst n=this.#values.length;\nconst order=new Uint32Array(n);\nfor(let i=0;i<n;i++)order[i]=i;\nconst cmp=collator(locale).compare;\nconst vals=this.#values;\nconst sorted=Array.from(order).sort((a,b)=>{\nconst av=vals[a];\nconst bv=vals[b];\nif(av===bv)return 0;\nif(av===null||av===undefined)return 1;\nif(bv===null||bv===undefined)return-1;\nreturn cmp(String(av),String(bv));\n});\nconst ranks=new Uint32Array(n);\nfor(let r=0;r<sorted.length;r++)ranks[sorted[r]]=r;\nthis.#ranks.set(key,{version:this.#version,ranks});\nreturn ranks;\n}\n}\nfunction unpackHandle(packed){\nif(packed==null)return null;\nconst presence=packed.presence\n?new TransportedBitset(packed.presence,packed.presenceBits||packed.presence.length*8)\n:null;\nconst dict=packed.dict?new TransportedDictionary(packed.dict):null;\nconst values=packed.values;\nconst offsets=packed.offsets??null;\nconst kind=packed.kind;\nconst get=(physical)=>{\nif(presence&&!presence.get(physical))return null;\nswitch(kind){\ncase'dictionary':\nreturn dict?dict.valueOf(values[physical]):values[physical];\ncase'bitset':\nreturn(values[physical>>>3]&(1<<(physical&7)))!==0;\ncase'multi':{\nif(!offsets)return null;\nconst from=offsets[physical];\nconst to=offsets[physical+1];\nconst out=new Array(to-from);\nfor(let i=from;i<to;i++)out[i-from]=dict?dict.valueOf(values[i]):values[i];\nreturn out;\n}\ndefault:\nreturn values[physical];\n}\n};\nreturn{\nid:packed.id,\nkind,\nnullable:packed.nullable,\nvalues,\npresence,\ndict,\noffsets,\nget,\nversion:packed.version,\n};\n}\nfunction unpackHandles(packed){\nconst out=new Array(packed.length);\nfor(let i=0;i<packed.length;i++)out[i]=unpackHandle(packed[i]);\nreturn out;\n}\nfunction createMaskPool(){\nconst masks=[];\nconst indices=[];\nreturn{\nmask(n){\nfor(let i=0;i<masks.length;i++){\nif(masks[i].length>=n){\nconst buf=masks.splice(i,1)[0].subarray(0,n);\nbuf.fill(0);\nreturn buf;\n}\n}\nreturn new Uint8Array(n);\n},\nindices(n){\nfor(let i=0;i<indices.length;i++){\nif(indices[i].length>=n)return indices.splice(i,1)[0].subarray(0,n);\n}\nreturn new Uint32Array(n);\n},\nrelease(buf){\nif(!buf)return;\nif(buf instanceof Uint8Array)masks.push(buf);\nelse if(buf instanceof Uint32Array)indices.push(buf);\n},\nclear(){masks.length=0;indices.length=0;},\n};\n}\nfunction isTransferable(v){\nif(!ArrayBuffer.isView(v))return false;\nconst buf=(v).buffer;\nif(!buf)return false;\nreturn typeof SharedArrayBuffer==='undefined'||!(buf instanceof SharedArrayBuffer);\n}\nfunction collectTransfers(value,out=[]){\nconst add=(v)=>{\nif(!isTransferable(v))return;\nconst buf=(v).buffer;\nif(!out.includes(buf))out.push(buf);\n};\nif(value==null)return out;\nif(ArrayBuffer.isView(value)){add(value);return out;}\nif(Array.isArray(value)){\nfor(const item of value)add(item);\nreturn out;\n}\nif(typeof value==='object'){\nfor(const key of Object.keys(value)){\nconst item=(value)[key];\nif(Array.isArray(item))for(const sub of item)add(sub);\nelse add(item);\n}\n}\nreturn out;\n}\nfunction isPortable(value,depth=0){\nif(value==null)return true;\nconst t=typeof value;\nif(t==='function'||t==='symbol')return false;\nif(t!=='object')return true;\nif(depth>4)return true;\nif(ArrayBuffer.isView(value)||value instanceof ArrayBuffer||value instanceof Date)return true;\nif(Array.isArray(value)){\nfor(const item of value)if(!isPortable(item,depth+1))return false;\nreturn true;\n}\nfor(const key of Object.keys(value)){\nif(!isPortable((value)[key],depth+1))return false;\n}\nreturn true;\n}\nfunction filterColumnIds(filters,out=new Set()){\nif(!filters||typeof filters!=='object')return out;\nconst node=(filters);\nif(typeof node.col==='string')out.add(node.col);\nconst conditions=node.conditions;\nif(Array.isArray(conditions))for(const child of conditions)filterColumnIds(child,out);\nreturn out;\n}\n});\n__def(\"packages/core/src/compute/handle.js\",function(__exports,__req){\n'use strict';\nObject.defineProperty(__exports,\"identity\",{enumerable:true,get:function(){return identity;}});\nObject.defineProperty(__exports,\"rowCount\",{enumerable:true,get:function(){return rowCount;}});\nObject.defineProperty(__exports,\"bitReader\",{enumerable:true,get:function(){return bitReader;}});\nObject.defineProperty(__exports,\"presenceReader\",{enumerable:true,get:function(){return presenceReader;}});\nObject.defineProperty(__exports,\"dictSize\",{enumerable:true,get:function(){return dictSize;}});\nObject.defineProperty(__exports,\"dictValue\",{enumerable:true,get:function(){return dictValue;}});\nObject.defineProperty(__exports,\"multiValue\",{enumerable:true,get:function(){return multiValue;}});\nObject.defineProperty(__exports,\"valueReader\",{enumerable:true,get:function(){return valueReader;}});\nObject.defineProperty(__exports,\"numericTotalOrder\",{enumerable:true,get:function(){return numericTotalOrder;}});\nObject.defineProperty(__exports,\"valueComparator\",{enumerable:true,get:function(){return valueComparator;}});\nObject.defineProperty(__exports,\"dictRanks\",{enumerable:true,get:function(){return dictRanks;}});\nObject.defineProperty(__exports,\"isMissing\",{enumerable:true,get:function(){return isMissing;}});\nconst __m0=__req(\"packages/core/src/internal/util.js\");\nconst collator=__m0[\"collator\"];\nconst defaultCompare=__m0[\"defaultCompare\"];\nconst warnOnce=__m0[\"warnOnce\"];\nfunction identity(n){\nconst out=new Uint32Array(n);\nfor(let i=0;i<n;i++)out[i]=i;\nreturn out;\n}\nfunction rowCount(handle,opts){\nif(opts&&typeof opts.count==='number')return opts.count;\nif(!handle)return 0;\nif(typeof handle.count==='number')return handle.count;\nif(typeof handle.length==='number')return handle.length;\nconst values=handle.values;\nif(handle.kind==='multi'&&handle.offsets)return Math.max(0,handle.offsets.length-1);\nif(!values)return handle.presence&&typeof handle.presence.size==='number'?handle.presence.size:0;\nif(handle.kind==='bitset'){\nif(typeof values.size==='number')return values.size;\nif(handle.presence&&typeof handle.presence.size==='number')return handle.presence.size;\nwarnOnce(`count:${handle.id}`,`column \"${handle.id}\" is bitset-backed with no declared row count; assuming ${values.length*8}`);\nreturn values.length*8;\n}\nreturn values.length;\n}\nconst bitOrders=new WeakMap();\nfunction bitOrderOf(bitset){\nconst ctor=bitset.constructor;\nif(!ctor)return'unknown';\nconst cached=bitOrders.get(ctor);\nif(cached)return cached;\nlet order='unknown';\ntry{\nlet probe=null;\nif(typeof ctor.from==='function')probe=ctor.from([false,true]);\nelse{\nprobe=new ctor(8);\nprobe.set(1);\n}\nconst words=probe&&probe.words;\nif(words&&words.length){\nif(words[0]===0x02)order='lsb';\nelse if(words[0]===0x40)order='msb';\n}\n}catch{\norder='unknown';\n}\nbitOrders.set(ctor,order);\nreturn order;\n}\nfunction bitReader(bits){\nif(!bits)return()=>0;\nconst raw=bits instanceof Uint8Array?bits:bits.words;\nif(raw instanceof Uint8Array){\nconst order=bits instanceof Uint8Array?'lsb':bitOrderOf(bits);\nif(order==='lsb')return(i)=>(raw[i>>>3]>>>(i&7))&1;\nif(order==='msb')return(i)=>(raw[i>>>3]>>>(7-(i&7)))&1;\n}\nif(typeof bits.get==='function')return(i)=>(bits.get(i)?1:0);\nreturn()=>0;\n}\nfunction presenceReader(handle){\nif(!handle||!handle.presence)return null;\nreturn bitReader(handle.presence);\n}\nfunction dictSize(dict){\nif(!dict)return 0;\nif(typeof dict.size==='number')return dict.size;\nif(typeof dict.values==='function')return dict.values().length;\nreturn 0;\n}\nfunction dictValue(dict,code){\nif(!dict)return null;\nif(typeof dict.valueOf==='function')return dict.valueOf(code);\nif(typeof dict.values==='function')return dict.values()[code];\nreturn null;\n}\nfunction multiValue(handle,i){\nconst offsets=handle.offsets;\nconst values=handle.values;\nif(!offsets||!values)return[];\nconst from=offsets[i];\nconst to=offsets[i+1];\nif(!(to>from))return[];\nconst dict=handle.dict;\nconst out=new Array(to-from);\nfor(let k=from;k<to;k++)out[k-from]=dict?dictValue(dict,values[k]):values[k];\nreturn out;\n}\nfunction valueReader(handle){\nif(!handle)return()=>undefined;\nconst values=handle.values;\nconst present=presenceReader(handle);\nconst kind=handle.kind;\nif(kind==='dictionary'){\nconst dict=handle.dict;\nif(present)return(i)=>(present(i)?dictValue(dict,values[i]):null);\nreturn(i)=>dictValue(dict,values[i]);\n}\nif(kind==='bitset'){\nconst bit=bitReader(values);\nif(present)return(i)=>(present(i)?bit(i)===1:null);\nreturn(i)=>bit(i)===1;\n}\nif(kind==='multi'){\nif(present)return(i)=>(present(i)?multiValue(handle,i):null);\nreturn(i)=>multiValue(handle,i);\n}\nif(!values&&typeof handle.get==='function'){\nconst get=handle.get.bind(handle);\nreturn(i)=>{\nconst v=get(i);\nreturn v===undefined?null:v;\n};\n}\nif(present){\nreturn(i)=>{\nif(!present(i))return null;\nconst v=values[i];\nreturn v===undefined?null:v;\n};\n}\nreturn(i)=>{\nconst v=values[i];\nreturn v===undefined?null:v;\n};\n}\nfunction numericTotalOrder(a,b){\nif(a<b)return-1;\nif(a>b)return 1;\nif(a===b){\nconst na=Object.is(a,-0);\nconst nb=Object.is(b,-0);\nif(na===nb)return 0;\nreturn na?-1:1;\n}\nconst an=Number.isNaN(a);\nconst bn=Number.isNaN(b);\nif(an&&bn)return 0;\nreturn an?1:-1;\n}\nfunction valueComparator(locale){\nconst coll=collator(locale);\nreturn(a,b)=>{\nif(a===b)return 0;\nconst ta=typeof a;\nconst tb=typeof b;\nif(ta==='string'&&tb==='string')return coll.compare(a,b);\nif(ta==='number'&&tb==='number')return numericTotalOrder(a,b);\nif(ta==='boolean'&&tb==='boolean')return a===b?0:a?1:-1;\nif(a instanceof Date||b instanceof Date){\nconst na=a instanceof Date?a.getTime():Number(a);\nconst nb=b instanceof Date?b.getTime():Number(b);\nreturn numericTotalOrder(na,nb);\n}\nreturn defaultCompare(a,b);\n};\n}\nfunction dictRanks(dict,locale){\nif(dict&&typeof dict.ranks==='function')return dict.ranks(locale);\nconst table=dict&&typeof dict.values==='function'?dict.values():[];\nconst n=table.length;\nconst cmp=valueComparator(locale);\nconst order=new Array(n);\nfor(let i=0;i<n;i++)order[i]=i;\norder.sort((a,b)=>cmp(table[a],table[b])||a-b);\nconst ranks=new Uint32Array(n);\nfor(let r=0;r<n;r++)ranks[order[r]]=r;\nreturn ranks;\n}\nfunction isMissing(v){\nreturn v===null||v===undefined||(typeof v==='number'&&Number.isNaN(v));\n}\n});\n__def(\"packages/core/src/compute/sort.js\",function(__exports,__req){\n'use strict';\nObject.defineProperty(__exports,\"radixSortFloat64\",{enumerable:true,get:function(){return radixSortFloat64;}});\nObject.defineProperty(__exports,\"radixSortInt32\",{enumerable:true,get:function(){return radixSortInt32;}});\nObject.defineProperty(__exports,\"rankSortDictionary\",{enumerable:true,get:function(){return rankSortDictionary;}});\nObject.defineProperty(__exports,\"mergeSortComparator\",{enumerable:true,get:function(){return mergeSortComparator;}});\nObject.defineProperty(__exports,\"sortColumn\",{enumerable:true,get:function(){return sortColumn;}});\nObject.defineProperty(__exports,\"sortMulti\",{enumerable:true,get:function(){return sortMulti;}});\nconst __m0=__req(\"packages/core/src/compute/handle.js\");\nconst bitReader=__m0[\"bitReader\"];\nconst dictRanks=__m0[\"dictRanks\"];\nconst dictSize=__m0[\"dictSize\"];\nconst identity=__m0[\"identity\"];\nconst isMissing=__m0[\"isMissing\"];\nconst presenceReader=__m0[\"presenceReader\"];\nconst rowCount=__m0[\"rowCount\"];\nconst valueComparator=__m0[\"valueComparator\"];\nconst valueReader=__m0[\"valueReader\"];\nconst EMPTY_INDICES=new Uint32Array(0);\nconst SCRATCH=new ArrayBuffer(8);\nconst SCRATCH_F64=new Float64Array(SCRATCH);\nconst SCRATCH_U32=new Uint32Array(SCRATCH);\nconst HI=(()=>{\nSCRATCH_F64[0]=-1;\nreturn(SCRATCH_U32[1]&0x80000000)!==0?1:0;\n})();\nconst LO=HI===1?0:1;\nfunction transformDouble(value,out){\nSCRATCH_F64[0]=value;\nlet hi=SCRATCH_U32[HI];\nlet lo=SCRATCH_U32[LO];\nif((hi&0x80000000)!==0){\nhi=~hi>>>0;\nlo=~lo>>>0;\n}else{\nhi=(hi^0x80000000)>>>0;\n}\nout[0]=lo;\nout[1]=hi;\n}\nfunction radixLsd64(idx,lo,hi,n){\nif(n<2)return idx;\nconst hist=new Uint32Array(256*8);\nfor(let i=0;i<n;i++){\nconst l=lo[i];\nconst h=hi[i];\nhist[l&0xff]++;\nhist[256+((l>>>8)&0xff)]++;\nhist[512+((l>>>16)&0xff)]++;\nhist[768+((l>>>24)&0xff)]++;\nhist[1024+(h&0xff)]++;\nhist[1280+((h>>>8)&0xff)]++;\nhist[1536+((h>>>16)&0xff)]++;\nhist[1792+((h>>>24)&0xff)]++;\n}\nlet srcIdx=idx;\nlet srcLo=lo;\nlet srcHi=hi;\nlet dstIdx=new Uint32Array(n);\nlet dstLo=new Uint32Array(n);\nlet dstHi=new Uint32Array(n);\nconst offset=new Uint32Array(256);\nfor(let pass=0;pass<8;pass++){\nconst base=pass<<8;\nconst shift=(pass&3)<<3;\nconst useHi=pass>=4;\nlet skip=false;\nfor(let b=0;b<256;b++){\nif(hist[base+b]===n){skip=true;break;}\n}\nif(skip)continue;\nlet sum=0;\nfor(let b=0;b<256;b++){\noffset[b]=sum;\nsum+=hist[base+b];\n}\nfor(let i=0;i<n;i++){\nconst l=srcLo[i];\nconst h=srcHi[i];\nconst digit=((useHi?h:l)>>>shift)&0xff;\nconst p=offset[digit]++;\ndstIdx[p]=srcIdx[i];\ndstLo[p]=l;\ndstHi[p]=h;\n}\nlet t=srcIdx;srcIdx=dstIdx;dstIdx=t;\nt=srcLo;srcLo=dstLo;dstLo=t;\nt=srcHi;srcHi=dstHi;dstHi=t;\n}\nreturn srcIdx;\n}\nfunction radixLsd32(idx,keys,n){\nif(n<2)return idx;\nconst hist=new Uint32Array(256*4);\nfor(let i=0;i<n;i++){\nconst k=keys[i];\nhist[k&0xff]++;\nhist[256+((k>>>8)&0xff)]++;\nhist[512+((k>>>16)&0xff)]++;\nhist[768+((k>>>24)&0xff)]++;\n}\nlet srcIdx=idx;\nlet srcKeys=keys;\nlet dstIdx=new Uint32Array(n);\nlet dstKeys=new Uint32Array(n);\nconst offset=new Uint32Array(256);\nfor(let pass=0;pass<4;pass++){\nconst base=pass<<8;\nconst shift=pass<<3;\nlet skip=false;\nfor(let b=0;b<256;b++){\nif(hist[base+b]===n){skip=true;break;}\n}\nif(skip)continue;\nlet sum=0;\nfor(let b=0;b<256;b++){\noffset[b]=sum;\nsum+=hist[base+b];\n}\nfor(let i=0;i<n;i++){\nconst k=srcKeys[i];\nconst p=offset[(k>>>shift)&0xff]++;\ndstIdx[p]=srcIdx[i];\ndstKeys[p]=k;\n}\nlet t=srcIdx;srcIdx=dstIdx;dstIdx=t;\nt=srcKeys;srcKeys=dstKeys;dstKeys=t;\n}\nreturn srcIdx;\n}\nfunction countingSort(idx,keys,n,radix){\nconst counts=new Uint32Array(radix+1);\nfor(let i=0;i<n;i++)counts[keys[i]]++;\nlet sum=0;\nfor(let k=0;k<=radix;k++){\nconst c=counts[k];\ncounts[k]=sum;\nsum+=c;\n}\nconst out=new Uint32Array(n);\nfor(let i=0;i<n;i++)out[counts[keys[i]]++]=idx[i];\nreturn out;\n}\nfunction sortUint32Keys(idx,keys,n,radix){\nif(n<2)return idx;\nif(radix<=65536||radix<=n*2)return countingSort(idx,keys,n,radix);\nreturn radixLsd32(idx,keys,n);\n}\nfunction exact(buffer,n){\nif(buffer.length===n&&buffer.byteOffset===0)return buffer;\nreturn Uint32Array.prototype.slice.call(buffer,0,n);\n}\nfunction radixSortFloat64(values,order,descending=false){\nconst src=order||identity(values.length);\nconst n=src.length;\nif(n<2)return Uint32Array.from(src);\nconst idx=new Uint32Array(n);\nconst lo=new Uint32Array(n);\nconst hi=new Uint32Array(n);\nconst nans=new Uint32Array(n);\nconst pair=new Uint32Array(2);\nlet m=0;\nlet nanCount=0;\nfor(let i=0;i<n;i++){\nconst row=src[i];\nconst v=values[row];\nif(Number.isNaN(v)){nans[nanCount++]=row;continue;}\ntransformDouble(v,pair);\nif(descending){\nlo[m]=~pair[0]>>>0;\nhi[m]=~pair[1]>>>0;\n}else{\nlo[m]=pair[0];\nhi[m]=pair[1];\n}\nidx[m++]=row;\n}\nconst sorted=radixLsd64(idx.subarray(0,m),lo.subarray(0,m),hi.subarray(0,m),m);\nif(nanCount===0)return exact(sorted,m);\nconst out=new Uint32Array(n);\nout.set(sorted.subarray(0,m),0);\nout.set(nans.subarray(0,nanCount),m);\nreturn out;\n}\nfunction radixSortInt32(values,order,descending=false){\nconst src=order||identity(values.length);\nconst n=src.length;\nif(n<2)return Uint32Array.from(src);\nconst idx=Uint32Array.from(src);\nconst keys=new Uint32Array(n);\nfor(let i=0;i<n;i++){\nconst k=(values[idx[i]]^0x80000000)>>>0;\nkeys[i]=descending?(~k>>>0):k;\n}\nreturn exact(radixLsd32(idx,keys,n),n);\n}\nfunction rankSortDictionary(handle,order,opts={}){\nconst src=order||identity(rowCount(handle,opts));\nconst n=src.length;\nif(n<2)return Uint32Array.from(src);\nconst ranks=dictRanks(handle.dict,opts.locale);\nconst codes=handle.values;\nconst present=presenceReader(handle);\nconst size=Math.max(dictSize(handle.dict),ranks.length);\nconst absentRank=size;\nconst idx=Uint32Array.from(src);\nconst keys=new Uint32Array(n);\nconst descending=!!opts.descending;\nfor(let i=0;i<n;i++){\nconst row=idx[i];\nlet rank=present&&present(row)===0?absentRank:ranks[codes[row]];\nif(rank===undefined)rank=absentRank;\nkeys[i]=descending?absentRank-rank:rank;\n}\nreturn exact(sortUint32Keys(idx,keys,n,size+1),n);\n}\nfunction mergeSortComparator(values,order,compare){\nconst n=order.length;\nlet src=Uint32Array.from(order);\nif(n<2)return src;\nlet dst=new Uint32Array(n);\nfor(let width=1;width<n;width<<=1){\nfor(let start=0;start<n;start+=width<<1){\nconst mid=Math.min(start+width,n);\nconst end=Math.min(start+(width<<1),n);\nlet i=start;\nlet j=mid;\nlet k=start;\nwhile(i<mid&&j<end){\ndst[k++]=compare(values[src[i]],values[src[j]])<=0?src[i++]:src[j++];\n}\nwhile(i<mid)dst[k++]=src[i++];\nwhile(j<end)dst[k++]=src[j++];\n}\nconst t=src;src=dst;dst=t;\n}\nreturn src;\n}\nfunction sortBitsetColumn(handle,idx,descending){\nconst bit=bitReader(handle.values);\nconst n=idx.length;\nconst out=new Uint32Array(n);\nconst first=descending?1:0;\nlet k=0;\nfor(let i=0;i<n;i++)if(bit(idx[i])===first)out[k++]=idx[i];\nfor(let i=0;i<n;i++)if(bit(idx[i])!==first)out[k++]=idx[i];\nreturn out;\n}\nfunction indexableValues(handle,idx){\nconst values=handle.values;\nconst kind=handle.kind;\nconst direct=(kind==='object'||kind===undefined)&&(Array.isArray(values)||ArrayBuffer.isView(values));\nif(direct&&!handle.presence)return values;\nconst reader=valueReader(handle);\nconst materialised=new Array(rowCount(handle)||0);\nfor(let i=0;i<idx.length;i++){\nconst row=idx[i];\nmaterialised[row]=reader(row);\n}\nreturn materialised;\n}\nfunction sortByComparator(handle,idx,opts){\nconst values=indexableValues(handle,idx);\nconst base=valueComparator(opts.locale);\nconst compare=opts.descending?(a,b)=>base(b,a):base;\nreturn mergeSortComparator(values,idx,compare);\n}\nfunction sortByCompare(handle,idx,opts){\nconst values=indexableValues(handle,idx);\nconst user=opts.compare;\nconst descending=!!opts.descending;\nconst compare=descending\n?(a,b)=>-user(a,b,undefined,undefined,true)\n:(a,b)=>user(a,b,undefined,undefined,false);\nreturn mergeSortComparator(values,idx,compare);\n}\nfunction partitionPresent(handle,idx){\nconst n=idx.length;\nconst present=presenceReader(handle);\nconst values=handle.values;\nconst checkNaN=handle.kind==='float64'&&!!values;\nconst looseKind=handle.kind==='object'||handle.kind==='multi'||handle.kind===undefined;\nif(!present&&!checkNaN&&!looseKind)return{present:idx,absent:EMPTY_INDICES};\nconst keep=new Uint32Array(n);\nconst drop=new Uint32Array(n);\nlet p=0;\nlet a=0;\nif(present&&checkNaN){\nfor(let i=0;i<n;i++){\nconst row=idx[i];\nif(present(row)===1&&!Number.isNaN(values[row]))keep[p++]=row;else drop[a++]=row;\n}\n}else if(checkNaN&&!present){\nfor(let i=0;i<n;i++){\nconst row=idx[i];\nif(!Number.isNaN(values[row]))keep[p++]=row;else drop[a++]=row;\n}\n}else if(present&&!looseKind){\nfor(let i=0;i<n;i++){\nconst row=idx[i];\nif(present(row)===1)keep[p++]=row;else drop[a++]=row;\n}\n}else{\nconst reader=valueReader(handle);\nfor(let i=0;i<n;i++){\nconst row=idx[i];\nif(!isMissing(reader(row)))keep[p++]=row;else drop[a++]=row;\n}\n}\nif(a===0)return{present:idx,absent:EMPTY_INDICES};\nreturn{present:keep.subarray(0,p),absent:drop.subarray(0,a)};\n}\nfunction joinRuns(sorted,absent,nullsFirst){\nif(absent.length===0)return sorted;\nconst out=new Uint32Array(sorted.length+absent.length);\nif(nullsFirst){\nout.set(absent,0);\nout.set(sorted,absent.length);\n}else{\nout.set(sorted,0);\nout.set(absent,sorted.length);\n}\nreturn out;\n}\nfunction sortColumn(handle,order,opts={}){\nconst src=order||identity(rowCount(handle,opts));\nif(!handle||src.length<2)return Uint32Array.from(src);\nconst{present,absent}=partitionPresent(handle,src);\nif(present.length===0)return Uint32Array.from(src);\nconst descending=!!opts.descending;\nlet sorted;\nif(typeof opts.compare==='function'){\nsorted=sortByCompare(handle,present,opts);\n}else{\nswitch(handle.kind){\ncase'float64':\nsorted=radixSortFloat64(handle.values,present,descending);\nbreak;\ncase'int32':\nsorted=radixSortInt32(handle.values,present,descending);\nbreak;\ncase'dictionary':\nsorted=rankSortDictionary(handle,present,opts);\nbreak;\ncase'bitset':\nsorted=sortBitsetColumn(handle,present,descending);\nbreak;\ndefault:\nsorted=sortByComparator(handle,present,opts);\nbreak;\n}\n}\nreturn joinRuns(sorted,absent,!!opts.nullsFirst);\n}\nfunction sortMulti(handles,entries,order,opts={}){\nconst list=entries||[];\nconst first=(list.length&&(list[0].handle||byId(handles,list[0].col)))||(handles&&handles[0]);\nlet current=order||identity(rowCount(first,opts));\nfor(let i=list.length-1;i>=0;i--){\nconst entry=list[i];\nconst handle=entry.handle||byId(handles,entry.col)||(handles&&handles[i]);\nif(!handle)continue;\ncurrent=sortColumn(handle,current,{\ndescending:entry.descending!==undefined?!!entry.descending:entry.dir==='desc',\nnullsFirst:!!entry.nullsFirst,\nlocale:entry.locale!==undefined?entry.locale:opts.locale,\ncompare:entry.compare,\n});\n}\nreturn current instanceof Uint32Array?current:Uint32Array.from(current);\n}\nfunction byId(handles,id){\nif(!handles||id===undefined)return undefined;\nfor(let i=0;i<handles.length;i++)if(handles[i]&&handles[i].id===id)return handles[i];\nreturn undefined;\n}\n});\n__def(\"packages/core/src/format/date.js\",function(__exports,__req){\n'use strict';\nObject.defineProperty(__exports,\"scanPattern\",{enumerable:true,get:function(){return scanPattern;}});\nObject.defineProperty(__exports,\"toDate\",{enumerable:true,get:function(){return toDate;}});\nObject.defineProperty(__exports,\"compilePattern\",{enumerable:true,get:function(){return compilePattern;}});\nObject.defineProperty(__exports,\"compileDate\",{enumerable:true,get:function(){return compileDate;}});\nObject.defineProperty(__exports,\"toIsoDate\",{enumerable:true,get:function(){return toIsoDate;}});\nObject.defineProperty(__exports,\"toIsoDateTime\",{enumerable:true,get:function(){return toIsoDateTime;}});\nObject.defineProperty(__exports,\"compareIso\",{enumerable:true,get:function(){return compareIso;}});\nconst __m0=__req(\"packages/core/src/internal/util.js\");\nconst isNil=__m0[\"isNil\"];\nconst warnOnce=__m0[\"warnOnce\"];\nconst TOKENS=[\n'yyyy','yy','MMMM','MMM','MM','M','dd','d',\n'EEEE','EEE','HH','H','hh','h','mm','m','ss','s','SSS','a',\n];\nfunction scanPattern(pattern){\nconst out=[];\nlet i=0;\nlet literal='';\nconst flush=()=>{if(literal){out.push({token:null,text:literal});literal='';}};\nwhile(i<pattern.length){\nconst ch=pattern[i];\nif(ch===\"'\"){\nif(pattern[i+1]===\"'\"){literal+=\"'\";i+=2;continue;}\nconst end=pattern.indexOf(\"'\",i+1);\nif(end===-1){literal+=pattern.slice(i+1);i=pattern.length;continue;}\nliteral+=pattern.slice(i+1,end);\ni=end+1;\ncontinue;\n}\nconst token=TOKENS.find((t)=>pattern.startsWith(t,i));\nif(token){flush();out.push({token,text:token});i+=token.length;continue;}\nif(/[A-Za-z]/.test(ch)){\nwarnOnce(\n`date.pattern.token:${ch}`,\n`the date pattern \"${pattern}\" contains '${ch}', which is not a supported token, `\n+'so it is rendered as text. Quote it as a literal to silence this. '\n+`Supported: ${TOKENS.join(' ')}.`,\n);\n}\nliteral+=ch;\ni+=1;\n}\nflush();\nreturn out;\n}\nconst WALL_CLOCK=/^(\\d{4})-(\\d{2})-(\\d{2})(?:[T ](\\d{2}):(\\d{2})(?::(\\d{2}))?(?:\\.\\d+)?)?$/;\nfunction toDate(value){\nif(isNil(value)||value==='')return null;\nif(value instanceof Date)return Number.isNaN(value.getTime())?null:value;\nif(typeof value==='number')return Number.isNaN(value)?null:new Date(value);\nif(typeof value==='string'){\nconst wall=WALL_CLOCK.exec(value.trim());\nif(wall){\nconst[,y,mo,d,h='0',mi='0',sec='0']=wall;\nreturn new Date(+y,+mo-1,+d,+h,+mi,+sec);\n}\nconst d=new Date(value);\nreturn Number.isNaN(d.getTime())?null:d;\n}\nreturn null;\n}\nfunction pad(n,w){return String(n).padStart(w,'0');}\nfunction fieldReader(timeZone){\nif(!timeZone){\nreturn(d)=>({\nyear:d.getFullYear(),month:d.getMonth()+1,day:d.getDate(),\nhour:d.getHours(),minute:d.getMinutes(),second:d.getSeconds(),\nms:d.getMilliseconds(),weekday:d.getDay(),\n});\n}\nconst zoned=new Intl.DateTimeFormat('en-US',{\ntimeZone,year:'numeric',month:'2-digit',day:'2-digit',\nhour:'2-digit',minute:'2-digit',second:'2-digit',hour12:false,weekday:'short',\n});\nconst days={Sun:0,Mon:1,Tue:2,Wed:3,Thu:4,Fri:5,Sat:6};\nreturn(d)=>{\nconst f={year:0,month:1,day:1,hour:0,minute:0,second:0,ms:d.getMilliseconds(),weekday:0};\nfor(const part of zoned.formatToParts(d)){\nswitch(part.type){\ncase'year':f.year=Number(part.value);break;\ncase'month':f.month=Number(part.value);break;\ncase'day':f.day=Number(part.value);break;\ncase'hour':f.hour=Number(part.value)%24;break;\ncase'minute':f.minute=Number(part.value);break;\ncase'second':f.second=Number(part.value);break;\ncase'weekday':f.weekday=days[part.value]??0;break;\ndefault:break;\n}\n}\nreturn f;\n};\n}\nfunction compilePattern(pattern,locale,timeZone){\nconst segments=scanPattern(pattern);\nconst read=fieldReader(timeZone);\nconst used=new Set(segments.filter((s)=>s.token).map((s)=>s.token));\nconst monthShort=used.has('MMM')?new Intl.DateTimeFormat(locale,{month:'short',timeZone}):null;\nconst monthLong=used.has('MMMM')?new Intl.DateTimeFormat(locale,{month:'long',timeZone}):null;\nconst dayShort=used.has('EEE')?new Intl.DateTimeFormat(locale,{weekday:'short',timeZone}):null;\nconst dayLong=used.has('EEEE')?new Intl.DateTimeFormat(locale,{weekday:'long',timeZone}):null;\nreturn(d)=>{\nconst f=read(d);\nlet out='';\nfor(const seg of segments){\nif(!seg.token){out+=seg.text;continue;}\nswitch(seg.token){\ncase'yyyy':out+=pad(f.year,4);break;\ncase'yy':out+=pad(f.year%100,2);break;\ncase'MMMM':out+=monthLong.format(d);break;\ncase'MMM':out+=monthShort.format(d);break;\ncase'MM':out+=pad(f.month,2);break;\ncase'M':out+=String(f.month);break;\ncase'dd':out+=pad(f.day,2);break;\ncase'd':out+=String(f.day);break;\ncase'EEEE':out+=dayLong.format(d);break;\ncase'EEE':out+=dayShort.format(d);break;\ncase'HH':out+=pad(f.hour,2);break;\ncase'H':out+=String(f.hour);break;\ncase'hh':out+=pad(f.hour%12===0?12:f.hour%12,2);break;\ncase'h':out+=String(f.hour%12===0?12:f.hour%12);break;\ncase'mm':out+=pad(f.minute,2);break;\ncase'm':out+=String(f.minute);break;\ncase'ss':out+=pad(f.second,2);break;\ncase's':out+=String(f.second);break;\ncase'SSS':out+=pad(f.ms,3);break;\ncase'a':out+=f.hour<12?'AM':'PM';break;\ndefault:out+=seg.text;break;\n}\n}\nreturn out;\n};\n}\nconst UNITS=[\n['year',365*24*3600e3],\n['month',30*24*3600e3],\n['week',7*24*3600e3],\n['day',24*3600e3],\n['hour',3600e3],\n['minute',60e3],\n['second',1e3],\n];\nfunction compileDate(spec,locale){\nconst s=spec||{};\nconst loc=s.locale||locale||undefined;\nconst nullDisplay=s.nullDisplay??'';\nconst timeZone=s.timeZone;\nlet absolute;\nif(s.pattern){\nabsolute=compilePattern(s.pattern,loc,timeZone);\n}else if(s.dateStyle||s.timeStyle){\nconst opts={timeZone};\nif(s.dateStyle)opts.dateStyle=s.dateStyle;\nif(s.timeStyle)opts.timeStyle=s.timeStyle;\nconst dtf=new Intl.DateTimeFormat(loc,opts);\nabsolute=(d)=>dtf.format(d);\n}else{\nconst dtf=new Intl.DateTimeFormat(loc,{dateStyle:'medium',timeZone});\nabsolute=(d)=>dtf.format(d);\n}\nconst relative=s.relative?new Intl.RelativeTimeFormat(loc,{numeric:'auto'}):null;\nconst thresholdDays=typeof s.relative==='object'&&s.relative\n?(s.relative.threshold??7)\n:7;\nconst thresholdMs=thresholdDays*24*3600e3;\nconst format=(value,params)=>{\nconst d=toDate(value);\nif(!d)return nullDisplay;\nif(relative){\nconst now=params&&typeof params.now==='number'?params.now:Date.now();\nconst delta=d.getTime()-now;\nif(Math.abs(delta)<thresholdMs){\nfor(const[unit,ms]of UNITS){\nif(Math.abs(delta)>=ms||unit==='second'){\nreturn relative.format(Math.round(delta/ms),unit);\n}\n}\n}\n}\nreturn absolute(d);\n};\nformat.spec=s;\nreturn format;\n}\nfunction toIsoDate(value){\nif(isNil(value)||value==='')return null;\nif(typeof value==='string'){\nconst match=/^(\\d{4}-\\d{2}-\\d{2})/.exec(value.trim());\nif(match)return match[1];\nconst parsed=toDate(value);\nreturn parsed?toIsoDate(parsed):null;\n}\nconst date=toDate(value);\nif(!date)return null;\nconst pad=(n)=>String(n).padStart(2,'0');\nreturn`${date.getFullYear()}-${pad(date.getMonth()+1)}-${pad(date.getDate())}`;\n}\nfunction toIsoDateTime(value,timeZone){\nif(isNil(value)||value==='')return null;\nif(typeof value==='string'){\nconst text=value.trim();\nif(ZONE_SUFFIX.test(text)){\nconst instant=toDate(text);\nreturn instant?wallClockIn(instant,timeZone):null;\n}\nconst match=/^(\\d{4}-\\d{2}-\\d{2})[T ](\\d{2}):(\\d{2})(?::(\\d{2}))?/.exec(text);\nif(match){\nconst[,day,hour,minute,second]=match;\nreturn`${day}T${hour}:${minute}${second&&second!=='00'?`:${second}`:''}`;\n}\nif(/^\\d{4}-\\d{2}-\\d{2}$/.test(text))return`${text}T00:00`;\nconst parsed=toDate(text);\nreturn parsed?toIsoDateTime(parsed):null;\n}\nconst date=toDate(value);\nif(!date)return null;\nreturn wallClockIn(date,timeZone);\n}\nconst ZONE_SUFFIX=/(?:Z|[+-]\\d{2}:?\\d{2})$/i;\nfunction wallClockIn(date,timeZone){\nconst pad=(n)=>String(n).padStart(2,'0');\nif(timeZone){\ntry{\nconst parts=new Intl.DateTimeFormat('en-CA',{\ntimeZone,\nyear:'numeric',month:'2-digit',day:'2-digit',\nhour:'2-digit',minute:'2-digit',second:'2-digit',\nhour12:false,\n}).formatToParts(date).reduce((out,part)=>{\nif(part.type!=='literal')out[part.type]=part.value;\nreturn out;\n},{});\nconst hour=parts.hour==='24'?'00':parts.hour;\nconst seconds=Number(parts.second);\nreturn`${parts.year}-${parts.month}-${parts.day}T${hour}:${parts.minute}`\n+(seconds?`:${parts.second}`:'');\n}catch{\n}\n}\nconst day=`${date.getFullYear()}-${pad(date.getMonth()+1)}-${pad(date.getDate())}`;\nconst seconds=date.getSeconds();\nconst clock=`${pad(date.getHours())}:${pad(date.getMinutes())}${seconds?`:${pad(seconds)}`:''}`;\nreturn`${day}T${clock}`;\n}\nfunction compareIso(a,b){\nconst left=isNil(a)||a===''?null:String(a);\nconst right=isNil(b)||b===''?null:String(b);\nif(left===null)return right===null?0:1;\nif(right===null)return-1;\nreturn left<right?-1:left>right?1:0;\n}\n});\n__def(\"packages/core/src/compute/filter.js\",function(__exports,__req){\n'use strict';\nObject.defineProperty(__exports,\"releaseMask\",{enumerable:true,get:function(){return releaseMask;}});\nObject.defineProperty(__exports,\"compilePredicate\",{enumerable:true,get:function(){return compilePredicate;}});\nObject.defineProperty(__exports,\"testValue\",{enumerable:true,get:function(){return testValue;}});\nObject.defineProperty(__exports,\"evaluateCondition\",{enumerable:true,get:function(){return evaluateCondition;}});\nObject.defineProperty(__exports,\"evaluateFilters\",{enumerable:true,get:function(){return evaluateFilters;}});\nObject.defineProperty(__exports,\"pruneColumn\",{enumerable:true,get:function(){return pruneColumn;}});\nObject.defineProperty(__exports,\"mentionsColumn\",{enumerable:true,get:function(){return mentionsColumn;}});\nObject.defineProperty(__exports,\"compact\",{enumerable:true,get:function(){return compact;}});\nconst __m0=__req(\"packages/core/src/internal/util.js\");\nconst isBlank=__m0[\"isBlank\"];\nconst toArray=__m0[\"toArray\"];\nconst warnOnce=__m0[\"warnOnce\"];\nconst __m1=__req(\"packages/core/src/format/date.js\");\nconst toIsoDate=__m1[\"toIsoDate\"];\nconst __m2=__req(\"packages/core/src/compute/handle.js\");\nconst bitReader=__m2[\"bitReader\"];\nconst dictSize=__m2[\"dictSize\"];\nconst dictValue=__m2[\"dictValue\"];\nconst presenceReader=__m2[\"presenceReader\"];\nconst valueComparator=__m2[\"valueComparator\"];\nconst valueReader=__m2[\"valueReader\"];\nconst ISO_DAY=/^\\d{4}-\\d{2}-\\d{2}$/;\nconst NULL_KEY='\\u0000null\\u0000';\nfunction acquireMask(ctx,n){\nconst pool=ctx&&ctx.pool;\nif(pool){\nconst take=pool.mask||pool.acquireMask||pool.acquire||pool.take;\nif(typeof take==='function'){\nconst mask=take.call(pool,n);\nif(mask&&mask.length>=n)return mask;\n}\n}\nreturn new Uint8Array(n);\n}\nfunction releaseMask(ctx,mask){\nconst pool=ctx&&ctx.pool;\nif(!pool||!mask)return;\nconst give=pool.release||pool.releaseMask||pool.free||pool.recycle;\nif(typeof give==='function')give.call(pool,mask);\n}\nfunction fillMask(mask,n,value){\nmask.fill(value,0,n);\nreturn mask;\n}\nfunction unorderable(v){\nreturn v===null||v===undefined||(typeof v==='number'&&Number.isNaN(v));\n}\nfunction coerceTarget(value,type){\nif(value===null||value===undefined)return value;\nif(type==='number')return typeof value==='number'?value:Number(value);\nif(type==='date'||type==='dateString'){\nconst iso=toIsoDate(value);\nreturn iso===null?toMillis(value):iso;\n}\nif(type==='boolean'){\nif(typeof value==='boolean')return value;\nif(value==='true'||value===1)return true;\nif(value==='false'||value===0)return false;\nreturn!!value;\n}\nreturn value;\n}\nfunction toMillis(value){\nif(value instanceof Date)return value.getTime();\nif(typeof value==='number')return value;\nreturn Date.parse(String(value));\n}\nfunction toNumber(value){\nif(typeof value==='number')return value;\nif(value instanceof Date)return value.getTime();\nif(value===null||value===undefined||value==='')return NaN;\nreturn Number(value);\n}\nfunction textOf(v,caseSensitive){\nconst s=typeof v==='string'?v:String(v);\nreturn caseSensitive?s:s.toLowerCase();\n}\nfunction setKey(v,caseSensitive){\nif(v===null||v===undefined)return NULL_KEY;\nif(typeof v==='string')return caseSensitive?v:v.toLowerCase();\nif(v instanceof Date)return v.getTime();\nreturn v;\n}\nfunction buildSet(value,caseSensitive,type){\nconst set=new Set();\nfor(const raw of toArray(value)){\nconst entry=coerceTarget(raw,type);\nset.add(setKey(entry,caseSensitive));\nif(typeof entry==='string'&&entry!==''&&Number.isFinite(Number(entry)))set.add(Number(entry));\nelse if(typeof entry==='number'&&Number.isFinite(entry))set.add(setKey(String(entry),caseSensitive));\n}\nreturn set;\n}\nfunction valueEquals(a,b,caseSensitive){\nif(a===null||a===undefined||b===null||b===undefined){\nreturn(a===null||a===undefined)&&(b===null||b===undefined);\n}\nconst ta=typeof a;\nconst tb=typeof b;\nif(ta==='string'&&tb==='string')return caseSensitive?a===b:a.toLowerCase()===b.toLowerCase();\nif(a instanceof Date||b instanceof Date)return toMillis(a)===toMillis(b);\nif(ta==='number'&&tb==='number')return a===b||(Number.isNaN(a)&&Number.isNaN(b));\nif(ta==='number'&&tb==='string')return a===Number(b);\nif(ta==='string'&&tb==='number')return Number(a)===b;\nif(ta==='boolean'||tb==='boolean')return a===b;\nif(Array.isArray(a)&&Array.isArray(b)){\nreturn a.length===b.length&&a.every((x,i)=>valueEquals(x,b[i],caseSensitive));\n}\nreturn a===b;\n}\nfunction compileRegExp(value,caseSensitive){\ntry{\nif(value instanceof RegExp){\nconst flags=value.flags.replace(/[gy]/g,'');\nreturn new RegExp(value.source,caseSensitive?flags:flags.includes('i')?flags:`${flags}i`);\n}\nreturn new RegExp(String(value),caseSensitive?'':'i');\n}catch(err){\nwarnOnce(`regex:${String(value)}`,`filter operator \"matches\" received an invalid pattern: ${String(value)}`,err);\nreturn null;\n}\n}\nfunction compilePredicate(condition,locale){\nconst predicate=compileValuePredicate(condition,locale);\nconst type=condition&&condition.type;\nif(type!=='date'&&type!=='dateString')return predicate;\nreturn(v)=>predicate(typeof v==='string'&&ISO_DAY.test(v)?v:(toIsoDate(v)??v));\n}\nfunction compileValuePredicate(condition,locale){\nconst op=condition&&condition.op;\nconst caseSensitive=!!(condition&&condition.caseSensitive);\nconst type=condition&&condition.type;\nconst cmp=valueComparator(locale);\nconst not=(p)=>(v)=>!p(v);\nswitch(op){\ncase'eq':{\nconst target=coerceTarget(condition.value,type);\nreturn(v)=>valueEquals(v,target,caseSensitive);\n}\ncase'ne':{\nconst target=coerceTarget(condition.value,type);\nreturn(v)=>!valueEquals(v,target,caseSensitive);\n}\ncase'lt':case'lte':case'gt':case'gte':{\nconst target=coerceTarget(condition.value,type);\nif(unorderable(target))return()=>false;\nconst want=op==='lt'?-1:op==='lte'?0:op==='gt'?1:2;\nreturn(v)=>{\nif(unorderable(v))return false;\nconst c=cmp(v,target);\nreturn want===-1?c<0:want===0?c<=0:want===1?c>0:c>=0;\n};\n}\ncase'between':case'notBetween':{\nconst pair=toArray(condition.value);\nconst lo=coerceTarget(pair[0],type);\nconst hi=coerceTarget(pair[1],type);\nconst bounds=condition.bounds||'[]';\nconst loInclusive=bounds.charAt(0)!=='(';\nconst hiInclusive=bounds.charAt(1)!==')';\nif(unorderable(lo)||unorderable(hi))return op==='between'?()=>false:()=>true;\nconst inRange=(v)=>{\nif(unorderable(v))return false;\nconst a=cmp(v,lo);\nconst b=cmp(v,hi);\nreturn(loInclusive?a>=0:a>0)&&(hiInclusive?b<=0:b<0);\n};\nreturn op==='between'?inRange:not(inRange);\n}\ncase'in':case'notIn':{\nconst set=buildSet(condition.value,caseSensitive,type);\nconst member=(v)=>set.has(setKey(v,caseSensitive));\nreturn op==='in'?member:not(member);\n}\ncase'contains':case'notContains':{\nconst needle=textOf(coerceTarget(condition.value,type),caseSensitive);\nconst has=(v)=>(v===null||v===undefined?false:textOf(v,caseSensitive).includes(needle));\nreturn op==='contains'?has:not(has);\n}\ncase'startsWith':{\nconst needle=textOf(coerceTarget(condition.value,type),caseSensitive);\nreturn(v)=>(v===null||v===undefined?false:textOf(v,caseSensitive).startsWith(needle));\n}\ncase'endsWith':{\nconst needle=textOf(coerceTarget(condition.value,type),caseSensitive);\nreturn(v)=>(v===null||v===undefined?false:textOf(v,caseSensitive).endsWith(needle));\n}\ncase'matches':{\nconst re=compileRegExp(condition.value,caseSensitive);\nif(!re)return()=>false;\nreturn(v)=>(v===null||v===undefined?false:re.test(String(v)));\n}\ncase'blank':\nreturn(v)=>isBlank(v)||(Array.isArray(v)&&v.length===0);\ncase'notBlank':\nreturn(v)=>!(isBlank(v)||(Array.isArray(v)&&v.length===0));\ncase'containsAny':case'containsNone':{\nconst set=buildSet(condition.value,caseSensitive,type);\nconst any=(v)=>{\nconst list=v===null||v===undefined?[]:toArray(v);\nfor(let i=0;i<list.length;i++)if(set.has(setKey(list[i],caseSensitive)))return true;\nreturn false;\n};\nreturn op==='containsAny'?any:not(any);\n}\ncase'containsAll':{\nconst wanted=toArray(condition.value).map((x)=>setKey(coerceTarget(x,type),caseSensitive));\nreturn(v)=>{\nconst list=v===null||v===undefined?[]:toArray(v);\nif(wanted.length===0)return true;\nconst have=new Set(list.map((x)=>setKey(x,caseSensitive)));\nfor(let i=0;i<wanted.length;i++)if(!have.has(wanted[i]))return false;\nreturn true;\n};\n}\ndefault:\nwarnOnce(`op:${String(op)}`,`unknown filter operator \"${String(op)}\"; the condition passes every row`);\nreturn()=>true;\n}\n}\nfunction testValue(value,condition,locale){\nreturn compilePredicate(condition,locale)(value);\n}\nfunction presenceCondition(handle,wantPresent,mask,count){\nconst present=presenceReader(handle);\nif(present){\nconst target=wantPresent?1:0;\nfor(let i=0;i<count;i++)mask[i]=present(i)===target?1:0;\nreturn mask;\n}\nconst kind=handle.kind;\nif(kind==='float64'||kind==='int32'||kind==='bitset'){\nreturn fillMask(mask,count,wantPresent?1:0);\n}\nconst read=valueReader(handle);\nfor(let i=0;i<count;i++){\nconst v=read(i);\nconst blank=isBlank(v)||(Array.isArray(v)&&v.length===0);\nmask[i]=blank===wantPresent?0:1;\n}\nreturn mask;\n}\nfunction dictionaryCondition(handle,pred,mask,count){\nconst dict=handle.dict;\nconst size=dictSize(dict);\nconst allowed=new Uint8Array(size);\nfor(let code=0;code<size;code++)allowed[code]=pred(dictValue(dict,code))?1:0;\nconst codes=handle.values;\nconst present=presenceReader(handle);\nif(!present){\nfor(let i=0;i<count;i++)mask[i]=allowed[codes[i]];\nreturn mask;\n}\nconst absentAnswer=pred(null)?1:0;\nfor(let i=0;i<count;i++)mask[i]=present(i)===1?allowed[codes[i]]:absentAnswer;\nreturn mask;\n}\nfunction booleanCondition(handle,pred,mask,count){\nconst bit=bitReader(handle.values);\nconst whenTrue=pred(true)?1:0;\nconst whenFalse=pred(false)?1:0;\nconst present=presenceReader(handle);\nif(!present){\nfor(let i=0;i<count;i++)mask[i]=bit(i)===1?whenTrue:whenFalse;\nreturn mask;\n}\nconst absentAnswer=pred(null)?1:0;\nfor(let i=0;i<count;i++){\nmask[i]=present(i)===0?absentAnswer:(bit(i)===1?whenTrue:whenFalse);\n}\nreturn mask;\n}\nfunction numericCondition(handle,condition,pred,mask,count){\nconst values=handle.values;\nconst type=condition.type;\nconst op=condition.op;\nlet handled=true;\nswitch(op){\ncase'eq':case'ne':{\nconst target=toNumber(coerceTarget(condition.value,type));\nconst wantNaN=typeof condition.value==='number'&&Number.isNaN(condition.value);\nconst invert=op==='ne'?1:0;\nif(wantNaN){\nfor(let i=0;i<count;i++)mask[i]=(Number.isNaN(values[i])?1:0)^invert;\n}else{\nfor(let i=0;i<count;i++)mask[i]=((values[i]===target)?1:0)^invert;\n}\nbreak;\n}\ncase'lt':{\nconst t=toNumber(coerceTarget(condition.value,type));\nfor(let i=0;i<count;i++)mask[i]=values[i]<t?1:0;\nbreak;\n}\ncase'lte':{\nconst t=toNumber(coerceTarget(condition.value,type));\nfor(let i=0;i<count;i++)mask[i]=values[i]<=t?1:0;\nbreak;\n}\ncase'gt':{\nconst t=toNumber(coerceTarget(condition.value,type));\nfor(let i=0;i<count;i++)mask[i]=values[i]>t?1:0;\nbreak;\n}\ncase'gte':{\nconst t=toNumber(coerceTarget(condition.value,type));\nfor(let i=0;i<count;i++)mask[i]=values[i]>=t?1:0;\nbreak;\n}\ncase'between':case'notBetween':{\nconst pair=toArray(condition.value);\nconst lo=toNumber(coerceTarget(pair[0],type));\nconst hi=toNumber(coerceTarget(pair[1],type));\nconst bounds=condition.bounds||'[]';\nconst loInclusive=bounds.charAt(0)!=='(';\nconst hiInclusive=bounds.charAt(1)!==')';\nconst invert=op==='notBetween'?1:0;\nif(loInclusive&&hiInclusive){\nfor(let i=0;i<count;i++)mask[i]=(((values[i]>=lo)&(values[i]<=hi))?1:0)^invert;\n}else if(loInclusive){\nfor(let i=0;i<count;i++)mask[i]=(((values[i]>=lo)&(values[i]<hi))?1:0)^invert;\n}else if(hiInclusive){\nfor(let i=0;i<count;i++)mask[i]=(((values[i]>lo)&(values[i]<=hi))?1:0)^invert;\n}else{\nfor(let i=0;i<count;i++)mask[i]=(((values[i]>lo)&(values[i]<hi))?1:0)^invert;\n}\nbreak;\n}\ncase'in':case'notIn':{\nconst set=new Set();\nfor(const raw of toArray(condition.value)){\nconst n=toNumber(coerceTarget(raw,type));\nif(!Number.isNaN(n))set.add(n);\n}\nconst invert=op==='notIn'?1:0;\nfor(let i=0;i<count;i++)mask[i]=(set.has(values[i])?1:0)^invert;\nbreak;\n}\ndefault:\nhandled=false;\nbreak;\n}\nif(!handled)return false;\nconst present=presenceReader(handle);\nif(present){\nconst absentAnswer=pred(null)?1:0;\nfor(let i=0;i<count;i++)if(present(i)===0)mask[i]=absentAnswer;\n}\nreturn true;\n}\nfunction genericCondition(handle,pred,mask,count){\nconst read=valueReader(handle);\nfor(let i=0;i<count;i++)mask[i]=pred(read(i))?1:0;\nreturn mask;\n}\nfunction evaluateCondition(condition,ctx,out){\nconst count=ctx.count|0;\nconst mask=out||acquireMask(ctx,count);\nif(!condition)return fillMask(mask,count,1);\nconst handle=typeof ctx.handle==='function'?ctx.handle(condition.col):undefined;\nconst custom=typeof ctx.custom==='function'?ctx.custom:null;\nif(!handle){\nif(custom){\nfor(let i=0;i<count;i++)mask[i]=custom(condition,i)?1:0;\nreturn mask;\n}\nwarnOnce(`filter:col:${String(condition.col)}`,\n`filter references unknown column \"${String(condition.col)}\"; the condition passes every row`);\nreturn fillMask(mask,count,1);\n}\nconst op=condition.op;\nif(op==='blank'||op==='notBlank')return presenceCondition(handle,op==='notBlank',mask,count);\nconst pred=compilePredicate(condition,ctx.locale);\nswitch(handle.kind){\ncase'dictionary':\nreturn dictionaryCondition(handle,pred,mask,count);\ncase'bitset':\nreturn booleanCondition(handle,pred,mask,count);\ncase'float64':case'int32':\nif(numericCondition(handle,condition,pred,mask,count))return mask;\nreturn genericCondition(handle,pred,mask,count);\ndefault:\nreturn genericCondition(handle,pred,mask,count);\n}\n}\nfunction evaluateNode(node,ctx,count){\nif(!node)return fillMask(acquireMask(ctx,count),count,1);\nif(Array.isArray(node.conditions)){\nconst children=node.conditions.filter((c)=>c!=null);\nconst op=node.op==='or'?'or':node.op==='not'?'not':'and';\nif(children.length===0)return fillMask(acquireMask(ctx,count),count,1);\nconst acc=evaluateNode(children[0],ctx,count);\nfor(let k=1;k<children.length;k++){\nconst rhs=evaluateNode(children[k],ctx,count);\nif(op==='or')for(let i=0;i<count;i++)acc[i]|=rhs[i];\nelse for(let i=0;i<count;i++)acc[i]&=rhs[i];\nreleaseMask(ctx,rhs);\n}\nif(op==='not')for(let i=0;i<count;i++)acc[i]^=1;\nreturn acc;\n}\nreturn evaluateCondition(node,ctx,acquireMask(ctx,count));\n}\nfunction evaluateFilters(filters,ctx){\nreturn evaluateNode(filters,ctx,ctx.count|0);\n}\nfunction pruneColumn(filters,colId){\nif(!filters||!colId)return filters||null;\nconst node=(filters);\nif(Array.isArray(node.conditions)){\nconst op=node.op==='or'?'or':node.op==='not'?'not':'and';\nif(op!=='and'){\nreturn mentionsColumn(node,colId)?null:filters;\n}\nconst kept=[];\nfor(const child of node.conditions){\nconst pruned=pruneColumn(child,colId);\nif(pruned)kept.push(pruned);\n}\nif(!kept.length)return null;\nreturn{...node,op:'and',conditions:kept};\n}\nreturn node.col===colId?null:filters;\n}\nfunction mentionsColumn(filters,colId){\nif(!filters||typeof filters!=='object')return false;\nconst node=(filters);\nif(node.col===colId)return true;\nif(Array.isArray(node.conditions)){\nfor(const child of node.conditions)if(mentionsColumn(child,colId))return true;\n}\nreturn false;\n}\nfunction compact(mask,count,out){\nif(out&&out.length>=count){\nlet k=0;\nfor(let i=0;i<count;i++)if(mask[i])out[k++]=i;\nreturn out.subarray(0,k);\n}\nlet survivors=0;\nfor(let i=0;i<count;i++)survivors+=mask[i]?1:0;\nconst result=new Uint32Array(survivors);\nlet k=0;\nfor(let i=0;i<count;i++)if(mask[i])result[k++]=i;\nreturn result;\n}\n});\n__def(\"packages/core/src/compute/group.js\",function(__exports,__req){\n'use strict';\nObject.defineProperty(__exports,\"packKeys\",{enumerable:true,get:function(){return packKeys;}});\nObject.defineProperty(__exports,\"groupByColumns\",{enumerable:true,get:function(){return groupByColumns;}});\nconst __m0=__req(\"packages/core/src/compute/handle.js\");\nconst dictSize=__m0[\"dictSize\"];\nconst identity=__m0[\"identity\"];\nconst presenceReader=__m0[\"presenceReader\"];\nconst rowCount=__m0[\"rowCount\"];\nconst valueReader=__m0[\"valueReader\"];\nconst KEY_SEPARATOR='\\u001F';\nconst NULL_MARKER='\\u0000';\nconst MAX_DIRECT_COUNTS=1<<20;\nfunction packKeys(handles,idx,n){\nconst k=handles.length;\nconst readers=handles.map((h)=>valueReader(h));\nconst allDictionary=k>0&&handles.every((h)=>h&&h.kind==='dictionary'&&h.dict);\nif(allDictionary){\nconst cards=handles.map((h)=>dictSize(h.dict)+1);\nlet product=1;\nfor(let j=0;j<k;j++)product*=cards[j];\nif(product<=Number.MAX_SAFE_INTEGER){\nconst codes=handles.map((h)=>h.values);\nconst presence=handles.map((h)=>presenceReader(h));\nconst keyOf=(row)=>{\nlet key=0;\nfor(let j=0;j<k;j++){\nconst present=presence[j];\nconst code=present&&present(row)===0?cards[j]-1:codes[j][row];\nkey=key*cards[j]+code;\n}\nreturn key;\n};\nconst packed=new Float64Array(n);\nfor(let i=0;i<n;i++)packed[i]=keyOf(idx[i]);\nreturn{packed,strings:null,product,readers,keyOf};\n}\n}\nconst keyOf=(row)=>{\nlet key='';\nfor(let j=0;j<k;j++){\nconst v=readers[j](row);\nkey+=(j===0?'':KEY_SEPARATOR)+(v===null||v===undefined?NULL_MARKER:String(v));\n}\nreturn key;\n};\nconst strings=new Array(n);\nfor(let i=0;i<n;i++)strings[i]=keyOf(idx[i]);\nreturn{packed:null,strings,product:Infinity,readers,keyOf};\n}\nfunction scatterBuckets(idx,ids,n,groups){\nconst offsets=new Uint32Array(groups+1);\nfor(let i=0;i<n;i++)offsets[ids[i]+1]++;\nfor(let g=0;g<groups;g++)offsets[g+1]+=offsets[g];\nconst scattered=new Uint32Array(n);\nconst cursor=offsets.slice(0,groups);\nfor(let i=0;i<n;i++)scattered[cursor[ids[i]]++]=idx[i];\nconst buckets=new Array(groups);\nfor(let g=0;g<groups;g++)buckets[g]=scattered.subarray(offsets[g],offsets[g+1]);\nreturn buckets;\n}\nfunction groupByColumns(handles,order,opts={}){\nconst list=handles||[];\nconst idx=order||identity(rowCount(list[0],opts));\nconst n=idx.length;\nif(list.length===0||n===0)return{keys:[],buckets:[]};\nconst{packed,strings,product,readers}=packKeys(list,idx,n);\nconst ids=new Uint32Array(n);\nlet groups=0;\nlet packedKeys=null;\nif(packed&&product<=Math.max(1024,Math.min(MAX_DIRECT_COUNTS,n*4))){\nconst size=product;\nconst seen=new Int32Array(size).fill(-1);\nfor(let i=0;i<n;i++)seen[packed[i]]=0;\nfor(let key=0;key<size;key++)if(seen[key]===0)seen[key]=groups++;\nfor(let i=0;i<n;i++)ids[i]=seen[packed[i]];\npackedKeys=new Float64Array(groups);\nfor(let key=0;key<size;key++)if(seen[key]>=0)packedKeys[seen[key]]=key;\n}else if(packed){\nconst seen=new Map();\nfor(let i=0;i<n;i++){\nconst key=packed[i];\nlet id=seen.get(key);\nif(id===undefined){id=groups++;seen.set(key,id);}\nids[i]=id;\n}\npackedKeys=new Float64Array(groups);\nfor(const[key,id]of seen)packedKeys[id]=key;\n}else{\nconst seen=new Map();\nfor(let i=0;i<n;i++){\nconst key=strings[i];\nlet id=seen.get(key);\nif(id===undefined){id=groups++;seen.set(key,id);}\nids[i]=id;\n}\n}\nconst buckets=scatterBuckets(idx,ids,n,groups);\nconst keys=new Array(groups);\nfor(let g=0;g<groups;g++){\nconst row=buckets[g][0];\nconst tuple=new Array(readers.length);\nfor(let j=0;j<readers.length;j++)tuple[j]=readers[j](row);\nkeys[g]=tuple;\n}\nconst result={keys,buckets};\nif(packedKeys)result.packed=packedKeys;\nreturn result;\n}\n});\n__def(\"packages/core/src/compute/facet.js\",function(__exports,__req){\n'use strict';\nObject.defineProperty(__exports,\"STRATEGIES\",{enumerable:true,get:function(){return STRATEGIES;}});\nObject.defineProperty(__exports,\"GRANULARITIES\",{enumerable:true,get:function(){return GRANULARITIES;}});\nObject.defineProperty(__exports,\"DEFAULT_BUCKETS\",{enumerable:true,get:function(){return DEFAULT_BUCKETS;}});\nObject.defineProperty(__exports,\"DEFAULT_CARDINALITY_LIMIT\",{enumerable:true,get:function(){return DEFAULT_CARDINALITY_LIMIT;}});\nObject.defineProperty(__exports,\"QUANTILE_SAMPLE\",{enumerable:true,get:function(){return QUANTILE_SAMPLE;}});\nObject.defineProperty(__exports,\"facetKind\",{enumerable:true,get:function(){return facetKind;}});\nObject.defineProperty(__exports,\"orderedReader\",{enumerable:true,get:function(){return orderedReader;}});\nObject.defineProperty(__exports,\"toNumeric\",{enumerable:true,get:function(){return toNumeric;}});\nObject.defineProperty(__exports,\"cardinalityOf\",{enumerable:true,get:function(){return cardinalityOf;}});\nObject.defineProperty(__exports,\"pickGranularity\",{enumerable:true,get:function(){return pickGranularity;}});\nObject.defineProperty(__exports,\"floorTo\",{enumerable:true,get:function(){return floorTo;}});\nObject.defineProperty(__exports,\"advance\",{enumerable:true,get:function(){return advance;}});\nObject.defineProperty(__exports,\"computeBounds\",{enumerable:true,get:function(){return computeBounds;}});\nObject.defineProperty(__exports,\"countInto\",{enumerable:true,get:function(){return countInto;}});\nObject.defineProperty(__exports,\"bucketOf\",{enumerable:true,get:function(){return bucketOf;}});\nObject.defineProperty(__exports,\"facet\",{enumerable:true,get:function(){return facet;}});\nObject.defineProperty(__exports,\"default\",{enumerable:true,get:function(){return __default;}});\nconst __m0=__req(\"packages/core/src/compute/handle.js\");\nconst presenceReader=__m0[\"presenceReader\"];\nconst valueReader=__m0[\"valueReader\"];\nconst dictSize=__m0[\"dictSize\"];\nconst dictValue=__m0[\"dictValue\"];\nconst STRATEGIES=Object.freeze(['equal','quantile','log']);\nconst GRANULARITIES=Object.freeze(['hour','day','week','month','quarter','year']);\nconst DEFAULT_BUCKETS=20;\nconst DEFAULT_CARDINALITY_LIMIT=50;\nconst QUANTILE_SAMPLE=10_000;\nfunction facetKind(handle,type){\nif(!handle)return'none';\nconst base=type&&type.base;\nif(base==='date'||base==='datetime'||base==='time'||base==='dateString')return'date';\nswitch(handle.kind){\ncase'bitset':return'boolean';\ncase'float64':case'int32':return'numeric';\ncase'dictionary':return'category';\ncase'multi':return'category';\ndefault:\nif(base==='number')return'numeric';\nif(base==='boolean')return'boolean';\nif(base==='text')return'category';\nreturn'none';\n}\n}\nfunction orderedReader(handle){\nconst values=handle.values;\nconst kind=handle.kind;\nif((kind==='float64'||kind==='int32')&&values)return(i)=>values[i];\nconst read=valueReader(handle);\nreturn(i)=>toNumeric(read(i));\n}\nfunction toNumeric(v){\nif(typeof v==='number')return v;\nif(v instanceof Date)return v.getTime();\nif(v===null||v===undefined||v==='')return NaN;\nif(typeof v==='boolean')return v?1:0;\nif(typeof v==='string'){\nconst n=Number(v);\nif(Number.isFinite(n))return n;\nconst t=Date.parse(v);\nreturn Number.isFinite(t)?t:NaN;\n}\nreturn NaN;\n}\nfunction cardinalityOf(handle,indices,count,limit=DEFAULT_CARDINALITY_LIMIT){\nif(!handle)return{cardinality:0,exact:true};\nif(handle.dict)return{cardinality:dictSize(handle.dict),exact:true};\nif(handle.kind==='bitset')return{cardinality:2,exact:true};\nconst read=valueReader(handle);\nconst n=indices?indices.length:count;\nconst seen=new Set();\nfor(let k=0;k<n;k++){\nconst v=read(indices?indices[k]:k);\nif(v===null||v===undefined)continue;\nseen.add(v);\nif(seen.size>limit)return{cardinality:seen.size,exact:false};\n}\nreturn{cardinality:seen.size,exact:true};\n}\nconst HOUR_MS=3600_000;\nconst DAY_MS=86_400_000;\nfunction pickGranularity(span,target=DEFAULT_BUCKETS){\nconst ms=Number.isFinite(span)&&span>0?span:0;\nconst wide=Math.max(1,target)*2;\nif(ms/HOUR_MS<=wide)return'hour';\nif(ms/DAY_MS<=wide)return'day';\nif(ms/(7*DAY_MS)<=wide)return'week';\nif(ms/(30*DAY_MS)<=wide)return'month';\nif(ms/(91*DAY_MS)<=wide)return'quarter';\nreturn'year';\n}\nfunction floorTo(ms,granularity){\nif(!Number.isFinite(ms))return NaN;\nconst d=new Date(ms);\nswitch(granularity){\ncase'hour':d.setMinutes(0,0,0);return d.getTime();\ncase'day':d.setHours(0,0,0,0);return d.getTime();\ncase'week':{\nd.setHours(0,0,0,0);\nconst back=(d.getDay()+6)%7;\nd.setDate(d.getDate()-back);\nreturn d.getTime();\n}\ncase'month':d.setDate(1);d.setHours(0,0,0,0);return d.getTime();\ncase'quarter':\nd.setMonth(Math.floor(d.getMonth()/3)*3,1);\nd.setHours(0,0,0,0);\nreturn d.getTime();\ndefault:d.setMonth(0,1);d.setHours(0,0,0,0);return d.getTime();\n}\n}\nfunction advance(ms,granularity){\nconst d=new Date(ms);\nswitch(granularity){\ncase'hour':d.setHours(d.getHours()+1);break;\ncase'day':d.setDate(d.getDate()+1);break;\ncase'week':d.setDate(d.getDate()+7);break;\ncase'month':d.setMonth(d.getMonth()+1);break;\ncase'quarter':d.setMonth(d.getMonth()+3);break;\ndefault:d.setFullYear(d.getFullYear()+1);break;\n}\nreturn d.getTime();\n}\nfunction numericExtent(handle,indices,count){\nconst read=orderedReader(handle);\nconst present=presenceReader(handle);\nconst n=indices?indices.length:count;\nlet min=Infinity;\nlet max=-Infinity;\nlet nulls=0;\nlet finite=0;\nfor(let k=0;k<n;k++){\nconst i=indices?indices[k]:k;\nif(present&&!present(i)){nulls++;continue;}\nconst v=read(i);\nif(!Number.isFinite(v)){nulls++;continue;}\nif(v<min)min=v;\nif(v>max)max=v;\nfinite++;\n}\nreturn{min,max,nulls,finite};\n}\nfunction sortedSample(handle,indices,count,cap){\nconst read=orderedReader(handle);\nconst present=presenceReader(handle);\nconst n=indices?indices.length:count;\nconst step=n>cap?n/cap:1;\nconst out=[];\nfor(let s=0;s<n;s+=step){\nconst i=indices?indices[Math.floor(s)]:Math.floor(s);\nif(present&&!present(i))continue;\nconst v=read(i);\nif(Number.isFinite(v))out.push(v);\n}\nconst arr=Float64Array.from(out);\narr.sort();\nreturn arr;\n}\nfunction computeBounds(handle,indices,count,opts={}){\nconst kind=opts.kind||facetKind(handle,opts.type);\nif(kind==='none'||!handle)return{kind:'none',buckets:[],suppressed:'type'};\nif(kind==='boolean')return boundsForBoolean(handle,indices,count);\nif(kind==='category')return boundsForCategory(handle,indices,count,opts);\nreturn boundsForOrdered(handle,indices,count,kind,opts);\n}\nfunction boundsForBoolean(handle,indices,count){\nconst present=presenceReader(handle);\nlet nulls=0;\nif(present){\nconst n=indices?indices.length:count;\nfor(let k=0;k<n;k++)if(!present(indices?indices[k]:k))nulls++;\n}\nconst buckets=[{value:false,label:'false'},{value:true,label:'true'}];\nif(nulls>0)buckets.push({null:true,label:'Empty'});\nreturn{kind:'boolean',buckets};\n}\nfunction boundsForCategory(handle,indices,count,opts){\nconst limit=opts.cardinalityLimit??DEFAULT_CARDINALITY_LIMIT;\nconst{cardinality}=cardinalityOf(handle,indices,count,limit);\nif(cardinality>limit&&(opts.aboveLimit||'suppress')==='suppress'){\nreturn{kind:'category',buckets:[],suppressed:'cardinality',cardinality};\n}\nconst read=valueReader(handle);\nconst n=indices?indices.length:count;\nconst tally=new Map();\nlet nulls=0;\nfor(let k=0;k<n;k++){\nconst v=read(indices?indices[k]:k);\nif(v===null||v===undefined||v===''){nulls++;continue;}\nif(Array.isArray(v)){\nif(!v.length){nulls++;continue;}\nfor(const m of v)tally.set(m,(tally.get(m)||0)+1);\ncontinue;\n}\ntally.set(v,(tally.get(v)||0)+1);\n}\nlet entries=[...tally.entries()];\nif(opts.order==='alpha'){\nentries.sort((a,b)=>String(a[0]).localeCompare(String(b[0])));\n}else{\nentries.sort((a,b)=>b[1]-a[1]);\n}\nlet remainder=0;\nlet dropped=0;\nif(entries.length>limit){\ndropped=entries.length-limit;\nfor(let i=limit;i<entries.length;i++)remainder+=entries[i][1];\nentries=entries.slice(0,limit);\n}\nconst buckets=entries.map(([value])=>({value,label:String(value)}));\nif(remainder>0)buckets.push({remainder:true,label:`Other (${dropped} values)`});\nif(nulls>0)buckets.push({null:true,label:'Empty'});\nreturn{kind:'category',buckets,cardinality};\n}\nfunction boundsForOrdered(handle,indices,count,kind,opts){\nconst{min,max,nulls,finite}=numericExtent(handle,indices,count);\nif(!finite){\nreturn{kind,buckets:nulls?[{null:true,label:'Empty'}]:[],empty:true};\n}\nconst wanted=Math.max(1,Math.floor(opts.buckets||DEFAULT_BUCKETS));\nlet buckets=[];\nif(kind==='date'){\nconst granularity=GRANULARITIES.includes(opts.granularity)\n?opts.granularity:pickGranularity(max-min,wanted);\nlet edge=floorTo(min,granularity);\nwhile(edge<=max&&buckets.length<4096){\nconst next=advance(edge,granularity);\nif(!(next>edge))break;\nbuckets.push({from:edge,to:next});\nedge=next;\n}\nreturn{kind,buckets:withNull(buckets,nulls),granularity};\n}\nconst strategy=STRATEGIES.includes(opts.strategy)?opts.strategy:'equal';\nif(strategy==='quantile'){\nconst sample=sortedSample(handle,indices,count,QUANTILE_SAMPLE);\nif(sample.length){\nconst edges=[sample[0]];\nfor(let b=1;b<wanted;b++){\nconst v=sample[Math.min(sample.length-1,Math.floor((b/wanted)*sample.length))];\nif(v>edges[edges.length-1])edges.push(v);\n}\nedges.push(max);\nfor(let b=0;b<edges.length-1;b++)buckets.push({from:edges[b],to:edges[b+1]});\n}\n}else if(strategy==='log'&&min>0){\nconst lo=Math.log10(min);\nconst hi=Math.log10(max);\nconst step=(hi-lo)/wanted||1;\nfor(let b=0;b<wanted;b++){\nbuckets.push({from:10**(lo+b*step),to:10**(lo+(b+1)*step)});\n}\n}\nif(!buckets.length){\nconst width=(max-min)/wanted||1;\nfor(let b=0;b<wanted;b++)buckets.push({from:min+b*width,to:min+(b+1)*width});\n}\nbuckets[buckets.length-1].to=max;\nreturn{kind,buckets:withNull(buckets,nulls),strategy,min,max};\n}\nfunction withNull(buckets,nulls){\nreturn nulls>0?[...buckets,{null:true,label:'Empty'}]:buckets;\n}\nfunction countInto(handle,indices,count,bounds,out){\nconst buckets=(bounds&&bounds.buckets)||[];\nconst counts=out&&out.length>=buckets.length?out.subarray(0,buckets.length)\n:new Uint32Array(buckets.length);\ncounts.fill(0);\nif(!handle||!buckets.length)return counts;\nconst nullBucket=buckets.length-1;\nconst hasNull=!!buckets[nullBucket]&&buckets[nullBucket].null===true;\nconst n=indices?indices.length:count;\nif(bounds.kind==='boolean'){\nconst read=valueReader(handle);\nfor(let k=0;k<n;k++){\nconst v=read(indices?indices[k]:k);\nif(v===null||v===undefined){if(hasNull)counts[nullBucket]++;continue;}\ncounts[v?1:0]++;\n}\nreturn counts;\n}\nif(bounds.kind==='category'){\nconst slot=new Map();\nfor(let b=0;b<buckets.length;b++){\nif(!buckets[b].null&&!buckets[b].remainder)slot.set(buckets[b].value,b);\n}\nconst remainderAt=buckets.findIndex((b)=>b.remainder);\nconst read=valueReader(handle);\nfor(let k=0;k<n;k++){\nconst v=read(indices?indices[k]:k);\nif(v===null||v===undefined||v===''){if(hasNull)counts[nullBucket]++;continue;}\nif(Array.isArray(v)){\nif(!v.length){if(hasNull)counts[nullBucket]++;continue;}\nfor(const m of v){\nconst at=slot.get(m);\nif(at!==undefined)counts[at]++;\nelse if(remainderAt>=0)counts[remainderAt]++;\n}\ncontinue;\n}\nconst at=slot.get(v);\nif(at!==undefined)counts[at]++;\nelse if(remainderAt>=0)counts[remainderAt]++;\n}\nreturn counts;\n}\nconst ordered=hasNull?buckets.length-1:buckets.length;\nconst edges=new Float64Array(ordered+1);\nfor(let b=0;b<ordered;b++)edges[b]=buckets[b].from;\nedges[ordered]=ordered?buckets[ordered-1].to:0;\nconst read=orderedReader(handle);\nconst present=presenceReader(handle);\nfor(let k=0;k<n;k++){\nconst i=indices?indices[k]:k;\nif(present&&!present(i)){if(hasNull)counts[nullBucket]++;continue;}\nconst v=read(i);\nif(!Number.isFinite(v)){if(hasNull)counts[nullBucket]++;continue;}\nconst at=bucketOf(edges,ordered,v);\nif(at>=0)counts[at]++;\n}\nreturn counts;\n}\nfunction bucketOf(edges,ordered,v){\nif(!ordered)return-1;\nif(v<edges[0])return-1;\nif(v>=edges[ordered])return v===edges[ordered]?ordered-1:-1;\nlet lo=0;\nlet hi=ordered-1;\nwhile(lo<hi){\nconst mid=(lo+hi+1)>>>1;\nif(v>=edges[mid])lo=mid;else hi=mid-1;\n}\nreturn lo;\n}\nfunction facet(handle,indices,count,opts={}){\nconst bounds=opts.bounds||computeBounds(handle,opts.boundsIndices??indices,count,opts);\nreturn{bounds,counts:countInto(handle,indices,count,bounds)};\n}\nconst __default=facet;\n});\n__def(\"packages/core/src/compute/statistics.js\",function(__exports,__req){\n'use strict';\nObject.defineProperty(__exports,\"MAINTENANCE\",{enumerable:true,get:function(){return MAINTENANCE;}});\nObject.defineProperty(__exports,\"numbers\",{enumerable:true,get:function(){return numbers;}});\nObject.defineProperty(__exports,\"moments\",{enumerable:true,get:function(){return moments;}});\nObject.defineProperty(__exports,\"quantileSorted\",{enumerable:true,get:function(){return quantileSorted;}});\nObject.defineProperty(__exports,\"quantile\",{enumerable:true,get:function(){return quantile;}});\nObject.defineProperty(__exports,\"STAT_FNS\",{enumerable:true,get:function(){return STAT_FNS;}});\nObject.defineProperty(__exports,\"STAT_LABELS\",{enumerable:true,get:function(){return STAT_LABELS;}});\nObject.defineProperty(__exports,\"weightedAverage\",{enumerable:true,get:function(){return weightedAverage;}});\nObject.defineProperty(__exports,\"extremeRow\",{enumerable:true,get:function(){return extremeRow;}});\nObject.defineProperty(__exports,\"correlation\",{enumerable:true,get:function(){return correlation;}});\nObject.defineProperty(__exports,\"countOutside\",{enumerable:true,get:function(){return countOutside;}});\nObject.defineProperty(__exports,\"histogram\",{enumerable:true,get:function(){return histogram;}});\nconst __m0=__req(\"packages/core/src/compute/handle.js\");\nconst presenceReader=__m0[\"presenceReader\"];\nconst valueReader=__m0[\"valueReader\"];\nconst MAINTENANCE=Object.freeze({\nvariance:'maintained',\nvarianceP:'maintained',\nstddev:'maintained',\nstddevP:'maintained',\nsumSquares:'maintained',\nweightedAvg:'maintained',\nmedian:'rescan',\np25:'rescan',\np75:'rescan',\np90:'rescan',\np95:'rescan',\np99:'rescan',\niqr:'rescan',\nmode:'rescan',\ndistinct:'rescan',\nrange:'rescan',\nskewness:'rescan',\nkurtosis:'rescan',\ngeomean:'rescan',\nharmean:'rescan',\nmad:'rescan',\nargmin:'rescan',\nargmax:'rescan',\n});\nfunction numbers(handle,indices){\nconst n=indices.length;\nconst out=new Float64Array(n);\nlet count=0;\nconst numeric=handle&&(handle.kind==='float64'||handle.kind==='int32');\nif(numeric){\nconst values=handle.values;\nconst present=presenceReader(handle);\nfor(let i=0;i<n;i++){\nconst row=indices[i];\nif(present&&present(row)!==1)continue;\nconst v=values[row];\nif(Number.isNaN(v))continue;\nout[count++]=v;\n}\nreturn out.subarray(0,count);\n}\nconst read=valueReader(handle);\nfor(let i=0;i<n;i++){\nconst raw=read(indices[i]);\nif(raw===null||raw===undefined||raw==='')continue;\nconst v=typeof raw==='number'?raw:Number(raw);\nif(!Number.isFinite(v))continue;\nout[count++]=v;\n}\nreturn out.subarray(0,count);\n}\nfunction moments(values){\nlet n=0;\nlet mean=0;\nlet m2=0;\nfor(let i=0;i<values.length;i++){\nconst x=values[i];\nn++;\nconst delta=x-mean;\nmean+=delta/n;\nm2+=delta*(x-mean);\n}\nreturn{n,mean,m2};\n}\nfunction quantileSorted(sorted,p){\nconst n=sorted.length;\nif(!n)return NaN;\nif(n===1)return sorted[0];\nconst h=(n-1)*Math.min(1,Math.max(0,p));\nconst lo=Math.floor(h);\nconst hi=Math.ceil(h);\nif(lo===hi)return sorted[lo];\nreturn sorted[lo]+(h-lo)*(sorted[hi]-sorted[lo]);\n}\nfunction quantile(values,p){\nif(!values.length)return NaN;\nconst sorted=values.slice().sort();\nreturn quantileSorted(sorted,p);\n}\nconst STAT_FNS=Object.freeze({\nvariance:(h,i)=>{\nconst{n,m2}=moments(numbers(h,i));\nreturn n>1?m2/(n-1):null;\n},\nvarianceP:(h,i)=>{\nconst{n,m2}=moments(numbers(h,i));\nreturn n>0?m2/n:null;\n},\nstddev:(h,i)=>{\nconst{n,m2}=moments(numbers(h,i));\nreturn n>1?Math.sqrt(m2/(n-1)):null;\n},\nstddevP:(h,i)=>{\nconst{n,m2}=moments(numbers(h,i));\nreturn n>0?Math.sqrt(m2/n):null;\n},\nmedian:(h,i)=>{\nconst values=numbers(h,i);\nreturn values.length?quantile(values,0.5):null;\n},\np25:(h,i)=>{\nconst values=numbers(h,i);\nreturn values.length?quantile(values,0.25):null;\n},\np75:(h,i)=>{\nconst values=numbers(h,i);\nreturn values.length?quantile(values,0.75):null;\n},\np90:(h,i)=>{\nconst values=numbers(h,i);\nreturn values.length?quantile(values,0.9):null;\n},\np95:(h,i)=>{\nconst values=numbers(h,i);\nreturn values.length?quantile(values,0.95):null;\n},\np99:(h,i)=>{\nconst values=numbers(h,i);\nreturn values.length?quantile(values,0.99):null;\n},\niqr:(h,i)=>{\nconst values=numbers(h,i);\nif(!values.length)return null;\nconst sorted=values.slice().sort();\nreturn quantileSorted(sorted,0.75)-quantileSorted(sorted,0.25);\n},\nmad:(h,i)=>{\nconst values=numbers(h,i);\nif(!values.length)return null;\nconst middle=quantile(values,0.5);\nconst deviations=new Float64Array(values.length);\nfor(let k=0;k<values.length;k++)deviations[k]=Math.abs(values[k]-middle);\nreturn quantile(deviations,0.5);\n},\nrange:(h,i)=>{\nconst values=numbers(h,i);\nif(!values.length)return null;\nlet lo=Infinity;\nlet hi=-Infinity;\nfor(let k=0;k<values.length;k++){\nif(values[k]<lo)lo=values[k];\nif(values[k]>hi)hi=values[k];\n}\nreturn hi-lo;\n},\ndistinct:(h,i)=>{\nconst read=valueReader(h);\nconst seen=new Set();\nfor(let k=0;k<i.length;k++){\nconst v=read(i[k]);\nif(v===null||v===undefined||v==='')continue;\nseen.add(v instanceof Date?v.getTime():v);\n}\nreturn seen.size;\n},\nmode:(h,i)=>{\nconst read=valueReader(h);\nconst counts=new Map();\nfor(let k=0;k<i.length;k++){\nconst v=read(i[k]);\nif(v===null||v===undefined||v==='')continue;\nconst id=v instanceof Date?v.getTime():v;\ncounts.set(id,(counts.get(id)||0)+1);\n}\nlet best=null;\nlet most=1;\nfor(const[value,times]of counts){\nif(times>most){\nmost=times;\nbest=value;\n}\n}\nreturn best;\n},\nskewness:(h,i)=>{\nconst values=numbers(h,i);\nconst{n,mean,m2}=moments(values);\nif(n<3||m2<=0)return null;\nconst sd=Math.sqrt(m2/(n-1));\nlet sum=0;\nfor(let k=0;k<values.length;k++)sum+=((values[k]-mean)/sd)**3;\nreturn(n/((n-1)*(n-2)))*sum;\n},\nkurtosis:(h,i)=>{\nconst values=numbers(h,i);\nconst{n,mean,m2}=moments(values);\nif(n<4||m2<=0)return null;\nconst sd=Math.sqrt(m2/(n-1));\nlet sum=0;\nfor(let k=0;k<values.length;k++)sum+=((values[k]-mean)/sd)**4;\nconst a=(n*(n+1))/((n-1)*(n-2)*(n-3));\nconst b=(3*(n-1)**2)/((n-2)*(n-3));\nreturn a*sum-b;\n},\ngeomean:(h,i)=>{\nconst values=numbers(h,i);\nif(!values.length)return null;\nlet sum=0;\nfor(let k=0;k<values.length;k++){\nif(values[k]<=0)return null;\nsum+=Math.log(values[k]);\n}\nreturn Math.exp(sum/values.length);\n},\nharmean:(h,i)=>{\nconst values=numbers(h,i);\nif(!values.length)return null;\nlet sum=0;\nfor(let k=0;k<values.length;k++){\nif(values[k]===0)return null;\nsum+=1/values[k];\n}\nreturn values.length/sum;\n},\nsumSquares:(h,i)=>{\nconst values=numbers(h,i);\nlet sum=0;\nfor(let k=0;k<values.length;k++)sum+=values[k]*values[k];\nreturn sum;\n},\n});\nconst STAT_LABELS=Object.freeze({\nmedian:'Median',\np25:'25th percentile',\np75:'75th percentile',\np90:'90th percentile',\np95:'95th percentile',\np99:'99th percentile',\niqr:'Interquartile range',\nmad:'Median absolute deviation',\nvariance:'Variance',\nvarianceP:'Variance (population)',\nstddev:'Standard deviation',\nstddevP:'Standard deviation (population)',\nrange:'Range',\ndistinct:'Distinct',\nmode:'Mode',\nskewness:'Skewness',\nkurtosis:'Kurtosis',\ngeomean:'Geometric mean',\nharmean:'Harmonic mean',\nsumSquares:'Sum of squares',\nweightedAvg:'Weighted average',\nargmin:'Lowest by',\nargmax:'Highest by',\n});\nfunction weightedAverage(handle,weights,indices){\nconst readValue=valueReader(handle);\nconst readWeight=valueReader(weights);\nlet top=0;\nlet bottom=0;\nfor(let i=0;i<indices.length;i++){\nconst row=indices[i];\nconst value=Number(readValue(row));\nconst weight=Number(readWeight(row));\nif(!Number.isFinite(value)||!Number.isFinite(weight))continue;\ntop+=value*weight;\nbottom+=weight;\n}\nreturn bottom===0?null:top/bottom;\n}\nfunction extremeRow(handle,indices,largest){\nconst read=valueReader(handle);\nlet best=null;\nlet bestValue=largest?-Infinity:Infinity;\nfor(let i=0;i<indices.length;i++){\nconst row=indices[i];\nconst value=Number(read(row));\nif(!Number.isFinite(value))continue;\nif(largest?value>bestValue:value<bestValue){\nbestValue=value;\nbest=row;\n}\n}\nreturn best;\n}\nfunction correlation(a,b,indices){\nconst readA=valueReader(a);\nconst readB=valueReader(b);\nlet n=0;\nlet sx=0;\nlet sy=0;\nlet sxx=0;\nlet syy=0;\nlet sxy=0;\nfor(let i=0;i<indices.length;i++){\nconst row=indices[i];\nconst x=Number(readA(row));\nconst y=Number(readB(row));\nif(!Number.isFinite(x)||!Number.isFinite(y))continue;\nn++;\nsx+=x;\nsy+=y;\nsxx+=x*x;\nsyy+=y*y;\nsxy+=x*y;\n}\nif(n<2)return null;\nconst top=n*sxy-sx*sy;\nconst bottom=Math.sqrt((n*sxx-sx*sx)*(n*syy-sy*sy));\nif(bottom===0)return null;\nconst r=top/bottom;\nreturn Math.max(-1,Math.min(1,r));\n}\nfunction countOutside(values,low,high){\nlet count=0;\nfor(let i=0;i<values.length;i++){\nif(values[i]<low||values[i]>high)count++;\n}\nreturn count;\n}\nfunction histogram(sorted,q1,q3,cap=20){\nconst n=sorted.length;\nif(!n)return[];\nconst min=sorted[0];\nconst max=sorted[n-1];\nif(max===min)return[{from:min,to:max,count:n}];\nconst iqr=q3-q1;\nconst fence=1.5*iqr;\nlet lo=iqr>0?Math.max(min,q1-fence):min;\nlet hi=iqr>0?Math.min(max,q3+fence):max;\nif(!(hi>lo)){lo=min;hi=max;}\nconst width=iqr>0?(2*iqr)/Math.cbrt(n):(hi-lo)/(Math.ceil(Math.log2(n))+1);\nconst count=width>0\n?Math.min(cap,Math.max(1,Math.ceil((hi-lo)/width)))\n:1;\nconst step=(hi-lo)/count;\nconst bins=[];\nfor(let i=0;i<count;i++){\nbins.push({from:lo+i*step,to:lo+(i+1)*step,count:0});\n}\nfor(let i=0;i<n;i++){\nconst at=Math.min(count-1,Math.max(0,Math.floor((sorted[i]-lo)/step)));\nbins[at].count++;\n}\nbins[0].from=min;\nbins[count-1].to=max;\nreturn bins;\n}\n});\n__def(\"packages/core/src/compute/total.js\",function(__exports,__req){\n'use strict';\nObject.defineProperty(__exports,\"TOTAL_FNS\",{enumerable:true,get:function(){return TOTAL_FNS;}});\nObject.defineProperty(__exports,\"TOTAL_LABELS\",{enumerable:true,get:function(){return TOTAL_LABELS;}});\nObject.defineProperty(__exports,\"totalLabel\",{enumerable:true,get:function(){return totalLabel;}});\nObject.defineProperty(__exports,\"collectValues\",{enumerable:true,get:function(){return collectValues;}});\nObject.defineProperty(__exports,\"total\",{enumerable:true,get:function(){return total;}});\nconst __m0=__req(\"packages/core/src/internal/util.js\");\nconst isFunction=__m0[\"isFunction\"];\nconst warnOnce=__m0[\"warnOnce\"];\nconst __m1=__req(\"packages/core/src/compute/handle.js\");\nconst presenceReader=__m1[\"presenceReader\"];\nconst valueComparator=__m1[\"valueComparator\"];\nconst valueReader=__m1[\"valueReader\"];\nconst __m2=__req(\"packages/core/src/compute/statistics.js\");\nconst STAT_FNS=__m2[\"STAT_FNS\"];\nconst STAT_LABELS=__m2[\"STAT_LABELS\"];\nfunction isNumericBacking(handle){\nreturn!!handle&&(handle.kind==='float64'||handle.kind==='int32');\n}\nfunction sum(handle,indices){\nconst n=indices.length;\nlet acc=0;\nif(isNumericBacking(handle)){\nconst values=handle.values;\nconst present=presenceReader(handle);\nif(!present){\nfor(let i=0;i<n;i++){\nconst v=values[indices[i]];\nif(!Number.isNaN(v))acc+=v;\n}\nreturn acc;\n}\nfor(let i=0;i<n;i++){\nconst row=indices[i];\nif(present(row)===1){\nconst v=values[row];\nif(!Number.isNaN(v))acc+=v;\n}\n}\nreturn acc;\n}\nconst read=valueReader(handle);\nfor(let i=0;i<n;i++){\nconst v=numberOf(read(indices[i]));\nif(v!==null)acc+=v;\n}\nreturn acc;\n}\nsum.kernel=true;\nfunction countValues(handle,indices){\nconst n=indices.length;\nlet count=0;\nif(isNumericBacking(handle)){\nconst values=handle.values;\nconst present=presenceReader(handle);\nif(!present){\nfor(let i=0;i<n;i++)if(!Number.isNaN(values[indices[i]]))count++;\nreturn count;\n}\nfor(let i=0;i<n;i++){\nconst row=indices[i];\nif(present(row)===1&&!Number.isNaN(values[row]))count++;\n}\nreturn count;\n}\nconst read=valueReader(handle);\nfor(let i=0;i<n;i++){\nconst v=read(indices[i]);\nif(v!==null&&v!==undefined&&!(typeof v==='number'&&Number.isNaN(v)))count++;\n}\nreturn count;\n}\ncountValues.kernel=true;\nfunction count(handle,indices){\nreturn indices.length;\n}\ncount.kernel=true;\nfunction avg(handle,indices){\nconst values=countValues(handle,indices);\nif(values===0)return null;\nreturn sum(handle,indices)/values;\n}\navg.kernel=true;\nfunction extreme(handle,indices,direction,locale){\nconst n=indices.length;\nif(isNumericBacking(handle)){\nconst values=handle.values;\nconst present=presenceReader(handle);\nlet best=null;\nif(!present){\nfor(let i=0;i<n;i++){\nconst v=values[indices[i]];\nif(Number.isNaN(v))continue;\nif(best===null||(direction<0?v<best:v>best))best=v;\n}\nreturn best;\n}\nfor(let i=0;i<n;i++){\nconst row=indices[i];\nif(present(row)===0)continue;\nconst v=values[row];\nif(Number.isNaN(v))continue;\nif(best===null||(direction<0?v<best:v>best))best=v;\n}\nreturn best;\n}\nconst read=valueReader(handle);\nconst cmp=valueComparator(locale);\nlet best=null;\nfor(let i=0;i<n;i++){\nconst v=read(indices[i]);\nif(v===null||v===undefined||(typeof v==='number'&&Number.isNaN(v)))continue;\nif(best===null||(direction<0?cmp(v,best)<0:cmp(v,best)>0))best=v;\n}\nreturn best;\n}\nfunction min(handle,indices,ctx){\nreturn extreme(handle,indices,-1,ctx&&ctx.locale);\n}\nmin.kernel=true;\nfunction max(handle,indices,ctx){\nreturn extreme(handle,indices,1,ctx&&ctx.locale);\n}\nmax.kernel=true;\nfunction first(handle,indices){\nif(indices.length===0)return null;\nreturn valueReader(handle)(indices[0]);\n}\nfirst.kernel=true;\nfunction last(handle,indices){\nif(indices.length===0)return null;\nreturn valueReader(handle)(indices[indices.length-1]);\n}\nlast.kernel=true;\nfunction numberOf(v){\nif(typeof v==='number')return Number.isNaN(v)?null:v;\nif(v===null||v===undefined||v===''||typeof v==='boolean')return null;\nif(v instanceof Date)return v.getTime();\nconst n=Number(v);\nreturn Number.isNaN(n)?null:n;\n}\nconst TOTAL_FNS={\nsum,min,max,avg,count,first,last,countValues,\n...STAT_FNS,\n};\nconst TOTAL_LABELS=Object.freeze({\n...STAT_LABELS,\nsum:'Sum',\navg:'Average',\nmin:'Min',\nmax:'Max',\ncount:'Count',\ncountValues:'Count of values',\nfirst:'First',\nlast:'Last',\n});\nfunction totalLabel(fn){\nif(!fn)return'';\nif(typeof fn==='string')return TOTAL_LABELS[fn]||fn;\nreturn'Total';\n}\nfunction collectValues(handle,indices){\nconst read=valueReader(handle);\nconst out=[];\nfor(let i=0;i<indices.length;i++){\nconst v=read(indices[i]);\nif(v===null||v===undefined)continue;\nout.push(v);\n}\nreturn out;\n}\nfunction total(handle,indices,fn,ctx){\nconst list=indices||[];\nif(typeof fn==='string'){\nconst kernel=TOTAL_FNS[fn];\nif(!kernel){\nwarnOnce(`total:${fn}`,`unknown total function \"${fn}\"; register it in config.totalFns`);\nreturn null;\n}\nreturn kernel(handle,list,ctx);\n}\nif(isFunction(fn)){\nif(fn.kernel===true)return fn(handle,list,ctx);\nreturn fn(collectValues(handle,list),ctx||{});\n}\nreturn null;\n}\n});\n__def(\"packages/core/src/compute/pivot.js\",function(__exports,__req){\n'use strict';\nObject.defineProperty(__exports,\"KEY_DELIMITER\",{enumerable:true,get:function(){return KEY_DELIMITER;}});\nObject.defineProperty(__exports,\"DEFAULT_PATH_SEPARATOR\",{enumerable:true,get:function(){return DEFAULT_PATH_SEPARATOR;}});\nObject.defineProperty(__exports,\"DEFAULT_MAX_COLUMNS\",{enumerable:true,get:function(){return DEFAULT_MAX_COLUMNS;}});\nObject.defineProperty(__exports,\"pivotKey\",{enumerable:true,get:function(){return pivotKey;}});\nObject.defineProperty(__exports,\"joinPath\",{enumerable:true,get:function(){return joinPath;}});\nObject.defineProperty(__exports,\"resolvePivotKeys\",{enumerable:true,get:function(){return resolvePivotKeys;}});\nObject.defineProperty(__exports,\"pivot\",{enumerable:true,get:function(){return pivot;}});\nconst __m0=__req(\"packages/core/src/internal/util.js\");\nconst warnOnce=__m0[\"warnOnce\"];\nconst __m1=__req(\"packages/core/src/compute/handle.js\");\nconst valueComparator=__m1[\"valueComparator\"];\nconst __m2=__req(\"packages/core/src/compute/group.js\");\nconst packKeys=__m2[\"packKeys\"];\nconst __m3=__req(\"packages/core/src/compute/total.js\");\nconst total=__m3[\"total\"];\nconst KEY_DELIMITER='|';\nconst DEFAULT_PATH_SEPARATOR='/';\nconst DEFAULT_MAX_COLUMNS=2000;\nfunction pivotKey(groupPath,pivotPath,colId){\nreturn`${groupPath}${KEY_DELIMITER}${pivotPath}${KEY_DELIMITER}${colId}`;\n}\nfunction joinPath(parts,separator){\nlet out='';\nfor(let i=0;i<parts.length;i++){\nconst v=parts[i];\nout+=(i===0?'':separator)+(v===null||v===undefined?'':String(v));\n}\nreturn out;\n}\nfunction resolvePivotKeys(handles,order,opts={}){\nconst separator=opts.separator||DEFAULT_PATH_SEPARATOR;\nconst n=order.length;\nconst{keyOf,readers}=packKeys(handles,order,0);\nconst seen=new Map();\nconst tuples=[];\nconst rawKeys=[];\nfor(let i=0;i<n;i++){\nconst row=order[i];\nconst key=keyOf(row);\nif(seen.has(key))continue;\nseen.set(key,tuples.length);\nrawKeys.push(key);\nconst tuple=new Array(readers.length);\nfor(let j=0;j<readers.length;j++)tuple[j]=readers[j](row);\ntuples.push(tuple);\n}\nconst cmp=valueComparator(opts.locale);\nconst rank=tuples.map((_,i)=>i);\nrank.sort((a,b)=>{\nconst ta=tuples[a];\nconst tb=tuples[b];\nfor(let j=0;j<ta.length;j++){\nconst c=compareNullable(ta[j],tb[j],cmp);\nif(c!==0)return c;\n}\nreturn a-b;\n});\nconst keys=new Array(rank.length);\nconst paths=new Array(rank.length);\nconst idByKey=new Map();\nfor(let position=0;position<rank.length;position++){\nconst from=rank[position];\nkeys[position]=tuples[from];\npaths[position]=joinPath(tuples[from],separator);\nidByKey.set(rawKeys[from],position);\n}\nconst idOf=(row)=>{\nconst id=idByKey.get(keyOf(row));\nreturn id===undefined?-1:id;\n};\nreturn{keys,paths,idOf};\n}\nfunction compareNullable(a,b,cmp){\nconst na=a===null||a===undefined;\nconst nb=b===null||b===undefined;\nif(na||nb)return na&&nb?0:na?1:-1;\nreturn cmp(a,b);\n}\nfunction resolveValueColumns(opts){\nconst declared=opts.values||opts.totals||[];\nif(declared.length&&typeof declared[0]==='object'&&declared[0]!==null){\nreturn declared.filter((entry)=>entry&&entry.handle);\n}\nconst resolve=typeof opts.handle==='function'?opts.handle:null;\nif(!resolve){\nif(declared.length){\nwarnOnce('pivot:handles',\n'pivot was given total column ids but no handle(colId) resolver, so no cell values were reduced. Pass values: [{ colId, handle, fn }] or opts.handle.');\n}\nreturn[];\n}\nconst totalOf=typeof opts.totalOf==='function'?opts.totalOf:null;\nconst out=[];\nfor(const colId of declared){\nconst handle=resolve(colId);\nif(!handle)continue;\nout.push({colId,handle,fn:totalOf?totalOf(colId):'sum'});\n}\nreturn out;\n}\nfunction normaliseArgs(a,b,c){\nif(Array.isArray(a)){\nconst opts=c||{};\nreturn{...opts,pivotHandles:a,order:b||null,groups:opts.groups||null};\n}\nreturn a||{};\n}\nfunction pivot(input,orderArg,optsArg){\nconst opts=normaliseArgs(input,orderArg,optsArg);\nconst separator=opts.separator||DEFAULT_PATH_SEPARATOR;\nconst valueColumns=resolveValueColumns(opts);\nconst maxColumns=opts.maxColumns===undefined?DEFAULT_MAX_COLUMNS:opts.maxColumns;\nconst groups=opts.groups&&opts.groups.buckets?opts.groups:null;\nconst buckets=groups?groups.buckets:[opts.order||new Uint32Array(0)];\nconst groupPaths=opts.groupPaths\n||(groups?groups.keys.map((tuple)=>joinPath(tuple,separator)):['']);\nconst scope=concatIndices(buckets);\nconst{keys,paths,idOf}=resolvePivotKeys(opts.pivotHandles||[],scope,opts);\nconst columns=paths.length*Math.max(1,valueColumns.length);\nconst fields=derivedFields(paths,valueColumns,separator);\nif(maxColumns&&columns>maxColumns){\nconst empty=new Map();\nreturn{\nkeys,\npaths,\nfields,\ngroupPaths,\ncolumns,\nvalues:empty,\ncells:empty,\nerror:{\ncode:'pivot-max-columns',\nmessage:`[lattice] pivot would generate ${columns} columns, above pivot.maxColumns of ${maxColumns}. Narrow the pivot columns or raise the limit.`,\ncolumns,\nmaxColumns,\n},\n};\n}\nconst cells=new Map();\nconst keyCount=paths.length;\nfor(let g=0;g<buckets.length;g++){\nconst bucket=buckets[g];\nconst groupPath=groupPaths[g]===undefined?'':groupPaths[g];\nconst n=bucket.length;\nif(n===0)continue;\nconst ids=new Int32Array(n);\nconst counts=new Uint32Array(keyCount+1);\nfor(let i=0;i<n;i++){\nconst id=idOf(bucket[i]);\nids[i]=id;\nif(id>=0)counts[id+1]++;\n}\nfor(let k=0;k<keyCount;k++)counts[k+1]+=counts[k];\nconst scattered=new Uint32Array(n);\nconst cursor=counts.slice(0,keyCount);\nfor(let i=0;i<n;i++){\nconst id=ids[i];\nif(id>=0)scattered[cursor[id]++]=bucket[i];\n}\nfor(let k=0;k<keyCount;k++){\nconst from=counts[k];\nconst to=counts[k+1];\nif(to===from)continue;\nconst slice=scattered.subarray(from,to);\nfor(let c=0;c<valueColumns.length;c++){\nconst column=valueColumns[c];\nconst result=total(column.handle,slice,column.fn,opts.totalContext||{locale:opts.locale});\ncells.set(pivotKey(groupPath,paths[k],column.colId),result);\n}\n}\n}\nreturn{keys,paths,fields,groupPaths,columns,values:cells,cells,error:null};\n}\nfunction derivedFields(paths,valueColumns,separator){\nif(valueColumns.length===0)return paths.slice();\nconst out=[];\nfor(const path of paths){\nfor(const column of valueColumns)out.push(`${path}${separator}${column.colId}`);\n}\nreturn out;\n}\nfunction concatIndices(buckets){\nif(buckets.length===1)return buckets[0]||new Uint32Array(0);\nlet n=0;\nfor(const b of buckets)n+=b?b.length:0;\nconst out=new Uint32Array(n);\nlet at=0;\nfor(const b of buckets){\nif(!b||b.length===0)continue;\nout.set(b,at);\nat+=b.length;\n}\nreturn out;\n}\n});\n__def(\"packages/core/src/compute/reference.js\",function(__exports,__req){\n'use strict';\nObject.defineProperty(__exports,\"referenceValue\",{enumerable:true,get:function(){return referenceValue;}});\nObject.defineProperty(__exports,\"referenceSort\",{enumerable:true,get:function(){return referenceSort;}});\nObject.defineProperty(__exports,\"referenceFilter\",{enumerable:true,get:function(){return referenceFilter;}});\nObject.defineProperty(__exports,\"referencePasses\",{enumerable:true,get:function(){return referencePasses;}});\nObject.defineProperty(__exports,\"referenceGroup\",{enumerable:true,get:function(){return referenceGroup;}});\nObject.defineProperty(__exports,\"referenceTotal\",{enumerable:true,get:function(){return referenceTotal;}});\nconst __m0=__req(\"packages/core/src/internal/util.js\");\nconst getPath=__m0[\"getPath\"];\nconst __m1=__req(\"packages/core/src/compute/handle.js\");\nconst isMissing=__m1[\"isMissing\"];\nconst valueComparator=__m1[\"valueComparator\"];\nconst __m2=__req(\"packages/core/src/compute/filter.js\");\nconst testValue=__m2[\"testValue\"];\nconst KEY_SEPARATOR=String.fromCharCode(0x1f);\nconst NULL_MARKER=String.fromCharCode(0x00);\nfunction referenceValue(row,col){\nconst v=col.includes('.')?getPath(row,col):(row==null?undefined:row[col]);\nreturn v===undefined?null:v;\n}\nfunction referenceSort(rows,entries,opts={}){\nconst list=entries||[];\nlet order=rows.map((_,i)=>i);\nif(list.length===0)return order;\nfor(let e=list.length-1;e>=0;e--){\norder=referenceSortOne(rows,order,list[e],opts);\n}\nreturn order;\n}\nfunction referenceSortOne(rows,order,entry,opts){\nconst locale=entry.locale!==undefined?entry.locale:opts.locale;\nconst base=valueComparator(locale);\nconst descending=entry.descending!==undefined?!!entry.descending:entry.dir==='desc';\nconst present=[];\nconst absent=[];\nfor(const i of order){\nconst v=referenceValue(rows[i],entry.col);\nif(isMissing(v))absent.push(i);else present.push(i);\n}\nconst position=new Map();\nfor(let p=0;p<present.length;p++)position.set(present[p],p);\nconst compare=(a,b)=>{\nconst va=referenceValue(rows[a],entry.col);\nconst vb=referenceValue(rows[b],entry.col);\nlet c;\nif(typeof entry.compare==='function'){\nc=entry.compare(va,vb,rows[a],rows[b],descending);\nif(descending)c=-c;\n}else{\nc=descending?base(vb,va):base(va,vb);\n}\nreturn c!==0?c:position.get(a)-position.get(b);\n};\npresent.sort(compare);\nreturn entry.nullsFirst?absent.concat(present):present.concat(absent);\n}\nfunction referenceFilter(rows,filters,opts={}){\nconst out=[];\nfor(let i=0;i<rows.length;i++){\nif(referencePasses(rows[i],filters,opts,i))out.push(i);\n}\nreturn out;\n}\nfunction referencePasses(row,node,opts,index){\nif(!node)return true;\nif(Array.isArray(node.conditions)){\nconst children=node.conditions.filter((c)=>c!=null);\nif(children.length===0)return true;\nif(node.op==='or')return children.some((c)=>referencePasses(row,c,opts,index));\nconst all=children.every((c)=>referencePasses(row,c,opts,index));\nreturn node.op==='not'?!all:all;\n}\nif(node.col===undefined&&typeof opts.custom==='function')return!!opts.custom(node,row,index);\nreturn testValue(referenceValue(row,node.col),node,opts.locale);\n}\nfunction referenceGroup(rows,cols,order){\nconst source=order||rows.map((_,i)=>i);\nconst seen=new Map();\nconst keys=[];\nconst buckets=[];\nfor(const i of source){\nconst tuple=cols.map((col)=>referenceValue(rows[i],col));\nconst key=tuple\n.map((v)=>(v===null||v===undefined?NULL_MARKER:String(v)))\n.join(KEY_SEPARATOR);\nlet at=seen.get(key);\nif(at===undefined){\nat=keys.length;\nseen.set(key,at);\nkeys.push(tuple);\nbuckets.push([]);\n}\nbuckets[at].push(i);\n}\nreturn{keys,buckets};\n}\nfunction referenceTotal(values,fn,opts={}){\nconst cmp=valueComparator(opts.locale);\nconst live=values.filter((v)=>!isMissing(v));\nconst numbers=live.map(toNumberOrNull).filter((v)=>v!==null);\nswitch(fn){\ncase'count':return values.length;\ncase'countValues':return live.length;\ncase'sum':return numbers.reduce((a,b)=>a+b,0);\ncase'avg':return live.length===0?null:numbers.reduce((a,b)=>a+b,0)/live.length;\ncase'min':return live.length===0?null:live.reduce((a,b)=>(cmp(b,a)<0?b:a));\ncase'max':return live.length===0?null:live.reduce((a,b)=>(cmp(b,a)>0?b:a));\ncase'first':return values.length===0?null:normaliseNull(values[0]);\ncase'last':return values.length===0?null:normaliseNull(values[values.length-1]);\ndefault:return null;\n}\n}\nfunction toNumberOrNull(v){\nif(typeof v==='number')return Number.isNaN(v)?null:v;\nif(v===null||v===undefined||v===''||typeof v==='boolean')return null;\nif(v instanceof Date)return v.getTime();\nconst n=Number(v);\nreturn Number.isNaN(n)?null:n;\n}\nfunction normaliseNull(v){\nreturn v===undefined?null:v;\n}\n});\n__def(\"packages/core/src/compute/index.js\",function(__exports,__req){\n'use strict';\nconst __m0=__req(\"packages/core/src/compute/sort.js\");\nObject.defineProperty(__exports,\"sortColumn\",{enumerable:true,get:function(){return __m0[\"sortColumn\"];}});\nObject.defineProperty(__exports,\"sortMulti\",{enumerable:true,get:function(){return __m0[\"sortMulti\"];}});\nObject.defineProperty(__exports,\"radixSortFloat64\",{enumerable:true,get:function(){return __m0[\"radixSortFloat64\"];}});\nObject.defineProperty(__exports,\"radixSortInt32\",{enumerable:true,get:function(){return __m0[\"radixSortInt32\"];}});\nObject.defineProperty(__exports,\"rankSortDictionary\",{enumerable:true,get:function(){return __m0[\"rankSortDictionary\"];}});\nObject.defineProperty(__exports,\"mergeSortComparator\",{enumerable:true,get:function(){return __m0[\"mergeSortComparator\"];}});\nconst __m1=__req(\"packages/core/src/compute/filter.js\");\nObject.defineProperty(__exports,\"evaluateFilters\",{enumerable:true,get:function(){return __m1[\"evaluateFilters\"];}});\nObject.defineProperty(__exports,\"evaluateCondition\",{enumerable:true,get:function(){return __m1[\"evaluateCondition\"];}});\nObject.defineProperty(__exports,\"compact\",{enumerable:true,get:function(){return __m1[\"compact\"];}});\nObject.defineProperty(__exports,\"testValue\",{enumerable:true,get:function(){return __m1[\"testValue\"];}});\nObject.defineProperty(__exports,\"compilePredicate\",{enumerable:true,get:function(){return __m1[\"compilePredicate\"];}});\nObject.defineProperty(__exports,\"releaseMask\",{enumerable:true,get:function(){return __m1[\"releaseMask\"];}});\nObject.defineProperty(__exports,\"pruneColumn\",{enumerable:true,get:function(){return __m1[\"pruneColumn\"];}});\nObject.defineProperty(__exports,\"mentionsColumn\",{enumerable:true,get:function(){return __m1[\"mentionsColumn\"];}});\nconst __m2=__req(\"packages/core/src/compute/group.js\");\nObject.defineProperty(__exports,\"groupByColumns\",{enumerable:true,get:function(){return __m2[\"groupByColumns\"];}});\nObject.defineProperty(__exports,\"packKeys\",{enumerable:true,get:function(){return __m2[\"packKeys\"];}});\nconst __m3=__req(\"packages/core/src/compute/facet.js\");\nObject.defineProperty(__exports,\"facet\",{enumerable:true,get:function(){return __m3[\"facet\"];}});\nObject.defineProperty(__exports,\"computeBounds\",{enumerable:true,get:function(){return __m3[\"computeBounds\"];}});\nObject.defineProperty(__exports,\"countInto\",{enumerable:true,get:function(){return __m3[\"countInto\"];}});\nObject.defineProperty(__exports,\"bucketOf\",{enumerable:true,get:function(){return __m3[\"bucketOf\"];}});\nObject.defineProperty(__exports,\"facetKind\",{enumerable:true,get:function(){return __m3[\"facetKind\"];}});\nObject.defineProperty(__exports,\"cardinalityOf\",{enumerable:true,get:function(){return __m3[\"cardinalityOf\"];}});\nObject.defineProperty(__exports,\"pickGranularity\",{enumerable:true,get:function(){return __m3[\"pickGranularity\"];}});\nObject.defineProperty(__exports,\"floorTo\",{enumerable:true,get:function(){return __m3[\"floorTo\"];}});\nObject.defineProperty(__exports,\"advance\",{enumerable:true,get:function(){return __m3[\"advance\"];}});\nObject.defineProperty(__exports,\"STRATEGIES\",{enumerable:true,get:function(){return __m3[\"STRATEGIES\"];}});\nObject.defineProperty(__exports,\"GRANULARITIES\",{enumerable:true,get:function(){return __m3[\"GRANULARITIES\"];}});\nObject.defineProperty(__exports,\"DEFAULT_BUCKETS\",{enumerable:true,get:function(){return __m3[\"DEFAULT_BUCKETS\"];}});\nObject.defineProperty(__exports,\"DEFAULT_CARDINALITY_LIMIT\",{enumerable:true,get:function(){return __m3[\"DEFAULT_CARDINALITY_LIMIT\"];}});\nObject.defineProperty(__exports,\"QUANTILE_SAMPLE\",{enumerable:true,get:function(){return __m3[\"QUANTILE_SAMPLE\"];}});\nconst __m4=__req(\"packages/core/src/compute/total.js\");\nObject.defineProperty(__exports,\"TOTAL_FNS\",{enumerable:true,get:function(){return __m4[\"TOTAL_FNS\"];}});\nObject.defineProperty(__exports,\"TOTAL_LABELS\",{enumerable:true,get:function(){return __m4[\"TOTAL_LABELS\"];}});\nObject.defineProperty(__exports,\"totalLabel\",{enumerable:true,get:function(){return __m4[\"totalLabel\"];}});\nObject.defineProperty(__exports,\"total\",{enumerable:true,get:function(){return __m4[\"total\"];}});\nObject.defineProperty(__exports,\"collectValues\",{enumerable:true,get:function(){return __m4[\"collectValues\"];}});\nconst __m5=__req(\"packages/core/src/compute/pivot.js\");\nObject.defineProperty(__exports,\"pivot\",{enumerable:true,get:function(){return __m5[\"pivot\"];}});\nObject.defineProperty(__exports,\"resolvePivotKeys\",{enumerable:true,get:function(){return __m5[\"resolvePivotKeys\"];}});\nObject.defineProperty(__exports,\"pivotKey\",{enumerable:true,get:function(){return __m5[\"pivotKey\"];}});\nObject.defineProperty(__exports,\"joinPath\",{enumerable:true,get:function(){return __m5[\"joinPath\"];}});\nObject.defineProperty(__exports,\"KEY_DELIMITER\",{enumerable:true,get:function(){return __m5[\"KEY_DELIMITER\"];}});\nObject.defineProperty(__exports,\"DEFAULT_PATH_SEPARATOR\",{enumerable:true,get:function(){return __m5[\"DEFAULT_PATH_SEPARATOR\"];}});\nObject.defineProperty(__exports,\"DEFAULT_MAX_COLUMNS\",{enumerable:true,get:function(){return __m5[\"DEFAULT_MAX_COLUMNS\"];}});\nconst __m6=__req(\"packages/core/src/compute/reference.js\");\nObject.defineProperty(__exports,\"referenceSort\",{enumerable:true,get:function(){return __m6[\"referenceSort\"];}});\nObject.defineProperty(__exports,\"referenceFilter\",{enumerable:true,get:function(){return __m6[\"referenceFilter\"];}});\nObject.defineProperty(__exports,\"referenceGroup\",{enumerable:true,get:function(){return __m6[\"referenceGroup\"];}});\nObject.defineProperty(__exports,\"referenceTotal\",{enumerable:true,get:function(){return __m6[\"referenceTotal\"];}});\nObject.defineProperty(__exports,\"referencePasses\",{enumerable:true,get:function(){return __m6[\"referencePasses\"];}});\nObject.defineProperty(__exports,\"referenceValue\",{enumerable:true,get:function(){return __m6[\"referenceValue\"];}});\nconst __m7=__req(\"packages/core/src/compute/handle.js\");\nObject.defineProperty(__exports,\"identity\",{enumerable:true,get:function(){return __m7[\"identity\"];}});\nObject.defineProperty(__exports,\"rowCount\",{enumerable:true,get:function(){return __m7[\"rowCount\"];}});\nObject.defineProperty(__exports,\"presenceReader\",{enumerable:true,get:function(){return __m7[\"presenceReader\"];}});\nObject.defineProperty(__exports,\"bitReader\",{enumerable:true,get:function(){return __m7[\"bitReader\"];}});\nObject.defineProperty(__exports,\"valueReader\",{enumerable:true,get:function(){return __m7[\"valueReader\"];}});\nObject.defineProperty(__exports,\"valueComparator\",{enumerable:true,get:function(){return __m7[\"valueComparator\"];}});\nObject.defineProperty(__exports,\"numericTotalOrder\",{enumerable:true,get:function(){return __m7[\"numericTotalOrder\"];}});\nObject.defineProperty(__exports,\"dictRanks\",{enumerable:true,get:function(){return __m7[\"dictRanks\"];}});\nObject.defineProperty(__exports,\"dictSize\",{enumerable:true,get:function(){return __m7[\"dictSize\"];}});\nObject.defineProperty(__exports,\"dictValue\",{enumerable:true,get:function(){return __m7[\"dictValue\"];}});\nObject.defineProperty(__exports,\"multiValue\",{enumerable:true,get:function(){return __m7[\"multiValue\"];}});\nObject.defineProperty(__exports,\"isMissing\",{enumerable:true,get:function(){return __m7[\"isMissing\"];}});\n});\n__def(\"packages/worker/src/kernel.js\",function(__exports,__req){\n'use strict';\nObject.defineProperty(__exports,\"loadCompute\",{enumerable:true,get:function(){return loadCompute;}});\nObject.defineProperty(__exports,\"setCompute\",{enumerable:true,get:function(){return setCompute;}});\nObject.defineProperty(__exports,\"dispatch\",{enumerable:true,get:function(){return dispatch;}});\nObject.defineProperty(__exports,\"handleMessage\",{enumerable:true,get:function(){return handleMessage;}});\nObject.defineProperty(__exports,\"installKernel\",{enumerable:true,get:function(){return installKernel;}});\nconst __m0=__req(\"packages/worker/src/transport.js\");\nconst PROTOCOL=__m0[\"PROTOCOL\"];\nconst OPS=__m0[\"OPS\"];\nconst CONTROL=__m0[\"CONTROL\"];\nconst ERRORS=__m0[\"ERRORS\"];\nconst unpackHandle=__m0[\"unpackHandle\"];\nconst unpackHandles=__m0[\"unpackHandles\"];\nconst createMaskPool=__m0[\"createMaskPool\"];\nconst collectTransfers=__m0[\"collectTransfers\"];\nlet computeModule=null;\nlet computePromise=null;\nlet computeError=null;\nasync function loadCompute(loader){\nif(computeModule)return computeModule;\nif(!computePromise){\nconst load=loader||(()=>Promise.resolve(__req(\"packages/core/src/compute/index.js\")));\ncomputePromise=Promise.resolve()\n.then(load)\n.then((mod)=>{computeModule=mod;return mod;})\n.catch((err)=>{\ncomputeError=err;\ncomputeModule=null;\nreturn null;\n});\n}\nreturn computePromise;\n}\nfunction setCompute(mod){\ncomputeModule=mod;\ncomputePromise=mod?Promise.resolve(mod):null;\ncomputeError=mod?null:computeError;\n}\nfunction filterContext(handles,count,locale){\nconst byId=new Map();\nfor(const h of handles)if(h)byId.set(h.id,h);\nreturn{\nhandle(colId){return byId.get(colId);},\ncount,\npool:createMaskPool(),\nlocale,\n};\n}\nfunction dispatch(request,compute){\nconst{op,args}=request;\nconst fn=compute[op];\nif(typeof fn!=='function'){\nconst err=new Error(`[lattice] compute kernel '${op}' is not exported`);\n(err).code=ERRORS.NO_KERNEL;\nthrow err;\n}\nswitch(op){\ncase OPS.SORT_COLUMN:\nreturn fn(unpackHandle(args.handle),args.order??null,args.opts||{});\ncase OPS.SORT_MULTI:{\nconst handles=unpackHandles(args.handles||[]);\nconst entries=(args.entries||[]).map((e)=>({\n...e,\nhandle:handles[e.index],\n}));\nreturn fn(handles,entries,args.order??null);\n}\ncase OPS.EVALUATE_FILTERS:\nreturn fn(args.filters,filterContext(unpackHandles(args.handles||[]),args.count,args.locale));\ncase OPS.COMPACT:\nreturn fn(args.mask,args.count,undefined);\ncase OPS.GROUP_BY_COLUMNS:\nreturn fn(unpackHandles(args.handles||[]),args.order??null,args.opts||{});\ncase OPS.TOTAL:\nreturn fn(unpackHandle(args.handle),args.indices??null,args.fn);\ncase OPS.PIVOT:\nreturn fn(unpackHandles(args.handles||[]),args.order??null,args.opts||{});\ncase OPS.FACET:\nreturn fn(unpackHandle(args.handle),args.indices??null,args.count,args.opts||{});\ndefault:{\nconst err=new Error(`[lattice] unknown worker op '${op}'`);\n(err).code=ERRORS.PROTOCOL;\nthrow err;\n}\n}\n}\nasync function handleMessage(message,opts={}){\nif(!message||message.lattice!==PROTOCOL)return null;\nconst{id,op}=message;\nif(op===CONTROL.CANCEL){\nopts.cancelled?.add(message.target);\nreturn null;\n}\nif(op===CONTROL.PING){\nreturn{reply:{lattice:PROTOCOL,id,ok:true,result:'pong'},transfer:[]};\n}\nconst compute=await loadCompute(opts.loader);\nif(!compute){\nreturn{\nreply:{\nlattice:PROTOCOL,\nid,\nok:false,\nerror:{\ncode:ERRORS.NO_COMPUTE,\nmessage:`[lattice] compute kernels unavailable in worker: ${computeError?computeError.message:'module not found'}`,\n},\n},\ntransfer:[],\n};\n}\nif(opts.cancelled?.has(id)){\nopts.cancelled.delete(id);\nreturn{reply:{lattice:PROTOCOL,id,ok:false,error:{code:ERRORS.ABORTED,message:'[lattice] request superseded'}},transfer:[]};\n}\ntry{\nconst result=dispatch(message,compute);\nif(opts.cancelled?.has(id)){\nopts.cancelled.delete(id);\nreturn{reply:{lattice:PROTOCOL,id,ok:false,error:{code:ERRORS.ABORTED,message:'[lattice] request superseded'}},transfer:[]};\n}\nreturn{reply:{lattice:PROTOCOL,id,ok:true,result},transfer:collectTransfers(result)};\n}catch(err){\nconst e=(err);\nreturn{\nreply:{\nlattice:PROTOCOL,\nid,\nok:false,\nerror:{code:e.code||ERRORS.KERNEL,message:e.message||String(err),stack:e.stack},\n},\ntransfer:[],\n};\n}\n}\nfunction installKernel(scope,opts={}){\nconst cancelled=new Set();\nconst onMessage=async(event)=>{\nconst outcome=await handleMessage(event.data,{loader:opts.loader,cancelled});\nif(!outcome)return;\nscope.postMessage(outcome.reply,outcome.transfer);\n};\nscope.addEventListener('message',onMessage);\nloadCompute(opts.loader).then((mod)=>{\nscope.postMessage({lattice:PROTOCOL,id:0,op:CONTROL.READY,compute:!!mod});\n});\nreturn()=>scope.removeEventListener('message',onMessage);\n}\n});\nvar __entry=__req(\"packages/worker/src/kernel.js\");\nroot[\"__latticeKernel\"]=__entry;\n})(typeof globalThis!=='undefined'?globalThis:this);\n__latticeKernel.installKernel(self);\n",{type:'classic'});
|
|
63246
|
+
__req("packages/worker/src/inline.js").setWorkerSource("(function(root){\n'use strict';\nvar __mods=Object.create(null);\nvar __cache=Object.create(null);\nfunction __def(id,fn){__mods[id]=fn;}\nfunction __req(id){\nvar hit=__cache[id];\nif(hit)return hit;\nvar exports=Object.create(null);\n__cache[id]=exports;\nvar fn=__mods[id];\nif(!fn)throw new Error('[lattice] missing module: '+id);\nfn(exports,__req);\nreturn exports;\n}\n__def(\"packages/core/src/internal/util.js\",function(__exports,__req){\n'use strict';\nObject.defineProperty(__exports,\"VERSION\",{enumerable:true,get:function(){return VERSION;}});\nObject.defineProperty(__exports,\"reportedWarnings\",{enumerable:true,get:function(){return reportedWarnings;}});\nObject.defineProperty(__exports,\"warnOnce\",{enumerable:true,get:function(){return warnOnce;}});\nObject.defineProperty(__exports,\"infoOnce\",{enumerable:true,get:function(){return infoOnce;}});\nObject.defineProperty(__exports,\"resetWarnings\",{enumerable:true,get:function(){return resetWarnings;}});\nObject.defineProperty(__exports,\"fail\",{enumerable:true,get:function(){return fail;}});\nObject.defineProperty(__exports,\"invariant\",{enumerable:true,get:function(){return invariant;}});\nObject.defineProperty(__exports,\"DEV\",{enumerable:true,get:function(){return DEV;}});\nObject.defineProperty(__exports,\"isObject\",{enumerable:true,get:function(){return isObject;}});\nObject.defineProperty(__exports,\"isFunction\",{enumerable:true,get:function(){return isFunction;}});\nObject.defineProperty(__exports,\"isNil\",{enumerable:true,get:function(){return isNil;}});\nObject.defineProperty(__exports,\"isBlank\",{enumerable:true,get:function(){return isBlank;}});\nObject.defineProperty(__exports,\"isCtor\",{enumerable:true,get:function(){return isCtor;}});\nObject.defineProperty(__exports,\"pathGetter\",{enumerable:true,get:function(){return pathGetter;}});\nObject.defineProperty(__exports,\"pathSetter\",{enumerable:true,get:function(){return pathSetter;}});\nObject.defineProperty(__exports,\"getPath\",{enumerable:true,get:function(){return getPath;}});\nObject.defineProperty(__exports,\"setPath\",{enumerable:true,get:function(){return setPath;}});\nObject.defineProperty(__exports,\"humanise\",{enumerable:true,get:function(){return humanise;}});\nObject.defineProperty(__exports,\"escapeHtml\",{enumerable:true,get:function(){return escapeHtml;}});\nObject.defineProperty(__exports,\"titleCase\",{enumerable:true,get:function(){return titleCase;}});\nObject.defineProperty(__exports,\"expand\",{enumerable:true,get:function(){return expand;}});\nObject.defineProperty(__exports,\"toArray\",{enumerable:true,get:function(){return toArray;}});\nObject.defineProperty(__exports,\"merge\",{enumerable:true,get:function(){return merge;}});\nObject.defineProperty(__exports,\"mergeRow\",{enumerable:true,get:function(){return mergeRow;}});\nObject.defineProperty(__exports,\"Lru\",{enumerable:true,get:function(){return Lru;}});\nObject.defineProperty(__exports,\"collator\",{enumerable:true,get:function(){return collator;}});\nObject.defineProperty(__exports,\"defaultCompare\",{enumerable:true,get:function(){return defaultCompare;}});\nObject.defineProperty(__exports,\"now\",{enumerable:true,get:function(){return now;}});\nObject.defineProperty(__exports,\"nextFrame\",{enumerable:true,get:function(){return nextFrame;}});\nObject.defineProperty(__exports,\"cancelFrame\",{enumerable:true,get:function(){return cancelFrame;}});\nObject.defineProperty(__exports,\"frameBatched\",{enumerable:true,get:function(){return frameBatched;}});\nObject.defineProperty(__exports,\"whenIdle\",{enumerable:true,get:function(){return whenIdle;}});\nObject.defineProperty(__exports,\"uid\",{enumerable:true,get:function(){return uid;}});\nconst VERSION='1.9.0';\nconst warned=new Set();\nconst reported=[];\nconst REPORT_LIMIT=500;\nfunction record(key,level,message){\nreported.push({\nkey,\nlevel,\nmessage:message.map((m)=>(typeof m==='string'?m:safeString(m))).join(' '),\nat:Date.now(),\n});\nif(reported.length>REPORT_LIMIT)reported.shift();\n}\nfunction safeString(value){\nif(value instanceof Error)return value.message;\ntry{return JSON.stringify(value);}catch{return String(value);}\n}\nfunction reportedWarnings(){return reported.map((r)=>({...r}));}\nfunction warnOnce(key,...message){\nif(warned.has(key))return;\nwarned.add(key);\nrecord(key,'warn',message);\nconsole.warn('[lattice]',...message);\n}\nfunction infoOnce(key,...message){\nif(warned.has(key))return;\nwarned.add(key);\nrecord(key,'info',message);\nconsole.info('[lattice]',...message);\n}\nfunction resetWarnings(){\nwarned.clear();\nreported.length=0;\n}\nfunction fail(message,extra){\nconst err=new Error(`[lattice] ${message}`);\nif(extra!==undefined)err.cause=extra;\nthrow err;\n}\nfunction invariant(condition,message){\nif(!condition)fail(message);\n}\nconst DEV=(()=>{\ntry{\nreturn!(typeof process!=='undefined'&&process.env\n&&process.env.NODE_ENV==='production');\n}catch{\nreturn true;\n}\n})();\nfunction isObject(v){\nreturn v!==null&&typeof v==='object'&&!Array.isArray(v);\n}\nfunction isFunction(v){\nreturn typeof v==='function';\n}\nfunction isNil(v){\nreturn v===null||v===undefined;\n}\nfunction isBlank(v){\nreturn v===null||v===undefined||v==='';\n}\nfunction isCtor(v){\nif(typeof v!=='function')return false;\nif(/^class[\\s{]/.test(Function.prototype.toString.call(v)))return true;\nreturn!!(v.prototype&&Object.getOwnPropertyNames(v.prototype).length>1);\n}\nconst pathCache=new Map();\nfunction pathGetter(path){\nlet fn=pathCache.get(path);\nif(fn)return fn;\nif(!path.includes('.')){\nfn=(o)=>(o==null?undefined:o[path]);\n}else{\nconst parts=path.split('.');\nconst n=parts.length;\nfn=(o)=>{\nlet cur=o;\nfor(let i=0;i<n;i++){\nif(cur==null)return undefined;\ncur=cur[parts[i]];\n}\nreturn cur;\n};\n}\npathCache.set(path,fn);\nreturn fn;\n}\nconst setterCache=new Map();\nfunction pathSetter(path){\nlet fn=setterCache.get(path);\nif(fn)return fn;\nif(!path.includes('.')){\nfn=(o,v)=>{if(o!=null)o[path]=v;};\n}else{\nconst parts=path.split('.');\nconst last=parts.length-1;\nfn=(o,v)=>{\nlet cur=o;\nfor(let i=0;i<last;i++){\nif(cur==null)return;\nconst k=parts[i];\nif(cur[k]==null)cur[k]={};\ncur=cur[k];\n}\nif(cur!=null)cur[parts[last]]=v;\n};\n}\nsetterCache.set(path,fn);\nreturn fn;\n}\nfunction getPath(obj,path){\nreturn pathGetter(path)(obj);\n}\nfunction setPath(obj,path,value){\npathSetter(path)(obj,value);\n}\nfunction humanise(field){\nif(!field)return'';\nconst leaf=field.includes('.')?field.slice(field.lastIndexOf('.')+1):field;\nreturn leaf\n.replace(/[_-]+/g,' ')\n.replace(/([a-z0-9])([A-Z])/g,'$1 $2')\n.replace(/([A-Z]+)([A-Z][a-z])/g,'$1 $2')\n.replace(/\\s+/g,' ')\n.trim()\n.replace(/^./,(c)=>c.toUpperCase());\n}\nconst ESCAPES={'&':'&','<':'<','>':'>','\"':'"',\"'\":'''};\nfunction escapeHtml(s){\nconst str=s==null?'':String(s);\nreturn/[&<>\"']/.test(str)?str.replace(/[&<>\"']/g,(c)=>ESCAPES[c]):str;\n}\nfunction titleCase(s){\nreturn String(s).replace(/\\w\\S*/g,(t)=>t[0].toUpperCase()+t.slice(1).toLowerCase());\n}\nfunction expand(value,key,whenTrue){\nif(value===undefined)return undefined;\nif(value===true)return{enabled:true,...whenTrue};\nif(value===false)return{enabled:false};\nif(isObject(value))return value;\nreturn{[key]:value,enabled:true};\n}\nfunction toArray(v){\nif(v===undefined||v===null)return[];\nreturn Array.isArray(v)?v:[v];\n}\nfunction merge(a,b){\nif(!isObject(a))return isObject(b)?{...b}:b;\nif(!isObject(b))return b===undefined?a:b;\nconst out={...a};\nfor(const k of Object.keys(b)){\nconst bv=b[k];\nif(bv===undefined)continue;\nout[k]=isObject(bv)&&isObject(out[k])?merge(out[k],bv):bv;\n}\nreturn out;\n}\nfunction mergeRow(previous,patch){\nif(!isObject(previous)||!isObject(patch)||previous===patch)return patch;\nconst out=Object.create(Object.getPrototypeOf(previous));\nObject.assign(out,previous,patch);\nreturn out;\n}\nclass Lru{\n#max;\n#map=new Map();\n#onEvict;\nconstructor(max=256,onEvict=null){\nthis.#max=max;\nthis.#onEvict=onEvict;\n}\nget size(){\nreturn this.#map.size;\n}\nget max(){\nreturn this.#max;\n}\nset max(v){\nthis.#max=v;\nthis.#trim();\n}\nhas(k){\nreturn this.#map.has(k);\n}\nget(k){\nconst m=this.#map;\nif(!m.has(k))return undefined;\nconst v=m.get(k);\nm.delete(k);\nm.set(k,v);\nreturn v;\n}\npeek(k){\nreturn this.#map.get(k);\n}\nset(k,v){\nconst m=this.#map;\nif(m.has(k))m.delete(k);\nm.set(k,v);\nthis.#trim();\nreturn v;\n}\ndelete(k){\nconst v=this.#map.get(k);\nif(this.#map.delete(k)&&this.#onEvict)this.#onEvict(v,k);\nreturn v;\n}\nclear(){\nif(this.#onEvict)for(const[k,v]of this.#map)this.#onEvict(v,k);\nthis.#map.clear();\n}\nkeys(){\nreturn this.#map.keys();\n}\nvalues(){\nreturn this.#map.values();\n}\n#trim(){\nconst m=this.#map;\nwhile(m.size>this.#max){\nconst oldest=m.keys().next().value;\nconst v=m.get(oldest);\nm.delete(oldest);\nif(this.#onEvict)this.#onEvict(v,oldest);\n}\n}\n}\nconst collators=new Map();\nfunction collator(locale,opts){\nconst key=`${locale||''}|${opts?JSON.stringify(opts):''}`;\nlet c=collators.get(key);\nif(!c){\nc=new Intl.Collator(locale||undefined,{\nnumeric:true,sensitivity:'variant',...opts,\n});\ncollators.set(key,c);\n}\nreturn c;\n}\nfunction defaultCompare(a,b){\nif(a===b)return 0;\nif(a===null||a===undefined)return 1;\nif(b===null||b===undefined)return-1;\nif(typeof a==='number'&&typeof b==='number'){\nif(Number.isNaN(a))return Number.isNaN(b)?0:1;\nif(Number.isNaN(b))return-1;\nreturn a<b?-1:a>b?1:0;\n}\nconst sa=String(a);\nconst sb=String(b);\nreturn sa<sb?-1:sa>sb?1:0;\n}\nfunction now(){\nreturn typeof performance!=='undefined'&&performance.now\n?performance.now()\n:Date.now();\n}\nconst hasRaf=typeof requestAnimationFrame==='function';\nfunction nextFrame(fn){\nif(hasRaf)return requestAnimationFrame(fn);\nreturn setTimeout(()=>fn(now()),16);\n}\nfunction cancelFrame(handle){\nif(handle==null)return;\nif(hasRaf)cancelAnimationFrame(handle);\nelse clearTimeout(handle);\n}\nfunction frameBatched(fn){\nlet handle=null;\nlet lastArgs=null;\nconst run=()=>{\nhandle=null;\nconst a=lastArgs;\nlastArgs=null;\nfn(...(a||[]));\n};\nconst wrapped=(...args)=>{\nlastArgs=args;\nif(handle===null)handle=nextFrame(run);\n};\nwrapped.cancel=()=>{\ncancelFrame(handle);\nhandle=null;\nlastArgs=null;\n};\nwrapped.flush=()=>{\nif(handle!==null){\ncancelFrame(handle);\nrun();\n}\n};\nreturn wrapped;\n}\nfunction whenIdle(fn,timeout=50){\nif(typeof requestIdleCallback==='function'){\nreturn requestIdleCallback(fn,{timeout});\n}\nreturn setTimeout(()=>fn({timeRemaining:()=>0,didTimeout:true}),1);\n}\nlet idSeq=0;\nfunction uid(prefix='l'){\nreturn`${prefix}${(++idSeq).toString(36)}`;\n}\n});\n__def(\"packages/worker/src/transport.js\",function(__exports,__req){\n'use strict';\nObject.defineProperty(__exports,\"PROTOCOL\",{enumerable:true,get:function(){return PROTOCOL;}});\nObject.defineProperty(__exports,\"OPS\",{enumerable:true,get:function(){return OPS;}});\nObject.defineProperty(__exports,\"CONTROL\",{enumerable:true,get:function(){return CONTROL;}});\nObject.defineProperty(__exports,\"ERRORS\",{enumerable:true,get:function(){return ERRORS;}});\nObject.defineProperty(__exports,\"packHandle\",{enumerable:true,get:function(){return packHandle;}});\nObject.defineProperty(__exports,\"packHandles\",{enumerable:true,get:function(){return packHandles;}});\nObject.defineProperty(__exports,\"TransportedDictionary\",{enumerable:true,get:function(){return TransportedDictionary;}});\nObject.defineProperty(__exports,\"unpackHandle\",{enumerable:true,get:function(){return unpackHandle;}});\nObject.defineProperty(__exports,\"unpackHandles\",{enumerable:true,get:function(){return unpackHandles;}});\nObject.defineProperty(__exports,\"createMaskPool\",{enumerable:true,get:function(){return createMaskPool;}});\nObject.defineProperty(__exports,\"isTransferable\",{enumerable:true,get:function(){return isTransferable;}});\nObject.defineProperty(__exports,\"collectTransfers\",{enumerable:true,get:function(){return collectTransfers;}});\nObject.defineProperty(__exports,\"isPortable\",{enumerable:true,get:function(){return isPortable;}});\nObject.defineProperty(__exports,\"filterColumnIds\",{enumerable:true,get:function(){return filterColumnIds;}});\nconst __m0=__req(\"packages/core/src/internal/util.js\");\nconst collator=__m0[\"collator\"];\nconst isFunction=__m0[\"isFunction\"];\nconst PROTOCOL=1;\nconst OPS=Object.freeze({\nSORT_COLUMN:'sortColumn',\nSORT_MULTI:'sortMulti',\nEVALUATE_FILTERS:'evaluateFilters',\nCOMPACT:'compact',\nGROUP_BY_COLUMNS:'groupByColumns',\nTOTAL:'total',\nPIVOT:'pivot',\nFACET:'facet',\n});\nconst CONTROL=Object.freeze({\nREADY:'ready',\nCANCEL:'cancel',\nPING:'ping',\n});\nconst ERRORS=Object.freeze({\nNO_COMPUTE:'E_NO_COMPUTE',\nNO_KERNEL:'E_NO_KERNEL',\nABORTED:'E_ABORTED',\nKERNEL:'E_KERNEL',\nPROTOCOL:'E_PROTOCOL',\n});\nfunction packHandle(handle){\nif(handle==null)return null;\nconst presence=handle.presence;\nreturn{\nid:handle.id,\nkind:handle.kind,\nnullable:!!handle.nullable,\nvalues:handle.values??null,\npresence:presence?(presence.words??presence):null,\npresenceBits:presence?(presence.size??(presence.words??presence).length*8):0,\ndict:handle.dict?sliceDictionary(handle.dict):null,\noffsets:handle.offsets??null,\nversion:handle.version??0,\n};\n}\nfunction sliceDictionary(dict){\nif(Array.isArray(dict))return dict;\nif(isFunction(dict.values))return dict.values();\nreturn[];\n}\nfunction packHandles(handles){\nconst out=new Array(handles.length);\nfor(let i=0;i<handles.length;i++)out[i]=packHandle(handles[i]);\nreturn out;\n}\nclass TransportedBitset{\n#words;\n#bits;\nconstructor(words,bits){\nthis.#words=words;\nthis.#bits=bits;\n}\nget words(){return this.#words;}\nget size(){return this.#bits;}\nget(i){return(this.#words[i>>>3]&(1<<(i&7)))!==0;}\ncount(){\nconst w=this.#words;\nlet n=0;\nfor(let i=0;i<w.length;i++){\nlet v=w[i];\nwhile(v){v&=v-1;n++;}\n}\nreturn n;\n}\n}\nclass TransportedDictionary{\n#values;\n#index=null;\n#version=0;\n#ranks=new Map();\nconstructor(values){\nthis.#values=values||[];\n}\nget size(){return this.#values.length;}\nget version(){return this.#version;}\ncodeOf(value){\nif(this.#index===null){\nthis.#index=new Map();\nfor(let i=0;i<this.#values.length;i++)this.#index.set(this.#values[i],i);\n}\nconst found=this.#index.get(value);\nif(found!==undefined)return found;\nconst code=this.#values.length;\nthis.#values.push(value);\nthis.#index.set(value,code);\nthis.#version++;\nreturn code;\n}\nvalueOf(code){return this.#values[code];}\nvalues(){return this.#values;}\nranks(locale){\nconst key=locale||'';\nconst cached=this.#ranks.get(key);\nif(cached&&cached.version===this.#version)return cached.ranks;\nconst n=this.#values.length;\nconst order=new Uint32Array(n);\nfor(let i=0;i<n;i++)order[i]=i;\nconst cmp=collator(locale).compare;\nconst vals=this.#values;\nconst sorted=Array.from(order).sort((a,b)=>{\nconst av=vals[a];\nconst bv=vals[b];\nif(av===bv)return 0;\nif(av===null||av===undefined)return 1;\nif(bv===null||bv===undefined)return-1;\nreturn cmp(String(av),String(bv));\n});\nconst ranks=new Uint32Array(n);\nfor(let r=0;r<sorted.length;r++)ranks[sorted[r]]=r;\nthis.#ranks.set(key,{version:this.#version,ranks});\nreturn ranks;\n}\n}\nfunction unpackHandle(packed){\nif(packed==null)return null;\nconst presence=packed.presence\n?new TransportedBitset(packed.presence,packed.presenceBits||packed.presence.length*8)\n:null;\nconst dict=packed.dict?new TransportedDictionary(packed.dict):null;\nconst values=packed.values;\nconst offsets=packed.offsets??null;\nconst kind=packed.kind;\nconst get=(physical)=>{\nif(presence&&!presence.get(physical))return null;\nswitch(kind){\ncase'dictionary':\nreturn dict?dict.valueOf(values[physical]):values[physical];\ncase'bitset':\nreturn(values[physical>>>3]&(1<<(physical&7)))!==0;\ncase'multi':{\nif(!offsets)return null;\nconst from=offsets[physical];\nconst to=offsets[physical+1];\nconst out=new Array(to-from);\nfor(let i=from;i<to;i++)out[i-from]=dict?dict.valueOf(values[i]):values[i];\nreturn out;\n}\ndefault:\nreturn values[physical];\n}\n};\nreturn{\nid:packed.id,\nkind,\nnullable:packed.nullable,\nvalues,\npresence,\ndict,\noffsets,\nget,\nversion:packed.version,\n};\n}\nfunction unpackHandles(packed){\nconst out=new Array(packed.length);\nfor(let i=0;i<packed.length;i++)out[i]=unpackHandle(packed[i]);\nreturn out;\n}\nfunction createMaskPool(){\nconst masks=[];\nconst indices=[];\nreturn{\nmask(n){\nfor(let i=0;i<masks.length;i++){\nif(masks[i].length>=n){\nconst buf=masks.splice(i,1)[0].subarray(0,n);\nbuf.fill(0);\nreturn buf;\n}\n}\nreturn new Uint8Array(n);\n},\nindices(n){\nfor(let i=0;i<indices.length;i++){\nif(indices[i].length>=n)return indices.splice(i,1)[0].subarray(0,n);\n}\nreturn new Uint32Array(n);\n},\nrelease(buf){\nif(!buf)return;\nif(buf instanceof Uint8Array)masks.push(buf);\nelse if(buf instanceof Uint32Array)indices.push(buf);\n},\nclear(){masks.length=0;indices.length=0;},\n};\n}\nfunction isTransferable(v){\nif(!ArrayBuffer.isView(v))return false;\nconst buf=(v).buffer;\nif(!buf)return false;\nreturn typeof SharedArrayBuffer==='undefined'||!(buf instanceof SharedArrayBuffer);\n}\nfunction collectTransfers(value,out=[]){\nconst add=(v)=>{\nif(!isTransferable(v))return;\nconst buf=(v).buffer;\nif(!out.includes(buf))out.push(buf);\n};\nif(value==null)return out;\nif(ArrayBuffer.isView(value)){add(value);return out;}\nif(Array.isArray(value)){\nfor(const item of value)add(item);\nreturn out;\n}\nif(typeof value==='object'){\nfor(const key of Object.keys(value)){\nconst item=(value)[key];\nif(Array.isArray(item))for(const sub of item)add(sub);\nelse add(item);\n}\n}\nreturn out;\n}\nfunction isPortable(value,depth=0){\nif(value==null)return true;\nconst t=typeof value;\nif(t==='function'||t==='symbol')return false;\nif(t!=='object')return true;\nif(depth>4)return true;\nif(ArrayBuffer.isView(value)||value instanceof ArrayBuffer||value instanceof Date)return true;\nif(Array.isArray(value)){\nfor(const item of value)if(!isPortable(item,depth+1))return false;\nreturn true;\n}\nfor(const key of Object.keys(value)){\nif(!isPortable((value)[key],depth+1))return false;\n}\nreturn true;\n}\nfunction filterColumnIds(filters,out=new Set()){\nif(!filters||typeof filters!=='object')return out;\nconst node=(filters);\nif(typeof node.col==='string')out.add(node.col);\nconst conditions=node.conditions;\nif(Array.isArray(conditions))for(const child of conditions)filterColumnIds(child,out);\nreturn out;\n}\n});\n__def(\"packages/core/src/compute/handle.js\",function(__exports,__req){\n'use strict';\nObject.defineProperty(__exports,\"identity\",{enumerable:true,get:function(){return identity;}});\nObject.defineProperty(__exports,\"rowCount\",{enumerable:true,get:function(){return rowCount;}});\nObject.defineProperty(__exports,\"bitReader\",{enumerable:true,get:function(){return bitReader;}});\nObject.defineProperty(__exports,\"presenceReader\",{enumerable:true,get:function(){return presenceReader;}});\nObject.defineProperty(__exports,\"dictSize\",{enumerable:true,get:function(){return dictSize;}});\nObject.defineProperty(__exports,\"dictValue\",{enumerable:true,get:function(){return dictValue;}});\nObject.defineProperty(__exports,\"multiValue\",{enumerable:true,get:function(){return multiValue;}});\nObject.defineProperty(__exports,\"valueReader\",{enumerable:true,get:function(){return valueReader;}});\nObject.defineProperty(__exports,\"numericTotalOrder\",{enumerable:true,get:function(){return numericTotalOrder;}});\nObject.defineProperty(__exports,\"valueComparator\",{enumerable:true,get:function(){return valueComparator;}});\nObject.defineProperty(__exports,\"dictRanks\",{enumerable:true,get:function(){return dictRanks;}});\nObject.defineProperty(__exports,\"isMissing\",{enumerable:true,get:function(){return isMissing;}});\nconst __m0=__req(\"packages/core/src/internal/util.js\");\nconst collator=__m0[\"collator\"];\nconst defaultCompare=__m0[\"defaultCompare\"];\nconst warnOnce=__m0[\"warnOnce\"];\nfunction identity(n){\nconst out=new Uint32Array(n);\nfor(let i=0;i<n;i++)out[i]=i;\nreturn out;\n}\nfunction rowCount(handle,opts){\nif(opts&&typeof opts.count==='number')return opts.count;\nif(!handle)return 0;\nif(typeof handle.count==='number')return handle.count;\nif(typeof handle.length==='number')return handle.length;\nconst values=handle.values;\nif(handle.kind==='multi'&&handle.offsets)return Math.max(0,handle.offsets.length-1);\nif(!values)return handle.presence&&typeof handle.presence.size==='number'?handle.presence.size:0;\nif(handle.kind==='bitset'){\nif(typeof values.size==='number')return values.size;\nif(handle.presence&&typeof handle.presence.size==='number')return handle.presence.size;\nwarnOnce(`count:${handle.id}`,`column \"${handle.id}\" is bitset-backed with no declared row count; assuming ${values.length*8}`);\nreturn values.length*8;\n}\nreturn values.length;\n}\nconst bitOrders=new WeakMap();\nfunction bitOrderOf(bitset){\nconst ctor=bitset.constructor;\nif(!ctor)return'unknown';\nconst cached=bitOrders.get(ctor);\nif(cached)return cached;\nlet order='unknown';\ntry{\nlet probe=null;\nif(typeof ctor.from==='function')probe=ctor.from([false,true]);\nelse{\nprobe=new ctor(8);\nprobe.set(1);\n}\nconst words=probe&&probe.words;\nif(words&&words.length){\nif(words[0]===0x02)order='lsb';\nelse if(words[0]===0x40)order='msb';\n}\n}catch{\norder='unknown';\n}\nbitOrders.set(ctor,order);\nreturn order;\n}\nfunction bitReader(bits){\nif(!bits)return()=>0;\nconst raw=bits instanceof Uint8Array?bits:bits.words;\nif(raw instanceof Uint8Array){\nconst order=bits instanceof Uint8Array?'lsb':bitOrderOf(bits);\nif(order==='lsb')return(i)=>(raw[i>>>3]>>>(i&7))&1;\nif(order==='msb')return(i)=>(raw[i>>>3]>>>(7-(i&7)))&1;\n}\nif(typeof bits.get==='function')return(i)=>(bits.get(i)?1:0);\nreturn()=>0;\n}\nfunction presenceReader(handle){\nif(!handle||!handle.presence)return null;\nreturn bitReader(handle.presence);\n}\nfunction dictSize(dict){\nif(!dict)return 0;\nif(typeof dict.size==='number')return dict.size;\nif(typeof dict.values==='function')return dict.values().length;\nreturn 0;\n}\nfunction dictValue(dict,code){\nif(!dict)return null;\nif(typeof dict.valueOf==='function')return dict.valueOf(code);\nif(typeof dict.values==='function')return dict.values()[code];\nreturn null;\n}\nfunction multiValue(handle,i){\nconst offsets=handle.offsets;\nconst values=handle.values;\nif(!offsets||!values)return[];\nconst from=offsets[i];\nconst to=offsets[i+1];\nif(!(to>from))return[];\nconst dict=handle.dict;\nconst out=new Array(to-from);\nfor(let k=from;k<to;k++)out[k-from]=dict?dictValue(dict,values[k]):values[k];\nreturn out;\n}\nfunction valueReader(handle){\nif(!handle)return()=>undefined;\nconst values=handle.values;\nconst present=presenceReader(handle);\nconst kind=handle.kind;\nif(kind==='dictionary'){\nconst dict=handle.dict;\nif(present)return(i)=>(present(i)?dictValue(dict,values[i]):null);\nreturn(i)=>dictValue(dict,values[i]);\n}\nif(kind==='bitset'){\nconst bit=bitReader(values);\nif(present)return(i)=>(present(i)?bit(i)===1:null);\nreturn(i)=>bit(i)===1;\n}\nif(kind==='multi'){\nif(present)return(i)=>(present(i)?multiValue(handle,i):null);\nreturn(i)=>multiValue(handle,i);\n}\nif(!values&&typeof handle.get==='function'){\nconst get=handle.get.bind(handle);\nreturn(i)=>{\nconst v=get(i);\nreturn v===undefined?null:v;\n};\n}\nif(present){\nreturn(i)=>{\nif(!present(i))return null;\nconst v=values[i];\nreturn v===undefined?null:v;\n};\n}\nreturn(i)=>{\nconst v=values[i];\nreturn v===undefined?null:v;\n};\n}\nfunction numericTotalOrder(a,b){\nif(a<b)return-1;\nif(a>b)return 1;\nif(a===b){\nconst na=Object.is(a,-0);\nconst nb=Object.is(b,-0);\nif(na===nb)return 0;\nreturn na?-1:1;\n}\nconst an=Number.isNaN(a);\nconst bn=Number.isNaN(b);\nif(an&&bn)return 0;\nreturn an?1:-1;\n}\nfunction valueComparator(locale){\nconst coll=collator(locale);\nreturn(a,b)=>{\nif(a===b)return 0;\nconst ta=typeof a;\nconst tb=typeof b;\nif(ta==='string'&&tb==='string')return coll.compare(a,b);\nif(ta==='number'&&tb==='number')return numericTotalOrder(a,b);\nif(ta==='boolean'&&tb==='boolean')return a===b?0:a?1:-1;\nif(a instanceof Date||b instanceof Date){\nconst na=a instanceof Date?a.getTime():Number(a);\nconst nb=b instanceof Date?b.getTime():Number(b);\nreturn numericTotalOrder(na,nb);\n}\nreturn defaultCompare(a,b);\n};\n}\nfunction dictRanks(dict,locale){\nif(dict&&typeof dict.ranks==='function')return dict.ranks(locale);\nconst table=dict&&typeof dict.values==='function'?dict.values():[];\nconst n=table.length;\nconst cmp=valueComparator(locale);\nconst order=new Array(n);\nfor(let i=0;i<n;i++)order[i]=i;\norder.sort((a,b)=>cmp(table[a],table[b])||a-b);\nconst ranks=new Uint32Array(n);\nfor(let r=0;r<n;r++)ranks[order[r]]=r;\nreturn ranks;\n}\nfunction isMissing(v){\nreturn v===null||v===undefined||(typeof v==='number'&&Number.isNaN(v));\n}\n});\n__def(\"packages/core/src/compute/sort.js\",function(__exports,__req){\n'use strict';\nObject.defineProperty(__exports,\"radixSortFloat64\",{enumerable:true,get:function(){return radixSortFloat64;}});\nObject.defineProperty(__exports,\"radixSortInt32\",{enumerable:true,get:function(){return radixSortInt32;}});\nObject.defineProperty(__exports,\"rankSortDictionary\",{enumerable:true,get:function(){return rankSortDictionary;}});\nObject.defineProperty(__exports,\"mergeSortComparator\",{enumerable:true,get:function(){return mergeSortComparator;}});\nObject.defineProperty(__exports,\"sortColumn\",{enumerable:true,get:function(){return sortColumn;}});\nObject.defineProperty(__exports,\"sortMulti\",{enumerable:true,get:function(){return sortMulti;}});\nconst __m0=__req(\"packages/core/src/compute/handle.js\");\nconst bitReader=__m0[\"bitReader\"];\nconst dictRanks=__m0[\"dictRanks\"];\nconst dictSize=__m0[\"dictSize\"];\nconst identity=__m0[\"identity\"];\nconst isMissing=__m0[\"isMissing\"];\nconst presenceReader=__m0[\"presenceReader\"];\nconst rowCount=__m0[\"rowCount\"];\nconst valueComparator=__m0[\"valueComparator\"];\nconst valueReader=__m0[\"valueReader\"];\nconst EMPTY_INDICES=new Uint32Array(0);\nconst SCRATCH=new ArrayBuffer(8);\nconst SCRATCH_F64=new Float64Array(SCRATCH);\nconst SCRATCH_U32=new Uint32Array(SCRATCH);\nconst HI=(()=>{\nSCRATCH_F64[0]=-1;\nreturn(SCRATCH_U32[1]&0x80000000)!==0?1:0;\n})();\nconst LO=HI===1?0:1;\nfunction transformDouble(value,out){\nSCRATCH_F64[0]=value;\nlet hi=SCRATCH_U32[HI];\nlet lo=SCRATCH_U32[LO];\nif((hi&0x80000000)!==0){\nhi=~hi>>>0;\nlo=~lo>>>0;\n}else{\nhi=(hi^0x80000000)>>>0;\n}\nout[0]=lo;\nout[1]=hi;\n}\nfunction radixLsd64(idx,lo,hi,n){\nif(n<2)return idx;\nconst hist=new Uint32Array(256*8);\nfor(let i=0;i<n;i++){\nconst l=lo[i];\nconst h=hi[i];\nhist[l&0xff]++;\nhist[256+((l>>>8)&0xff)]++;\nhist[512+((l>>>16)&0xff)]++;\nhist[768+((l>>>24)&0xff)]++;\nhist[1024+(h&0xff)]++;\nhist[1280+((h>>>8)&0xff)]++;\nhist[1536+((h>>>16)&0xff)]++;\nhist[1792+((h>>>24)&0xff)]++;\n}\nlet srcIdx=idx;\nlet srcLo=lo;\nlet srcHi=hi;\nlet dstIdx=new Uint32Array(n);\nlet dstLo=new Uint32Array(n);\nlet dstHi=new Uint32Array(n);\nconst offset=new Uint32Array(256);\nfor(let pass=0;pass<8;pass++){\nconst base=pass<<8;\nconst shift=(pass&3)<<3;\nconst useHi=pass>=4;\nlet skip=false;\nfor(let b=0;b<256;b++){\nif(hist[base+b]===n){skip=true;break;}\n}\nif(skip)continue;\nlet sum=0;\nfor(let b=0;b<256;b++){\noffset[b]=sum;\nsum+=hist[base+b];\n}\nfor(let i=0;i<n;i++){\nconst l=srcLo[i];\nconst h=srcHi[i];\nconst digit=((useHi?h:l)>>>shift)&0xff;\nconst p=offset[digit]++;\ndstIdx[p]=srcIdx[i];\ndstLo[p]=l;\ndstHi[p]=h;\n}\nlet t=srcIdx;srcIdx=dstIdx;dstIdx=t;\nt=srcLo;srcLo=dstLo;dstLo=t;\nt=srcHi;srcHi=dstHi;dstHi=t;\n}\nreturn srcIdx;\n}\nfunction radixLsd32(idx,keys,n){\nif(n<2)return idx;\nconst hist=new Uint32Array(256*4);\nfor(let i=0;i<n;i++){\nconst k=keys[i];\nhist[k&0xff]++;\nhist[256+((k>>>8)&0xff)]++;\nhist[512+((k>>>16)&0xff)]++;\nhist[768+((k>>>24)&0xff)]++;\n}\nlet srcIdx=idx;\nlet srcKeys=keys;\nlet dstIdx=new Uint32Array(n);\nlet dstKeys=new Uint32Array(n);\nconst offset=new Uint32Array(256);\nfor(let pass=0;pass<4;pass++){\nconst base=pass<<8;\nconst shift=pass<<3;\nlet skip=false;\nfor(let b=0;b<256;b++){\nif(hist[base+b]===n){skip=true;break;}\n}\nif(skip)continue;\nlet sum=0;\nfor(let b=0;b<256;b++){\noffset[b]=sum;\nsum+=hist[base+b];\n}\nfor(let i=0;i<n;i++){\nconst k=srcKeys[i];\nconst p=offset[(k>>>shift)&0xff]++;\ndstIdx[p]=srcIdx[i];\ndstKeys[p]=k;\n}\nlet t=srcIdx;srcIdx=dstIdx;dstIdx=t;\nt=srcKeys;srcKeys=dstKeys;dstKeys=t;\n}\nreturn srcIdx;\n}\nfunction countingSort(idx,keys,n,radix){\nconst counts=new Uint32Array(radix+1);\nfor(let i=0;i<n;i++)counts[keys[i]]++;\nlet sum=0;\nfor(let k=0;k<=radix;k++){\nconst c=counts[k];\ncounts[k]=sum;\nsum+=c;\n}\nconst out=new Uint32Array(n);\nfor(let i=0;i<n;i++)out[counts[keys[i]]++]=idx[i];\nreturn out;\n}\nfunction sortUint32Keys(idx,keys,n,radix){\nif(n<2)return idx;\nif(radix<=65536||radix<=n*2)return countingSort(idx,keys,n,radix);\nreturn radixLsd32(idx,keys,n);\n}\nfunction exact(buffer,n){\nif(buffer.length===n&&buffer.byteOffset===0)return buffer;\nreturn Uint32Array.prototype.slice.call(buffer,0,n);\n}\nfunction radixSortFloat64(values,order,descending=false){\nconst src=order||identity(values.length);\nconst n=src.length;\nif(n<2)return Uint32Array.from(src);\nconst idx=new Uint32Array(n);\nconst lo=new Uint32Array(n);\nconst hi=new Uint32Array(n);\nconst nans=new Uint32Array(n);\nconst pair=new Uint32Array(2);\nlet m=0;\nlet nanCount=0;\nfor(let i=0;i<n;i++){\nconst row=src[i];\nconst v=values[row];\nif(Number.isNaN(v)){nans[nanCount++]=row;continue;}\ntransformDouble(v,pair);\nif(descending){\nlo[m]=~pair[0]>>>0;\nhi[m]=~pair[1]>>>0;\n}else{\nlo[m]=pair[0];\nhi[m]=pair[1];\n}\nidx[m++]=row;\n}\nconst sorted=radixLsd64(idx.subarray(0,m),lo.subarray(0,m),hi.subarray(0,m),m);\nif(nanCount===0)return exact(sorted,m);\nconst out=new Uint32Array(n);\nout.set(sorted.subarray(0,m),0);\nout.set(nans.subarray(0,nanCount),m);\nreturn out;\n}\nfunction radixSortInt32(values,order,descending=false){\nconst src=order||identity(values.length);\nconst n=src.length;\nif(n<2)return Uint32Array.from(src);\nconst idx=Uint32Array.from(src);\nconst keys=new Uint32Array(n);\nfor(let i=0;i<n;i++){\nconst k=(values[idx[i]]^0x80000000)>>>0;\nkeys[i]=descending?(~k>>>0):k;\n}\nreturn exact(radixLsd32(idx,keys,n),n);\n}\nfunction rankSortDictionary(handle,order,opts={}){\nconst src=order||identity(rowCount(handle,opts));\nconst n=src.length;\nif(n<2)return Uint32Array.from(src);\nconst ranks=dictRanks(handle.dict,opts.locale);\nconst codes=handle.values;\nconst present=presenceReader(handle);\nconst size=Math.max(dictSize(handle.dict),ranks.length);\nconst absentRank=size;\nconst idx=Uint32Array.from(src);\nconst keys=new Uint32Array(n);\nconst descending=!!opts.descending;\nfor(let i=0;i<n;i++){\nconst row=idx[i];\nlet rank=present&&present(row)===0?absentRank:ranks[codes[row]];\nif(rank===undefined)rank=absentRank;\nkeys[i]=descending?absentRank-rank:rank;\n}\nreturn exact(sortUint32Keys(idx,keys,n,size+1),n);\n}\nfunction mergeSortComparator(values,order,compare){\nconst n=order.length;\nlet src=Uint32Array.from(order);\nif(n<2)return src;\nlet dst=new Uint32Array(n);\nfor(let width=1;width<n;width<<=1){\nfor(let start=0;start<n;start+=width<<1){\nconst mid=Math.min(start+width,n);\nconst end=Math.min(start+(width<<1),n);\nlet i=start;\nlet j=mid;\nlet k=start;\nwhile(i<mid&&j<end){\ndst[k++]=compare(values[src[i]],values[src[j]])<=0?src[i++]:src[j++];\n}\nwhile(i<mid)dst[k++]=src[i++];\nwhile(j<end)dst[k++]=src[j++];\n}\nconst t=src;src=dst;dst=t;\n}\nreturn src;\n}\nfunction sortBitsetColumn(handle,idx,descending){\nconst bit=bitReader(handle.values);\nconst n=idx.length;\nconst out=new Uint32Array(n);\nconst first=descending?1:0;\nlet k=0;\nfor(let i=0;i<n;i++)if(bit(idx[i])===first)out[k++]=idx[i];\nfor(let i=0;i<n;i++)if(bit(idx[i])!==first)out[k++]=idx[i];\nreturn out;\n}\nfunction indexableValues(handle,idx){\nconst values=handle.values;\nconst kind=handle.kind;\nconst direct=(kind==='object'||kind===undefined)&&(Array.isArray(values)||ArrayBuffer.isView(values));\nif(direct&&!handle.presence)return values;\nconst reader=valueReader(handle);\nconst materialised=new Array(rowCount(handle)||0);\nfor(let i=0;i<idx.length;i++){\nconst row=idx[i];\nmaterialised[row]=reader(row);\n}\nreturn materialised;\n}\nfunction sortByComparator(handle,idx,opts){\nconst values=indexableValues(handle,idx);\nconst base=valueComparator(opts.locale);\nconst compare=opts.descending?(a,b)=>base(b,a):base;\nreturn mergeSortComparator(values,idx,compare);\n}\nfunction sortByCompare(handle,idx,opts){\nconst values=indexableValues(handle,idx);\nconst user=opts.compare;\nconst descending=!!opts.descending;\nconst compare=descending\n?(a,b)=>-user(a,b,undefined,undefined,true)\n:(a,b)=>user(a,b,undefined,undefined,false);\nreturn mergeSortComparator(values,idx,compare);\n}\nfunction partitionPresent(handle,idx){\nconst n=idx.length;\nconst present=presenceReader(handle);\nconst values=handle.values;\nconst checkNaN=handle.kind==='float64'&&!!values;\nconst looseKind=handle.kind==='object'||handle.kind==='multi'||handle.kind===undefined;\nif(!present&&!checkNaN&&!looseKind)return{present:idx,absent:EMPTY_INDICES};\nconst keep=new Uint32Array(n);\nconst drop=new Uint32Array(n);\nlet p=0;\nlet a=0;\nif(present&&checkNaN){\nfor(let i=0;i<n;i++){\nconst row=idx[i];\nif(present(row)===1&&!Number.isNaN(values[row]))keep[p++]=row;else drop[a++]=row;\n}\n}else if(checkNaN&&!present){\nfor(let i=0;i<n;i++){\nconst row=idx[i];\nif(!Number.isNaN(values[row]))keep[p++]=row;else drop[a++]=row;\n}\n}else if(present&&!looseKind){\nfor(let i=0;i<n;i++){\nconst row=idx[i];\nif(present(row)===1)keep[p++]=row;else drop[a++]=row;\n}\n}else{\nconst reader=valueReader(handle);\nfor(let i=0;i<n;i++){\nconst row=idx[i];\nif(!isMissing(reader(row)))keep[p++]=row;else drop[a++]=row;\n}\n}\nif(a===0)return{present:idx,absent:EMPTY_INDICES};\nreturn{present:keep.subarray(0,p),absent:drop.subarray(0,a)};\n}\nfunction joinRuns(sorted,absent,nullsFirst){\nif(absent.length===0)return sorted;\nconst out=new Uint32Array(sorted.length+absent.length);\nif(nullsFirst){\nout.set(absent,0);\nout.set(sorted,absent.length);\n}else{\nout.set(sorted,0);\nout.set(absent,sorted.length);\n}\nreturn out;\n}\nfunction sortColumn(handle,order,opts={}){\nconst src=order||identity(rowCount(handle,opts));\nif(!handle||src.length<2)return Uint32Array.from(src);\nconst{present,absent}=partitionPresent(handle,src);\nif(present.length===0)return Uint32Array.from(src);\nconst descending=!!opts.descending;\nlet sorted;\nif(typeof opts.compare==='function'){\nsorted=sortByCompare(handle,present,opts);\n}else{\nswitch(handle.kind){\ncase'float64':\nsorted=radixSortFloat64(handle.values,present,descending);\nbreak;\ncase'int32':\nsorted=radixSortInt32(handle.values,present,descending);\nbreak;\ncase'dictionary':\nsorted=rankSortDictionary(handle,present,opts);\nbreak;\ncase'bitset':\nsorted=sortBitsetColumn(handle,present,descending);\nbreak;\ndefault:\nsorted=sortByComparator(handle,present,opts);\nbreak;\n}\n}\nreturn joinRuns(sorted,absent,!!opts.nullsFirst);\n}\nfunction sortMulti(handles,entries,order,opts={}){\nconst list=entries||[];\nconst first=(list.length&&(list[0].handle||byId(handles,list[0].col)))||(handles&&handles[0]);\nlet current=order||identity(rowCount(first,opts));\nfor(let i=list.length-1;i>=0;i--){\nconst entry=list[i];\nconst handle=entry.handle||byId(handles,entry.col)||(handles&&handles[i]);\nif(!handle)continue;\ncurrent=sortColumn(handle,current,{\ndescending:entry.descending!==undefined?!!entry.descending:entry.dir==='desc',\nnullsFirst:!!entry.nullsFirst,\nlocale:entry.locale!==undefined?entry.locale:opts.locale,\ncompare:entry.compare,\n});\n}\nreturn current instanceof Uint32Array?current:Uint32Array.from(current);\n}\nfunction byId(handles,id){\nif(!handles||id===undefined)return undefined;\nfor(let i=0;i<handles.length;i++)if(handles[i]&&handles[i].id===id)return handles[i];\nreturn undefined;\n}\n});\n__def(\"packages/core/src/format/date.js\",function(__exports,__req){\n'use strict';\nObject.defineProperty(__exports,\"scanPattern\",{enumerable:true,get:function(){return scanPattern;}});\nObject.defineProperty(__exports,\"toDate\",{enumerable:true,get:function(){return toDate;}});\nObject.defineProperty(__exports,\"compilePattern\",{enumerable:true,get:function(){return compilePattern;}});\nObject.defineProperty(__exports,\"compileDate\",{enumerable:true,get:function(){return compileDate;}});\nObject.defineProperty(__exports,\"toIsoDate\",{enumerable:true,get:function(){return toIsoDate;}});\nObject.defineProperty(__exports,\"toIsoDateTime\",{enumerable:true,get:function(){return toIsoDateTime;}});\nObject.defineProperty(__exports,\"compareIso\",{enumerable:true,get:function(){return compareIso;}});\nconst __m0=__req(\"packages/core/src/internal/util.js\");\nconst isNil=__m0[\"isNil\"];\nconst warnOnce=__m0[\"warnOnce\"];\nconst TOKENS=[\n'yyyy','yy','MMMM','MMM','MM','M','dd','d',\n'EEEE','EEE','HH','H','hh','h','mm','m','ss','s','SSS','a',\n];\nfunction scanPattern(pattern){\nconst out=[];\nlet i=0;\nlet literal='';\nconst flush=()=>{if(literal){out.push({token:null,text:literal});literal='';}};\nwhile(i<pattern.length){\nconst ch=pattern[i];\nif(ch===\"'\"){\nif(pattern[i+1]===\"'\"){literal+=\"'\";i+=2;continue;}\nconst end=pattern.indexOf(\"'\",i+1);\nif(end===-1){literal+=pattern.slice(i+1);i=pattern.length;continue;}\nliteral+=pattern.slice(i+1,end);\ni=end+1;\ncontinue;\n}\nconst token=TOKENS.find((t)=>pattern.startsWith(t,i));\nif(token){flush();out.push({token,text:token});i+=token.length;continue;}\nif(/[A-Za-z]/.test(ch)){\nwarnOnce(\n`date.pattern.token:${ch}`,\n`the date pattern \"${pattern}\" contains '${ch}', which is not a supported token, `\n+'so it is rendered as text. Quote it as a literal to silence this. '\n+`Supported: ${TOKENS.join(' ')}.`,\n);\n}\nliteral+=ch;\ni+=1;\n}\nflush();\nreturn out;\n}\nconst WALL_CLOCK=/^(\\d{4})-(\\d{2})-(\\d{2})(?:[T ](\\d{2}):(\\d{2})(?::(\\d{2}))?(?:\\.\\d+)?)?$/;\nfunction toDate(value){\nif(isNil(value)||value==='')return null;\nif(value instanceof Date)return Number.isNaN(value.getTime())?null:value;\nif(typeof value==='number')return Number.isNaN(value)?null:new Date(value);\nif(typeof value==='string'){\nconst wall=WALL_CLOCK.exec(value.trim());\nif(wall){\nconst[,y,mo,d,h='0',mi='0',sec='0']=wall;\nreturn new Date(+y,+mo-1,+d,+h,+mi,+sec);\n}\nconst d=new Date(value);\nreturn Number.isNaN(d.getTime())?null:d;\n}\nreturn null;\n}\nfunction pad(n,w){return String(n).padStart(w,'0');}\nfunction fieldReader(timeZone){\nif(!timeZone){\nreturn(d)=>({\nyear:d.getFullYear(),month:d.getMonth()+1,day:d.getDate(),\nhour:d.getHours(),minute:d.getMinutes(),second:d.getSeconds(),\nms:d.getMilliseconds(),weekday:d.getDay(),\n});\n}\nconst zoned=new Intl.DateTimeFormat('en-US',{\ntimeZone,year:'numeric',month:'2-digit',day:'2-digit',\nhour:'2-digit',minute:'2-digit',second:'2-digit',hour12:false,weekday:'short',\n});\nconst days={Sun:0,Mon:1,Tue:2,Wed:3,Thu:4,Fri:5,Sat:6};\nreturn(d)=>{\nconst f={year:0,month:1,day:1,hour:0,minute:0,second:0,ms:d.getMilliseconds(),weekday:0};\nfor(const part of zoned.formatToParts(d)){\nswitch(part.type){\ncase'year':f.year=Number(part.value);break;\ncase'month':f.month=Number(part.value);break;\ncase'day':f.day=Number(part.value);break;\ncase'hour':f.hour=Number(part.value)%24;break;\ncase'minute':f.minute=Number(part.value);break;\ncase'second':f.second=Number(part.value);break;\ncase'weekday':f.weekday=days[part.value]??0;break;\ndefault:break;\n}\n}\nreturn f;\n};\n}\nfunction compilePattern(pattern,locale,timeZone){\nconst segments=scanPattern(pattern);\nconst read=fieldReader(timeZone);\nconst used=new Set(segments.filter((s)=>s.token).map((s)=>s.token));\nconst monthShort=used.has('MMM')?new Intl.DateTimeFormat(locale,{month:'short',timeZone}):null;\nconst monthLong=used.has('MMMM')?new Intl.DateTimeFormat(locale,{month:'long',timeZone}):null;\nconst dayShort=used.has('EEE')?new Intl.DateTimeFormat(locale,{weekday:'short',timeZone}):null;\nconst dayLong=used.has('EEEE')?new Intl.DateTimeFormat(locale,{weekday:'long',timeZone}):null;\nreturn(d)=>{\nconst f=read(d);\nlet out='';\nfor(const seg of segments){\nif(!seg.token){out+=seg.text;continue;}\nswitch(seg.token){\ncase'yyyy':out+=pad(f.year,4);break;\ncase'yy':out+=pad(f.year%100,2);break;\ncase'MMMM':out+=monthLong.format(d);break;\ncase'MMM':out+=monthShort.format(d);break;\ncase'MM':out+=pad(f.month,2);break;\ncase'M':out+=String(f.month);break;\ncase'dd':out+=pad(f.day,2);break;\ncase'd':out+=String(f.day);break;\ncase'EEEE':out+=dayLong.format(d);break;\ncase'EEE':out+=dayShort.format(d);break;\ncase'HH':out+=pad(f.hour,2);break;\ncase'H':out+=String(f.hour);break;\ncase'hh':out+=pad(f.hour%12===0?12:f.hour%12,2);break;\ncase'h':out+=String(f.hour%12===0?12:f.hour%12);break;\ncase'mm':out+=pad(f.minute,2);break;\ncase'm':out+=String(f.minute);break;\ncase'ss':out+=pad(f.second,2);break;\ncase's':out+=String(f.second);break;\ncase'SSS':out+=pad(f.ms,3);break;\ncase'a':out+=f.hour<12?'AM':'PM';break;\ndefault:out+=seg.text;break;\n}\n}\nreturn out;\n};\n}\nconst UNITS=[\n['year',365*24*3600e3],\n['month',30*24*3600e3],\n['week',7*24*3600e3],\n['day',24*3600e3],\n['hour',3600e3],\n['minute',60e3],\n['second',1e3],\n];\nfunction compileDate(spec,locale){\nconst s=spec||{};\nconst loc=s.locale||locale||undefined;\nconst nullDisplay=s.nullDisplay??'';\nconst timeZone=s.timeZone;\nlet absolute;\nif(s.pattern){\nabsolute=compilePattern(s.pattern,loc,timeZone);\n}else if(s.dateStyle||s.timeStyle){\nconst opts={timeZone};\nif(s.dateStyle)opts.dateStyle=s.dateStyle;\nif(s.timeStyle)opts.timeStyle=s.timeStyle;\nconst dtf=new Intl.DateTimeFormat(loc,opts);\nabsolute=(d)=>dtf.format(d);\n}else{\nconst dtf=new Intl.DateTimeFormat(loc,{dateStyle:'medium',timeZone});\nabsolute=(d)=>dtf.format(d);\n}\nconst relative=s.relative?new Intl.RelativeTimeFormat(loc,{numeric:'auto'}):null;\nconst thresholdDays=typeof s.relative==='object'&&s.relative\n?(s.relative.threshold??7)\n:7;\nconst thresholdMs=thresholdDays*24*3600e3;\nconst format=(value,params)=>{\nconst d=toDate(value);\nif(!d)return nullDisplay;\nif(relative){\nconst now=params&&typeof params.now==='number'?params.now:Date.now();\nconst delta=d.getTime()-now;\nif(Math.abs(delta)<thresholdMs){\nfor(const[unit,ms]of UNITS){\nif(Math.abs(delta)>=ms||unit==='second'){\nreturn relative.format(Math.round(delta/ms),unit);\n}\n}\n}\n}\nreturn absolute(d);\n};\nformat.spec=s;\nreturn format;\n}\nfunction toIsoDate(value){\nif(isNil(value)||value==='')return null;\nif(typeof value==='string'){\nconst match=/^(\\d{4}-\\d{2}-\\d{2})/.exec(value.trim());\nif(match)return match[1];\nconst parsed=toDate(value);\nreturn parsed?toIsoDate(parsed):null;\n}\nconst date=toDate(value);\nif(!date)return null;\nconst pad=(n)=>String(n).padStart(2,'0');\nreturn`${date.getFullYear()}-${pad(date.getMonth()+1)}-${pad(date.getDate())}`;\n}\nfunction toIsoDateTime(value,timeZone){\nif(isNil(value)||value==='')return null;\nif(typeof value==='string'){\nconst text=value.trim();\nif(ZONE_SUFFIX.test(text)){\nconst instant=toDate(text);\nreturn instant?wallClockIn(instant,timeZone):null;\n}\nconst match=/^(\\d{4}-\\d{2}-\\d{2})[T ](\\d{2}):(\\d{2})(?::(\\d{2}))?/.exec(text);\nif(match){\nconst[,day,hour,minute,second]=match;\nreturn`${day}T${hour}:${minute}${second&&second!=='00'?`:${second}`:''}`;\n}\nif(/^\\d{4}-\\d{2}-\\d{2}$/.test(text))return`${text}T00:00`;\nconst parsed=toDate(text);\nreturn parsed?toIsoDateTime(parsed):null;\n}\nconst date=toDate(value);\nif(!date)return null;\nreturn wallClockIn(date,timeZone);\n}\nconst ZONE_SUFFIX=/(?:Z|[+-]\\d{2}:?\\d{2})$/i;\nfunction wallClockIn(date,timeZone){\nconst pad=(n)=>String(n).padStart(2,'0');\nif(timeZone){\ntry{\nconst parts=new Intl.DateTimeFormat('en-CA',{\ntimeZone,\nyear:'numeric',month:'2-digit',day:'2-digit',\nhour:'2-digit',minute:'2-digit',second:'2-digit',\nhour12:false,\n}).formatToParts(date).reduce((out,part)=>{\nif(part.type!=='literal')out[part.type]=part.value;\nreturn out;\n},{});\nconst hour=parts.hour==='24'?'00':parts.hour;\nconst seconds=Number(parts.second);\nreturn`${parts.year}-${parts.month}-${parts.day}T${hour}:${parts.minute}`\n+(seconds?`:${parts.second}`:'');\n}catch{\n}\n}\nconst day=`${date.getFullYear()}-${pad(date.getMonth()+1)}-${pad(date.getDate())}`;\nconst seconds=date.getSeconds();\nconst clock=`${pad(date.getHours())}:${pad(date.getMinutes())}${seconds?`:${pad(seconds)}`:''}`;\nreturn`${day}T${clock}`;\n}\nfunction compareIso(a,b){\nconst left=isNil(a)||a===''?null:String(a);\nconst right=isNil(b)||b===''?null:String(b);\nif(left===null)return right===null?0:1;\nif(right===null)return-1;\nreturn left<right?-1:left>right?1:0;\n}\n});\n__def(\"packages/core/src/compute/filter.js\",function(__exports,__req){\n'use strict';\nObject.defineProperty(__exports,\"releaseMask\",{enumerable:true,get:function(){return releaseMask;}});\nObject.defineProperty(__exports,\"compilePredicate\",{enumerable:true,get:function(){return compilePredicate;}});\nObject.defineProperty(__exports,\"testValue\",{enumerable:true,get:function(){return testValue;}});\nObject.defineProperty(__exports,\"evaluateCondition\",{enumerable:true,get:function(){return evaluateCondition;}});\nObject.defineProperty(__exports,\"evaluateFilters\",{enumerable:true,get:function(){return evaluateFilters;}});\nObject.defineProperty(__exports,\"pruneColumn\",{enumerable:true,get:function(){return pruneColumn;}});\nObject.defineProperty(__exports,\"mentionsColumn\",{enumerable:true,get:function(){return mentionsColumn;}});\nObject.defineProperty(__exports,\"compact\",{enumerable:true,get:function(){return compact;}});\nconst __m0=__req(\"packages/core/src/internal/util.js\");\nconst isBlank=__m0[\"isBlank\"];\nconst toArray=__m0[\"toArray\"];\nconst warnOnce=__m0[\"warnOnce\"];\nconst __m1=__req(\"packages/core/src/format/date.js\");\nconst toIsoDate=__m1[\"toIsoDate\"];\nconst __m2=__req(\"packages/core/src/compute/handle.js\");\nconst bitReader=__m2[\"bitReader\"];\nconst dictSize=__m2[\"dictSize\"];\nconst dictValue=__m2[\"dictValue\"];\nconst presenceReader=__m2[\"presenceReader\"];\nconst valueComparator=__m2[\"valueComparator\"];\nconst valueReader=__m2[\"valueReader\"];\nconst ISO_DAY=/^\\d{4}-\\d{2}-\\d{2}$/;\nconst NULL_KEY='\\u0000null\\u0000';\nfunction acquireMask(ctx,n){\nconst pool=ctx&&ctx.pool;\nif(pool){\nconst take=pool.mask||pool.acquireMask||pool.acquire||pool.take;\nif(typeof take==='function'){\nconst mask=take.call(pool,n);\nif(mask&&mask.length>=n)return mask;\n}\n}\nreturn new Uint8Array(n);\n}\nfunction releaseMask(ctx,mask){\nconst pool=ctx&&ctx.pool;\nif(!pool||!mask)return;\nconst give=pool.release||pool.releaseMask||pool.free||pool.recycle;\nif(typeof give==='function')give.call(pool,mask);\n}\nfunction fillMask(mask,n,value){\nmask.fill(value,0,n);\nreturn mask;\n}\nfunction unorderable(v){\nreturn v===null||v===undefined||(typeof v==='number'&&Number.isNaN(v));\n}\nfunction coerceTarget(value,type){\nif(value===null||value===undefined)return value;\nif(type==='number')return typeof value==='number'?value:Number(value);\nif(type==='date'||type==='dateString'){\nconst iso=toIsoDate(value);\nreturn iso===null?toMillis(value):iso;\n}\nif(type==='boolean'){\nif(typeof value==='boolean')return value;\nif(value==='true'||value===1)return true;\nif(value==='false'||value===0)return false;\nreturn!!value;\n}\nreturn value;\n}\nfunction toMillis(value){\nif(value instanceof Date)return value.getTime();\nif(typeof value==='number')return value;\nreturn Date.parse(String(value));\n}\nfunction toNumber(value){\nif(typeof value==='number')return value;\nif(value instanceof Date)return value.getTime();\nif(value===null||value===undefined||value==='')return NaN;\nreturn Number(value);\n}\nfunction textOf(v,caseSensitive){\nconst s=typeof v==='string'?v:String(v);\nreturn caseSensitive?s:s.toLowerCase();\n}\nfunction setKey(v,caseSensitive){\nif(v===null||v===undefined)return NULL_KEY;\nif(typeof v==='string')return caseSensitive?v:v.toLowerCase();\nif(v instanceof Date)return v.getTime();\nreturn v;\n}\nfunction buildSet(value,caseSensitive,type){\nconst set=new Set();\nfor(const raw of toArray(value)){\nconst entry=coerceTarget(raw,type);\nset.add(setKey(entry,caseSensitive));\nif(typeof entry==='string'&&entry!==''&&Number.isFinite(Number(entry)))set.add(Number(entry));\nelse if(typeof entry==='number'&&Number.isFinite(entry))set.add(setKey(String(entry),caseSensitive));\n}\nreturn set;\n}\nfunction valueEquals(a,b,caseSensitive){\nif(a===null||a===undefined||b===null||b===undefined){\nreturn(a===null||a===undefined)&&(b===null||b===undefined);\n}\nconst ta=typeof a;\nconst tb=typeof b;\nif(ta==='string'&&tb==='string')return caseSensitive?a===b:a.toLowerCase()===b.toLowerCase();\nif(a instanceof Date||b instanceof Date)return toMillis(a)===toMillis(b);\nif(ta==='number'&&tb==='number')return a===b||(Number.isNaN(a)&&Number.isNaN(b));\nif(ta==='number'&&tb==='string')return a===Number(b);\nif(ta==='string'&&tb==='number')return Number(a)===b;\nif(ta==='boolean'||tb==='boolean')return a===b;\nif(Array.isArray(a)&&Array.isArray(b)){\nreturn a.length===b.length&&a.every((x,i)=>valueEquals(x,b[i],caseSensitive));\n}\nreturn a===b;\n}\nfunction compileRegExp(value,caseSensitive){\ntry{\nif(value instanceof RegExp){\nconst flags=value.flags.replace(/[gy]/g,'');\nreturn new RegExp(value.source,caseSensitive?flags:flags.includes('i')?flags:`${flags}i`);\n}\nreturn new RegExp(String(value),caseSensitive?'':'i');\n}catch(err){\nwarnOnce(`regex:${String(value)}`,`filter operator \"matches\" received an invalid pattern: ${String(value)}`,err);\nreturn null;\n}\n}\nfunction compilePredicate(condition,locale){\nconst predicate=compileValuePredicate(condition,locale);\nconst type=condition&&condition.type;\nif(type!=='date'&&type!=='dateString')return predicate;\nreturn(v)=>predicate(typeof v==='string'&&ISO_DAY.test(v)?v:(toIsoDate(v)??v));\n}\nfunction compileValuePredicate(condition,locale){\nconst op=condition&&condition.op;\nconst caseSensitive=!!(condition&&condition.caseSensitive);\nconst type=condition&&condition.type;\nconst cmp=valueComparator(locale);\nconst not=(p)=>(v)=>!p(v);\nswitch(op){\ncase'eq':{\nconst target=coerceTarget(condition.value,type);\nreturn(v)=>valueEquals(v,target,caseSensitive);\n}\ncase'ne':{\nconst target=coerceTarget(condition.value,type);\nreturn(v)=>!valueEquals(v,target,caseSensitive);\n}\ncase'lt':case'lte':case'gt':case'gte':{\nconst target=coerceTarget(condition.value,type);\nif(unorderable(target))return()=>false;\nconst want=op==='lt'?-1:op==='lte'?0:op==='gt'?1:2;\nreturn(v)=>{\nif(unorderable(v))return false;\nconst c=cmp(v,target);\nreturn want===-1?c<0:want===0?c<=0:want===1?c>0:c>=0;\n};\n}\ncase'between':case'notBetween':{\nconst pair=toArray(condition.value);\nconst lo=coerceTarget(pair[0],type);\nconst hi=coerceTarget(pair[1],type);\nconst bounds=condition.bounds||'[]';\nconst loInclusive=bounds.charAt(0)!=='(';\nconst hiInclusive=bounds.charAt(1)!==')';\nif(unorderable(lo)||unorderable(hi))return op==='between'?()=>false:()=>true;\nconst inRange=(v)=>{\nif(unorderable(v))return false;\nconst a=cmp(v,lo);\nconst b=cmp(v,hi);\nreturn(loInclusive?a>=0:a>0)&&(hiInclusive?b<=0:b<0);\n};\nreturn op==='between'?inRange:not(inRange);\n}\ncase'in':case'notIn':{\nconst set=buildSet(condition.value,caseSensitive,type);\nconst member=(v)=>set.has(setKey(v,caseSensitive));\nreturn op==='in'?member:not(member);\n}\ncase'contains':case'notContains':{\nconst needle=textOf(coerceTarget(condition.value,type),caseSensitive);\nconst has=(v)=>(v===null||v===undefined?false:textOf(v,caseSensitive).includes(needle));\nreturn op==='contains'?has:not(has);\n}\ncase'startsWith':{\nconst needle=textOf(coerceTarget(condition.value,type),caseSensitive);\nreturn(v)=>(v===null||v===undefined?false:textOf(v,caseSensitive).startsWith(needle));\n}\ncase'endsWith':{\nconst needle=textOf(coerceTarget(condition.value,type),caseSensitive);\nreturn(v)=>(v===null||v===undefined?false:textOf(v,caseSensitive).endsWith(needle));\n}\ncase'matches':{\nconst re=compileRegExp(condition.value,caseSensitive);\nif(!re)return()=>false;\nreturn(v)=>(v===null||v===undefined?false:re.test(String(v)));\n}\ncase'blank':\nreturn(v)=>isBlank(v)||(Array.isArray(v)&&v.length===0);\ncase'notBlank':\nreturn(v)=>!(isBlank(v)||(Array.isArray(v)&&v.length===0));\ncase'containsAny':case'containsNone':{\nconst set=buildSet(condition.value,caseSensitive,type);\nconst any=(v)=>{\nconst list=v===null||v===undefined?[]:toArray(v);\nfor(let i=0;i<list.length;i++)if(set.has(setKey(list[i],caseSensitive)))return true;\nreturn false;\n};\nreturn op==='containsAny'?any:not(any);\n}\ncase'containsAll':{\nconst wanted=toArray(condition.value).map((x)=>setKey(coerceTarget(x,type),caseSensitive));\nreturn(v)=>{\nconst list=v===null||v===undefined?[]:toArray(v);\nif(wanted.length===0)return true;\nconst have=new Set(list.map((x)=>setKey(x,caseSensitive)));\nfor(let i=0;i<wanted.length;i++)if(!have.has(wanted[i]))return false;\nreturn true;\n};\n}\ndefault:\nwarnOnce(`op:${String(op)}`,`unknown filter operator \"${String(op)}\"; the condition passes every row`);\nreturn()=>true;\n}\n}\nfunction testValue(value,condition,locale){\nreturn compilePredicate(condition,locale)(value);\n}\nfunction presenceCondition(handle,wantPresent,mask,count){\nconst present=presenceReader(handle);\nif(present){\nconst target=wantPresent?1:0;\nfor(let i=0;i<count;i++)mask[i]=present(i)===target?1:0;\nreturn mask;\n}\nconst kind=handle.kind;\nif(kind==='float64'||kind==='int32'||kind==='bitset'){\nreturn fillMask(mask,count,wantPresent?1:0);\n}\nconst read=valueReader(handle);\nfor(let i=0;i<count;i++){\nconst v=read(i);\nconst blank=isBlank(v)||(Array.isArray(v)&&v.length===0);\nmask[i]=blank===wantPresent?0:1;\n}\nreturn mask;\n}\nfunction dictionaryCondition(handle,pred,mask,count){\nconst dict=handle.dict;\nconst size=dictSize(dict);\nconst allowed=new Uint8Array(size);\nfor(let code=0;code<size;code++)allowed[code]=pred(dictValue(dict,code))?1:0;\nconst codes=handle.values;\nconst present=presenceReader(handle);\nif(!present){\nfor(let i=0;i<count;i++)mask[i]=allowed[codes[i]];\nreturn mask;\n}\nconst absentAnswer=pred(null)?1:0;\nfor(let i=0;i<count;i++)mask[i]=present(i)===1?allowed[codes[i]]:absentAnswer;\nreturn mask;\n}\nfunction booleanCondition(handle,pred,mask,count){\nconst bit=bitReader(handle.values);\nconst whenTrue=pred(true)?1:0;\nconst whenFalse=pred(false)?1:0;\nconst present=presenceReader(handle);\nif(!present){\nfor(let i=0;i<count;i++)mask[i]=bit(i)===1?whenTrue:whenFalse;\nreturn mask;\n}\nconst absentAnswer=pred(null)?1:0;\nfor(let i=0;i<count;i++){\nmask[i]=present(i)===0?absentAnswer:(bit(i)===1?whenTrue:whenFalse);\n}\nreturn mask;\n}\nfunction numericCondition(handle,condition,pred,mask,count){\nconst values=handle.values;\nconst type=condition.type;\nconst op=condition.op;\nlet handled=true;\nswitch(op){\ncase'eq':case'ne':{\nconst target=toNumber(coerceTarget(condition.value,type));\nconst wantNaN=typeof condition.value==='number'&&Number.isNaN(condition.value);\nconst invert=op==='ne'?1:0;\nif(wantNaN){\nfor(let i=0;i<count;i++)mask[i]=(Number.isNaN(values[i])?1:0)^invert;\n}else{\nfor(let i=0;i<count;i++)mask[i]=((values[i]===target)?1:0)^invert;\n}\nbreak;\n}\ncase'lt':{\nconst t=toNumber(coerceTarget(condition.value,type));\nfor(let i=0;i<count;i++)mask[i]=values[i]<t?1:0;\nbreak;\n}\ncase'lte':{\nconst t=toNumber(coerceTarget(condition.value,type));\nfor(let i=0;i<count;i++)mask[i]=values[i]<=t?1:0;\nbreak;\n}\ncase'gt':{\nconst t=toNumber(coerceTarget(condition.value,type));\nfor(let i=0;i<count;i++)mask[i]=values[i]>t?1:0;\nbreak;\n}\ncase'gte':{\nconst t=toNumber(coerceTarget(condition.value,type));\nfor(let i=0;i<count;i++)mask[i]=values[i]>=t?1:0;\nbreak;\n}\ncase'between':case'notBetween':{\nconst pair=toArray(condition.value);\nconst lo=toNumber(coerceTarget(pair[0],type));\nconst hi=toNumber(coerceTarget(pair[1],type));\nconst bounds=condition.bounds||'[]';\nconst loInclusive=bounds.charAt(0)!=='(';\nconst hiInclusive=bounds.charAt(1)!==')';\nconst invert=op==='notBetween'?1:0;\nif(loInclusive&&hiInclusive){\nfor(let i=0;i<count;i++)mask[i]=(((values[i]>=lo)&(values[i]<=hi))?1:0)^invert;\n}else if(loInclusive){\nfor(let i=0;i<count;i++)mask[i]=(((values[i]>=lo)&(values[i]<hi))?1:0)^invert;\n}else if(hiInclusive){\nfor(let i=0;i<count;i++)mask[i]=(((values[i]>lo)&(values[i]<=hi))?1:0)^invert;\n}else{\nfor(let i=0;i<count;i++)mask[i]=(((values[i]>lo)&(values[i]<hi))?1:0)^invert;\n}\nbreak;\n}\ncase'in':case'notIn':{\nconst set=new Set();\nfor(const raw of toArray(condition.value)){\nconst n=toNumber(coerceTarget(raw,type));\nif(!Number.isNaN(n))set.add(n);\n}\nconst invert=op==='notIn'?1:0;\nfor(let i=0;i<count;i++)mask[i]=(set.has(values[i])?1:0)^invert;\nbreak;\n}\ndefault:\nhandled=false;\nbreak;\n}\nif(!handled)return false;\nconst present=presenceReader(handle);\nif(present){\nconst absentAnswer=pred(null)?1:0;\nfor(let i=0;i<count;i++)if(present(i)===0)mask[i]=absentAnswer;\n}\nreturn true;\n}\nfunction genericCondition(handle,pred,mask,count){\nconst read=valueReader(handle);\nfor(let i=0;i<count;i++)mask[i]=pred(read(i))?1:0;\nreturn mask;\n}\nfunction evaluateCondition(condition,ctx,out){\nconst count=ctx.count|0;\nconst mask=out||acquireMask(ctx,count);\nif(!condition)return fillMask(mask,count,1);\nconst handle=typeof ctx.handle==='function'?ctx.handle(condition.col):undefined;\nconst custom=typeof ctx.custom==='function'?ctx.custom:null;\nif(!handle){\nif(custom){\nfor(let i=0;i<count;i++)mask[i]=custom(condition,i)?1:0;\nreturn mask;\n}\nwarnOnce(`filter:col:${String(condition.col)}`,\n`filter references unknown column \"${String(condition.col)}\"; the condition passes every row`);\nreturn fillMask(mask,count,1);\n}\nconst op=condition.op;\nif(op==='blank'||op==='notBlank')return presenceCondition(handle,op==='notBlank',mask,count);\nconst pred=compilePredicate(condition,ctx.locale);\nswitch(handle.kind){\ncase'dictionary':\nreturn dictionaryCondition(handle,pred,mask,count);\ncase'bitset':\nreturn booleanCondition(handle,pred,mask,count);\ncase'float64':case'int32':\nif(numericCondition(handle,condition,pred,mask,count))return mask;\nreturn genericCondition(handle,pred,mask,count);\ndefault:\nreturn genericCondition(handle,pred,mask,count);\n}\n}\nfunction evaluateNode(node,ctx,count){\nif(!node)return fillMask(acquireMask(ctx,count),count,1);\nif(Array.isArray(node.conditions)){\nconst children=node.conditions.filter((c)=>c!=null);\nconst op=node.op==='or'?'or':node.op==='not'?'not':'and';\nif(children.length===0)return fillMask(acquireMask(ctx,count),count,1);\nconst acc=evaluateNode(children[0],ctx,count);\nfor(let k=1;k<children.length;k++){\nconst rhs=evaluateNode(children[k],ctx,count);\nif(op==='or')for(let i=0;i<count;i++)acc[i]|=rhs[i];\nelse for(let i=0;i<count;i++)acc[i]&=rhs[i];\nreleaseMask(ctx,rhs);\n}\nif(op==='not')for(let i=0;i<count;i++)acc[i]^=1;\nreturn acc;\n}\nreturn evaluateCondition(node,ctx,acquireMask(ctx,count));\n}\nfunction evaluateFilters(filters,ctx){\nreturn evaluateNode(filters,ctx,ctx.count|0);\n}\nfunction pruneColumn(filters,colId){\nif(!filters||!colId)return filters||null;\nconst node=(filters);\nif(Array.isArray(node.conditions)){\nconst op=node.op==='or'?'or':node.op==='not'?'not':'and';\nif(op!=='and'){\nreturn mentionsColumn(node,colId)?null:filters;\n}\nconst kept=[];\nfor(const child of node.conditions){\nconst pruned=pruneColumn(child,colId);\nif(pruned)kept.push(pruned);\n}\nif(!kept.length)return null;\nreturn{...node,op:'and',conditions:kept};\n}\nreturn node.col===colId?null:filters;\n}\nfunction mentionsColumn(filters,colId){\nif(!filters||typeof filters!=='object')return false;\nconst node=(filters);\nif(node.col===colId)return true;\nif(Array.isArray(node.conditions)){\nfor(const child of node.conditions)if(mentionsColumn(child,colId))return true;\n}\nreturn false;\n}\nfunction compact(mask,count,out){\nif(out&&out.length>=count){\nlet k=0;\nfor(let i=0;i<count;i++)if(mask[i])out[k++]=i;\nreturn out.subarray(0,k);\n}\nlet survivors=0;\nfor(let i=0;i<count;i++)survivors+=mask[i]?1:0;\nconst result=new Uint32Array(survivors);\nlet k=0;\nfor(let i=0;i<count;i++)if(mask[i])result[k++]=i;\nreturn result;\n}\n});\n__def(\"packages/core/src/compute/group.js\",function(__exports,__req){\n'use strict';\nObject.defineProperty(__exports,\"packKeys\",{enumerable:true,get:function(){return packKeys;}});\nObject.defineProperty(__exports,\"groupByColumns\",{enumerable:true,get:function(){return groupByColumns;}});\nconst __m0=__req(\"packages/core/src/compute/handle.js\");\nconst dictSize=__m0[\"dictSize\"];\nconst identity=__m0[\"identity\"];\nconst presenceReader=__m0[\"presenceReader\"];\nconst rowCount=__m0[\"rowCount\"];\nconst valueReader=__m0[\"valueReader\"];\nconst KEY_SEPARATOR='\\u001F';\nconst NULL_MARKER='\\u0000';\nconst MAX_DIRECT_COUNTS=1<<20;\nfunction packKeys(handles,idx,n){\nconst k=handles.length;\nconst readers=handles.map((h)=>valueReader(h));\nconst allDictionary=k>0&&handles.every((h)=>h&&h.kind==='dictionary'&&h.dict);\nif(allDictionary){\nconst cards=handles.map((h)=>dictSize(h.dict)+1);\nlet product=1;\nfor(let j=0;j<k;j++)product*=cards[j];\nif(product<=Number.MAX_SAFE_INTEGER){\nconst codes=handles.map((h)=>h.values);\nconst presence=handles.map((h)=>presenceReader(h));\nconst keyOf=(row)=>{\nlet key=0;\nfor(let j=0;j<k;j++){\nconst present=presence[j];\nconst code=present&&present(row)===0?cards[j]-1:codes[j][row];\nkey=key*cards[j]+code;\n}\nreturn key;\n};\nconst packed=new Float64Array(n);\nfor(let i=0;i<n;i++)packed[i]=keyOf(idx[i]);\nreturn{packed,strings:null,product,readers,keyOf};\n}\n}\nconst keyOf=(row)=>{\nlet key='';\nfor(let j=0;j<k;j++){\nconst v=readers[j](row);\nkey+=(j===0?'':KEY_SEPARATOR)+(v===null||v===undefined?NULL_MARKER:String(v));\n}\nreturn key;\n};\nconst strings=new Array(n);\nfor(let i=0;i<n;i++)strings[i]=keyOf(idx[i]);\nreturn{packed:null,strings,product:Infinity,readers,keyOf};\n}\nfunction scatterBuckets(idx,ids,n,groups){\nconst offsets=new Uint32Array(groups+1);\nfor(let i=0;i<n;i++)offsets[ids[i]+1]++;\nfor(let g=0;g<groups;g++)offsets[g+1]+=offsets[g];\nconst scattered=new Uint32Array(n);\nconst cursor=offsets.slice(0,groups);\nfor(let i=0;i<n;i++)scattered[cursor[ids[i]]++]=idx[i];\nconst buckets=new Array(groups);\nfor(let g=0;g<groups;g++)buckets[g]=scattered.subarray(offsets[g],offsets[g+1]);\nreturn buckets;\n}\nfunction groupByColumns(handles,order,opts={}){\nconst list=handles||[];\nconst idx=order||identity(rowCount(list[0],opts));\nconst n=idx.length;\nif(list.length===0||n===0)return{keys:[],buckets:[]};\nconst{packed,strings,product,readers}=packKeys(list,idx,n);\nconst ids=new Uint32Array(n);\nlet groups=0;\nlet packedKeys=null;\nif(packed&&product<=Math.max(1024,Math.min(MAX_DIRECT_COUNTS,n*4))){\nconst size=product;\nconst seen=new Int32Array(size).fill(-1);\nfor(let i=0;i<n;i++)seen[packed[i]]=0;\nfor(let key=0;key<size;key++)if(seen[key]===0)seen[key]=groups++;\nfor(let i=0;i<n;i++)ids[i]=seen[packed[i]];\npackedKeys=new Float64Array(groups);\nfor(let key=0;key<size;key++)if(seen[key]>=0)packedKeys[seen[key]]=key;\n}else if(packed){\nconst seen=new Map();\nfor(let i=0;i<n;i++){\nconst key=packed[i];\nlet id=seen.get(key);\nif(id===undefined){id=groups++;seen.set(key,id);}\nids[i]=id;\n}\npackedKeys=new Float64Array(groups);\nfor(const[key,id]of seen)packedKeys[id]=key;\n}else{\nconst seen=new Map();\nfor(let i=0;i<n;i++){\nconst key=strings[i];\nlet id=seen.get(key);\nif(id===undefined){id=groups++;seen.set(key,id);}\nids[i]=id;\n}\n}\nconst buckets=scatterBuckets(idx,ids,n,groups);\nconst keys=new Array(groups);\nfor(let g=0;g<groups;g++){\nconst row=buckets[g][0];\nconst tuple=new Array(readers.length);\nfor(let j=0;j<readers.length;j++)tuple[j]=readers[j](row);\nkeys[g]=tuple;\n}\nconst result={keys,buckets};\nif(packedKeys)result.packed=packedKeys;\nreturn result;\n}\n});\n__def(\"packages/core/src/compute/facet.js\",function(__exports,__req){\n'use strict';\nObject.defineProperty(__exports,\"STRATEGIES\",{enumerable:true,get:function(){return STRATEGIES;}});\nObject.defineProperty(__exports,\"GRANULARITIES\",{enumerable:true,get:function(){return GRANULARITIES;}});\nObject.defineProperty(__exports,\"DEFAULT_BUCKETS\",{enumerable:true,get:function(){return DEFAULT_BUCKETS;}});\nObject.defineProperty(__exports,\"DEFAULT_CARDINALITY_LIMIT\",{enumerable:true,get:function(){return DEFAULT_CARDINALITY_LIMIT;}});\nObject.defineProperty(__exports,\"QUANTILE_SAMPLE\",{enumerable:true,get:function(){return QUANTILE_SAMPLE;}});\nObject.defineProperty(__exports,\"facetKind\",{enumerable:true,get:function(){return facetKind;}});\nObject.defineProperty(__exports,\"orderedReader\",{enumerable:true,get:function(){return orderedReader;}});\nObject.defineProperty(__exports,\"toNumeric\",{enumerable:true,get:function(){return toNumeric;}});\nObject.defineProperty(__exports,\"cardinalityOf\",{enumerable:true,get:function(){return cardinalityOf;}});\nObject.defineProperty(__exports,\"pickGranularity\",{enumerable:true,get:function(){return pickGranularity;}});\nObject.defineProperty(__exports,\"floorTo\",{enumerable:true,get:function(){return floorTo;}});\nObject.defineProperty(__exports,\"advance\",{enumerable:true,get:function(){return advance;}});\nObject.defineProperty(__exports,\"computeBounds\",{enumerable:true,get:function(){return computeBounds;}});\nObject.defineProperty(__exports,\"countInto\",{enumerable:true,get:function(){return countInto;}});\nObject.defineProperty(__exports,\"bucketOf\",{enumerable:true,get:function(){return bucketOf;}});\nObject.defineProperty(__exports,\"facet\",{enumerable:true,get:function(){return facet;}});\nObject.defineProperty(__exports,\"default\",{enumerable:true,get:function(){return __default;}});\nconst __m0=__req(\"packages/core/src/compute/handle.js\");\nconst presenceReader=__m0[\"presenceReader\"];\nconst valueReader=__m0[\"valueReader\"];\nconst dictSize=__m0[\"dictSize\"];\nconst dictValue=__m0[\"dictValue\"];\nconst STRATEGIES=Object.freeze(['equal','quantile','log']);\nconst GRANULARITIES=Object.freeze(['hour','day','week','month','quarter','year']);\nconst DEFAULT_BUCKETS=20;\nconst DEFAULT_CARDINALITY_LIMIT=50;\nconst QUANTILE_SAMPLE=10_000;\nfunction facetKind(handle,type){\nif(!handle)return'none';\nconst base=type&&type.base;\nif(base==='date'||base==='datetime'||base==='time'||base==='dateString')return'date';\nswitch(handle.kind){\ncase'bitset':return'boolean';\ncase'float64':case'int32':return'numeric';\ncase'dictionary':return'category';\ncase'multi':return'category';\ndefault:\nif(base==='number')return'numeric';\nif(base==='boolean')return'boolean';\nif(base==='text')return'category';\nreturn'none';\n}\n}\nfunction orderedReader(handle){\nconst values=handle.values;\nconst kind=handle.kind;\nif((kind==='float64'||kind==='int32')&&values)return(i)=>values[i];\nconst read=valueReader(handle);\nreturn(i)=>toNumeric(read(i));\n}\nfunction toNumeric(v){\nif(typeof v==='number')return v;\nif(v instanceof Date)return v.getTime();\nif(v===null||v===undefined||v==='')return NaN;\nif(typeof v==='boolean')return v?1:0;\nif(typeof v==='string'){\nconst n=Number(v);\nif(Number.isFinite(n))return n;\nconst t=Date.parse(v);\nreturn Number.isFinite(t)?t:NaN;\n}\nreturn NaN;\n}\nfunction cardinalityOf(handle,indices,count,limit=DEFAULT_CARDINALITY_LIMIT){\nif(!handle)return{cardinality:0,exact:true};\nif(handle.dict)return{cardinality:dictSize(handle.dict),exact:true};\nif(handle.kind==='bitset')return{cardinality:2,exact:true};\nconst read=valueReader(handle);\nconst n=indices?indices.length:count;\nconst seen=new Set();\nfor(let k=0;k<n;k++){\nconst v=read(indices?indices[k]:k);\nif(v===null||v===undefined)continue;\nseen.add(v);\nif(seen.size>limit)return{cardinality:seen.size,exact:false};\n}\nreturn{cardinality:seen.size,exact:true};\n}\nconst HOUR_MS=3600_000;\nconst DAY_MS=86_400_000;\nfunction pickGranularity(span,target=DEFAULT_BUCKETS){\nconst ms=Number.isFinite(span)&&span>0?span:0;\nconst wide=Math.max(1,target)*2;\nif(ms/HOUR_MS<=wide)return'hour';\nif(ms/DAY_MS<=wide)return'day';\nif(ms/(7*DAY_MS)<=wide)return'week';\nif(ms/(30*DAY_MS)<=wide)return'month';\nif(ms/(91*DAY_MS)<=wide)return'quarter';\nreturn'year';\n}\nfunction floorTo(ms,granularity){\nif(!Number.isFinite(ms))return NaN;\nconst d=new Date(ms);\nswitch(granularity){\ncase'hour':d.setMinutes(0,0,0);return d.getTime();\ncase'day':d.setHours(0,0,0,0);return d.getTime();\ncase'week':{\nd.setHours(0,0,0,0);\nconst back=(d.getDay()+6)%7;\nd.setDate(d.getDate()-back);\nreturn d.getTime();\n}\ncase'month':d.setDate(1);d.setHours(0,0,0,0);return d.getTime();\ncase'quarter':\nd.setMonth(Math.floor(d.getMonth()/3)*3,1);\nd.setHours(0,0,0,0);\nreturn d.getTime();\ndefault:d.setMonth(0,1);d.setHours(0,0,0,0);return d.getTime();\n}\n}\nfunction advance(ms,granularity){\nconst d=new Date(ms);\nswitch(granularity){\ncase'hour':d.setHours(d.getHours()+1);break;\ncase'day':d.setDate(d.getDate()+1);break;\ncase'week':d.setDate(d.getDate()+7);break;\ncase'month':d.setMonth(d.getMonth()+1);break;\ncase'quarter':d.setMonth(d.getMonth()+3);break;\ndefault:d.setFullYear(d.getFullYear()+1);break;\n}\nreturn d.getTime();\n}\nfunction numericExtent(handle,indices,count){\nconst read=orderedReader(handle);\nconst present=presenceReader(handle);\nconst n=indices?indices.length:count;\nlet min=Infinity;\nlet max=-Infinity;\nlet nulls=0;\nlet finite=0;\nfor(let k=0;k<n;k++){\nconst i=indices?indices[k]:k;\nif(present&&!present(i)){nulls++;continue;}\nconst v=read(i);\nif(!Number.isFinite(v)){nulls++;continue;}\nif(v<min)min=v;\nif(v>max)max=v;\nfinite++;\n}\nreturn{min,max,nulls,finite};\n}\nfunction sortedSample(handle,indices,count,cap){\nconst read=orderedReader(handle);\nconst present=presenceReader(handle);\nconst n=indices?indices.length:count;\nconst step=n>cap?n/cap:1;\nconst out=[];\nfor(let s=0;s<n;s+=step){\nconst i=indices?indices[Math.floor(s)]:Math.floor(s);\nif(present&&!present(i))continue;\nconst v=read(i);\nif(Number.isFinite(v))out.push(v);\n}\nconst arr=Float64Array.from(out);\narr.sort();\nreturn arr;\n}\nfunction computeBounds(handle,indices,count,opts={}){\nconst kind=opts.kind||facetKind(handle,opts.type);\nif(kind==='none'||!handle)return{kind:'none',buckets:[],suppressed:'type'};\nif(kind==='boolean')return boundsForBoolean(handle,indices,count);\nif(kind==='category')return boundsForCategory(handle,indices,count,opts);\nreturn boundsForOrdered(handle,indices,count,kind,opts);\n}\nfunction boundsForBoolean(handle,indices,count){\nconst present=presenceReader(handle);\nlet nulls=0;\nif(present){\nconst n=indices?indices.length:count;\nfor(let k=0;k<n;k++)if(!present(indices?indices[k]:k))nulls++;\n}\nconst buckets=[{value:false,label:'false'},{value:true,label:'true'}];\nif(nulls>0)buckets.push({null:true,label:'Empty'});\nreturn{kind:'boolean',buckets};\n}\nfunction boundsForCategory(handle,indices,count,opts){\nconst limit=opts.cardinalityLimit??DEFAULT_CARDINALITY_LIMIT;\nconst{cardinality}=cardinalityOf(handle,indices,count,limit);\nif(cardinality>limit&&(opts.aboveLimit||'suppress')==='suppress'){\nreturn{kind:'category',buckets:[],suppressed:'cardinality',cardinality};\n}\nconst read=valueReader(handle);\nconst n=indices?indices.length:count;\nconst tally=new Map();\nlet nulls=0;\nfor(let k=0;k<n;k++){\nconst v=read(indices?indices[k]:k);\nif(v===null||v===undefined||v===''){nulls++;continue;}\nif(Array.isArray(v)){\nif(!v.length){nulls++;continue;}\nfor(const m of v)tally.set(m,(tally.get(m)||0)+1);\ncontinue;\n}\ntally.set(v,(tally.get(v)||0)+1);\n}\nlet entries=[...tally.entries()];\nif(opts.order==='alpha'){\nentries.sort((a,b)=>String(a[0]).localeCompare(String(b[0])));\n}else{\nentries.sort((a,b)=>b[1]-a[1]);\n}\nlet remainder=0;\nlet dropped=0;\nif(entries.length>limit){\ndropped=entries.length-limit;\nfor(let i=limit;i<entries.length;i++)remainder+=entries[i][1];\nentries=entries.slice(0,limit);\n}\nconst buckets=entries.map(([value])=>({value,label:String(value)}));\nif(remainder>0)buckets.push({remainder:true,label:`Other (${dropped} values)`});\nif(nulls>0)buckets.push({null:true,label:'Empty'});\nreturn{kind:'category',buckets,cardinality};\n}\nfunction boundsForOrdered(handle,indices,count,kind,opts){\nconst{min,max,nulls,finite}=numericExtent(handle,indices,count);\nif(!finite){\nreturn{kind,buckets:nulls?[{null:true,label:'Empty'}]:[],empty:true};\n}\nconst wanted=Math.max(1,Math.floor(opts.buckets||DEFAULT_BUCKETS));\nlet buckets=[];\nif(kind==='date'){\nconst granularity=GRANULARITIES.includes(opts.granularity)\n?opts.granularity:pickGranularity(max-min,wanted);\nlet edge=floorTo(min,granularity);\nwhile(edge<=max&&buckets.length<4096){\nconst next=advance(edge,granularity);\nif(!(next>edge))break;\nbuckets.push({from:edge,to:next});\nedge=next;\n}\nreturn{kind,buckets:withNull(buckets,nulls),granularity};\n}\nconst strategy=STRATEGIES.includes(opts.strategy)?opts.strategy:'equal';\nif(strategy==='quantile'){\nconst sample=sortedSample(handle,indices,count,QUANTILE_SAMPLE);\nif(sample.length){\nconst edges=[sample[0]];\nfor(let b=1;b<wanted;b++){\nconst v=sample[Math.min(sample.length-1,Math.floor((b/wanted)*sample.length))];\nif(v>edges[edges.length-1])edges.push(v);\n}\nedges.push(max);\nfor(let b=0;b<edges.length-1;b++)buckets.push({from:edges[b],to:edges[b+1]});\n}\n}else if(strategy==='log'&&min>0){\nconst lo=Math.log10(min);\nconst hi=Math.log10(max);\nconst step=(hi-lo)/wanted||1;\nfor(let b=0;b<wanted;b++){\nbuckets.push({from:10**(lo+b*step),to:10**(lo+(b+1)*step)});\n}\n}\nif(!buckets.length){\nconst width=(max-min)/wanted||1;\nfor(let b=0;b<wanted;b++)buckets.push({from:min+b*width,to:min+(b+1)*width});\n}\nbuckets[buckets.length-1].to=max;\nreturn{kind,buckets:withNull(buckets,nulls),strategy,min,max};\n}\nfunction withNull(buckets,nulls){\nreturn nulls>0?[...buckets,{null:true,label:'Empty'}]:buckets;\n}\nfunction countInto(handle,indices,count,bounds,out){\nconst buckets=(bounds&&bounds.buckets)||[];\nconst counts=out&&out.length>=buckets.length?out.subarray(0,buckets.length)\n:new Uint32Array(buckets.length);\ncounts.fill(0);\nif(!handle||!buckets.length)return counts;\nconst nullBucket=buckets.length-1;\nconst hasNull=!!buckets[nullBucket]&&buckets[nullBucket].null===true;\nconst n=indices?indices.length:count;\nif(bounds.kind==='boolean'){\nconst read=valueReader(handle);\nfor(let k=0;k<n;k++){\nconst v=read(indices?indices[k]:k);\nif(v===null||v===undefined){if(hasNull)counts[nullBucket]++;continue;}\ncounts[v?1:0]++;\n}\nreturn counts;\n}\nif(bounds.kind==='category'){\nconst slot=new Map();\nfor(let b=0;b<buckets.length;b++){\nif(!buckets[b].null&&!buckets[b].remainder)slot.set(buckets[b].value,b);\n}\nconst remainderAt=buckets.findIndex((b)=>b.remainder);\nconst read=valueReader(handle);\nfor(let k=0;k<n;k++){\nconst v=read(indices?indices[k]:k);\nif(v===null||v===undefined||v===''){if(hasNull)counts[nullBucket]++;continue;}\nif(Array.isArray(v)){\nif(!v.length){if(hasNull)counts[nullBucket]++;continue;}\nfor(const m of v){\nconst at=slot.get(m);\nif(at!==undefined)counts[at]++;\nelse if(remainderAt>=0)counts[remainderAt]++;\n}\ncontinue;\n}\nconst at=slot.get(v);\nif(at!==undefined)counts[at]++;\nelse if(remainderAt>=0)counts[remainderAt]++;\n}\nreturn counts;\n}\nconst ordered=hasNull?buckets.length-1:buckets.length;\nconst edges=new Float64Array(ordered+1);\nfor(let b=0;b<ordered;b++)edges[b]=buckets[b].from;\nedges[ordered]=ordered?buckets[ordered-1].to:0;\nconst read=orderedReader(handle);\nconst present=presenceReader(handle);\nfor(let k=0;k<n;k++){\nconst i=indices?indices[k]:k;\nif(present&&!present(i)){if(hasNull)counts[nullBucket]++;continue;}\nconst v=read(i);\nif(!Number.isFinite(v)){if(hasNull)counts[nullBucket]++;continue;}\nconst at=bucketOf(edges,ordered,v);\nif(at>=0)counts[at]++;\n}\nreturn counts;\n}\nfunction bucketOf(edges,ordered,v){\nif(!ordered)return-1;\nif(v<edges[0])return-1;\nif(v>=edges[ordered])return v===edges[ordered]?ordered-1:-1;\nlet lo=0;\nlet hi=ordered-1;\nwhile(lo<hi){\nconst mid=(lo+hi+1)>>>1;\nif(v>=edges[mid])lo=mid;else hi=mid-1;\n}\nreturn lo;\n}\nfunction facet(handle,indices,count,opts={}){\nconst bounds=opts.bounds||computeBounds(handle,opts.boundsIndices??indices,count,opts);\nreturn{bounds,counts:countInto(handle,indices,count,bounds)};\n}\nconst __default=facet;\n});\n__def(\"packages/core/src/compute/statistics.js\",function(__exports,__req){\n'use strict';\nObject.defineProperty(__exports,\"KENDALL_LIMIT\",{enumerable:true,get:function(){return KENDALL_LIMIT;}});\nObject.defineProperty(__exports,\"MAINTENANCE\",{enumerable:true,get:function(){return MAINTENANCE;}});\nObject.defineProperty(__exports,\"numbers\",{enumerable:true,get:function(){return numbers;}});\nObject.defineProperty(__exports,\"frequencies\",{enumerable:true,get:function(){return frequencies;}});\nObject.defineProperty(__exports,\"herfindahl\",{enumerable:true,get:function(){return herfindahl;}});\nObject.defineProperty(__exports,\"entropy\",{enumerable:true,get:function(){return entropy;}});\nObject.defineProperty(__exports,\"evenness\",{enumerable:true,get:function(){return evenness;}});\nObject.defineProperty(__exports,\"topShare\",{enumerable:true,get:function(){return topShare;}});\nObject.defineProperty(__exports,\"gini\",{enumerable:true,get:function(){return gini;}});\nObject.defineProperty(__exports,\"moments\",{enumerable:true,get:function(){return moments;}});\nObject.defineProperty(__exports,\"quantileSorted\",{enumerable:true,get:function(){return quantileSorted;}});\nObject.defineProperty(__exports,\"quantile\",{enumerable:true,get:function(){return quantile;}});\nObject.defineProperty(__exports,\"STAT_FNS\",{enumerable:true,get:function(){return STAT_FNS;}});\nObject.defineProperty(__exports,\"STAT_LABELS\",{enumerable:true,get:function(){return STAT_LABELS;}});\nObject.defineProperty(__exports,\"weightedAverage\",{enumerable:true,get:function(){return weightedAverage;}});\nObject.defineProperty(__exports,\"extremeRow\",{enumerable:true,get:function(){return extremeRow;}});\nObject.defineProperty(__exports,\"correlation\",{enumerable:true,get:function(){return correlation;}});\nObject.defineProperty(__exports,\"trimmedMean\",{enumerable:true,get:function(){return trimmedMean;}});\nObject.defineProperty(__exports,\"winsorizedMean\",{enumerable:true,get:function(){return winsorizedMean;}});\nObject.defineProperty(__exports,\"modifiedZOutliers\",{enumerable:true,get:function(){return modifiedZOutliers;}});\nObject.defineProperty(__exports,\"jarqueBera\",{enumerable:true,get:function(){return jarqueBera;}});\nObject.defineProperty(__exports,\"weightedQuantile\",{enumerable:true,get:function(){return weightedQuantile;}});\nObject.defineProperty(__exports,\"pairs\",{enumerable:true,get:function(){return pairs;}});\nObject.defineProperty(__exports,\"covariance\",{enumerable:true,get:function(){return covariance;}});\nObject.defineProperty(__exports,\"regression\",{enumerable:true,get:function(){return regression;}});\nObject.defineProperty(__exports,\"spearman\",{enumerable:true,get:function(){return spearman;}});\nObject.defineProperty(__exports,\"kendall\",{enumerable:true,get:function(){return kendall;}});\nObject.defineProperty(__exports,\"seriesStats\",{enumerable:true,get:function(){return seriesStats;}});\nObject.defineProperty(__exports,\"D2_N2\",{enumerable:true,get:function(){return D2_N2;}});\nObject.defineProperty(__exports,\"withinSigma\",{enumerable:true,get:function(){return withinSigma;}});\nObject.defineProperty(__exports,\"capability\",{enumerable:true,get:function(){return capability;}});\nObject.defineProperty(__exports,\"controlLimits\",{enumerable:true,get:function(){return controlLimits;}});\nObject.defineProperty(__exports,\"controlViolations\",{enumerable:true,get:function(){return controlViolations;}});\nObject.defineProperty(__exports,\"countOutside\",{enumerable:true,get:function(){return countOutside;}});\nObject.defineProperty(__exports,\"histogram\",{enumerable:true,get:function(){return histogram;}});\nconst __m0=__req(\"packages/core/src/compute/handle.js\");\nconst presenceReader=__m0[\"presenceReader\"];\nconst valueReader=__m0[\"valueReader\"];\nconst KENDALL_LIMIT=5000;\nconst MAINTENANCE=Object.freeze({\nvariance:'maintained',\nvarianceP:'maintained',\nstddev:'maintained',\nstddevP:'maintained',\nsumSquares:'maintained',\nweightedAvg:'maintained',\nmedian:'rescan',\np25:'rescan',\np75:'rescan',\np90:'rescan',\np95:'rescan',\np99:'rescan',\niqr:'rescan',\nmode:'rescan',\ndistinct:'rescan',\nrange:'rescan',\nskewness:'rescan',\nkurtosis:'rescan',\ngeomean:'rescan',\nharmean:'rescan',\nmad:'rescan',\nargmin:'rescan',\nargmax:'rescan',\nhhi:'rescan',\nentropy:'rescan',\nevenness:'rescan',\ntop3Share:'rescan',\ntop10Share:'rescan',\ngini:'rescan',\ntrimmedMean:'rescan',\nwinsorizedMean:'rescan',\nrobustOutliers:'rescan',\njarqueBera:'rescan',\n});\nfunction numbers(handle,indices){\nconst n=indices.length;\nconst out=new Float64Array(n);\nlet count=0;\nconst numeric=handle&&(handle.kind==='float64'||handle.kind==='int32');\nif(numeric){\nconst values=handle.values;\nconst present=presenceReader(handle);\nfor(let i=0;i<n;i++){\nconst row=indices[i];\nif(present&&present(row)!==1)continue;\nconst v=values[row];\nif(Number.isNaN(v))continue;\nout[count++]=v;\n}\nreturn out.subarray(0,count);\n}\nconst read=valueReader(handle);\nfor(let i=0;i<n;i++){\nconst raw=read(indices[i]);\nif(raw===null||raw===undefined||raw==='')continue;\nconst v=typeof raw==='number'?raw:Number(raw);\nif(!Number.isFinite(v))continue;\nout[count++]=v;\n}\nreturn out.subarray(0,count);\n}\nfunction frequencies(handle,indices){\nconst seen=new Map();\nconst read=valueReader(handle);\nlet total=0;\nfor(let i=0;i<indices.length;i++){\nconst raw=read(indices[i]);\nif(raw===null||raw===undefined||raw==='')continue;\nif(typeof raw==='number'&&Number.isNaN(raw))continue;\nconst key=typeof raw==='object'?String(raw):raw;\nseen.set(key,(seen.get(key)||0)+1);\ntotal++;\n}\nconst counts=[...seen.values()].sort((a,b)=>b-a);\nreturn{counts,total,distinct:counts.length};\n}\nfunction sharesOf(freq){\nreturn freq.total>0?freq.counts.map((c)=>c/freq.total):[];\n}\nfunction herfindahl(handle,indices){\nconst freq=frequencies(handle,indices);\nif(!freq.total)return null;\nlet sum=0;\nfor(const share of sharesOf(freq))sum+=share*share;\nreturn sum;\n}\nfunction entropy(handle,indices){\nconst freq=frequencies(handle,indices);\nif(!freq.total)return null;\nlet sum=0;\nfor(const share of sharesOf(freq))if(share>0)sum-=share*Math.log2(share);\nreturn sum;\n}\nfunction evenness(handle,indices){\nconst freq=frequencies(handle,indices);\nif(!freq.total||freq.distinct<2)return freq.total?1:null;\nlet sum=0;\nfor(const share of sharesOf(freq))if(share>0)sum-=share*Math.log2(share);\nreturn sum/Math.log2(freq.distinct);\n}\nfunction topShare(handle,indices,n=3){\nconst freq=frequencies(handle,indices);\nif(!freq.total)return null;\nconst take=Math.max(1,Math.floor(n));\nlet held=0;\nfor(let i=0;i<Math.min(take,freq.counts.length);i++)held+=freq.counts[i];\nreturn held/freq.total;\n}\nfunction gini(handle,indices){\nconst values=numbers(handle,indices);\nconst n=values.length;\nif(!n)return null;\nconst sorted=values.slice().sort();\nif(sorted[0]<0)return null;\nlet total=0;\nlet weighted=0;\nfor(let i=0;i<n;i++){\ntotal+=sorted[i];\nweighted+=(i+1)*sorted[i];\n}\nif(total===0)return 0;\nreturn(2*weighted)/(n*total)-(n+1)/n;\n}\nfunction moments(values){\nlet n=0;\nlet mean=0;\nlet m2=0;\nfor(let i=0;i<values.length;i++){\nconst x=values[i];\nn++;\nconst delta=x-mean;\nmean+=delta/n;\nm2+=delta*(x-mean);\n}\nreturn{n,mean,m2};\n}\nfunction quantileSorted(sorted,p){\nconst n=sorted.length;\nif(!n)return NaN;\nif(n===1)return sorted[0];\nconst h=(n-1)*Math.min(1,Math.max(0,p));\nconst lo=Math.floor(h);\nconst hi=Math.ceil(h);\nif(lo===hi)return sorted[lo];\nreturn sorted[lo]+(h-lo)*(sorted[hi]-sorted[lo]);\n}\nfunction quantile(values,p){\nif(!values.length)return NaN;\nconst sorted=values.slice().sort();\nreturn quantileSorted(sorted,p);\n}\nconst STAT_FNS=Object.freeze({\nhhi:(h,i)=>herfindahl(h,i),\nentropy:(h,i)=>entropy(h,i),\nevenness:(h,i)=>evenness(h,i),\ntop3Share:(h,i)=>topShare(h,i,3),\ntop10Share:(h,i)=>topShare(h,i,10),\ngini:(h,i)=>gini(h,i),\ntrimmedMean:(h,i)=>trimmedMean(numbers(h,i),0.1),\nwinsorizedMean:(h,i)=>winsorizedMean(numbers(h,i),0.1),\nrobustOutliers:(h,i)=>modifiedZOutliers(numbers(h,i),3.5),\njarqueBera:(h,i)=>jarqueBera(numbers(h,i)),\nvariance:(h,i)=>{\nconst{n,m2}=moments(numbers(h,i));\nreturn n>1?m2/(n-1):null;\n},\nvarianceP:(h,i)=>{\nconst{n,m2}=moments(numbers(h,i));\nreturn n>0?m2/n:null;\n},\nstddev:(h,i)=>{\nconst{n,m2}=moments(numbers(h,i));\nreturn n>1?Math.sqrt(m2/(n-1)):null;\n},\nstddevP:(h,i)=>{\nconst{n,m2}=moments(numbers(h,i));\nreturn n>0?Math.sqrt(m2/n):null;\n},\nmedian:(h,i)=>{\nconst values=numbers(h,i);\nreturn values.length?quantile(values,0.5):null;\n},\np25:(h,i)=>{\nconst values=numbers(h,i);\nreturn values.length?quantile(values,0.25):null;\n},\np75:(h,i)=>{\nconst values=numbers(h,i);\nreturn values.length?quantile(values,0.75):null;\n},\np90:(h,i)=>{\nconst values=numbers(h,i);\nreturn values.length?quantile(values,0.9):null;\n},\np95:(h,i)=>{\nconst values=numbers(h,i);\nreturn values.length?quantile(values,0.95):null;\n},\np99:(h,i)=>{\nconst values=numbers(h,i);\nreturn values.length?quantile(values,0.99):null;\n},\niqr:(h,i)=>{\nconst values=numbers(h,i);\nif(!values.length)return null;\nconst sorted=values.slice().sort();\nreturn quantileSorted(sorted,0.75)-quantileSorted(sorted,0.25);\n},\nmad:(h,i)=>{\nconst values=numbers(h,i);\nif(!values.length)return null;\nconst middle=quantile(values,0.5);\nconst deviations=new Float64Array(values.length);\nfor(let k=0;k<values.length;k++)deviations[k]=Math.abs(values[k]-middle);\nreturn quantile(deviations,0.5);\n},\nrange:(h,i)=>{\nconst values=numbers(h,i);\nif(!values.length)return null;\nlet lo=Infinity;\nlet hi=-Infinity;\nfor(let k=0;k<values.length;k++){\nif(values[k]<lo)lo=values[k];\nif(values[k]>hi)hi=values[k];\n}\nreturn hi-lo;\n},\ndistinct:(h,i)=>{\nconst read=valueReader(h);\nconst seen=new Set();\nfor(let k=0;k<i.length;k++){\nconst v=read(i[k]);\nif(v===null||v===undefined||v==='')continue;\nseen.add(v instanceof Date?v.getTime():v);\n}\nreturn seen.size;\n},\nmode:(h,i)=>{\nconst read=valueReader(h);\nconst counts=new Map();\nfor(let k=0;k<i.length;k++){\nconst v=read(i[k]);\nif(v===null||v===undefined||v==='')continue;\nconst id=v instanceof Date?v.getTime():v;\ncounts.set(id,(counts.get(id)||0)+1);\n}\nlet best=null;\nlet most=1;\nfor(const[value,times]of counts){\nif(times>most){\nmost=times;\nbest=value;\n}\n}\nreturn best;\n},\nskewness:(h,i)=>{\nconst values=numbers(h,i);\nconst{n,mean,m2}=moments(values);\nif(n<3||m2<=0)return null;\nconst sd=Math.sqrt(m2/(n-1));\nlet sum=0;\nfor(let k=0;k<values.length;k++)sum+=((values[k]-mean)/sd)**3;\nreturn(n/((n-1)*(n-2)))*sum;\n},\nkurtosis:(h,i)=>{\nconst values=numbers(h,i);\nconst{n,mean,m2}=moments(values);\nif(n<4||m2<=0)return null;\nconst sd=Math.sqrt(m2/(n-1));\nlet sum=0;\nfor(let k=0;k<values.length;k++)sum+=((values[k]-mean)/sd)**4;\nconst a=(n*(n+1))/((n-1)*(n-2)*(n-3));\nconst b=(3*(n-1)**2)/((n-2)*(n-3));\nreturn a*sum-b;\n},\ngeomean:(h,i)=>{\nconst values=numbers(h,i);\nif(!values.length)return null;\nlet sum=0;\nfor(let k=0;k<values.length;k++){\nif(values[k]<=0)return null;\nsum+=Math.log(values[k]);\n}\nreturn Math.exp(sum/values.length);\n},\nharmean:(h,i)=>{\nconst values=numbers(h,i);\nif(!values.length)return null;\nlet sum=0;\nfor(let k=0;k<values.length;k++){\nif(values[k]===0)return null;\nsum+=1/values[k];\n}\nreturn values.length/sum;\n},\nsumSquares:(h,i)=>{\nconst values=numbers(h,i);\nlet sum=0;\nfor(let k=0;k<values.length;k++)sum+=values[k]*values[k];\nreturn sum;\n},\n});\nconst STAT_LABELS=Object.freeze({\nhhi:'Concentration (HHI)',\nentropy:'Entropy',\nevenness:'Evenness',\ntop3Share:'Top 3 share',\ntop10Share:'Top 10 share',\ngini:'Gini coefficient',\ntrimmedMean:'Trimmed mean',\nwinsorizedMean:'Winsorized mean',\nrobustOutliers:'Outliers (robust)',\njarqueBera:'Jarque–Bera',\nmedian:'Median',\np25:'25th percentile',\np75:'75th percentile',\np90:'90th percentile',\np95:'95th percentile',\np99:'99th percentile',\niqr:'Interquartile range',\nmad:'Median absolute deviation',\nvariance:'Variance',\nvarianceP:'Variance (population)',\nstddev:'Standard deviation',\nstddevP:'Standard deviation (population)',\nrange:'Range',\ndistinct:'Distinct',\nmode:'Mode',\nskewness:'Skewness',\nkurtosis:'Kurtosis',\ngeomean:'Geometric mean',\nharmean:'Harmonic mean',\nsumSquares:'Sum of squares',\nweightedAvg:'Weighted average',\nargmin:'Lowest by',\nargmax:'Highest by',\n});\nfunction weightedAverage(handle,weights,indices){\nconst readValue=valueReader(handle);\nconst readWeight=valueReader(weights);\nlet top=0;\nlet bottom=0;\nfor(let i=0;i<indices.length;i++){\nconst row=indices[i];\nconst value=Number(readValue(row));\nconst weight=Number(readWeight(row));\nif(!Number.isFinite(value)||!Number.isFinite(weight))continue;\ntop+=value*weight;\nbottom+=weight;\n}\nreturn bottom===0?null:top/bottom;\n}\nfunction extremeRow(handle,indices,largest){\nconst read=valueReader(handle);\nlet best=null;\nlet bestValue=largest?-Infinity:Infinity;\nfor(let i=0;i<indices.length;i++){\nconst row=indices[i];\nconst value=Number(read(row));\nif(!Number.isFinite(value))continue;\nif(largest?value>bestValue:value<bestValue){\nbestValue=value;\nbest=row;\n}\n}\nreturn best;\n}\nfunction correlation(a,b,indices){\nconst readA=valueReader(a);\nconst readB=valueReader(b);\nlet n=0;\nlet sx=0;\nlet sy=0;\nlet sxx=0;\nlet syy=0;\nlet sxy=0;\nfor(let i=0;i<indices.length;i++){\nconst row=indices[i];\nconst x=Number(readA(row));\nconst y=Number(readB(row));\nif(!Number.isFinite(x)||!Number.isFinite(y))continue;\nn++;\nsx+=x;\nsy+=y;\nsxx+=x*x;\nsyy+=y*y;\nsxy+=x*y;\n}\nif(n<2)return null;\nconst top=n*sxy-sx*sy;\nconst bottom=Math.sqrt((n*sxx-sx*sx)*(n*syy-sy*sy));\nif(bottom===0)return null;\nconst r=top/bottom;\nreturn Math.max(-1,Math.min(1,r));\n}\nfunction trimmedMean(values,share=0.1){\nconst n=values.length;\nif(!n)return null;\nconst sorted=Array.from(values).sort((a,b)=>a-b);\nconst cut=Math.floor(n*Math.min(0.49,Math.max(0,share)));\nconst kept=sorted.slice(cut,n-cut);\nif(!kept.length)return quantileSorted(sorted,0.5);\nlet sum=0;\nfor(const v of kept)sum+=v;\nreturn sum/kept.length;\n}\nfunction winsorizedMean(values,share=0.1){\nconst n=values.length;\nif(!n)return null;\nconst sorted=Array.from(values).sort((a,b)=>a-b);\nconst cut=Math.floor(n*Math.min(0.49,Math.max(0,share)));\nconst low=sorted[cut];\nconst high=sorted[n-1-cut];\nlet sum=0;\nfor(const v of sorted)sum+=Math.min(high,Math.max(low,v));\nreturn sum/n;\n}\nfunction modifiedZOutliers(values,threshold=3.5){\nconst n=values.length;\nif(!n)return null;\nconst sorted=Array.from(values).sort((a,b)=>a-b);\nconst middle=quantileSorted(sorted,0.5);\nconst deviations=sorted.map((v)=>Math.abs(v-middle)).sort((a,b)=>a-b);\nconst mad=quantileSorted(deviations,0.5);\nif(mad===0)return null;\nlet count=0;\nfor(const v of sorted)if(Math.abs((0.6745*(v-middle))/mad)>threshold)count++;\nreturn count;\n}\nfunction jarqueBera(values){\nconst n=values.length;\nif(n<8)return null;\nlet mean=0;\nfor(const v of values)mean+=v;\nmean/=n;\nlet m2=0;\nlet m3=0;\nlet m4=0;\nfor(const v of values){\nconst d=v-mean;\nm2+=d*d;\nm3+=d*d*d;\nm4+=d*d*d*d;\n}\nm2/=n;\nm3/=n;\nm4/=n;\nif(m2===0)return null;\nconst skew=m3/m2**1.5;\nconst excess=m4/(m2*m2)-3;\nreturn(n/6)*(skew*skew+(excess*excess)/4);\n}\nfunction weightedQuantile(values,weights,p){\nconst paired=[];\nlet total=0;\nfor(let i=0;i<values.length;i++){\nconst v=Number(values[i]);\nconst w=Number(weights[i]);\nif(!Number.isFinite(v)||!Number.isFinite(w)||w<=0)continue;\npaired.push([v,w]);\ntotal+=w;\n}\nif(!paired.length||total<=0)return null;\npaired.sort((a,b)=>a[0]-b[0]);\nif(paired.length===1)return paired[0][0];\nconst at=[];\nlet seen=0;\nfor(const[,w]of paired){\nat.push((seen+w/2)/total);\nseen+=w;\n}\nconst target=Math.max(0,Math.min(1,p));\nif(target<=at[0])return paired[0][0];\nif(target>=at[at.length-1])return paired[paired.length-1][0];\nfor(let i=1;i<at.length;i++){\nif(target>at[i])continue;\nconst span=at[i]-at[i-1];\nconst within=span>0?(target-at[i-1])/span:0;\nreturn paired[i-1][0]+(paired[i][0]-paired[i-1][0])*within;\n}\nreturn paired[paired.length-1][0];\n}\nfunction pairs(a,b,indices){\nconst readA=valueReader(a);\nconst readB=valueReader(b);\nconst xs=new Float64Array(indices.length);\nconst ys=new Float64Array(indices.length);\nlet n=0;\nfor(let i=0;i<indices.length;i++){\nconst row=indices[i];\nconst x=Number(readA(row));\nconst y=Number(readB(row));\nif(!Number.isFinite(x)||!Number.isFinite(y))continue;\nxs[n]=x;\nys[n]=y;\nn++;\n}\nreturn{xs:xs.subarray(0,n),ys:ys.subarray(0,n),n};\n}\nfunction covariance(a,b,indices,population=false){\nconst{xs,ys,n}=pairs(a,b,indices);\nif(n<2)return null;\nlet mx=0;\nlet my=0;\nfor(let i=0;i<n;i++){mx+=xs[i];my+=ys[i];}\nmx/=n;\nmy/=n;\nlet sum=0;\nfor(let i=0;i<n;i++)sum+=(xs[i]-mx)*(ys[i]-my);\nreturn sum/(population?n:n-1);\n}\nfunction regression(a,b,indices){\nconst{xs,ys,n}=pairs(a,b,indices);\nif(n<2)return null;\nlet mx=0;\nlet my=0;\nfor(let i=0;i<n;i++){mx+=xs[i];my+=ys[i];}\nmx/=n;\nmy/=n;\nlet sxx=0;\nlet sxy=0;\nlet syy=0;\nfor(let i=0;i<n;i++){\nconst dx=xs[i]-mx;\nconst dy=ys[i]-my;\nsxx+=dx*dx;\nsxy+=dx*dy;\nsyy+=dy*dy;\n}\nif(sxx===0)return null;\nconst slope=sxy/sxx;\nconst intercept=my-slope*mx;\nconst r2=syy===0?1:Math.max(0,Math.min(1,(sxy*sxy)/(sxx*syy)));\nconst residual=Math.max(0,syy-slope*sxy);\nconst stdError=n>2?Math.sqrt(residual/(n-2)/sxx):0;\nreturn{slope,intercept,r2,stdError,n};\n}\nfunction ranksOf(values){\nconst n=values.length;\nconst order=Array.from({length:n},(unused,i)=>i)\n.sort((i,j)=>values[i]-values[j]);\nconst ranks=new Float64Array(n);\nlet i=0;\nwhile(i<n){\nlet j=i;\nwhile(j+1<n&&values[order[j+1]]===values[order[i]])j++;\nconst shared=(i+j)/2+1;\nfor(let k=i;k<=j;k++)ranks[order[k]]=shared;\ni=j+1;\n}\nreturn ranks;\n}\nfunction spearman(a,b,indices){\nconst{xs,ys,n}=pairs(a,b,indices);\nif(n<2)return null;\nconst rx=ranksOf(xs);\nconst ry=ranksOf(ys);\nlet mx=0;\nlet my=0;\nfor(let i=0;i<n;i++){mx+=rx[i];my+=ry[i];}\nmx/=n;\nmy/=n;\nlet sxy=0;\nlet sxx=0;\nlet syy=0;\nfor(let i=0;i<n;i++){\nconst dx=rx[i]-mx;\nconst dy=ry[i]-my;\nsxy+=dx*dy;\nsxx+=dx*dx;\nsyy+=dy*dy;\n}\nif(sxx===0||syy===0)return null;\nreturn Math.max(-1,Math.min(1,sxy/Math.sqrt(sxx*syy)));\n}\nfunction kendall(a,b,indices){\nconst{xs,ys,n}=pairs(a,b,indices);\nif(n<2||n>KENDALL_LIMIT)return null;\nlet concordant=0;\nlet discordant=0;\nlet tiedXOnly=0;\nlet tiedYOnly=0;\nfor(let i=0;i<n;i++){\nfor(let j=i+1;j<n;j++){\nconst dx=Math.sign(xs[i]-xs[j]);\nconst dy=Math.sign(ys[i]-ys[j]);\nconst product=dx*dy;\nif(product>0)concordant++;\nelse if(product<0)discordant++;\nelse if(dx===0&&dy===0){}\nelse if(dx===0)tiedXOnly++;\nelse tiedYOnly++;\n}\n}\nconst orderedByX=concordant+discordant+tiedYOnly;\nconst orderedByY=concordant+discordant+tiedXOnly;\nif(orderedByX===0||orderedByY===0)return null;\nreturn(concordant-discordant)/Math.sqrt(orderedByX*orderedByY);\n}\nfunction seriesStats(ordered,opts={}){\nconst n=ordered.length;\nif(n<2)return null;\nconst first=ordered[0];\nconst last=ordered[n-1];\nconst returns=[];\nfor(let i=1;i<n;i++){\nconst previous=ordered[i-1];\nif(previous===0)continue;\nreturns.push((ordered[i]-previous)/Math.abs(previous));\n}\nlet volatility=null;\nif(returns.length>1){\nlet mean=0;\nfor(const r of returns)mean+=r;\nmean/=returns.length;\nlet m2=0;\nfor(const r of returns)m2+=(r-mean)**2;\nvolatility=Math.sqrt(m2/(returns.length-1));\n}\nconst periods=Number(opts.periodsPerYear)>0?Number(opts.periodsPerYear):null;\nlet peak=ordered[0];\nlet peakAt=0;\nlet worst=0;\nlet worstFrom=0;\nlet worstTo=0;\nfor(let i=1;i<n;i++){\nif(ordered[i]>peak){peak=ordered[i];peakAt=i;continue;}\nif(peak<=0)continue;\nconst fall=(peak-ordered[i])/peak;\nif(fall>worst){worst=fall;worstFrom=peakAt;worstTo=i;}\n}\nlet autocorrelation=null;\nif(n>2){\nlet mean=0;\nfor(let i=0;i<n;i++)mean+=ordered[i];\nmean/=n;\nlet top=0;\nlet bottom=0;\nfor(let i=0;i<n;i++){\nconst d=ordered[i]-mean;\nbottom+=d*d;\nif(i>0)top+=d*(ordered[i-1]-mean);\n}\nautocorrelation=bottom>0?top/bottom:null;\n}\nlet up=0;\nlet down=0;\nfor(const r of returns){if(r>0)up++;else if(r<0)down++;}\nlet growth=null;\nif(first>0&&last>0){\nconst perPeriod=(last/first)**(1/(n-1))-1;\ngrowth=periods?(1+perPeriod)**periods-1:perPeriod;\n}\nreturn{\nn,\nfirst,\nlast,\nchange:last-first,\nchangePercent:first===0?null:((last-first)/Math.abs(first))*100,\nvolatility,\nannualisedVolatility:volatility!==null&&periods?volatility*Math.sqrt(periods):null,\ngrowth,\nmaxDrawdown:worst,\nmaxDrawdownFrom:worstFrom,\nmaxDrawdownTo:worstTo,\nautocorrelation,\nupDays:up,\ndownDays:down,\n};\n}\nconst D2_N2=1.128;\nfunction withinSigma(ordered){\nconst n=ordered.length;\nif(n<2)return null;\nlet total=0;\nfor(let i=1;i<n;i++)total+=Math.abs(ordered[i]-ordered[i-1]);\nconst meanRange=total/(n-1);\nreturn{sigma:meanRange/D2_N2,meanRange};\n}\nfunction capability(ordered,spec){\nconst n=ordered.length;\nif(n<2||!spec)return null;\nconst lower=Number.isFinite(Number(spec.lower))?Number(spec.lower):null;\nconst upper=Number.isFinite(Number(spec.upper))?Number(spec.upper):null;\nif(lower===null&&upper===null)return null;\nlet mean=0;\nfor(let i=0;i<n;i++)mean+=ordered[i];\nmean/=n;\nlet m2=0;\nfor(let i=0;i<n;i++)m2+=(ordered[i]-mean)**2;\nconst overall=Math.sqrt(m2/(n-1));\nconst within=withinSigma(ordered);\nconst sigmaWithin=within?within.sigma:null;\nconst indices=(sigma)=>{\nif(!sigma||sigma<=0)return{index:null,k:null};\nconst both=lower!==null&&upper!==null;\nconst index=both?(upper-lower)/(6*sigma):null;\nconst upperSide=upper!==null?(upper-mean)/(3*sigma):Infinity;\nconst lowerSide=lower!==null?(mean-lower)/(3*sigma):Infinity;\nreturn{index,k:Math.min(upperSide,lowerSide)};\n};\nconst short=indices(sigmaWithin);\nconst long=indices(overall);\nlet outOfSpec=0;\nfor(let i=0;i<n;i++){\nif(lower!==null&&ordered[i]<lower){outOfSpec++;continue;}\nif(upper!==null&&ordered[i]>upper)outOfSpec++;\n}\nreturn{\nn,\nmean,\nlower,\nupper,\ntarget:Number.isFinite(Number(spec.target))?Number(spec.target):null,\nsigmaWithin,\nsigmaOverall:overall,\ncp:short.index,\ncpk:short.k,\npp:long.index,\nppk:long.k,\noutOfSpec,\ndefectRate:n?outOfSpec/n:null,\n};\n}\nfunction controlLimits(ordered){\nconst n=ordered.length;\nif(n<2)return null;\nconst within=withinSigma(ordered);\nif(!within||!(within.sigma>0))return null;\nlet centre=0;\nfor(let i=0;i<n;i++)centre+=ordered[i];\ncentre/=n;\nreturn{\ncentre,\nsigma:within.sigma,\nupper:centre+3*within.sigma,\nlower:centre-3*within.sigma,\n};\n}\nfunction controlViolations(ordered,limits){\nif(!limits||!(limits.sigma>0))return[];\nconst n=ordered.length;\nconst{centre,sigma}=limits;\nconst z=(i)=>(ordered[i]-centre)/sigma;\nconst out=[];\nfor(let i=0;i<n;i++){\nif(Math.abs(z(i))>3){\nout.push({index:i,rule:1,description:'beyond three sigma'});\n}\nif(i>=2){\nfor(const side of[1,-1]){\nlet hits=0;\nfor(let k=i-2;k<=i;k++)if(z(k)*side>2)hits++;\nif(hits>=2){\nout.push({index:i,rule:2,description:'two of three past two sigma'});\nbreak;\n}\n}\n}\nif(i>=4){\nfor(const side of[1,-1]){\nlet hits=0;\nfor(let k=i-4;k<=i;k++)if(z(k)*side>1)hits++;\nif(hits>=4){\nout.push({index:i,rule:3,description:'four of five past one sigma'});\nbreak;\n}\n}\n}\nif(i>=7){\nfor(const side of[1,-1]){\nlet all=true;\nfor(let k=i-7;k<=i;k++)if(z(k)*side<=0){all=false;break;}\nif(all){\nout.push({index:i,rule:4,description:'eight in a row on one side'});\nbreak;\n}\n}\n}\n}\nreturn out;\n}\nfunction countOutside(values,low,high){\nlet count=0;\nfor(let i=0;i<values.length;i++){\nif(values[i]<low||values[i]>high)count++;\n}\nreturn count;\n}\nfunction histogram(sorted,q1,q3,cap=20){\nconst n=sorted.length;\nif(!n)return[];\nconst min=sorted[0];\nconst max=sorted[n-1];\nif(max===min)return[{from:min,to:max,count:n}];\nconst iqr=q3-q1;\nconst fence=1.5*iqr;\nlet lo=iqr>0?Math.max(min,q1-fence):min;\nlet hi=iqr>0?Math.min(max,q3+fence):max;\nif(!(hi>lo)){lo=min;hi=max;}\nconst width=iqr>0?(2*iqr)/Math.cbrt(n):(hi-lo)/(Math.ceil(Math.log2(n))+1);\nconst count=width>0\n?Math.min(cap,Math.max(1,Math.ceil((hi-lo)/width)))\n:1;\nconst step=(hi-lo)/count;\nconst bins=[];\nfor(let i=0;i<count;i++){\nbins.push({from:lo+i*step,to:lo+(i+1)*step,count:0});\n}\nfor(let i=0;i<n;i++){\nconst at=Math.min(count-1,Math.max(0,Math.floor((sorted[i]-lo)/step)));\nbins[at].count++;\n}\nbins[0].from=min;\nbins[count-1].to=max;\nreturn bins;\n}\n});\n__def(\"packages/core/src/compute/total.js\",function(__exports,__req){\n'use strict';\nObject.defineProperty(__exports,\"TOTAL_FNS\",{enumerable:true,get:function(){return TOTAL_FNS;}});\nObject.defineProperty(__exports,\"TOTAL_LABELS\",{enumerable:true,get:function(){return TOTAL_LABELS;}});\nObject.defineProperty(__exports,\"totalLabel\",{enumerable:true,get:function(){return totalLabel;}});\nObject.defineProperty(__exports,\"collectValues\",{enumerable:true,get:function(){return collectValues;}});\nObject.defineProperty(__exports,\"total\",{enumerable:true,get:function(){return total;}});\nconst __m0=__req(\"packages/core/src/internal/util.js\");\nconst isFunction=__m0[\"isFunction\"];\nconst warnOnce=__m0[\"warnOnce\"];\nconst __m1=__req(\"packages/core/src/compute/handle.js\");\nconst presenceReader=__m1[\"presenceReader\"];\nconst valueComparator=__m1[\"valueComparator\"];\nconst valueReader=__m1[\"valueReader\"];\nconst __m2=__req(\"packages/core/src/compute/statistics.js\");\nconst STAT_FNS=__m2[\"STAT_FNS\"];\nconst STAT_LABELS=__m2[\"STAT_LABELS\"];\nfunction isNumericBacking(handle){\nreturn!!handle&&(handle.kind==='float64'||handle.kind==='int32');\n}\nfunction sum(handle,indices){\nconst n=indices.length;\nlet acc=0;\nif(isNumericBacking(handle)){\nconst values=handle.values;\nconst present=presenceReader(handle);\nif(!present){\nfor(let i=0;i<n;i++){\nconst v=values[indices[i]];\nif(!Number.isNaN(v))acc+=v;\n}\nreturn acc;\n}\nfor(let i=0;i<n;i++){\nconst row=indices[i];\nif(present(row)===1){\nconst v=values[row];\nif(!Number.isNaN(v))acc+=v;\n}\n}\nreturn acc;\n}\nconst read=valueReader(handle);\nfor(let i=0;i<n;i++){\nconst v=numberOf(read(indices[i]));\nif(v!==null)acc+=v;\n}\nreturn acc;\n}\nsum.kernel=true;\nfunction countValues(handle,indices){\nconst n=indices.length;\nlet count=0;\nif(isNumericBacking(handle)){\nconst values=handle.values;\nconst present=presenceReader(handle);\nif(!present){\nfor(let i=0;i<n;i++)if(!Number.isNaN(values[indices[i]]))count++;\nreturn count;\n}\nfor(let i=0;i<n;i++){\nconst row=indices[i];\nif(present(row)===1&&!Number.isNaN(values[row]))count++;\n}\nreturn count;\n}\nconst read=valueReader(handle);\nfor(let i=0;i<n;i++){\nconst v=read(indices[i]);\nif(v!==null&&v!==undefined&&!(typeof v==='number'&&Number.isNaN(v)))count++;\n}\nreturn count;\n}\ncountValues.kernel=true;\nfunction count(handle,indices){\nreturn indices.length;\n}\ncount.kernel=true;\nfunction avg(handle,indices){\nconst values=countValues(handle,indices);\nif(values===0)return null;\nreturn sum(handle,indices)/values;\n}\navg.kernel=true;\nfunction extreme(handle,indices,direction,locale){\nconst n=indices.length;\nif(isNumericBacking(handle)){\nconst values=handle.values;\nconst present=presenceReader(handle);\nlet best=null;\nif(!present){\nfor(let i=0;i<n;i++){\nconst v=values[indices[i]];\nif(Number.isNaN(v))continue;\nif(best===null||(direction<0?v<best:v>best))best=v;\n}\nreturn best;\n}\nfor(let i=0;i<n;i++){\nconst row=indices[i];\nif(present(row)===0)continue;\nconst v=values[row];\nif(Number.isNaN(v))continue;\nif(best===null||(direction<0?v<best:v>best))best=v;\n}\nreturn best;\n}\nconst read=valueReader(handle);\nconst cmp=valueComparator(locale);\nlet best=null;\nfor(let i=0;i<n;i++){\nconst v=read(indices[i]);\nif(v===null||v===undefined||(typeof v==='number'&&Number.isNaN(v)))continue;\nif(best===null||(direction<0?cmp(v,best)<0:cmp(v,best)>0))best=v;\n}\nreturn best;\n}\nfunction min(handle,indices,ctx){\nreturn extreme(handle,indices,-1,ctx&&ctx.locale);\n}\nmin.kernel=true;\nfunction max(handle,indices,ctx){\nreturn extreme(handle,indices,1,ctx&&ctx.locale);\n}\nmax.kernel=true;\nfunction first(handle,indices){\nif(indices.length===0)return null;\nreturn valueReader(handle)(indices[0]);\n}\nfirst.kernel=true;\nfunction last(handle,indices){\nif(indices.length===0)return null;\nreturn valueReader(handle)(indices[indices.length-1]);\n}\nlast.kernel=true;\nfunction numberOf(v){\nif(typeof v==='number')return Number.isNaN(v)?null:v;\nif(v===null||v===undefined||v===''||typeof v==='boolean')return null;\nif(v instanceof Date)return v.getTime();\nconst n=Number(v);\nreturn Number.isNaN(n)?null:n;\n}\nconst TOTAL_FNS={\nsum,min,max,avg,count,first,last,countValues,\n...STAT_FNS,\n};\nconst TOTAL_LABELS=Object.freeze({\n...STAT_LABELS,\nsum:'Sum',\navg:'Average',\nmin:'Min',\nmax:'Max',\ncount:'Count',\ncountValues:'Count of values',\nfirst:'First',\nlast:'Last',\n});\nfunction totalLabel(fn){\nif(!fn)return'';\nif(typeof fn==='string')return TOTAL_LABELS[fn]||fn;\nreturn'Total';\n}\nfunction collectValues(handle,indices){\nconst read=valueReader(handle);\nconst out=[];\nfor(let i=0;i<indices.length;i++){\nconst v=read(indices[i]);\nif(v===null||v===undefined)continue;\nout.push(v);\n}\nreturn out;\n}\nfunction total(handle,indices,fn,ctx){\nconst list=indices||[];\nif(typeof fn==='string'){\nconst kernel=TOTAL_FNS[fn];\nif(!kernel){\nwarnOnce(`total:${fn}`,`unknown total function \"${fn}\"; register it in config.totalFns`);\nreturn null;\n}\nreturn kernel(handle,list,ctx);\n}\nif(isFunction(fn)){\nif(fn.kernel===true)return fn(handle,list,ctx);\nreturn fn(collectValues(handle,list),ctx||{});\n}\nreturn null;\n}\n});\n__def(\"packages/core/src/compute/pivot.js\",function(__exports,__req){\n'use strict';\nObject.defineProperty(__exports,\"KEY_DELIMITER\",{enumerable:true,get:function(){return KEY_DELIMITER;}});\nObject.defineProperty(__exports,\"DEFAULT_PATH_SEPARATOR\",{enumerable:true,get:function(){return DEFAULT_PATH_SEPARATOR;}});\nObject.defineProperty(__exports,\"DEFAULT_MAX_COLUMNS\",{enumerable:true,get:function(){return DEFAULT_MAX_COLUMNS;}});\nObject.defineProperty(__exports,\"pivotKey\",{enumerable:true,get:function(){return pivotKey;}});\nObject.defineProperty(__exports,\"joinPath\",{enumerable:true,get:function(){return joinPath;}});\nObject.defineProperty(__exports,\"resolvePivotKeys\",{enumerable:true,get:function(){return resolvePivotKeys;}});\nObject.defineProperty(__exports,\"pivot\",{enumerable:true,get:function(){return pivot;}});\nconst __m0=__req(\"packages/core/src/internal/util.js\");\nconst warnOnce=__m0[\"warnOnce\"];\nconst __m1=__req(\"packages/core/src/compute/handle.js\");\nconst valueComparator=__m1[\"valueComparator\"];\nconst __m2=__req(\"packages/core/src/compute/group.js\");\nconst packKeys=__m2[\"packKeys\"];\nconst __m3=__req(\"packages/core/src/compute/total.js\");\nconst total=__m3[\"total\"];\nconst KEY_DELIMITER='|';\nconst DEFAULT_PATH_SEPARATOR='/';\nconst DEFAULT_MAX_COLUMNS=2000;\nfunction pivotKey(groupPath,pivotPath,colId){\nreturn`${groupPath}${KEY_DELIMITER}${pivotPath}${KEY_DELIMITER}${colId}`;\n}\nfunction joinPath(parts,separator){\nlet out='';\nfor(let i=0;i<parts.length;i++){\nconst v=parts[i];\nout+=(i===0?'':separator)+(v===null||v===undefined?'':String(v));\n}\nreturn out;\n}\nfunction resolvePivotKeys(handles,order,opts={}){\nconst separator=opts.separator||DEFAULT_PATH_SEPARATOR;\nconst n=order.length;\nconst{keyOf,readers}=packKeys(handles,order,0);\nconst seen=new Map();\nconst tuples=[];\nconst rawKeys=[];\nfor(let i=0;i<n;i++){\nconst row=order[i];\nconst key=keyOf(row);\nif(seen.has(key))continue;\nseen.set(key,tuples.length);\nrawKeys.push(key);\nconst tuple=new Array(readers.length);\nfor(let j=0;j<readers.length;j++)tuple[j]=readers[j](row);\ntuples.push(tuple);\n}\nconst cmp=valueComparator(opts.locale);\nconst rank=tuples.map((_,i)=>i);\nrank.sort((a,b)=>{\nconst ta=tuples[a];\nconst tb=tuples[b];\nfor(let j=0;j<ta.length;j++){\nconst c=compareNullable(ta[j],tb[j],cmp);\nif(c!==0)return c;\n}\nreturn a-b;\n});\nconst keys=new Array(rank.length);\nconst paths=new Array(rank.length);\nconst idByKey=new Map();\nfor(let position=0;position<rank.length;position++){\nconst from=rank[position];\nkeys[position]=tuples[from];\npaths[position]=joinPath(tuples[from],separator);\nidByKey.set(rawKeys[from],position);\n}\nconst idOf=(row)=>{\nconst id=idByKey.get(keyOf(row));\nreturn id===undefined?-1:id;\n};\nreturn{keys,paths,idOf};\n}\nfunction compareNullable(a,b,cmp){\nconst na=a===null||a===undefined;\nconst nb=b===null||b===undefined;\nif(na||nb)return na&&nb?0:na?1:-1;\nreturn cmp(a,b);\n}\nfunction resolveValueColumns(opts){\nconst declared=opts.values||opts.totals||[];\nif(declared.length&&typeof declared[0]==='object'&&declared[0]!==null){\nreturn declared.filter((entry)=>entry&&entry.handle);\n}\nconst resolve=typeof opts.handle==='function'?opts.handle:null;\nif(!resolve){\nif(declared.length){\nwarnOnce('pivot:handles',\n'pivot was given total column ids but no handle(colId) resolver, so no cell values were reduced. Pass values: [{ colId, handle, fn }] or opts.handle.');\n}\nreturn[];\n}\nconst totalOf=typeof opts.totalOf==='function'?opts.totalOf:null;\nconst out=[];\nfor(const colId of declared){\nconst handle=resolve(colId);\nif(!handle)continue;\nout.push({colId,handle,fn:totalOf?totalOf(colId):'sum'});\n}\nreturn out;\n}\nfunction normaliseArgs(a,b,c){\nif(Array.isArray(a)){\nconst opts=c||{};\nreturn{...opts,pivotHandles:a,order:b||null,groups:opts.groups||null};\n}\nreturn a||{};\n}\nfunction pivot(input,orderArg,optsArg){\nconst opts=normaliseArgs(input,orderArg,optsArg);\nconst separator=opts.separator||DEFAULT_PATH_SEPARATOR;\nconst valueColumns=resolveValueColumns(opts);\nconst maxColumns=opts.maxColumns===undefined?DEFAULT_MAX_COLUMNS:opts.maxColumns;\nconst groups=opts.groups&&opts.groups.buckets?opts.groups:null;\nconst buckets=groups?groups.buckets:[opts.order||new Uint32Array(0)];\nconst groupPaths=opts.groupPaths\n||(groups?groups.keys.map((tuple)=>joinPath(tuple,separator)):['']);\nconst scope=concatIndices(buckets);\nconst{keys,paths,idOf}=resolvePivotKeys(opts.pivotHandles||[],scope,opts);\nconst columns=paths.length*Math.max(1,valueColumns.length);\nconst fields=derivedFields(paths,valueColumns,separator);\nif(maxColumns&&columns>maxColumns){\nconst empty=new Map();\nreturn{\nkeys,\npaths,\nfields,\ngroupPaths,\ncolumns,\nvalues:empty,\ncells:empty,\nerror:{\ncode:'pivot-max-columns',\nmessage:`[lattice] pivot would generate ${columns} columns, above pivot.maxColumns of ${maxColumns}. Narrow the pivot columns or raise the limit.`,\ncolumns,\nmaxColumns,\n},\n};\n}\nconst cells=new Map();\nconst keyCount=paths.length;\nfor(let g=0;g<buckets.length;g++){\nconst bucket=buckets[g];\nconst groupPath=groupPaths[g]===undefined?'':groupPaths[g];\nconst n=bucket.length;\nif(n===0)continue;\nconst ids=new Int32Array(n);\nconst counts=new Uint32Array(keyCount+1);\nfor(let i=0;i<n;i++){\nconst id=idOf(bucket[i]);\nids[i]=id;\nif(id>=0)counts[id+1]++;\n}\nfor(let k=0;k<keyCount;k++)counts[k+1]+=counts[k];\nconst scattered=new Uint32Array(n);\nconst cursor=counts.slice(0,keyCount);\nfor(let i=0;i<n;i++){\nconst id=ids[i];\nif(id>=0)scattered[cursor[id]++]=bucket[i];\n}\nfor(let k=0;k<keyCount;k++){\nconst from=counts[k];\nconst to=counts[k+1];\nif(to===from)continue;\nconst slice=scattered.subarray(from,to);\nfor(let c=0;c<valueColumns.length;c++){\nconst column=valueColumns[c];\nconst result=total(column.handle,slice,column.fn,opts.totalContext||{locale:opts.locale});\ncells.set(pivotKey(groupPath,paths[k],column.colId),result);\n}\n}\n}\nreturn{keys,paths,fields,groupPaths,columns,values:cells,cells,error:null};\n}\nfunction derivedFields(paths,valueColumns,separator){\nif(valueColumns.length===0)return paths.slice();\nconst out=[];\nfor(const path of paths){\nfor(const column of valueColumns)out.push(`${path}${separator}${column.colId}`);\n}\nreturn out;\n}\nfunction concatIndices(buckets){\nif(buckets.length===1)return buckets[0]||new Uint32Array(0);\nlet n=0;\nfor(const b of buckets)n+=b?b.length:0;\nconst out=new Uint32Array(n);\nlet at=0;\nfor(const b of buckets){\nif(!b||b.length===0)continue;\nout.set(b,at);\nat+=b.length;\n}\nreturn out;\n}\n});\n__def(\"packages/core/src/compute/reference.js\",function(__exports,__req){\n'use strict';\nObject.defineProperty(__exports,\"referenceValue\",{enumerable:true,get:function(){return referenceValue;}});\nObject.defineProperty(__exports,\"referenceSort\",{enumerable:true,get:function(){return referenceSort;}});\nObject.defineProperty(__exports,\"referenceFilter\",{enumerable:true,get:function(){return referenceFilter;}});\nObject.defineProperty(__exports,\"referencePasses\",{enumerable:true,get:function(){return referencePasses;}});\nObject.defineProperty(__exports,\"referenceGroup\",{enumerable:true,get:function(){return referenceGroup;}});\nObject.defineProperty(__exports,\"referenceTotal\",{enumerable:true,get:function(){return referenceTotal;}});\nconst __m0=__req(\"packages/core/src/internal/util.js\");\nconst getPath=__m0[\"getPath\"];\nconst __m1=__req(\"packages/core/src/compute/handle.js\");\nconst isMissing=__m1[\"isMissing\"];\nconst valueComparator=__m1[\"valueComparator\"];\nconst __m2=__req(\"packages/core/src/compute/filter.js\");\nconst testValue=__m2[\"testValue\"];\nconst KEY_SEPARATOR=String.fromCharCode(0x1f);\nconst NULL_MARKER=String.fromCharCode(0x00);\nfunction referenceValue(row,col){\nconst v=col.includes('.')?getPath(row,col):(row==null?undefined:row[col]);\nreturn v===undefined?null:v;\n}\nfunction referenceSort(rows,entries,opts={}){\nconst list=entries||[];\nlet order=rows.map((_,i)=>i);\nif(list.length===0)return order;\nfor(let e=list.length-1;e>=0;e--){\norder=referenceSortOne(rows,order,list[e],opts);\n}\nreturn order;\n}\nfunction referenceSortOne(rows,order,entry,opts){\nconst locale=entry.locale!==undefined?entry.locale:opts.locale;\nconst base=valueComparator(locale);\nconst descending=entry.descending!==undefined?!!entry.descending:entry.dir==='desc';\nconst present=[];\nconst absent=[];\nfor(const i of order){\nconst v=referenceValue(rows[i],entry.col);\nif(isMissing(v))absent.push(i);else present.push(i);\n}\nconst position=new Map();\nfor(let p=0;p<present.length;p++)position.set(present[p],p);\nconst compare=(a,b)=>{\nconst va=referenceValue(rows[a],entry.col);\nconst vb=referenceValue(rows[b],entry.col);\nlet c;\nif(typeof entry.compare==='function'){\nc=entry.compare(va,vb,rows[a],rows[b],descending);\nif(descending)c=-c;\n}else{\nc=descending?base(vb,va):base(va,vb);\n}\nreturn c!==0?c:position.get(a)-position.get(b);\n};\npresent.sort(compare);\nreturn entry.nullsFirst?absent.concat(present):present.concat(absent);\n}\nfunction referenceFilter(rows,filters,opts={}){\nconst out=[];\nfor(let i=0;i<rows.length;i++){\nif(referencePasses(rows[i],filters,opts,i))out.push(i);\n}\nreturn out;\n}\nfunction referencePasses(row,node,opts,index){\nif(!node)return true;\nif(Array.isArray(node.conditions)){\nconst children=node.conditions.filter((c)=>c!=null);\nif(children.length===0)return true;\nif(node.op==='or')return children.some((c)=>referencePasses(row,c,opts,index));\nconst all=children.every((c)=>referencePasses(row,c,opts,index));\nreturn node.op==='not'?!all:all;\n}\nif(node.col===undefined&&typeof opts.custom==='function')return!!opts.custom(node,row,index);\nreturn testValue(referenceValue(row,node.col),node,opts.locale);\n}\nfunction referenceGroup(rows,cols,order){\nconst source=order||rows.map((_,i)=>i);\nconst seen=new Map();\nconst keys=[];\nconst buckets=[];\nfor(const i of source){\nconst tuple=cols.map((col)=>referenceValue(rows[i],col));\nconst key=tuple\n.map((v)=>(v===null||v===undefined?NULL_MARKER:String(v)))\n.join(KEY_SEPARATOR);\nlet at=seen.get(key);\nif(at===undefined){\nat=keys.length;\nseen.set(key,at);\nkeys.push(tuple);\nbuckets.push([]);\n}\nbuckets[at].push(i);\n}\nreturn{keys,buckets};\n}\nfunction referenceTotal(values,fn,opts={}){\nconst cmp=valueComparator(opts.locale);\nconst live=values.filter((v)=>!isMissing(v));\nconst numbers=live.map(toNumberOrNull).filter((v)=>v!==null);\nswitch(fn){\ncase'count':return values.length;\ncase'countValues':return live.length;\ncase'sum':return numbers.reduce((a,b)=>a+b,0);\ncase'avg':return live.length===0?null:numbers.reduce((a,b)=>a+b,0)/live.length;\ncase'min':return live.length===0?null:live.reduce((a,b)=>(cmp(b,a)<0?b:a));\ncase'max':return live.length===0?null:live.reduce((a,b)=>(cmp(b,a)>0?b:a));\ncase'first':return values.length===0?null:normaliseNull(values[0]);\ncase'last':return values.length===0?null:normaliseNull(values[values.length-1]);\ndefault:return null;\n}\n}\nfunction toNumberOrNull(v){\nif(typeof v==='number')return Number.isNaN(v)?null:v;\nif(v===null||v===undefined||v===''||typeof v==='boolean')return null;\nif(v instanceof Date)return v.getTime();\nconst n=Number(v);\nreturn Number.isNaN(n)?null:n;\n}\nfunction normaliseNull(v){\nreturn v===undefined?null:v;\n}\n});\n__def(\"packages/core/src/compute/index.js\",function(__exports,__req){\n'use strict';\nconst __m0=__req(\"packages/core/src/compute/sort.js\");\nObject.defineProperty(__exports,\"sortColumn\",{enumerable:true,get:function(){return __m0[\"sortColumn\"];}});\nObject.defineProperty(__exports,\"sortMulti\",{enumerable:true,get:function(){return __m0[\"sortMulti\"];}});\nObject.defineProperty(__exports,\"radixSortFloat64\",{enumerable:true,get:function(){return __m0[\"radixSortFloat64\"];}});\nObject.defineProperty(__exports,\"radixSortInt32\",{enumerable:true,get:function(){return __m0[\"radixSortInt32\"];}});\nObject.defineProperty(__exports,\"rankSortDictionary\",{enumerable:true,get:function(){return __m0[\"rankSortDictionary\"];}});\nObject.defineProperty(__exports,\"mergeSortComparator\",{enumerable:true,get:function(){return __m0[\"mergeSortComparator\"];}});\nconst __m1=__req(\"packages/core/src/compute/filter.js\");\nObject.defineProperty(__exports,\"evaluateFilters\",{enumerable:true,get:function(){return __m1[\"evaluateFilters\"];}});\nObject.defineProperty(__exports,\"evaluateCondition\",{enumerable:true,get:function(){return __m1[\"evaluateCondition\"];}});\nObject.defineProperty(__exports,\"compact\",{enumerable:true,get:function(){return __m1[\"compact\"];}});\nObject.defineProperty(__exports,\"testValue\",{enumerable:true,get:function(){return __m1[\"testValue\"];}});\nObject.defineProperty(__exports,\"compilePredicate\",{enumerable:true,get:function(){return __m1[\"compilePredicate\"];}});\nObject.defineProperty(__exports,\"releaseMask\",{enumerable:true,get:function(){return __m1[\"releaseMask\"];}});\nObject.defineProperty(__exports,\"pruneColumn\",{enumerable:true,get:function(){return __m1[\"pruneColumn\"];}});\nObject.defineProperty(__exports,\"mentionsColumn\",{enumerable:true,get:function(){return __m1[\"mentionsColumn\"];}});\nconst __m2=__req(\"packages/core/src/compute/group.js\");\nObject.defineProperty(__exports,\"groupByColumns\",{enumerable:true,get:function(){return __m2[\"groupByColumns\"];}});\nObject.defineProperty(__exports,\"packKeys\",{enumerable:true,get:function(){return __m2[\"packKeys\"];}});\nconst __m3=__req(\"packages/core/src/compute/facet.js\");\nObject.defineProperty(__exports,\"facet\",{enumerable:true,get:function(){return __m3[\"facet\"];}});\nObject.defineProperty(__exports,\"computeBounds\",{enumerable:true,get:function(){return __m3[\"computeBounds\"];}});\nObject.defineProperty(__exports,\"countInto\",{enumerable:true,get:function(){return __m3[\"countInto\"];}});\nObject.defineProperty(__exports,\"bucketOf\",{enumerable:true,get:function(){return __m3[\"bucketOf\"];}});\nObject.defineProperty(__exports,\"facetKind\",{enumerable:true,get:function(){return __m3[\"facetKind\"];}});\nObject.defineProperty(__exports,\"cardinalityOf\",{enumerable:true,get:function(){return __m3[\"cardinalityOf\"];}});\nObject.defineProperty(__exports,\"pickGranularity\",{enumerable:true,get:function(){return __m3[\"pickGranularity\"];}});\nObject.defineProperty(__exports,\"floorTo\",{enumerable:true,get:function(){return __m3[\"floorTo\"];}});\nObject.defineProperty(__exports,\"advance\",{enumerable:true,get:function(){return __m3[\"advance\"];}});\nObject.defineProperty(__exports,\"STRATEGIES\",{enumerable:true,get:function(){return __m3[\"STRATEGIES\"];}});\nObject.defineProperty(__exports,\"GRANULARITIES\",{enumerable:true,get:function(){return __m3[\"GRANULARITIES\"];}});\nObject.defineProperty(__exports,\"DEFAULT_BUCKETS\",{enumerable:true,get:function(){return __m3[\"DEFAULT_BUCKETS\"];}});\nObject.defineProperty(__exports,\"DEFAULT_CARDINALITY_LIMIT\",{enumerable:true,get:function(){return __m3[\"DEFAULT_CARDINALITY_LIMIT\"];}});\nObject.defineProperty(__exports,\"QUANTILE_SAMPLE\",{enumerable:true,get:function(){return __m3[\"QUANTILE_SAMPLE\"];}});\nconst __m4=__req(\"packages/core/src/compute/total.js\");\nObject.defineProperty(__exports,\"TOTAL_FNS\",{enumerable:true,get:function(){return __m4[\"TOTAL_FNS\"];}});\nObject.defineProperty(__exports,\"TOTAL_LABELS\",{enumerable:true,get:function(){return __m4[\"TOTAL_LABELS\"];}});\nObject.defineProperty(__exports,\"totalLabel\",{enumerable:true,get:function(){return __m4[\"totalLabel\"];}});\nObject.defineProperty(__exports,\"total\",{enumerable:true,get:function(){return __m4[\"total\"];}});\nObject.defineProperty(__exports,\"collectValues\",{enumerable:true,get:function(){return __m4[\"collectValues\"];}});\nconst __m5=__req(\"packages/core/src/compute/pivot.js\");\nObject.defineProperty(__exports,\"pivot\",{enumerable:true,get:function(){return __m5[\"pivot\"];}});\nObject.defineProperty(__exports,\"resolvePivotKeys\",{enumerable:true,get:function(){return __m5[\"resolvePivotKeys\"];}});\nObject.defineProperty(__exports,\"pivotKey\",{enumerable:true,get:function(){return __m5[\"pivotKey\"];}});\nObject.defineProperty(__exports,\"joinPath\",{enumerable:true,get:function(){return __m5[\"joinPath\"];}});\nObject.defineProperty(__exports,\"KEY_DELIMITER\",{enumerable:true,get:function(){return __m5[\"KEY_DELIMITER\"];}});\nObject.defineProperty(__exports,\"DEFAULT_PATH_SEPARATOR\",{enumerable:true,get:function(){return __m5[\"DEFAULT_PATH_SEPARATOR\"];}});\nObject.defineProperty(__exports,\"DEFAULT_MAX_COLUMNS\",{enumerable:true,get:function(){return __m5[\"DEFAULT_MAX_COLUMNS\"];}});\nconst __m6=__req(\"packages/core/src/compute/reference.js\");\nObject.defineProperty(__exports,\"referenceSort\",{enumerable:true,get:function(){return __m6[\"referenceSort\"];}});\nObject.defineProperty(__exports,\"referenceFilter\",{enumerable:true,get:function(){return __m6[\"referenceFilter\"];}});\nObject.defineProperty(__exports,\"referenceGroup\",{enumerable:true,get:function(){return __m6[\"referenceGroup\"];}});\nObject.defineProperty(__exports,\"referenceTotal\",{enumerable:true,get:function(){return __m6[\"referenceTotal\"];}});\nObject.defineProperty(__exports,\"referencePasses\",{enumerable:true,get:function(){return __m6[\"referencePasses\"];}});\nObject.defineProperty(__exports,\"referenceValue\",{enumerable:true,get:function(){return __m6[\"referenceValue\"];}});\nconst __m7=__req(\"packages/core/src/compute/handle.js\");\nObject.defineProperty(__exports,\"identity\",{enumerable:true,get:function(){return __m7[\"identity\"];}});\nObject.defineProperty(__exports,\"rowCount\",{enumerable:true,get:function(){return __m7[\"rowCount\"];}});\nObject.defineProperty(__exports,\"presenceReader\",{enumerable:true,get:function(){return __m7[\"presenceReader\"];}});\nObject.defineProperty(__exports,\"bitReader\",{enumerable:true,get:function(){return __m7[\"bitReader\"];}});\nObject.defineProperty(__exports,\"valueReader\",{enumerable:true,get:function(){return __m7[\"valueReader\"];}});\nObject.defineProperty(__exports,\"valueComparator\",{enumerable:true,get:function(){return __m7[\"valueComparator\"];}});\nObject.defineProperty(__exports,\"numericTotalOrder\",{enumerable:true,get:function(){return __m7[\"numericTotalOrder\"];}});\nObject.defineProperty(__exports,\"dictRanks\",{enumerable:true,get:function(){return __m7[\"dictRanks\"];}});\nObject.defineProperty(__exports,\"dictSize\",{enumerable:true,get:function(){return __m7[\"dictSize\"];}});\nObject.defineProperty(__exports,\"dictValue\",{enumerable:true,get:function(){return __m7[\"dictValue\"];}});\nObject.defineProperty(__exports,\"multiValue\",{enumerable:true,get:function(){return __m7[\"multiValue\"];}});\nObject.defineProperty(__exports,\"isMissing\",{enumerable:true,get:function(){return __m7[\"isMissing\"];}});\n});\n__def(\"packages/worker/src/kernel.js\",function(__exports,__req){\n'use strict';\nObject.defineProperty(__exports,\"loadCompute\",{enumerable:true,get:function(){return loadCompute;}});\nObject.defineProperty(__exports,\"setCompute\",{enumerable:true,get:function(){return setCompute;}});\nObject.defineProperty(__exports,\"dispatch\",{enumerable:true,get:function(){return dispatch;}});\nObject.defineProperty(__exports,\"handleMessage\",{enumerable:true,get:function(){return handleMessage;}});\nObject.defineProperty(__exports,\"installKernel\",{enumerable:true,get:function(){return installKernel;}});\nconst __m0=__req(\"packages/worker/src/transport.js\");\nconst PROTOCOL=__m0[\"PROTOCOL\"];\nconst OPS=__m0[\"OPS\"];\nconst CONTROL=__m0[\"CONTROL\"];\nconst ERRORS=__m0[\"ERRORS\"];\nconst unpackHandle=__m0[\"unpackHandle\"];\nconst unpackHandles=__m0[\"unpackHandles\"];\nconst createMaskPool=__m0[\"createMaskPool\"];\nconst collectTransfers=__m0[\"collectTransfers\"];\nlet computeModule=null;\nlet computePromise=null;\nlet computeError=null;\nasync function loadCompute(loader){\nif(computeModule)return computeModule;\nif(!computePromise){\nconst load=loader||(()=>Promise.resolve(__req(\"packages/core/src/compute/index.js\")));\ncomputePromise=Promise.resolve()\n.then(load)\n.then((mod)=>{computeModule=mod;return mod;})\n.catch((err)=>{\ncomputeError=err;\ncomputeModule=null;\nreturn null;\n});\n}\nreturn computePromise;\n}\nfunction setCompute(mod){\ncomputeModule=mod;\ncomputePromise=mod?Promise.resolve(mod):null;\ncomputeError=mod?null:computeError;\n}\nfunction filterContext(handles,count,locale){\nconst byId=new Map();\nfor(const h of handles)if(h)byId.set(h.id,h);\nreturn{\nhandle(colId){return byId.get(colId);},\ncount,\npool:createMaskPool(),\nlocale,\n};\n}\nfunction dispatch(request,compute){\nconst{op,args}=request;\nconst fn=compute[op];\nif(typeof fn!=='function'){\nconst err=new Error(`[lattice] compute kernel '${op}' is not exported`);\n(err).code=ERRORS.NO_KERNEL;\nthrow err;\n}\nswitch(op){\ncase OPS.SORT_COLUMN:\nreturn fn(unpackHandle(args.handle),args.order??null,args.opts||{});\ncase OPS.SORT_MULTI:{\nconst handles=unpackHandles(args.handles||[]);\nconst entries=(args.entries||[]).map((e)=>({\n...e,\nhandle:handles[e.index],\n}));\nreturn fn(handles,entries,args.order??null);\n}\ncase OPS.EVALUATE_FILTERS:\nreturn fn(args.filters,filterContext(unpackHandles(args.handles||[]),args.count,args.locale));\ncase OPS.COMPACT:\nreturn fn(args.mask,args.count,undefined);\ncase OPS.GROUP_BY_COLUMNS:\nreturn fn(unpackHandles(args.handles||[]),args.order??null,args.opts||{});\ncase OPS.TOTAL:\nreturn fn(unpackHandle(args.handle),args.indices??null,args.fn);\ncase OPS.PIVOT:\nreturn fn(unpackHandles(args.handles||[]),args.order??null,args.opts||{});\ncase OPS.FACET:\nreturn fn(unpackHandle(args.handle),args.indices??null,args.count,args.opts||{});\ndefault:{\nconst err=new Error(`[lattice] unknown worker op '${op}'`);\n(err).code=ERRORS.PROTOCOL;\nthrow err;\n}\n}\n}\nasync function handleMessage(message,opts={}){\nif(!message||message.lattice!==PROTOCOL)return null;\nconst{id,op}=message;\nif(op===CONTROL.CANCEL){\nopts.cancelled?.add(message.target);\nreturn null;\n}\nif(op===CONTROL.PING){\nreturn{reply:{lattice:PROTOCOL,id,ok:true,result:'pong'},transfer:[]};\n}\nconst compute=await loadCompute(opts.loader);\nif(!compute){\nreturn{\nreply:{\nlattice:PROTOCOL,\nid,\nok:false,\nerror:{\ncode:ERRORS.NO_COMPUTE,\nmessage:`[lattice] compute kernels unavailable in worker: ${computeError?computeError.message:'module not found'}`,\n},\n},\ntransfer:[],\n};\n}\nif(opts.cancelled?.has(id)){\nopts.cancelled.delete(id);\nreturn{reply:{lattice:PROTOCOL,id,ok:false,error:{code:ERRORS.ABORTED,message:'[lattice] request superseded'}},transfer:[]};\n}\ntry{\nconst result=dispatch(message,compute);\nif(opts.cancelled?.has(id)){\nopts.cancelled.delete(id);\nreturn{reply:{lattice:PROTOCOL,id,ok:false,error:{code:ERRORS.ABORTED,message:'[lattice] request superseded'}},transfer:[]};\n}\nreturn{reply:{lattice:PROTOCOL,id,ok:true,result},transfer:collectTransfers(result)};\n}catch(err){\nconst e=(err);\nreturn{\nreply:{\nlattice:PROTOCOL,\nid,\nok:false,\nerror:{code:e.code||ERRORS.KERNEL,message:e.message||String(err),stack:e.stack},\n},\ntransfer:[],\n};\n}\n}\nfunction installKernel(scope,opts={}){\nconst cancelled=new Set();\nconst onMessage=async(event)=>{\nconst outcome=await handleMessage(event.data,{loader:opts.loader,cancelled});\nif(!outcome)return;\nscope.postMessage(outcome.reply,outcome.transfer);\n};\nscope.addEventListener('message',onMessage);\nloadCompute(opts.loader).then((mod)=>{\nscope.postMessage({lattice:PROTOCOL,id:0,op:CONTROL.READY,compute:!!mod});\n});\nreturn()=>scope.removeEventListener('message',onMessage);\n}\n});\nvar __entry=__req(\"packages/worker/src/kernel.js\");\nroot[\"__latticeKernel\"]=__entry;\n})(typeof globalThis!=='undefined'?globalThis:this);\n__latticeKernel.installKernel(self);\n",{type:'classic'});
|
|
60893
63247
|
}catch(err){}
|
|
60894
63248
|
const __entry=__req("packages/dom/src/index.js");
|
|
60895
63249
|
export const
|
|
@@ -60930,6 +63284,8 @@ RADIX_PRESETS=__entry.RADIX_PRESETS,
|
|
|
60930
63284
|
parseRadix=__entry.parseRadix,
|
|
60931
63285
|
formatRadix=__entry.formatRadix,
|
|
60932
63286
|
createUnitType=__entry.createUnitType,
|
|
63287
|
+
registerUnitSystem=__entry.registerUnitSystem,
|
|
63288
|
+
defineUnit=__entry.defineUnit,
|
|
60933
63289
|
UNIT_SYSTEMS=__entry.UNIT_SYSTEMS,
|
|
60934
63290
|
parseUnit=__entry.parseUnit,
|
|
60935
63291
|
formatUnit=__entry.formatUnit,
|
|
@@ -61014,6 +63370,7 @@ alignGrids=__entry.alignGrids,
|
|
|
61014
63370
|
layoutState=__entry.layoutState,
|
|
61015
63371
|
ToolPanelDock=__entry.ToolPanelDock,
|
|
61016
63372
|
panelHost=__entry.panelHost,
|
|
63373
|
+
mountPanel=__entry.mountPanel,
|
|
61017
63374
|
CellEditController=__entry.CellEditController,
|
|
61018
63375
|
EditBar=__entry.EditBar,
|
|
61019
63376
|
HistoryBar=__entry.HistoryBar,
|