@unovis/ts 1.6.0-bigip.2 → 1.6.0-bigip.3

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.
@@ -22,9 +22,9 @@ export interface CrosshairConfigInterface<Datum> extends WithOptional<XYComponen
22
22
  /** An instance of the Tooltip component to be used with Crosshair. Default: `undefined` */
23
23
  tooltip?: Tooltip | undefined;
24
24
  /** Tooltip template accessor. The function is supposed to return either a valid HTML string or an HTMLElement.
25
- * When snapToData is false, datum will be undefined but nearestDatumIndex and data will be provided.
25
+ * When `snapToData` is `false`, `datum` will be `undefined` but `data` and `leftNearestDatumIndex` will be provided.
26
26
  * Default: `d => ''` */
27
- template?: (datum: Datum, x: number | Date, nearestDatumIndex?: number, data?: Datum[]) => string | HTMLElement;
27
+ template?: (datum: Datum, x: number | Date, data: Datum[], leftNearestDatumIndex: number) => string | HTMLElement;
28
28
  /** Hide Crosshair when the corresponding datum element is far from mouse pointer. Default: `true` */
29
29
  hideWhenFarFromPointer?: boolean;
30
30
  /** Distance in pixels to check in the hideWhenFarFromPointer condition. Default: `100` */
@@ -38,10 +38,10 @@ export interface CrosshairConfigInterface<Datum> extends WithOptional<XYComponen
38
38
  /** Custom function for setting up the crosshair circles, usually needed when `snapToData` is set to `false`.
39
39
  * The function receives the horizontal position of the crosshair (in the data space, not in pixels), the data array,
40
40
  * the `yScale` instance to help you calculate the correct vertical position of the circles, and the nearest datum index.
41
- * It has to return an array of the CrosshairCircle objects: `{ y: number; color: string; opacity?: number }[]`.
41
+ * It has to return an array of the `CrosshairCircle` objects: `{ y: number; color: string; opacity?: number }[]`.
42
42
  * Default: `undefined`
43
43
  */
44
- getCircles?: (x: number | Date, data: Datum[], yScale: ContinuousScale, nearestDatumIndex?: number) => CrosshairCircle[];
44
+ getCircles?: (x: number | Date, data: Datum[], yScale: ContinuousScale, leftNearestDatumIndex: number) => CrosshairCircle[];
45
45
  /** Callback function that is called when the crosshair is moved. Default: `undefined` */
46
46
  onCrosshairMove?: (x: number | Date, datum: Datum | undefined, datumIndex: number | undefined) => void;
47
47
  /** Force the crosshair to show at a specific position. Default: `undefined` */
@@ -1,6 +1,6 @@
1
1
  import { XYComponentDefaultConfig } from '../../core/xy-component/config.js';
2
2
 
3
- const CrosshairDefaultConfig = Object.assign(Object.assign({}, XYComponentDefaultConfig), { yStacked: undefined, baseline: null, duration: 100, tooltip: undefined, template: (d, x, nearestDatumIndex, data) => '', hideWhenFarFromPointer: true, hideWhenFarFromPointerDistance: 100, snapToData: true, getCircles: undefined, color: undefined, strokeColor: undefined, strokeWidth: undefined, onCrosshairMove: undefined, forceShowAt: undefined });
3
+ const CrosshairDefaultConfig = Object.assign(Object.assign({}, XYComponentDefaultConfig), { yStacked: undefined, baseline: null, duration: 100, tooltip: undefined, template: (d, x, data, leftNearestDatumIndex) => '', hideWhenFarFromPointer: true, hideWhenFarFromPointerDistance: 100, snapToData: true, getCircles: undefined, color: undefined, strokeColor: undefined, strokeWidth: undefined, onCrosshairMove: undefined, forceShowAt: undefined });
4
4
 
5
5
  export { CrosshairDefaultConfig };
6
6
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sources":["../../../src/components/crosshair/config.ts"],"sourcesContent":["import { XYComponentConfigInterface, XYComponentDefaultConfig } from 'core/xy-component/config'\nimport { Tooltip } from 'components/tooltip'\n\n// Types\nimport { NumericAccessor, ColorAccessor } from 'types/accessor'\nimport { ContinuousScale } from 'types/scale'\nimport { WithOptional } from 'types/misc'\nimport { CrosshairCircle } from './types'\n\n// We extend partial XY config interface because x and y properties are optional for Crosshair\nexport interface CrosshairConfigInterface<Datum> extends WithOptional<XYComponentConfigInterface<Datum>, 'x' | 'y'> {\n /** Optional accessor function for getting the values along the X axis. Default: `undefined` */\n x?: NumericAccessor<Datum>;\n /** Optional single of multiple accessor functions for getting the values along the Y axis. Default: `undefined` */\n y?: NumericAccessor<Datum> | NumericAccessor<Datum>[];\n /** Optional color array or color accessor function for crosshair circles. Default: `d => d.color` */\n color?: ColorAccessor<Datum>;\n /** Optional stroke color accessor function for crosshair circles. Default: `undefined` */\n strokeColor?: ColorAccessor<Datum>;\n /** Optional stroke width for crosshair circles. Default: `undefined` */\n strokeWidth?: NumericAccessor<Datum>;\n /** Separate array of accessors for stacked components (eg StackedBar, Area). Default: `undefined` */\n yStacked?: NumericAccessor<Datum>[];\n /** Baseline accessor function for stacked values, useful with stacked areas. Default: `null` */\n baseline?: NumericAccessor<Datum>;\n /** An instance of the Tooltip component to be used with Crosshair. Default: `undefined` */\n tooltip?: Tooltip | undefined;\n /** Tooltip template accessor. The function is supposed to return either a valid HTML string or an HTMLElement.\n * When snapToData is false, datum will be undefined but nearestDatumIndex and data will be provided.\n * Default: `d => ''` */\n template?: (datum: Datum, x: number | Date, nearestDatumIndex?: number, data?: Datum[]) => string | HTMLElement;\n /** Hide Crosshair when the corresponding datum element is far from mouse pointer. Default: `true` */\n hideWhenFarFromPointer?: boolean;\n /** Distance in pixels to check in the hideWhenFarFromPointer condition. Default: `100` */\n hideWhenFarFromPointerDistance?: number;\n /** Snap to the nearest data point.\n * If disabled, the tooltip template will receive only the horizontal position of the crosshair and you'll be responsible\n * for getting the underlying data records and crosshair circles (see the `getCircles` configuration option).\n * Default: `true`\n */\n snapToData?: boolean;\n /** Custom function for setting up the crosshair circles, usually needed when `snapToData` is set to `false`.\n * The function receives the horizontal position of the crosshair (in the data space, not in pixels), the data array,\n * the `yScale` instance to help you calculate the correct vertical position of the circles, and the nearest datum index.\n * It has to return an array of the CrosshairCircle objects: `{ y: number; color: string; opacity?: number }[]`.\n * Default: `undefined`\n */\n getCircles?: (x: number | Date, data: Datum[], yScale: ContinuousScale, nearestDatumIndex?: number) => CrosshairCircle[];\n /** Callback function that is called when the crosshair is moved. Default: `undefined` */\n onCrosshairMove?: (x: number | Date, datum: Datum | undefined, datumIndex: number | undefined) => void;\n /** Force the crosshair to show at a specific position. Default: `undefined` */\n forceShowAt?: number | Date;\n}\n\nexport const CrosshairDefaultConfig: CrosshairConfigInterface<unknown> = {\n ...XYComponentDefaultConfig,\n yStacked: undefined,\n baseline: null,\n duration: 100,\n tooltip: undefined,\n template: <Datum>(d: Datum | undefined, x: number | Date, nearestDatumIndex?: number, data?: Datum[]): string => '',\n hideWhenFarFromPointer: true,\n hideWhenFarFromPointerDistance: 100,\n snapToData: true,\n getCircles: undefined,\n color: undefined,\n strokeColor: undefined,\n strokeWidth: undefined,\n onCrosshairMove: undefined,\n forceShowAt: undefined,\n}\n\n"],"names":[],"mappings":";;AAsDO,MAAM,sBAAsB,GAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAC9B,wBAAwB,CAC3B,EAAA,EAAA,QAAQ,EAAE,SAAS,EACnB,QAAQ,EAAE,IAAI,EACd,QAAQ,EAAE,GAAG,EACb,OAAO,EAAE,SAAS,EAClB,QAAQ,EAAE,CAAQ,CAAoB,EAAE,CAAgB,EAAE,iBAA0B,EAAE,IAAc,KAAa,EAAE,EACnH,sBAAsB,EAAE,IAAI,EAC5B,8BAA8B,EAAE,GAAG,EACnC,UAAU,EAAE,IAAI,EAChB,UAAU,EAAE,SAAS,EACrB,KAAK,EAAE,SAAS,EAChB,WAAW,EAAE,SAAS,EACtB,WAAW,EAAE,SAAS,EACtB,eAAe,EAAE,SAAS,EAC1B,WAAW,EAAE,SAAS;;;;"}
1
+ {"version":3,"file":"config.js","sources":["../../../src/components/crosshair/config.ts"],"sourcesContent":["import { XYComponentConfigInterface, XYComponentDefaultConfig } from 'core/xy-component/config'\nimport { Tooltip } from 'components/tooltip'\n\n// Types\nimport { NumericAccessor, ColorAccessor } from 'types/accessor'\nimport { ContinuousScale } from 'types/scale'\nimport { WithOptional } from 'types/misc'\nimport { CrosshairCircle } from './types'\n\n// We extend partial XY config interface because x and y properties are optional for Crosshair\nexport interface CrosshairConfigInterface<Datum> extends WithOptional<XYComponentConfigInterface<Datum>, 'x' | 'y'> {\n /** Optional accessor function for getting the values along the X axis. Default: `undefined` */\n x?: NumericAccessor<Datum>;\n /** Optional single of multiple accessor functions for getting the values along the Y axis. Default: `undefined` */\n y?: NumericAccessor<Datum> | NumericAccessor<Datum>[];\n /** Optional color array or color accessor function for crosshair circles. Default: `d => d.color` */\n color?: ColorAccessor<Datum>;\n /** Optional stroke color accessor function for crosshair circles. Default: `undefined` */\n strokeColor?: ColorAccessor<Datum>;\n /** Optional stroke width for crosshair circles. Default: `undefined` */\n strokeWidth?: NumericAccessor<Datum>;\n /** Separate array of accessors for stacked components (eg StackedBar, Area). Default: `undefined` */\n yStacked?: NumericAccessor<Datum>[];\n /** Baseline accessor function for stacked values, useful with stacked areas. Default: `null` */\n baseline?: NumericAccessor<Datum>;\n /** An instance of the Tooltip component to be used with Crosshair. Default: `undefined` */\n tooltip?: Tooltip | undefined;\n // TODO: Change `datum` type to `Datum | undefined`. This may break the build for many people, so we might want to do it in version 2.0\n /** Tooltip template accessor. The function is supposed to return either a valid HTML string or an HTMLElement.\n * When `snapToData` is `false`, `datum` will be `undefined` but `data` and `leftNearestDatumIndex` will be provided.\n * Default: `d => ''` */\n template?: (datum: Datum, x: number | Date, data: Datum[], leftNearestDatumIndex: number) => string | HTMLElement;\n /** Hide Crosshair when the corresponding datum element is far from mouse pointer. Default: `true` */\n hideWhenFarFromPointer?: boolean;\n /** Distance in pixels to check in the hideWhenFarFromPointer condition. Default: `100` */\n hideWhenFarFromPointerDistance?: number;\n /** Snap to the nearest data point.\n * If disabled, the tooltip template will receive only the horizontal position of the crosshair and you'll be responsible\n * for getting the underlying data records and crosshair circles (see the `getCircles` configuration option).\n * Default: `true`\n */\n snapToData?: boolean;\n /** Custom function for setting up the crosshair circles, usually needed when `snapToData` is set to `false`.\n * The function receives the horizontal position of the crosshair (in the data space, not in pixels), the data array,\n * the `yScale` instance to help you calculate the correct vertical position of the circles, and the nearest datum index.\n * It has to return an array of the `CrosshairCircle` objects: `{ y: number; color: string; opacity?: number }[]`.\n * Default: `undefined`\n */\n getCircles?: (x: number | Date, data: Datum[], yScale: ContinuousScale, leftNearestDatumIndex: number) => CrosshairCircle[];\n /** Callback function that is called when the crosshair is moved. Default: `undefined` */\n onCrosshairMove?: (x: number | Date, datum: Datum | undefined, datumIndex: number | undefined) => void;\n /** Force the crosshair to show at a specific position. Default: `undefined` */\n forceShowAt?: number | Date;\n}\n\nexport const CrosshairDefaultConfig: CrosshairConfigInterface<unknown> = {\n ...XYComponentDefaultConfig,\n yStacked: undefined,\n baseline: null,\n duration: 100,\n tooltip: undefined,\n template: <Datum>(d: Datum, x: number | Date, data: Datum[], leftNearestDatumIndex: number): string => '',\n hideWhenFarFromPointer: true,\n hideWhenFarFromPointerDistance: 100,\n snapToData: true,\n getCircles: undefined,\n color: undefined,\n strokeColor: undefined,\n strokeWidth: undefined,\n onCrosshairMove: undefined,\n forceShowAt: undefined,\n}\n\n"],"names":[],"mappings":";;AAuDO,MAAM,sBAAsB,GAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAC9B,wBAAwB,CAC3B,EAAA,EAAA,QAAQ,EAAE,SAAS,EACnB,QAAQ,EAAE,IAAI,EACd,QAAQ,EAAE,GAAG,EACb,OAAO,EAAE,SAAS,EAClB,QAAQ,EAAE,CAAQ,CAAQ,EAAE,CAAgB,EAAE,IAAa,EAAE,qBAA6B,KAAa,EAAE,EACzG,sBAAsB,EAAE,IAAI,EAC5B,8BAA8B,EAAE,GAAG,EACnC,UAAU,EAAE,IAAI,EAChB,UAAU,EAAE,SAAS,EACrB,KAAK,EAAE,SAAS,EAChB,WAAW,EAAE,SAAS,EACtB,WAAW,EAAE,SAAS,EACtB,eAAe,EAAE,SAAS,EAC1B,WAAW,EAAE,SAAS;;;;"}
@@ -28,7 +28,7 @@ export declare class Crosshair<Datum> extends XYComponentCore<Datum, CrosshairCo
28
28
  hide(): void;
29
29
  _onMouseMove(event: MouseEvent): void;
30
30
  _onMouseOut(): void;
31
- _showTooltip(datum: Datum, xValue: number, pos: [number, number], nearestDatumIndex?: number): void;
31
+ _showTooltip(datum: Datum, xValue: number, pos: [number, number], nearestDatumIndex: number | undefined): void;
32
32
  _hideTooltip(): void;
33
33
  getYDataExtent(): number[];
34
34
  private getCircleData;
@@ -58,27 +58,23 @@ class Crosshair extends XYComponentCore {
58
58
  const isForceShowAtDefined = config.forceShowAt !== undefined;
59
59
  const xPx = isForceShowAtDefined ? this.xScale(config.forceShowAt) : this._xPx;
60
60
  const xValue = this.xScale.invert(xPx);
61
- let datum;
62
- let datumIndex;
61
+ const leftNearestDatumIndex = (((_a = datamodel.data) === null || _a === void 0 ? void 0 : _a.length) && this.accessors.x)
62
+ ? datamodel.data.indexOf(getNearest(datamodel.data, xValue, this.accessors.x, FindNearestDirection.Left)) : undefined;
63
+ let nearestDatum;
63
64
  let nearestDatumIndex;
64
- // Always calculate the nearest datum index for template and getCircles functions
65
- if (((_a = datamodel.data) === null || _a === void 0 ? void 0 : _a.length) && this.accessors.x) {
66
- const nearestDatum = getNearest(datamodel.data, xValue, this.accessors.x, FindNearestDirection.Left);
67
- nearestDatumIndex = datamodel.data.indexOf(nearestDatum);
68
- }
69
65
  if (config.snapToData) {
70
66
  if (!this.accessors.y && !this.accessors.yStacked && ((_b = datamodel.data) === null || _b === void 0 ? void 0 : _b.length)) {
71
67
  console.warn('Unovis | Crosshair: Y accessors have not been configured. Please check if they\'re present in the configuration object');
72
68
  }
73
- datum = getNearest(datamodel.data, xValue, this.accessors.x);
74
- datumIndex = datamodel.data.indexOf(datum);
75
- if (!datum)
69
+ nearestDatum = getNearest(datamodel.data, xValue, this.accessors.x);
70
+ nearestDatumIndex = datamodel.data.indexOf(nearestDatum);
71
+ if (!nearestDatum)
76
72
  return;
77
73
  }
78
74
  const xRange = this.xScale.range();
79
75
  const yRange = this.yScale.range();
80
76
  const xClamped = config.snapToData
81
- ? clamp(Math.round(this.xScale(getNumber(datum, this.accessors.x, datumIndex))), 0, this._width)
77
+ ? clamp(Math.round(this.xScale(getNumber(nearestDatum, this.accessors.x, nearestDatumIndex))), 0, this._width)
82
78
  : clamp(xPx, xRange[0], xRange[1]);
83
79
  const isCrosshairWithinXRange = (xPx >= xRange[0]) && (xPx <= xRange[1]);
84
80
  const isCrosshairWithinYRange = (this._yPx >= yRange[1]) && (this._yPx <= yRange[0]);
@@ -98,18 +94,18 @@ class Crosshair extends XYComponentCore {
98
94
  const screenX = (isContainerBody ? xPx + containerRect.left : xPx) + this._containerMargin.left;
99
95
  const screenY = this._height / 2 + (isContainerBody ? containerRect.top : 0);
100
96
  const pos = [screenX, screenY];
101
- this._showTooltip(datum, xValue, pos, nearestDatumIndex);
97
+ this._showTooltip(nearestDatum, xValue, pos, leftNearestDatumIndex);
102
98
  }
103
99
  else if (this._mouseEvent) {
104
100
  const pos = (isContainerBody ? [this._mouseEvent.clientX, this._mouseEvent.clientY] : pointer(this._mouseEvent, container));
105
- this._showTooltip(datum, xValue, pos, nearestDatumIndex);
101
+ this._showTooltip(nearestDatum, xValue, pos, leftNearestDatumIndex);
106
102
  }
107
103
  }
108
104
  else
109
105
  this._hideTooltip();
110
106
  // Trigger `onCrosshairMove` if the render was triggered by a mouse move event
111
107
  if (this._mouseEvent) {
112
- (_d = config.onCrosshairMove) === null || _d === void 0 ? void 0 : _d.call(config, shouldShow ? this.xScale.invert(this._xPx) : undefined, datum, datumIndex);
108
+ (_d = config.onCrosshairMove) === null || _d === void 0 ? void 0 : _d.call(config, shouldShow ? this.xScale.invert(this._xPx) : undefined, nearestDatum, nearestDatumIndex);
113
109
  this._mouseEvent = undefined;
114
110
  }
115
111
  // When `config.forceShowAt` becomes undefined, the component will "jump" to `this._xPx` which is set to the last mouse position.
@@ -129,8 +125,8 @@ class Crosshair extends XYComponentCore {
129
125
  .attr('x1', xClamped)
130
126
  .attr('x2', xClamped);
131
127
  const circleData = isFunction(config.getCircles)
132
- ? config.getCircles(xValue, datamodel.data, this.yScale, nearestDatumIndex)
133
- : this.getCircleData(datum, datumIndex);
128
+ ? config.getCircles(xValue, datamodel.data, this.yScale, leftNearestDatumIndex)
129
+ : this.getCircleData(nearestDatum, nearestDatumIndex);
134
130
  const circles = this.g
135
131
  .selectAll('circle')
136
132
  .data(circleData, (d, i) => { var _a; return (_a = d.id) !== null && _a !== void 0 ? _a : i; });
@@ -184,7 +180,7 @@ class Crosshair extends XYComponentCore {
184
180
  if (!tooltip || !pos)
185
181
  return;
186
182
  const [x, y] = pos;
187
- const content = config.template(datum, xValue, nearestDatumIndex, datamodel.data);
183
+ const content = config.template(datum, xValue, datamodel.data, nearestDatumIndex);
188
184
  // Force set `followCursor` to `true` because we don't want Crosshair's tooltip to be hoverable
189
185
  tooltip.config.followCursor = true;
190
186
  // Set tooltip placement based on Crosshair's position (left / right)
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/components/crosshair/index.ts"],"sourcesContent":["import { Selection, pointer } from 'd3-selection'\nimport { easeLinear } from 'd3-ease'\n\n// Core\nimport { XYComponentCore } from 'core/xy-component'\nimport { Tooltip } from 'components/tooltip'\n\n// Utils\nimport { isNumber, isArray, getNumber, clamp, getStackedValues, getNearest, isFunction } from 'utils/data'\nimport { smartTransition } from 'utils/d3'\nimport { getColor } from 'utils/color'\n\n// Types\nimport { Position } from 'types/position'\nimport { FindNearestDirection } from 'types/data'\n\n// Local Types\nimport { CrosshairAccessors, CrosshairCircle } from './types'\n\n// Config\nimport { CrosshairDefaultConfig, CrosshairConfigInterface } from './config'\n\n// Styles\nimport * as s from './style'\n\n\nexport class Crosshair<Datum> extends XYComponentCore<Datum, CrosshairConfigInterface<Datum>> {\n static selectors = s\n clippable = true // Don't apply clipping path to this component. See XYContainer\n protected _defaultConfig = CrosshairDefaultConfig as CrosshairConfigInterface<Datum>\n public config: CrosshairConfigInterface<Datum> = this._defaultConfig\n container: Selection<SVGSVGElement, any, SVGSVGElement, any>\n line: Selection<SVGLineElement, any, SVGElement, any>\n private _xPx: number | undefined = undefined\n private _yPx: number | undefined = undefined\n private _mouseEvent: MouseEvent | undefined = undefined\n private _animFrameId: number = null\n\n /** Tooltip component to be used by Crosshair if not provided by the config.\n * This property is supposed to be set externally by a container component like XYContainer. */\n public tooltip: Tooltip\n\n /** Accessors passed externally (e.g. from XYContainer) */\n private _accessors: CrosshairAccessors<Datum> = {\n x: undefined,\n y: undefined,\n yStacked: undefined,\n baseline: undefined,\n }\n\n public set accessors (accessors: CrosshairAccessors<Datum>) { this._accessors = accessors }\n public get accessors (): CrosshairAccessors<Datum> {\n const { config } = this\n\n const hasConfig = !!(config.x || config.y || config.yStacked)\n const x = hasConfig ? config.x : this._accessors.x\n const yAcc = hasConfig ? config.y : this._accessors.y\n const y = yAcc ? (isArray(yAcc) ? yAcc : [yAcc]) : undefined\n const yStacked = hasConfig ? config.yStacked : this._accessors.yStacked\n const baseline = config.baseline ?? this._accessors.baseline\n\n return { x, y, yStacked, baseline }\n }\n\n constructor (config?: CrosshairConfigInterface<Datum>) {\n super()\n if (config) this.setConfig(config)\n\n this.g.style('opacity', 0)\n this.line = this.g.append('line')\n .attr('class', s.line)\n }\n\n setContainer (containerSvg: Selection<SVGSVGElement, unknown, SVGSVGElement, unknown>): void {\n // Set up mousemove event for Crosshair\n this.container = containerSvg\n this.container.on('mousemove.crosshair', this._onMouseMove.bind(this))\n this.container.on('mouseout.crosshair', this._onMouseOut.bind(this))\n }\n\n _render (customDuration?: number): void {\n const { config, datamodel } = this\n const duration = isNumber(customDuration) ? customDuration : config.duration\n const isForceShowAtDefined = config.forceShowAt !== undefined\n const xPx = isForceShowAtDefined ? this.xScale(config.forceShowAt) : this._xPx\n\n const xValue = this.xScale.invert(xPx) as number\n\n let datum: Datum | undefined\n let datumIndex: number | undefined\n let nearestDatumIndex: number | undefined\n\n // Always calculate the nearest datum index for template and getCircles functions\n if (datamodel.data?.length && this.accessors.x) {\n const nearestDatum = getNearest(datamodel.data, xValue, this.accessors.x, FindNearestDirection.Left)\n nearestDatumIndex = datamodel.data.indexOf(nearestDatum)\n }\n\n if (config.snapToData) {\n if (!this.accessors.y && !this.accessors.yStacked && datamodel.data?.length) {\n console.warn('Unovis | Crosshair: Y accessors have not been configured. Please check if they\\'re present in the configuration object')\n }\n\n datum = getNearest(datamodel.data, xValue, this.accessors.x)\n datumIndex = datamodel.data.indexOf(datum)\n if (!datum) return\n }\n\n const xRange = this.xScale.range()\n const yRange = this.yScale.range()\n const xClamped = config.snapToData\n ? clamp(Math.round(this.xScale(getNumber(datum, this.accessors.x, datumIndex))), 0, this._width)\n : clamp(xPx, xRange[0], xRange[1])\n\n const isCrosshairWithinXRange = (xPx >= xRange[0]) && (xPx <= xRange[1])\n const isCrosshairWithinYRange = (this._yPx >= yRange[1]) && (this._yPx <= yRange[0])\n let shouldShow = this._xPx ? isCrosshairWithinXRange && isCrosshairWithinYRange : isCrosshairWithinXRange\n\n // If the crosshair is far from the mouse pointer (usually when `snapToData` is `true` and data resolution is low), hide it\n if (config.hideWhenFarFromPointer && ((Math.abs(xClamped - (+xPx)) >= config.hideWhenFarFromPointerDistance))) {\n shouldShow = false\n }\n\n const tooltip = config.tooltip ?? this.tooltip\n if (shouldShow && tooltip) {\n const container = tooltip.getContainer() || this.container.node()\n const isContainerBody = tooltip.isContainerBody()\n if (isForceShowAtDefined) {\n // Convert SVG coordinates to screen coordinates\n const containerRect = this.container.node().getBoundingClientRect()\n\n // Use the actual left margin from the container\n const screenX = (isContainerBody ? xPx + containerRect.left : xPx) + this._containerMargin.left\n const screenY = this._height / 2 + (isContainerBody ? containerRect.top : 0)\n const pos = [screenX, screenY] as [number, number]\n this._showTooltip(datum, xValue, pos, nearestDatumIndex)\n } else if (this._mouseEvent) {\n const pos = (isContainerBody ? [this._mouseEvent.clientX, this._mouseEvent.clientY] : pointer(this._mouseEvent, container)) as [number, number]\n this._showTooltip(datum, xValue, pos, nearestDatumIndex)\n }\n } else this._hideTooltip()\n\n // Trigger `onCrosshairMove` if the render was triggered by a mouse move event\n if (this._mouseEvent) {\n config.onCrosshairMove?.(shouldShow ? this.xScale.invert(this._xPx) as number : undefined, datum, datumIndex)\n this._mouseEvent = undefined\n }\n\n // When `config.forceShowAt` becomes undefined, the component will \"jump\" to `this._xPx` which is set to the last mouse position.\n // This looks off, so we set `this._xPx` to `xPx` to make it look like the crosshair is rendered at the forced position\n if (isForceShowAtDefined) {\n this._xPx = undefined\n }\n\n smartTransition(this.g, duration)\n .style('opacity', shouldShow ? 1 : 0)\n\n this.line\n .attr('y1', 0)\n .attr('y1', this._height)\n\n // Don't render the crosshair if the xPx is not finite\n if (!isFinite(xClamped)) return\n\n smartTransition(this.line, duration, easeLinear)\n .attr('x1', xClamped)\n .attr('x2', xClamped)\n\n const circleData = isFunction(config.getCircles)\n ? config.getCircles(xValue, datamodel.data, this.yScale, nearestDatumIndex)\n : this.getCircleData(datum, datumIndex)\n\n const circles = this.g\n .selectAll<SVGCircleElement, CrosshairCircle>('circle')\n .data(circleData, (d, i) => d.id ?? i)\n\n const circlesEnter = circles.enter()\n .append('circle')\n .attr('class', s.circle)\n .attr('r', 0)\n .attr('cx', xClamped)\n .attr('cy', d => d.y)\n .style('fill', d => d.color)\n .style('stroke', d => d.strokeColor)\n .style('stroke-width', d => d.strokeWidth)\n\n smartTransition(circlesEnter.merge(circles), duration, easeLinear)\n .attr('cx', xClamped)\n .attr('cy', d => d.y)\n .attr('r', 4)\n .style('opacity', d => d.opacity)\n .style('fill', d => d.color)\n .style('stroke', d => d.strokeColor)\n .style('stroke-width', d => d.strokeWidth)\n\n circles.exit().remove()\n }\n\n hide (): void {\n this._onMouseOut()\n }\n\n _onMouseMove (event: MouseEvent): void {\n const { datamodel, element } = this\n if (!this.accessors.x && datamodel.data?.length) {\n console.warn('Unovis | Crosshair: X accessor function has not been configured. Please check if it\\'s present in the configuration object')\n }\n const [x, y] = pointer(event, element)\n this._xPx = x\n this._yPx = y\n this._mouseEvent = event\n\n window.cancelAnimationFrame(this._animFrameId)\n this._animFrameId = window.requestAnimationFrame(() => {\n this._render()\n })\n }\n\n _onMouseOut (): void {\n window.cancelAnimationFrame(this._animFrameId)\n this._animFrameId = window.requestAnimationFrame(() => {\n this._render()\n })\n }\n\n _showTooltip (datum: Datum, xValue: number, pos: [number, number], nearestDatumIndex?: number): void {\n const { config, datamodel } = this\n const tooltip = config.tooltip ?? this.tooltip\n if (!tooltip || !pos) return\n\n const [x, y] = pos\n const content = config.template(datum, xValue, nearestDatumIndex, datamodel.data)\n // Force set `followCursor` to `true` because we don't want Crosshair's tooltip to be hoverable\n tooltip.config.followCursor = true\n\n // Set tooltip placement based on Crosshair's position (left / right)\n if (!tooltip.config.horizontalPlacement || tooltip.config.horizontalPlacement === Position.Auto) {\n const xRelative = tooltip.isContainerBody() ? x - this.container.node().getBoundingClientRect().left : x\n tooltip.overrideHorizontalPlacement(xRelative > this._containerWidth / 2 ? Position.Left : Position.Right)\n }\n\n if (content) tooltip.show(content, { x, y })\n }\n\n _hideTooltip (): void {\n const { config } = this\n const tooltip = config.tooltip ?? this.tooltip\n tooltip?.hide()\n }\n\n // We don't want Crosshair to be be taken in to account in domain calculations\n getYDataExtent (): number[] {\n return [undefined, undefined]\n }\n\n private getCircleData (datum: Datum, datumIndex: number): CrosshairCircle[] {\n const { config } = this\n\n if (config.snapToData && datum) {\n const yAccessors = this.accessors.y ?? []\n const yStackedAccessors = this.accessors.yStacked ?? []\n const baselineValue = getNumber(datum, this.accessors.baseline, datumIndex) || 0\n const stackedValues: CrosshairCircle[] = getStackedValues(datum, datumIndex, ...yStackedAccessors)\n .map((value, index) => ({\n y: this.yScale(value + baselineValue),\n opacity: isNumber(getNumber(datum, yStackedAccessors[index], index)) ? 1 : 0,\n color: getColor(datum, config.color, index),\n strokeColor: config.strokeColor ? getColor(datum, config.strokeColor, index) : undefined,\n strokeWidth: config.strokeWidth ? getNumber(datum, config.strokeWidth, index) : undefined,\n }))\n\n const regularValues: CrosshairCircle[] = yAccessors\n .map((a, index) => {\n const value = getNumber(datum, a, datumIndex)\n return {\n y: this.yScale(value),\n opacity: isNumber(value) ? 1 : 0,\n color: getColor(datum, config.color, stackedValues.length + index),\n strokeColor: config.strokeColor ? getColor(datum, config.strokeColor, index) : undefined,\n strokeWidth: config.strokeWidth ? getNumber(datum, config.strokeWidth, index) : undefined,\n }\n })\n\n return stackedValues.concat(regularValues)\n }\n\n return []\n }\n}\n"],"names":["s.line","s.circle","s"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/components/crosshair/index.ts"],"sourcesContent":["import { Selection, pointer } from 'd3-selection'\nimport { easeLinear } from 'd3-ease'\n\n// Core\nimport { XYComponentCore } from 'core/xy-component'\nimport { Tooltip } from 'components/tooltip'\n\n// Utils\nimport { isNumber, isArray, getNumber, clamp, getStackedValues, getNearest, isFunction } from 'utils/data'\nimport { smartTransition } from 'utils/d3'\nimport { getColor } from 'utils/color'\n\n// Types\nimport { Position } from 'types/position'\nimport { FindNearestDirection } from 'types/data'\n\n// Local Types\nimport { CrosshairAccessors, CrosshairCircle } from './types'\n\n// Config\nimport { CrosshairDefaultConfig, CrosshairConfigInterface } from './config'\n\n// Styles\nimport * as s from './style'\n\n\nexport class Crosshair<Datum> extends XYComponentCore<Datum, CrosshairConfigInterface<Datum>> {\n static selectors = s\n clippable = true // Don't apply clipping path to this component. See XYContainer\n protected _defaultConfig = CrosshairDefaultConfig as CrosshairConfigInterface<Datum>\n public config: CrosshairConfigInterface<Datum> = this._defaultConfig\n container: Selection<SVGSVGElement, any, SVGSVGElement, any>\n line: Selection<SVGLineElement, any, SVGElement, any>\n private _xPx: number | undefined = undefined\n private _yPx: number | undefined = undefined\n private _mouseEvent: MouseEvent | undefined = undefined\n private _animFrameId: number = null\n\n /** Tooltip component to be used by Crosshair if not provided by the config.\n * This property is supposed to be set externally by a container component like XYContainer. */\n public tooltip: Tooltip\n\n /** Accessors passed externally (e.g. from XYContainer) */\n private _accessors: CrosshairAccessors<Datum> = {\n x: undefined,\n y: undefined,\n yStacked: undefined,\n baseline: undefined,\n }\n\n public set accessors (accessors: CrosshairAccessors<Datum>) { this._accessors = accessors }\n public get accessors (): CrosshairAccessors<Datum> {\n const { config } = this\n\n const hasConfig = !!(config.x || config.y || config.yStacked)\n const x = hasConfig ? config.x : this._accessors.x\n const yAcc = hasConfig ? config.y : this._accessors.y\n const y = yAcc ? (isArray(yAcc) ? yAcc : [yAcc]) : undefined\n const yStacked = hasConfig ? config.yStacked : this._accessors.yStacked\n const baseline = config.baseline ?? this._accessors.baseline\n\n return { x, y, yStacked, baseline }\n }\n\n constructor (config?: CrosshairConfigInterface<Datum>) {\n super()\n if (config) this.setConfig(config)\n\n this.g.style('opacity', 0)\n this.line = this.g.append('line')\n .attr('class', s.line)\n }\n\n setContainer (containerSvg: Selection<SVGSVGElement, unknown, SVGSVGElement, unknown>): void {\n // Set up mousemove event for Crosshair\n this.container = containerSvg\n this.container.on('mousemove.crosshair', this._onMouseMove.bind(this))\n this.container.on('mouseout.crosshair', this._onMouseOut.bind(this))\n }\n\n _render (customDuration?: number): void {\n const { config, datamodel } = this\n const duration = isNumber(customDuration) ? customDuration : config.duration\n const isForceShowAtDefined = config.forceShowAt !== undefined\n const xPx = isForceShowAtDefined ? this.xScale(config.forceShowAt) : this._xPx\n\n const xValue = this.xScale.invert(xPx) as number\n\n const leftNearestDatumIndex = (datamodel.data?.length && this.accessors.x)\n ? datamodel.data.indexOf(\n getNearest(datamodel.data, xValue, this.accessors.x, FindNearestDirection.Left)\n ) : undefined\n\n let nearestDatum: Datum | undefined\n let nearestDatumIndex: number | undefined\n if (config.snapToData) {\n if (!this.accessors.y && !this.accessors.yStacked && datamodel.data?.length) {\n console.warn('Unovis | Crosshair: Y accessors have not been configured. Please check if they\\'re present in the configuration object')\n }\n\n nearestDatum = getNearest(datamodel.data, xValue, this.accessors.x)\n nearestDatumIndex = datamodel.data.indexOf(nearestDatum)\n if (!nearestDatum) return\n }\n\n const xRange = this.xScale.range()\n const yRange = this.yScale.range()\n const xClamped = config.snapToData\n ? clamp(Math.round(this.xScale(getNumber(nearestDatum, this.accessors.x, nearestDatumIndex))), 0, this._width)\n : clamp(xPx, xRange[0], xRange[1])\n\n const isCrosshairWithinXRange = (xPx >= xRange[0]) && (xPx <= xRange[1])\n const isCrosshairWithinYRange = (this._yPx >= yRange[1]) && (this._yPx <= yRange[0])\n let shouldShow = this._xPx ? isCrosshairWithinXRange && isCrosshairWithinYRange : isCrosshairWithinXRange\n\n // If the crosshair is far from the mouse pointer (usually when `snapToData` is `true` and data resolution is low), hide it\n if (config.hideWhenFarFromPointer && ((Math.abs(xClamped - (+xPx)) >= config.hideWhenFarFromPointerDistance))) {\n shouldShow = false\n }\n\n const tooltip = config.tooltip ?? this.tooltip\n if (shouldShow && tooltip) {\n const container = tooltip.getContainer() || this.container.node()\n const isContainerBody = tooltip.isContainerBody()\n\n if (isForceShowAtDefined) {\n // Convert SVG coordinates to screen coordinates\n const containerRect = this.container.node().getBoundingClientRect()\n\n // Use the actual left margin from the container\n const screenX = (isContainerBody ? xPx + containerRect.left : xPx) + this._containerMargin.left\n const screenY = this._height / 2 + (isContainerBody ? containerRect.top : 0)\n const pos = [screenX, screenY] as [number, number]\n this._showTooltip(nearestDatum, xValue, pos, leftNearestDatumIndex)\n } else if (this._mouseEvent) {\n const pos = (isContainerBody ? [this._mouseEvent.clientX, this._mouseEvent.clientY] : pointer(this._mouseEvent, container)) as [number, number]\n this._showTooltip(nearestDatum, xValue, pos, leftNearestDatumIndex)\n }\n } else this._hideTooltip()\n\n // Trigger `onCrosshairMove` if the render was triggered by a mouse move event\n if (this._mouseEvent) {\n config.onCrosshairMove?.(shouldShow ? this.xScale.invert(this._xPx) as number : undefined, nearestDatum, nearestDatumIndex)\n this._mouseEvent = undefined\n }\n\n // When `config.forceShowAt` becomes undefined, the component will \"jump\" to `this._xPx` which is set to the last mouse position.\n // This looks off, so we set `this._xPx` to `xPx` to make it look like the crosshair is rendered at the forced position\n if (isForceShowAtDefined) {\n this._xPx = undefined\n }\n\n smartTransition(this.g, duration)\n .style('opacity', shouldShow ? 1 : 0)\n\n this.line\n .attr('y1', 0)\n .attr('y1', this._height)\n\n // Don't render the crosshair if the xPx is not finite\n if (!isFinite(xClamped)) return\n\n smartTransition(this.line, duration, easeLinear)\n .attr('x1', xClamped)\n .attr('x2', xClamped)\n\n const circleData = isFunction(config.getCircles)\n ? config.getCircles(xValue, datamodel.data, this.yScale, leftNearestDatumIndex)\n : this.getCircleData(nearestDatum, nearestDatumIndex)\n\n const circles = this.g\n .selectAll<SVGCircleElement, CrosshairCircle>('circle')\n .data(circleData, (d, i) => d.id ?? i)\n\n const circlesEnter = circles.enter()\n .append('circle')\n .attr('class', s.circle)\n .attr('r', 0)\n .attr('cx', xClamped)\n .attr('cy', d => d.y)\n .style('fill', d => d.color)\n .style('stroke', d => d.strokeColor)\n .style('stroke-width', d => d.strokeWidth)\n\n smartTransition(circlesEnter.merge(circles), duration, easeLinear)\n .attr('cx', xClamped)\n .attr('cy', d => d.y)\n .attr('r', 4)\n .style('opacity', d => d.opacity)\n .style('fill', d => d.color)\n .style('stroke', d => d.strokeColor)\n .style('stroke-width', d => d.strokeWidth)\n\n circles.exit().remove()\n }\n\n hide (): void {\n this._onMouseOut()\n }\n\n _onMouseMove (event: MouseEvent): void {\n const { datamodel, element } = this\n if (!this.accessors.x && datamodel.data?.length) {\n console.warn('Unovis | Crosshair: X accessor function has not been configured. Please check if it\\'s present in the configuration object')\n }\n const [x, y] = pointer(event, element)\n this._xPx = x\n this._yPx = y\n this._mouseEvent = event\n\n window.cancelAnimationFrame(this._animFrameId)\n this._animFrameId = window.requestAnimationFrame(() => {\n this._render()\n })\n }\n\n _onMouseOut (): void {\n window.cancelAnimationFrame(this._animFrameId)\n this._animFrameId = window.requestAnimationFrame(() => {\n this._render()\n })\n }\n\n _showTooltip (datum: Datum, xValue: number, pos: [number, number], nearestDatumIndex: number | undefined): void {\n const { config, datamodel } = this\n const tooltip = config.tooltip ?? this.tooltip\n if (!tooltip || !pos) return\n\n const [x, y] = pos\n const content = config.template(datum, xValue, datamodel.data, nearestDatumIndex)\n // Force set `followCursor` to `true` because we don't want Crosshair's tooltip to be hoverable\n tooltip.config.followCursor = true\n\n // Set tooltip placement based on Crosshair's position (left / right)\n if (!tooltip.config.horizontalPlacement || tooltip.config.horizontalPlacement === Position.Auto) {\n const xRelative = tooltip.isContainerBody() ? x - this.container.node().getBoundingClientRect().left : x\n tooltip.overrideHorizontalPlacement(xRelative > this._containerWidth / 2 ? Position.Left : Position.Right)\n }\n\n if (content) tooltip.show(content, { x, y })\n }\n\n _hideTooltip (): void {\n const { config } = this\n const tooltip = config.tooltip ?? this.tooltip\n tooltip?.hide()\n }\n\n // We don't want Crosshair to be be taken in to account in domain calculations\n getYDataExtent (): number[] {\n return [undefined, undefined]\n }\n\n private getCircleData (datum: Datum, datumIndex: number): CrosshairCircle[] {\n const { config } = this\n\n if (config.snapToData && datum) {\n const yAccessors = this.accessors.y ?? []\n const yStackedAccessors = this.accessors.yStacked ?? []\n const baselineValue = getNumber(datum, this.accessors.baseline, datumIndex) || 0\n const stackedValues: CrosshairCircle[] = getStackedValues(datum, datumIndex, ...yStackedAccessors)\n .map((value, index) => ({\n y: this.yScale(value + baselineValue),\n opacity: isNumber(getNumber(datum, yStackedAccessors[index], index)) ? 1 : 0,\n color: getColor(datum, config.color, index),\n strokeColor: config.strokeColor ? getColor(datum, config.strokeColor, index) : undefined,\n strokeWidth: config.strokeWidth ? getNumber(datum, config.strokeWidth, index) : undefined,\n }))\n\n const regularValues: CrosshairCircle[] = yAccessors\n .map((a, index) => {\n const value = getNumber(datum, a, datumIndex)\n return {\n y: this.yScale(value),\n opacity: isNumber(value) ? 1 : 0,\n color: getColor(datum, config.color, stackedValues.length + index),\n strokeColor: config.strokeColor ? getColor(datum, config.strokeColor, index) : undefined,\n strokeWidth: config.strokeWidth ? getNumber(datum, config.strokeWidth, index) : undefined,\n }\n })\n\n return stackedValues.concat(regularValues)\n }\n\n return []\n }\n}\n"],"names":["s.line","s.circle","s"],"mappings":";;;;;;;;;;;;AA0BM,MAAO,SAAiB,SAAQ,eAAuD,CAAA;AAsC3F,IAAA,WAAA,CAAa,MAAwC,EAAA;AACnD,QAAA,KAAK,EAAE,CAAA;AArCT,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,CAAA;QACN,IAAc,CAAA,cAAA,GAAG,sBAAyD,CAAA;AAC7E,QAAA,IAAA,CAAA,MAAM,GAAoC,IAAI,CAAC,cAAc,CAAA;QAG5D,IAAI,CAAA,IAAA,GAAuB,SAAS,CAAA;QACpC,IAAI,CAAA,IAAA,GAAuB,SAAS,CAAA;QACpC,IAAW,CAAA,WAAA,GAA2B,SAAS,CAAA;QAC/C,IAAY,CAAA,YAAA,GAAW,IAAI,CAAA;;AAO3B,QAAA,IAAA,CAAA,UAAU,GAA8B;AAC9C,YAAA,CAAC,EAAE,SAAS;AACZ,YAAA,CAAC,EAAE,SAAS;AACZ,YAAA,QAAQ,EAAE,SAAS;AACnB,YAAA,QAAQ,EAAE,SAAS;SACpB,CAAA;AAkBC,QAAA,IAAI,MAAM;AAAE,YAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;QAElC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAA;QAC1B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;AAC9B,aAAA,IAAI,CAAC,OAAO,EAAEA,IAAM,CAAC,CAAA;KACzB;IArBD,IAAW,SAAS,CAAE,SAAoC,EAAI,EAAA,IAAI,CAAC,UAAU,GAAG,SAAS,CAAA,EAAE;AAC3F,IAAA,IAAW,SAAS,GAAA;;AAClB,QAAA,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;AAEvB,QAAA,MAAM,SAAS,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAA;AAC7D,QAAA,MAAM,CAAC,GAAG,SAAS,GAAG,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAA;AAClD,QAAA,MAAM,IAAI,GAAG,SAAS,GAAG,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAA;QACrD,MAAM,CAAC,GAAG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,SAAS,CAAA;AAC5D,QAAA,MAAM,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAA;AACvE,QAAA,MAAM,QAAQ,GAAG,CAAA,EAAA,GAAA,MAAM,CAAC,QAAQ,MAAI,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAA,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAA;QAE5D,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAA;KACpC;AAWD,IAAA,YAAY,CAAE,YAAuE,EAAA;;AAEnF,QAAA,IAAI,CAAC,SAAS,GAAG,YAAY,CAAA;AAC7B,QAAA,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,qBAAqB,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;AACtE,QAAA,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,oBAAoB,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;KACrE;AAED,IAAA,OAAO,CAAE,cAAuB,EAAA;;AAC9B,QAAA,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAA;AAClC,QAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC,cAAc,CAAC,GAAG,cAAc,GAAG,MAAM,CAAC,QAAQ,CAAA;AAC5E,QAAA,MAAM,oBAAoB,GAAG,MAAM,CAAC,WAAW,KAAK,SAAS,CAAA;QAC7D,MAAM,GAAG,GAAG,oBAAoB,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,IAAI,CAAA;QAE9E,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAW,CAAA;AAEhD,QAAA,MAAM,qBAAqB,GAAG,CAAC,CAAA,CAAA,EAAA,GAAA,SAAS,CAAC,IAAI,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,MAAM,KAAI,IAAI,CAAC,SAAS,CAAC,CAAC;AACvE,cAAE,SAAS,CAAC,IAAI,CAAC,OAAO,CACtB,UAAU,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,oBAAoB,CAAC,IAAI,CAAC,CAChF,GAAG,SAAS,CAAA;AAEf,QAAA,IAAI,YAA+B,CAAA;AACnC,QAAA,IAAI,iBAAqC,CAAA;QACzC,IAAI,MAAM,CAAC,UAAU,EAAE;YACrB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,KAAI,CAAA,EAAA,GAAA,SAAS,CAAC,IAAI,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,MAAM,CAAA,EAAE;AAC3E,gBAAA,OAAO,CAAC,IAAI,CAAC,wHAAwH,CAAC,CAAA;AACvI,aAAA;AAED,YAAA,YAAY,GAAG,UAAU,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;YACnE,iBAAiB,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;AACxD,YAAA,IAAI,CAAC,YAAY;gBAAE,OAAM;AAC1B,SAAA;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;QAClC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;AAClC,QAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU;AAChC,cAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC;AAC9G,cAAE,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;AAEpC,QAAA,MAAM,uBAAuB,GAAG,CAAC,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;QACxE,MAAM,uBAAuB,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;AACpF,QAAA,IAAI,UAAU,GAAG,IAAI,CAAC,IAAI,GAAG,uBAAuB,IAAI,uBAAuB,GAAG,uBAAuB,CAAA;;QAGzG,IAAI,MAAM,CAAC,sBAAsB,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM,CAAC,8BAA8B,EAAE,EAAE;YAC7G,UAAU,GAAG,KAAK,CAAA;AACnB,SAAA;QAED,MAAM,OAAO,GAAG,CAAA,EAAA,GAAA,MAAM,CAAC,OAAO,MAAI,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAA,IAAI,CAAC,OAAO,CAAA;QAC9C,IAAI,UAAU,IAAI,OAAO,EAAE;AACzB,YAAA,MAAM,SAAS,GAAG,OAAO,CAAC,YAAY,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAA;AACjE,YAAA,MAAM,eAAe,GAAG,OAAO,CAAC,eAAe,EAAE,CAAA;AAEjD,YAAA,IAAI,oBAAoB,EAAE;;gBAExB,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,qBAAqB,EAAE,CAAA;;gBAGnE,MAAM,OAAO,GAAG,CAAC,eAAe,GAAG,GAAG,GAAG,aAAa,CAAC,IAAI,GAAG,GAAG,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAA;gBAC/F,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,GAAG,CAAC,IAAI,eAAe,GAAG,aAAa,CAAC,GAAG,GAAG,CAAC,CAAC,CAAA;AAC5E,gBAAA,MAAM,GAAG,GAAG,CAAC,OAAO,EAAE,OAAO,CAAqB,CAAA;gBAClD,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,EAAE,qBAAqB,CAAC,CAAA;AACpE,aAAA;iBAAM,IAAI,IAAI,CAAC,WAAW,EAAE;AAC3B,gBAAA,MAAM,GAAG,IAAI,eAAe,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAqB,CAAA;gBAC/I,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,EAAE,qBAAqB,CAAC,CAAA;AACpE,aAAA;AACF,SAAA;;YAAM,IAAI,CAAC,YAAY,EAAE,CAAA;;QAG1B,IAAI,IAAI,CAAC,WAAW,EAAE;AACpB,YAAA,CAAA,EAAA,GAAA,MAAM,CAAC,eAAe,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,CAAtB,MAAM,EAAmB,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAW,GAAG,SAAS,EAAE,YAAY,EAAE,iBAAiB,CAAC,CAAA;AAC3H,YAAA,IAAI,CAAC,WAAW,GAAG,SAAS,CAAA;AAC7B,SAAA;;;AAID,QAAA,IAAI,oBAAoB,EAAE;AACxB,YAAA,IAAI,CAAC,IAAI,GAAG,SAAS,CAAA;AACtB,SAAA;AAED,QAAA,eAAe,CAAC,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC;AAC9B,aAAA,KAAK,CAAC,SAAS,EAAE,UAAU,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;AAEvC,QAAA,IAAI,CAAC,IAAI;AACN,aAAA,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;AACb,aAAA,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;;AAG3B,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE,OAAM;QAE/B,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,CAAC;AAC7C,aAAA,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC;AACpB,aAAA,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;AAEvB,QAAA,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC;AAC9C,cAAE,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,qBAAqB,CAAC;cAC7E,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAA;AAEvD,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC;aACnB,SAAS,CAAoC,QAAQ,CAAC;aACtD,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,KAAI,EAAA,IAAA,EAAA,CAAA,CAAC,OAAA,CAAA,EAAA,GAAA,CAAC,CAAC,EAAE,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAI,CAAC,CAAA,EAAA,CAAC,CAAA;AAExC,QAAA,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,EAAE;aACjC,MAAM,CAAC,QAAQ,CAAC;AAChB,aAAA,IAAI,CAAC,OAAO,EAAEC,MAAQ,CAAC;AACvB,aAAA,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;AACZ,aAAA,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC;aACpB,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aACpB,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC;aAC3B,KAAK,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC;aACnC,KAAK,CAAC,cAAc,EAAE,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,CAAA;QAE5C,eAAe,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,UAAU,CAAC;AAC/D,aAAA,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC;aACpB,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,aAAA,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;aACZ,KAAK,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC;aAChC,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC;aAC3B,KAAK,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC;aACnC,KAAK,CAAC,cAAc,EAAE,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,CAAA;AAE5C,QAAA,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,CAAA;KACxB;IAED,IAAI,GAAA;QACF,IAAI,CAAC,WAAW,EAAE,CAAA;KACnB;AAED,IAAA,YAAY,CAAE,KAAiB,EAAA;;AAC7B,QAAA,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;AACnC,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAI,CAAA,EAAA,GAAA,SAAS,CAAC,IAAI,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,MAAM,CAAA,EAAE;AAC/C,YAAA,OAAO,CAAC,IAAI,CAAC,4HAA4H,CAAC,CAAA;AAC3I,SAAA;AACD,QAAA,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;AACtC,QAAA,IAAI,CAAC,IAAI,GAAG,CAAC,CAAA;AACb,QAAA,IAAI,CAAC,IAAI,GAAG,CAAC,CAAA;AACb,QAAA,IAAI,CAAC,WAAW,GAAG,KAAK,CAAA;AAExB,QAAA,MAAM,CAAC,oBAAoB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QAC9C,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,qBAAqB,CAAC,MAAK;YACpD,IAAI,CAAC,OAAO,EAAE,CAAA;AAChB,SAAC,CAAC,CAAA;KACH;IAED,WAAW,GAAA;AACT,QAAA,MAAM,CAAC,oBAAoB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QAC9C,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,qBAAqB,CAAC,MAAK;YACpD,IAAI,CAAC,OAAO,EAAE,CAAA;AAChB,SAAC,CAAC,CAAA;KACH;AAED,IAAA,YAAY,CAAE,KAAY,EAAE,MAAc,EAAE,GAAqB,EAAE,iBAAqC,EAAA;;AACtG,QAAA,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAA;QAClC,MAAM,OAAO,GAAG,CAAA,EAAA,GAAA,MAAM,CAAC,OAAO,MAAI,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAA,IAAI,CAAC,OAAO,CAAA;AAC9C,QAAA,IAAI,CAAC,OAAO,IAAI,CAAC,GAAG;YAAE,OAAM;AAE5B,QAAA,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAA;AAClB,QAAA,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAA;;AAEjF,QAAA,OAAO,CAAC,MAAM,CAAC,YAAY,GAAG,IAAI,CAAA;;AAGlC,QAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC,mBAAmB,KAAK,QAAQ,CAAC,IAAI,EAAE;YAC/F,MAAM,SAAS,GAAG,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,qBAAqB,EAAE,CAAC,IAAI,GAAG,CAAC,CAAA;YACxG,OAAO,CAAC,2BAA2B,CAAC,SAAS,GAAG,IAAI,CAAC,eAAe,GAAG,CAAC,GAAG,QAAQ,CAAC,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;AAC3G,SAAA;AAED,QAAA,IAAI,OAAO;YAAE,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;KAC7C;IAED,YAAY,GAAA;;AACV,QAAA,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;QACvB,MAAM,OAAO,GAAG,CAAA,EAAA,GAAA,MAAM,CAAC,OAAO,MAAI,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAA,IAAI,CAAC,OAAO,CAAA;AAC9C,QAAA,OAAO,aAAP,OAAO,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAP,OAAO,CAAE,IAAI,EAAE,CAAA;KAChB;;IAGD,cAAc,GAAA;AACZ,QAAA,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;KAC9B;IAEO,aAAa,CAAE,KAAY,EAAE,UAAkB,EAAA;;AACrD,QAAA,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;AAEvB,QAAA,IAAI,MAAM,CAAC,UAAU,IAAI,KAAK,EAAE;YAC9B,MAAM,UAAU,GAAG,CAAA,EAAA,GAAA,IAAI,CAAC,SAAS,CAAC,CAAC,MAAI,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAA,EAAE,CAAA;YACzC,MAAM,iBAAiB,GAAG,CAAA,EAAA,GAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,MAAI,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAA,EAAE,CAAA;AACvD,YAAA,MAAM,aAAa,GAAG,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,UAAU,CAAC,IAAI,CAAC,CAAA;YAChF,MAAM,aAAa,GAAsB,gBAAgB,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,iBAAiB,CAAC;iBAC/F,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,MAAM;gBACtB,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,aAAa,CAAC;gBACrC,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC,KAAK,EAAE,iBAAiB,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;gBAC5E,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC;gBAC3C,WAAW,EAAE,MAAM,CAAC,WAAW,GAAG,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,WAAW,EAAE,KAAK,CAAC,GAAG,SAAS;gBACxF,WAAW,EAAE,MAAM,CAAC,WAAW,GAAG,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,WAAW,EAAE,KAAK,CAAC,GAAG,SAAS;AAC1F,aAAA,CAAC,CAAC,CAAA;YAEL,MAAM,aAAa,GAAsB,UAAU;AAChD,iBAAA,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,KAAI;gBAChB,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,EAAE,UAAU,CAAC,CAAA;gBAC7C,OAAO;AACL,oBAAA,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;AACrB,oBAAA,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;AAChC,oBAAA,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,aAAa,CAAC,MAAM,GAAG,KAAK,CAAC;oBAClE,WAAW,EAAE,MAAM,CAAC,WAAW,GAAG,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,WAAW,EAAE,KAAK,CAAC,GAAG,SAAS;oBACxF,WAAW,EAAE,MAAM,CAAC,WAAW,GAAG,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,WAAW,EAAE,KAAK,CAAC,GAAG,SAAS;iBAC1F,CAAA;AACH,aAAC,CAAC,CAAA;AAEJ,YAAA,OAAO,aAAa,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;AAC3C,SAAA;AAED,QAAA,OAAO,EAAE,CAAA;KACV;;AAlQM,SAAS,CAAA,SAAA,GAAGC,KAAC;;;;"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@unovis/ts",
3
3
  "description": "Modular data visualization framework for React, Angular, Svelte, Vue, Solid, and vanilla TypeScript or JavaScript",
4
- "version": "1.6.0-bigip.2",
4
+ "version": "1.6.0-bigip.3",
5
5
  "packageManager": "npm@10.9.1",
6
6
  "repository": {
7
7
  "type": "git",
package/utils/data.js CHANGED
@@ -259,8 +259,8 @@ function getNearest(data, value, accessor, direction = FindNearestDirection.Auto
259
259
  .sort(([a, i], [b, j]) => getNumber(a, accessor, i) - getNumber(b, accessor, j));
260
260
  const values = dataWithIndexSorted.map(([d, i]) => getNumber(d, accessor, i));
261
261
  const index = direction === FindNearestDirection.Left
262
- ? bisectRight(values, value, 1, data.length - 1)
263
- : bisectLeft(values, value, 1, data.length - 1);
262
+ ? bisectRight(values, value, 1, data.length)
263
+ : bisectLeft(values, value, 0, data.length - 1);
264
264
  if (direction === FindNearestDirection.Left) {
265
265
  return dataWithIndexSorted[index - 1][0];
266
266
  }
package/utils/data.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"data.js","sources":["../../src/utils/data.ts"],"sourcesContent":["import { max, min, mean, bisectLeft, bisectRight } from 'd3-array'\nimport { throttle as _throttle } from 'throttle-debounce'\n\n// Types\nimport { NumericAccessor, StringAccessor, BooleanAccessor, ColorAccessor, GenericAccessor } from 'types/accessor'\nimport { FindNearestDirection, StackValuesRecord } from 'types/data'\n\nexport const isNumber = <T>(a: T): a is T extends number ? T : never => typeof a === 'number'\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport const isFunction = <T>(a: T): a is T extends Function ? T : never => typeof a === 'function'\nexport const isUndefined = <T>(a: T): a is T extends undefined ? T : never => a === undefined\nexport const isNil = <T>(a: T): a is null | undefined => a == null\nexport const isString = <T>(a: T): a is T extends string ? T : never => typeof a === 'string'\nexport const isArray = <T>(a: T): a is T extends any[] ? T : never => Array.isArray(a)\nexport const isObject = <T>(a: T): boolean => (a instanceof Object)\nexport const isAClassInstance = <T>(a: T): boolean => a.constructor.name !== 'Function' && a.constructor.name !== 'Object'\nexport const isPlainObject = <T>(a: T): boolean => isObject(a) && !isArray(a) && !isFunction(a) && !isAClassInstance(a)\n\nexport const isEmpty = <T>(obj: T): boolean => {\n return [Object, Array].includes((obj || {}).constructor as ArrayConstructor | ObjectConstructor) &&\n !Object.entries((obj || {})).length\n}\n\n// Based on https://github.com/maplibre/maplibre-gl-js/blob/e78ad7944ef768e67416daa4af86b0464bd0f617/src/style-spec/util/deep_equal.ts, 3-Clause BSD license\nexport const isEqual = (\n a: unknown | null | undefined,\n b: unknown | null | undefined,\n skipKeys: string[] = [],\n visited: Set<any> = new Set()\n): boolean => {\n if (Array.isArray(a)) {\n if (!Array.isArray(b) || a.length !== b.length) return false\n\n if (visited.has(a)) return true\n else visited.add(a)\n\n for (let i = 0; i < a.length; i++) {\n if (!isEqual(a[i], b[i], skipKeys, visited)) return false\n }\n\n return true\n }\n\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime()\n }\n\n if (typeof a === 'object' && a !== null && b !== null) {\n if (!(typeof b === 'object')) return false\n if (a === b) return true\n\n const keysA = Object.keys(a).filter(key => !skipKeys.includes(key))\n const keysB = Object.keys(b).filter(key => !skipKeys.includes(key))\n\n if (keysA.length !== keysB.length) return false\n\n if (visited.has(a)) return true\n else visited.add(a)\n\n for (const key of keysA) {\n if (!isEqual((a as Record<string, unknown>)[key], (b as Record<string, unknown>)[key], skipKeys, visited)) return false\n }\n\n return true\n }\n\n return a === b\n}\n\nexport const without = <T>(arr: Array<T>, ...args: T[]): Array<T> => arr.filter(item => !args.includes(item))\nexport const flatten = <T>(arr: Array<T | T[]>): Array<T> => arr.flat() as T[]\nexport const cloneDeep = <T>(obj: T, stack: Map<any, any> = new Map()): T => {\n if (typeof obj !== 'object' || obj === null) {\n return obj\n }\n\n if (obj instanceof Date) {\n return new Date(obj.getTime()) as unknown as T\n }\n\n if (obj instanceof Array) {\n const clone: unknown[] = []\n stack.set(obj, clone)\n for (const item of obj) {\n clone.push(stack.has(item) ? stack.get(item) : cloneDeep(item, stack))\n }\n return clone as unknown as T\n }\n\n // Class instances will be copied without cloning\n if (isAClassInstance(obj)) {\n const clone = obj\n return clone\n }\n\n if (obj instanceof Object) {\n const clone = {} as T\n stack.set(obj, clone)\n const objAsRecord = obj as Record<string | number, unknown>\n Object.keys(obj)\n .reduce((newObj: typeof objAsRecord, key: string | number): typeof objAsRecord => {\n newObj[key] = stack.has(objAsRecord[key]) ? stack.get(objAsRecord[key]) : cloneDeep(objAsRecord[key], stack)\n return newObj\n }, clone as typeof objAsRecord)\n\n return clone\n }\n\n return obj\n}\n\n\nexport const merge = <T, K>(obj1: T, obj2: K, visited: Map<any, any> = new Map()): T & K => {\n type Rec = Record<string | number, unknown>\n\n if (!obj1 || !obj2) return obj1 as T & K\n if ((obj1 as unknown) === (obj2 as unknown)) return obj1 as T & K\n\n const newObj = (isAClassInstance(obj1 as Rec) ? obj1 : cloneDeep(obj1)) as T & K\n\n // Taking care of recursive structures\n if (visited.has(obj2)) return visited.get(obj2)\n else visited.set(obj2, newObj)\n\n Object.keys(obj2 as Rec).forEach(key => {\n // Preventing prototype pollution\n if (key === '__proto__' || key === 'constructor') return\n\n if (isPlainObject((obj1 as Rec)[key]) && isPlainObject((obj2 as Rec)[key])) {\n (newObj as Rec)[key] = merge((obj1 as Rec)[key], (obj2 as Rec)[key], visited)\n } else if (isAClassInstance(obj2 as Rec)) {\n (newObj as Rec)[key] = obj2\n } else {\n (newObj as Rec)[key] = cloneDeep((obj2 as Rec)[key])\n }\n })\n\n return newObj\n}\n\nexport const omit = <T extends Record<string | number | symbol, unknown>>(obj: T, props: Array<keyof T>): Partial<T> => {\n obj = { ...obj }\n props.forEach(prop => delete obj[prop])\n return obj\n}\n\nexport const groupBy = <T extends Record<string | number, any>> (arr: T[], accessor: (a: T, index: number) => string | number): Record<string | number, T[]> => {\n return arr.reduce(\n (grouped, v, i, a, k = accessor(v, i)) => (((grouped[k] || (grouped[k] = [])).push(v), grouped)),\n {} as Record<string | number, T[]>\n )\n}\n\nexport const sortBy = <T>(arr: Array<T>, accessor: (a: T) => string | number): Array<T> => {\n return arr.concat() // The native sort method modifies the array in place. We use `.concat()` to copy the array first\n .sort((a, b): number => {\n return (accessor(a) > accessor(b)) ? 1 : ((accessor(b) > accessor(a)) ? -1 : 0)\n })\n}\n\nexport const throttle = <T extends (...args: any[]) => any>(\n f: T,\n delay: number,\n options?: {\n noTrailing?: boolean;\n noLeading?: boolean;\n debounceMode?: boolean;\n }\n): _throttle<T> => _throttle(delay, f, options)\n\nexport function getValue<T, ReturnType> (\n d: T,\n accessor: NumericAccessor<T> | StringAccessor<T> | BooleanAccessor<T> | ColorAccessor<T> | GenericAccessor<ReturnType, T>,\n index?: number\n): ReturnType {\n // eslint-disable-next-line @typescript-eslint/ban-types\n if (isFunction(accessor)) return (accessor as Function)(d, index) as (ReturnType | null | undefined)\n else return accessor as unknown as (ReturnType | null | undefined)\n}\n\nexport function getString<T> (d: T, accessor: StringAccessor<T>, i?: number): string | null | undefined {\n return getValue<T, string>(d, accessor, i)\n}\n\nexport function getNumber<T> (d: T, accessor: NumericAccessor<T>, i?: number): number | null | undefined {\n return getValue<T, number>(d, accessor, i)\n}\n\nexport function getBoolean<T> (d: T, accessor: BooleanAccessor<T>, i?: number): boolean | null | undefined {\n return getValue<T, boolean>(d, accessor, i)\n}\n\nexport function clean<T> (data: T[]): T[] {\n return data.filter(d => d && !isNumber(d))\n}\n\nexport function clamp (d: number, min: number, max: number): number {\n return Math.min(Math.max(d, min), max)\n}\n\nexport function unique<T> (array: T[]): T[] {\n return Array.from(new Set(array))\n}\n\nexport function countUnique<T> (array: T[], accessor = (d: unknown) => d): number {\n return new Set(array.map(d => accessor(d))).size\n}\n\nexport function arrayOfIndices (n: number): number[] {\n return [...Array(n).keys()]\n}\n\nexport function shallowDiff (o1: Record<string, unknown> = {}, o2: Record<string, unknown> = {}): Record<string, unknown> {\n return Object.keys(o2).reduce((diff, key) => {\n if (o1[key] === o2[key]) return diff\n return {\n ...diff,\n [key]: o2[key],\n }\n }, {})\n}\n\nexport function getStackedExtent<Datum> (data: Datum[], ...acs: NumericAccessor<Datum>[]): (number | undefined)[] {\n if (!data) return [undefined, undefined]\n if (isArray(acs)) {\n let minValue = 0\n let maxValue = 0\n data.forEach((d, i) => {\n let positiveStack = 0\n let negativeStack = 0\n for (const a of acs as NumericAccessor<Datum>[]) {\n const value = getNumber(d, a, i) || 0\n if (value >= 0) positiveStack += value\n else negativeStack += value\n }\n\n if (positiveStack > maxValue) maxValue = positiveStack\n if (negativeStack < minValue) minValue = negativeStack\n })\n return [minValue, maxValue]\n }\n}\n\nexport function getStackedValues<Datum> (d: Datum, index: number, ...acs: NumericAccessor<Datum>[]): (number | undefined)[] {\n const values = []\n\n let positiveStack = 0\n let negativeStack = 0\n for (const a of acs as NumericAccessor<Datum>[]) {\n const value = getNumber(d, a, index) || 0\n if (value >= 0) {\n values.push(positiveStack += value)\n } else {\n values.push(negativeStack += value)\n }\n }\n\n return values\n}\n\nexport function getStackedData<Datum> (\n data: Datum[],\n baseline: NumericAccessor<Datum>,\n acs: NumericAccessor<Datum>[],\n prevNegative?: boolean[] // to help guessing the stack direction (positive/negative) when the values are 0 or null\n): StackValuesRecord[] {\n const baselineValues = data.map((d, i) => getNumber(d, baseline, i) || 0)\n const isNegativeStack = acs.map((a, j) => {\n const average = mean(data, (d, i) => getNumber(d, a, i) || 0)\n return (average === 0 && Array.isArray(prevNegative)) ? prevNegative[j] : average < 0\n })\n\n const stackedData = acs.map(() => [] as StackValuesRecord)\n data.forEach((d, i) => {\n let positiveStack = baselineValues[i]\n let negativeStack = baselineValues[i]\n acs.forEach((a, j) => {\n const value = getNumber(d, a, i) || 0\n if (value >= 0) {\n stackedData[j].push([positiveStack, positiveStack += value])\n } else {\n stackedData[j].push([negativeStack, negativeStack += value])\n }\n })\n })\n\n // Fill in additional stack information\n stackedData.forEach((stack, i) => {\n stack.isMostlyNegative = isNegativeStack[i]\n })\n\n return stackedData\n}\n\nexport function getMin<Datum> (data: Datum[], ...acs: NumericAccessor<Datum>[]): number | undefined {\n if (!data) return undefined\n const minValue = min(data, (d, i) => min(acs as NumericAccessor<Datum>[], a => getNumber(d, a, i)))\n return minValue\n}\n\nexport function getMax<Datum> (data: Datum[], ...acs: NumericAccessor<Datum>[]): number | undefined {\n if (!data) return undefined\n const maxValue = max(data, (d, i) => max(acs as NumericAccessor<Datum>[], a => getNumber(d, a, i)))\n return maxValue\n}\n\nexport function getExtent<Datum> (data: Datum[], ...acs: NumericAccessor<Datum>[]): (number | undefined)[] {\n return [getMin(data, ...acs), getMax(data, ...acs)]\n}\n\nexport function getNearest<Datum> (\n data: Datum[],\n value: number,\n accessor: NumericAccessor<Datum>,\n direction: FindNearestDirection = FindNearestDirection.Auto\n): Datum {\n if (data.length <= 1) return data[0]\n\n const dataWithIndex = data.map((d, i) => ([d, i])) as [Datum, number][]\n const dataWithIndexSorted = dataWithIndex\n .sort(([a, i], [b, j]) => getNumber(a, accessor, i) - getNumber(b, accessor, j))\n const values = dataWithIndexSorted.map(([d, i]) => getNumber(d, accessor, i))\n\n const index = direction === FindNearestDirection.Left\n ? bisectRight(values, value, 1, data.length - 1)\n : bisectLeft(values, value, 1, data.length - 1)\n\n if (direction === FindNearestDirection.Left) {\n return dataWithIndexSorted[index - 1][0]\n } else if (direction === FindNearestDirection.Right) {\n return dataWithIndexSorted[index][0]\n }\n\n return value - values[index - 1] > values[index] - value ? dataWithIndexSorted[index][0] : dataWithIndexSorted[index - 1][0]\n}\n\nexport function filterDataByRange<Datum> (\n data: Datum[],\n range: [number, number],\n accessor: NumericAccessor<Datum>,\n includeNeighbors = false\n): Datum[] {\n if (!accessor) return []\n\n const filteredData = data.filter((d, i) => {\n const value = getNumber(d, accessor, i)\n return (value >= range[0]) && (value <= range[1])\n })\n\n if (includeNeighbors) {\n // If `filteredData` is empty and `includeNeighbors` is true, try to find nearest points\n if (filteredData.length === 0) {\n const nearestLeft = getNearest(data, range[0], accessor, FindNearestDirection.Left)\n const nearestRight = getNearest(data, range[1], accessor, FindNearestDirection.Right)\n return [nearestLeft, nearestRight].filter(Boolean)\n }\n\n // Find indices of first and last filtered points in original data\n const firstFilteredItem = filteredData[0]\n const lastFilteredItem = filteredData[filteredData.length - 1]\n\n const firstFilteredIndex = data.findIndex((d: Datum) => d === firstFilteredItem)\n const lastFilteredIndex = data.findIndex((d: Datum) => d === lastFilteredItem)\n\n // Include neighbors (if they exist)\n const startIndex = Math.max(0, firstFilteredIndex - 1)\n const endIndex = Math.min(data.length - 1, lastFilteredIndex + 1)\n\n // Return data from startIndex to endIndex (inclusive)\n return data.slice(startIndex, endIndex + 1)\n }\n return filteredData\n}\n\nexport function isNumberWithinRange (value: number, range: [number, number]): boolean {\n return (value >= range[0] && value <= range[1]) || (value >= range[1] && value <= range[0])\n}\n\nexport const ensureArray = <T>(value: T | T[] | null): T[] => {\n if (value === null || value === undefined) {\n return []\n }\n\n if (Array.isArray(value)) {\n return value\n }\n\n return [value]\n}\n"],"names":["_throttle"],"mappings":";;;;AAOO,MAAM,QAAQ,GAAG,CAAI,CAAI,KAAwC,OAAO,CAAC,KAAK,SAAQ;AAC7F;AACO,MAAM,UAAU,GAAG,CAAI,CAAI,KAA0C,OAAO,CAAC,KAAK,WAAU;AAC5F,MAAM,WAAW,GAAG,CAAI,CAAI,KAA2C,CAAC,KAAK,UAAS;AACtF,MAAM,KAAK,GAAG,CAAI,CAAI,KAA4B,CAAC,IAAI,KAAI;AAC3D,MAAM,QAAQ,GAAG,CAAI,CAAI,KAAwC,OAAO,CAAC,KAAK,SAAQ;AACtF,MAAM,OAAO,GAAG,CAAI,CAAI,KAAuC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAC;AAC/E,MAAM,QAAQ,GAAG,CAAI,CAAI,MAAe,CAAC,YAAY,MAAM,EAAC;AACtD,MAAA,gBAAgB,GAAG,CAAI,CAAI,KAAc,CAAC,CAAC,WAAW,CAAC,IAAI,KAAK,UAAU,IAAI,CAAC,CAAC,WAAW,CAAC,IAAI,KAAK,SAAQ;AACnH,MAAM,aAAa,GAAG,CAAI,CAAI,KAAc,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,EAAC;AAE1G,MAAA,OAAO,GAAG,CAAI,GAAM,KAAa;AAC5C,IAAA,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,WAAmD,CAAC;AAC9F,QAAA,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,CAAC,MAAM,CAAA;AACvC,EAAC;AAED;AACa,MAAA,OAAO,GAAG,CACrB,CAA6B,EAC7B,CAA6B,EAC7B,QAAA,GAAqB,EAAE,EACvB,OAAA,GAAoB,IAAI,GAAG,EAAE,KAClB;AACX,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;AACpB,QAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;AAAE,YAAA,OAAO,KAAK,CAAA;AAE5D,QAAA,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;AAAE,YAAA,OAAO,IAAI,CAAA;;AAC1B,YAAA,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;AAEnB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACjC,YAAA,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC;AAAE,gBAAA,OAAO,KAAK,CAAA;AAC1D,SAAA;AAED,QAAA,OAAO,IAAI,CAAA;AACZ,KAAA;AAED,IAAA,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,IAAI,EAAE;QAC1C,OAAO,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,OAAO,EAAE,CAAA;AACnC,KAAA;AAED,IAAA,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE;AACrD,QAAA,IAAI,EAAE,OAAO,CAAC,KAAK,QAAQ,CAAC;AAAE,YAAA,OAAO,KAAK,CAAA;QAC1C,IAAI,CAAC,KAAK,CAAC;AAAE,YAAA,OAAO,IAAI,CAAA;QAExB,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAA;QACnE,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAA;AAEnE,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;AAAE,YAAA,OAAO,KAAK,CAAA;AAE/C,QAAA,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;AAAE,YAAA,OAAO,IAAI,CAAA;;AAC1B,YAAA,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;AAEnB,QAAA,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE;AACvB,YAAA,IAAI,CAAC,OAAO,CAAE,CAA6B,CAAC,GAAG,CAAC,EAAG,CAA6B,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC;AAAE,gBAAA,OAAO,KAAK,CAAA;AACxH,SAAA;AAED,QAAA,OAAO,IAAI,CAAA;AACZ,KAAA;IAED,OAAO,CAAC,KAAK,CAAC,CAAA;AAChB,EAAC;AAEM,MAAM,OAAO,GAAG,CAAI,GAAa,EAAE,GAAG,IAAS,KAAe,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAC;AACtG,MAAM,OAAO,GAAG,CAAI,GAAmB,KAAe,GAAG,CAAC,IAAI,GAAS;AACvE,MAAM,SAAS,GAAG,CAAI,GAAM,EAAE,KAAA,GAAuB,IAAI,GAAG,EAAE,KAAO;IAC1E,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE;AAC3C,QAAA,OAAO,GAAG,CAAA;AACX,KAAA;IAED,IAAI,GAAG,YAAY,IAAI,EAAE;QACvB,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAiB,CAAA;AAC/C,KAAA;IAED,IAAI,GAAG,YAAY,KAAK,EAAE;QACxB,MAAM,KAAK,GAAc,EAAE,CAAA;AAC3B,QAAA,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;AACrB,QAAA,KAAK,MAAM,IAAI,IAAI,GAAG,EAAE;AACtB,YAAA,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAA;AACvE,SAAA;AACD,QAAA,OAAO,KAAqB,CAAA;AAC7B,KAAA;;AAGD,IAAA,IAAI,gBAAgB,CAAC,GAAG,CAAC,EAAE;QACzB,MAAM,KAAK,GAAG,GAAG,CAAA;AACjB,QAAA,OAAO,KAAK,CAAA;AACb,KAAA;IAED,IAAI,GAAG,YAAY,MAAM,EAAE;QACzB,MAAM,KAAK,GAAG,EAAO,CAAA;AACrB,QAAA,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QACrB,MAAM,WAAW,GAAG,GAAuC,CAAA;AAC3D,QAAA,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;AACb,aAAA,MAAM,CAAC,CAAC,MAA0B,EAAE,GAAoB,KAAwB;AAC/E,YAAA,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAA;AAC5G,YAAA,OAAO,MAAM,CAAA;SACd,EAAE,KAA2B,CAAC,CAAA;AAEjC,QAAA,OAAO,KAAK,CAAA;AACb,KAAA;AAED,IAAA,OAAO,GAAG,CAAA;AACZ,EAAC;AAGM,MAAM,KAAK,GAAG,CAAO,IAAO,EAAE,IAAO,EAAE,OAAyB,GAAA,IAAI,GAAG,EAAE,KAAW;AAGzF,IAAA,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI;AAAE,QAAA,OAAO,IAAa,CAAA;IACxC,IAAK,IAAgB,KAAM,IAAgB;AAAE,QAAA,OAAO,IAAa,CAAA;AAEjE,IAAA,MAAM,MAAM,IAAI,gBAAgB,CAAC,IAAW,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAU,CAAA;;AAGhF,IAAA,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AAAE,QAAA,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;;AAC1C,QAAA,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IAE9B,MAAM,CAAC,IAAI,CAAC,IAAW,CAAC,CAAC,OAAO,CAAC,GAAG,IAAG;;AAErC,QAAA,IAAI,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,aAAa;YAAE,OAAM;AAExD,QAAA,IAAI,aAAa,CAAE,IAAY,CAAC,GAAG,CAAC,CAAC,IAAI,aAAa,CAAE,IAAY,CAAC,GAAG,CAAC,CAAC,EAAE;AACzE,YAAA,MAAc,CAAC,GAAG,CAAC,GAAG,KAAK,CAAE,IAAY,CAAC,GAAG,CAAC,EAAG,IAAY,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAA;AAC9E,SAAA;AAAM,aAAA,IAAI,gBAAgB,CAAC,IAAW,CAAC,EAAE;AACvC,YAAA,MAAc,CAAC,GAAG,CAAC,GAAG,IAAI,CAAA;AAC5B,SAAA;AAAM,aAAA;YACJ,MAAc,CAAC,GAAG,CAAC,GAAG,SAAS,CAAE,IAAY,CAAC,GAAG,CAAC,CAAC,CAAA;AACrD,SAAA;AACH,KAAC,CAAC,CAAA;AAEF,IAAA,OAAO,MAAM,CAAA;AACf,EAAC;MAEY,IAAI,GAAG,CAAsD,GAAM,EAAE,KAAqB,KAAgB;IACrH,GAAG,GAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAAQ,GAAG,CAAE,CAAA;AAChB,IAAA,KAAK,CAAC,OAAO,CAAC,IAAI,IAAI,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAA;AACvC,IAAA,OAAO,GAAG,CAAA;AACZ,EAAC;MAEY,OAAO,GAAG,CAA0C,GAAQ,EAAE,QAAkD,KAAkC;IAC7J,OAAO,GAAG,CAAC,MAAM,CACf,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,EAChG,EAAkC,CACnC,CAAA;AACH,EAAC;MAEY,MAAM,GAAG,CAAI,GAAa,EAAE,QAAmC,KAAc;AACxF,IAAA,OAAO,GAAG,CAAC,MAAM,EAAE;AAChB,SAAA,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAY;AACrB,QAAA,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;AACjF,KAAC,CAAC,CAAA;AACN,EAAC;MAEY,QAAQ,GAAG,CACtB,CAAI,EACJ,KAAa,EACb,OAIC,KACgBA,UAAS,CAAC,KAAK,EAAE,CAAC,EAAE,OAAO,EAAC;SAE/B,QAAQ,CACtB,CAAI,EACJ,QAAyH,EACzH,KAAc,EAAA;;IAGd,IAAI,UAAU,CAAC,QAAQ,CAAC;AAAE,QAAA,OAAQ,QAAqB,CAAC,CAAC,EAAE,KAAK,CAAoC,CAAA;;AAC/F,QAAA,OAAO,QAAsD,CAAA;AACpE,CAAC;SAEe,SAAS,CAAK,CAAI,EAAE,QAA2B,EAAE,CAAU,EAAA;IACzE,OAAO,QAAQ,CAAY,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAA;AAC5C,CAAC;SAEe,SAAS,CAAK,CAAI,EAAE,QAA4B,EAAE,CAAU,EAAA;IAC1E,OAAO,QAAQ,CAAY,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAA;AAC5C,CAAC;SAEe,UAAU,CAAK,CAAI,EAAE,QAA4B,EAAE,CAAU,EAAA;IAC3E,OAAO,QAAQ,CAAa,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAA;AAC7C,CAAC;AAEK,SAAU,KAAK,CAAK,IAAS,EAAA;AACjC,IAAA,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;AAC5C,CAAC;SAEe,KAAK,CAAE,CAAS,EAAE,GAAW,EAAE,GAAW,EAAA;AACxD,IAAA,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAA;AACxC,CAAC;AAEK,SAAU,MAAM,CAAK,KAAU,EAAA;IACnC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAA;AACnC,CAAC;AAEK,SAAU,WAAW,CAAK,KAAU,EAAE,QAAW,GAAA,CAAC,CAAU,KAAK,CAAC,EAAA;AACtE,IAAA,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;AAClD,CAAC;AAEK,SAAU,cAAc,CAAE,CAAS,EAAA;IACvC,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;AAC7B,CAAC;SAEe,WAAW,CAAE,KAA8B,EAAE,EAAE,KAA8B,EAAE,EAAA;AAC7F,IAAA,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,GAAG,KAAI;QAC1C,IAAI,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC;AAAE,YAAA,OAAO,IAAI,CAAA;QACpC,OACK,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAAA,IAAI,CACP,EAAA,EAAA,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,EACf,CAAA,CAAA;KACF,EAAE,EAAE,CAAC,CAAA;AACR,CAAC;SAEe,gBAAgB,CAAS,IAAa,EAAE,GAAG,GAA6B,EAAA;AACtF,IAAA,IAAI,CAAC,IAAI;AAAE,QAAA,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;AACxC,IAAA,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE;QAChB,IAAI,QAAQ,GAAG,CAAC,CAAA;QAChB,IAAI,QAAQ,GAAG,CAAC,CAAA;QAChB,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;YACpB,IAAI,aAAa,GAAG,CAAC,CAAA;YACrB,IAAI,aAAa,GAAG,CAAC,CAAA;AACrB,YAAA,KAAK,MAAM,CAAC,IAAI,GAA+B,EAAE;AAC/C,gBAAA,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAA;gBACrC,IAAI,KAAK,IAAI,CAAC;oBAAE,aAAa,IAAI,KAAK,CAAA;;oBACjC,aAAa,IAAI,KAAK,CAAA;AAC5B,aAAA;YAED,IAAI,aAAa,GAAG,QAAQ;gBAAE,QAAQ,GAAG,aAAa,CAAA;YACtD,IAAI,aAAa,GAAG,QAAQ;gBAAE,QAAQ,GAAG,aAAa,CAAA;AACxD,SAAC,CAAC,CAAA;AACF,QAAA,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;AAC5B,KAAA;AACH,CAAC;AAEK,SAAU,gBAAgB,CAAS,CAAQ,EAAE,KAAa,EAAE,GAAG,GAA6B,EAAA;IAChG,MAAM,MAAM,GAAG,EAAE,CAAA;IAEjB,IAAI,aAAa,GAAG,CAAC,CAAA;IACrB,IAAI,aAAa,GAAG,CAAC,CAAA;AACrB,IAAA,KAAK,MAAM,CAAC,IAAI,GAA+B,EAAE;AAC/C,QAAA,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;QACzC,IAAI,KAAK,IAAI,CAAC,EAAE;AACd,YAAA,MAAM,CAAC,IAAI,CAAC,aAAa,IAAI,KAAK,CAAC,CAAA;AACpC,SAAA;AAAM,aAAA;AACL,YAAA,MAAM,CAAC,IAAI,CAAC,aAAa,IAAI,KAAK,CAAC,CAAA;AACpC,SAAA;AACF,KAAA;AAED,IAAA,OAAO,MAAM,CAAA;AACf,CAAC;AAEK,SAAU,cAAc,CAC5B,IAAa,EACb,QAAgC,EAChC,GAA6B,EAC7B,YAAwB;;IAExB,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,SAAS,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;IACzE,MAAM,eAAe,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;QAC7D,OAAO,CAAC,OAAO,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,CAAC,CAAA;AACvF,KAAC,CAAC,CAAA;IAEF,MAAM,WAAW,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,EAAuB,CAAC,CAAA;IAC1D,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;AACpB,QAAA,IAAI,aAAa,GAAG,cAAc,CAAC,CAAC,CAAC,CAAA;AACrC,QAAA,IAAI,aAAa,GAAG,cAAc,CAAC,CAAC,CAAC,CAAA;QACrC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;AACnB,YAAA,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAA;YACrC,IAAI,KAAK,IAAI,CAAC,EAAE;AACd,gBAAA,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,aAAa,IAAI,KAAK,CAAC,CAAC,CAAA;AAC7D,aAAA;AAAM,iBAAA;AACL,gBAAA,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,aAAa,IAAI,KAAK,CAAC,CAAC,CAAA;AAC7D,aAAA;AACH,SAAC,CAAC,CAAA;AACJ,KAAC,CAAC,CAAA;;IAGF,WAAW,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,KAAI;AAC/B,QAAA,KAAK,CAAC,gBAAgB,GAAG,eAAe,CAAC,CAAC,CAAC,CAAA;AAC7C,KAAC,CAAC,CAAA;AAEF,IAAA,OAAO,WAAW,CAAA;AACpB,CAAC;SAEe,MAAM,CAAS,IAAa,EAAE,GAAG,GAA6B,EAAA;AAC5E,IAAA,IAAI,CAAC,IAAI;AAAE,QAAA,OAAO,SAAS,CAAA;AAC3B,IAAA,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,GAA+B,EAAE,CAAC,IAAI,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;AACnG,IAAA,OAAO,QAAQ,CAAA;AACjB,CAAC;SAEe,MAAM,CAAS,IAAa,EAAE,GAAG,GAA6B,EAAA;AAC5E,IAAA,IAAI,CAAC,IAAI;AAAE,QAAA,OAAO,SAAS,CAAA;AAC3B,IAAA,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,GAA+B,EAAE,CAAC,IAAI,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;AACnG,IAAA,OAAO,QAAQ,CAAA;AACjB,CAAC;SAEe,SAAS,CAAS,IAAa,EAAE,GAAG,GAA6B,EAAA;AAC/E,IAAA,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,MAAM,CAAC,IAAI,EAAE,GAAG,GAAG,CAAC,CAAC,CAAA;AACrD,CAAC;AAEe,SAAA,UAAU,CACxB,IAAa,EACb,KAAa,EACb,QAAgC,EAChC,SAAA,GAAkC,oBAAoB,CAAC,IAAI,EAAA;AAE3D,IAAA,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC;AAAE,QAAA,OAAO,IAAI,CAAC,CAAC,CAAC,CAAA;IAEpC,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAsB,CAAA;IACvE,MAAM,mBAAmB,GAAG,aAAa;AACtC,SAAA,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAA;IAClF,MAAM,MAAM,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAA;AAE7E,IAAA,MAAM,KAAK,GAAG,SAAS,KAAK,oBAAoB,CAAC,IAAI;AACnD,UAAE,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;AAChD,UAAE,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;AAEjD,IAAA,IAAI,SAAS,KAAK,oBAAoB,CAAC,IAAI,EAAE;QAC3C,OAAO,mBAAmB,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AACzC,KAAA;AAAM,SAAA,IAAI,SAAS,KAAK,oBAAoB,CAAC,KAAK,EAAE;AACnD,QAAA,OAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;AACrC,KAAA;AAED,IAAA,OAAO,KAAK,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,mBAAmB,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAC9H,CAAC;AAEK,SAAU,iBAAiB,CAC/B,IAAa,EACb,KAAuB,EACvB,QAAgC,EAChC,gBAAgB,GAAG,KAAK,EAAA;AAExB,IAAA,IAAI,CAAC,QAAQ;AAAE,QAAA,OAAO,EAAE,CAAA;IAExB,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;QACxC,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAA;AACvC,QAAA,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;AACnD,KAAC,CAAC,CAAA;AAEF,IAAA,IAAI,gBAAgB,EAAE;;AAEpB,QAAA,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE;AAC7B,YAAA,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,oBAAoB,CAAC,IAAI,CAAC,CAAA;AACnF,YAAA,MAAM,YAAY,GAAG,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,oBAAoB,CAAC,KAAK,CAAC,CAAA;YACrF,OAAO,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;AACnD,SAAA;;AAGD,QAAA,MAAM,iBAAiB,GAAG,YAAY,CAAC,CAAC,CAAC,CAAA;QACzC,MAAM,gBAAgB,GAAG,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;AAE9D,QAAA,MAAM,kBAAkB,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAQ,KAAK,CAAC,KAAK,iBAAiB,CAAC,CAAA;AAChF,QAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAQ,KAAK,CAAC,KAAK,gBAAgB,CAAC,CAAA;;AAG9E,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,kBAAkB,GAAG,CAAC,CAAC,CAAA;AACtD,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,iBAAiB,GAAG,CAAC,CAAC,CAAA;;QAGjE,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAA;AAC5C,KAAA;AACD,IAAA,OAAO,YAAY,CAAA;AACrB,CAAC;AAEe,SAAA,mBAAmB,CAAE,KAAa,EAAE,KAAuB,EAAA;AACzE,IAAA,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;AAC7F,CAAC;AAEY,MAAA,WAAW,GAAG,CAAI,KAAqB,KAAS;AAC3D,IAAA,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE;AACzC,QAAA,OAAO,EAAE,CAAA;AACV,KAAA;AAED,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACxB,QAAA,OAAO,KAAK,CAAA;AACb,KAAA;IAED,OAAO,CAAC,KAAK,CAAC,CAAA;AAChB;;;;"}
1
+ {"version":3,"file":"data.js","sources":["../../src/utils/data.ts"],"sourcesContent":["import { max, min, mean, bisectLeft, bisectRight } from 'd3-array'\nimport { throttle as _throttle } from 'throttle-debounce'\n\n// Types\nimport { NumericAccessor, StringAccessor, BooleanAccessor, ColorAccessor, GenericAccessor } from 'types/accessor'\nimport { FindNearestDirection, StackValuesRecord } from 'types/data'\n\nexport const isNumber = <T>(a: T): a is T extends number ? T : never => typeof a === 'number'\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport const isFunction = <T>(a: T): a is T extends Function ? T : never => typeof a === 'function'\nexport const isUndefined = <T>(a: T): a is T extends undefined ? T : never => a === undefined\nexport const isNil = <T>(a: T): a is null | undefined => a == null\nexport const isString = <T>(a: T): a is T extends string ? T : never => typeof a === 'string'\nexport const isArray = <T>(a: T): a is T extends any[] ? T : never => Array.isArray(a)\nexport const isObject = <T>(a: T): boolean => (a instanceof Object)\nexport const isAClassInstance = <T>(a: T): boolean => a.constructor.name !== 'Function' && a.constructor.name !== 'Object'\nexport const isPlainObject = <T>(a: T): boolean => isObject(a) && !isArray(a) && !isFunction(a) && !isAClassInstance(a)\n\nexport const isEmpty = <T>(obj: T): boolean => {\n return [Object, Array].includes((obj || {}).constructor as ArrayConstructor | ObjectConstructor) &&\n !Object.entries((obj || {})).length\n}\n\n// Based on https://github.com/maplibre/maplibre-gl-js/blob/e78ad7944ef768e67416daa4af86b0464bd0f617/src/style-spec/util/deep_equal.ts, 3-Clause BSD license\nexport const isEqual = (\n a: unknown | null | undefined,\n b: unknown | null | undefined,\n skipKeys: string[] = [],\n visited: Set<any> = new Set()\n): boolean => {\n if (Array.isArray(a)) {\n if (!Array.isArray(b) || a.length !== b.length) return false\n\n if (visited.has(a)) return true\n else visited.add(a)\n\n for (let i = 0; i < a.length; i++) {\n if (!isEqual(a[i], b[i], skipKeys, visited)) return false\n }\n\n return true\n }\n\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime()\n }\n\n if (typeof a === 'object' && a !== null && b !== null) {\n if (!(typeof b === 'object')) return false\n if (a === b) return true\n\n const keysA = Object.keys(a).filter(key => !skipKeys.includes(key))\n const keysB = Object.keys(b).filter(key => !skipKeys.includes(key))\n\n if (keysA.length !== keysB.length) return false\n\n if (visited.has(a)) return true\n else visited.add(a)\n\n for (const key of keysA) {\n if (!isEqual((a as Record<string, unknown>)[key], (b as Record<string, unknown>)[key], skipKeys, visited)) return false\n }\n\n return true\n }\n\n return a === b\n}\n\nexport const without = <T>(arr: Array<T>, ...args: T[]): Array<T> => arr.filter(item => !args.includes(item))\nexport const flatten = <T>(arr: Array<T | T[]>): Array<T> => arr.flat() as T[]\nexport const cloneDeep = <T>(obj: T, stack: Map<any, any> = new Map()): T => {\n if (typeof obj !== 'object' || obj === null) {\n return obj\n }\n\n if (obj instanceof Date) {\n return new Date(obj.getTime()) as unknown as T\n }\n\n if (obj instanceof Array) {\n const clone: unknown[] = []\n stack.set(obj, clone)\n for (const item of obj) {\n clone.push(stack.has(item) ? stack.get(item) : cloneDeep(item, stack))\n }\n return clone as unknown as T\n }\n\n // Class instances will be copied without cloning\n if (isAClassInstance(obj)) {\n const clone = obj\n return clone\n }\n\n if (obj instanceof Object) {\n const clone = {} as T\n stack.set(obj, clone)\n const objAsRecord = obj as Record<string | number, unknown>\n Object.keys(obj)\n .reduce((newObj: typeof objAsRecord, key: string | number): typeof objAsRecord => {\n newObj[key] = stack.has(objAsRecord[key]) ? stack.get(objAsRecord[key]) : cloneDeep(objAsRecord[key], stack)\n return newObj\n }, clone as typeof objAsRecord)\n\n return clone\n }\n\n return obj\n}\n\n\nexport const merge = <T, K>(obj1: T, obj2: K, visited: Map<any, any> = new Map()): T & K => {\n type Rec = Record<string | number, unknown>\n\n if (!obj1 || !obj2) return obj1 as T & K\n if ((obj1 as unknown) === (obj2 as unknown)) return obj1 as T & K\n\n const newObj = (isAClassInstance(obj1 as Rec) ? obj1 : cloneDeep(obj1)) as T & K\n\n // Taking care of recursive structures\n if (visited.has(obj2)) return visited.get(obj2)\n else visited.set(obj2, newObj)\n\n Object.keys(obj2 as Rec).forEach(key => {\n // Preventing prototype pollution\n if (key === '__proto__' || key === 'constructor') return\n\n if (isPlainObject((obj1 as Rec)[key]) && isPlainObject((obj2 as Rec)[key])) {\n (newObj as Rec)[key] = merge((obj1 as Rec)[key], (obj2 as Rec)[key], visited)\n } else if (isAClassInstance(obj2 as Rec)) {\n (newObj as Rec)[key] = obj2\n } else {\n (newObj as Rec)[key] = cloneDeep((obj2 as Rec)[key])\n }\n })\n\n return newObj\n}\n\nexport const omit = <T extends Record<string | number | symbol, unknown>>(obj: T, props: Array<keyof T>): Partial<T> => {\n obj = { ...obj }\n props.forEach(prop => delete obj[prop])\n return obj\n}\n\nexport const groupBy = <T extends Record<string | number, any>> (arr: T[], accessor: (a: T, index: number) => string | number): Record<string | number, T[]> => {\n return arr.reduce(\n (grouped, v, i, a, k = accessor(v, i)) => (((grouped[k] || (grouped[k] = [])).push(v), grouped)),\n {} as Record<string | number, T[]>\n )\n}\n\nexport const sortBy = <T>(arr: Array<T>, accessor: (a: T) => string | number): Array<T> => {\n return arr.concat() // The native sort method modifies the array in place. We use `.concat()` to copy the array first\n .sort((a, b): number => {\n return (accessor(a) > accessor(b)) ? 1 : ((accessor(b) > accessor(a)) ? -1 : 0)\n })\n}\n\nexport const throttle = <T extends (...args: any[]) => any>(\n f: T,\n delay: number,\n options?: {\n noTrailing?: boolean;\n noLeading?: boolean;\n debounceMode?: boolean;\n }\n): _throttle<T> => _throttle(delay, f, options)\n\nexport function getValue<T, ReturnType> (\n d: T,\n accessor: NumericAccessor<T> | StringAccessor<T> | BooleanAccessor<T> | ColorAccessor<T> | GenericAccessor<ReturnType, T>,\n index?: number\n): ReturnType {\n // eslint-disable-next-line @typescript-eslint/ban-types\n if (isFunction(accessor)) return (accessor as Function)(d, index) as (ReturnType | null | undefined)\n else return accessor as unknown as (ReturnType | null | undefined)\n}\n\nexport function getString<T> (d: T, accessor: StringAccessor<T>, i?: number): string | null | undefined {\n return getValue<T, string>(d, accessor, i)\n}\n\nexport function getNumber<T> (d: T, accessor: NumericAccessor<T>, i?: number): number | null | undefined {\n return getValue<T, number>(d, accessor, i)\n}\n\nexport function getBoolean<T> (d: T, accessor: BooleanAccessor<T>, i?: number): boolean | null | undefined {\n return getValue<T, boolean>(d, accessor, i)\n}\n\nexport function clean<T> (data: T[]): T[] {\n return data.filter(d => d && !isNumber(d))\n}\n\nexport function clamp (d: number, min: number, max: number): number {\n return Math.min(Math.max(d, min), max)\n}\n\nexport function unique<T> (array: T[]): T[] {\n return Array.from(new Set(array))\n}\n\nexport function countUnique<T> (array: T[], accessor = (d: unknown) => d): number {\n return new Set(array.map(d => accessor(d))).size\n}\n\nexport function arrayOfIndices (n: number): number[] {\n return [...Array(n).keys()]\n}\n\nexport function shallowDiff (o1: Record<string, unknown> = {}, o2: Record<string, unknown> = {}): Record<string, unknown> {\n return Object.keys(o2).reduce((diff, key) => {\n if (o1[key] === o2[key]) return diff\n return {\n ...diff,\n [key]: o2[key],\n }\n }, {})\n}\n\nexport function getStackedExtent<Datum> (data: Datum[], ...acs: NumericAccessor<Datum>[]): (number | undefined)[] {\n if (!data) return [undefined, undefined]\n if (isArray(acs)) {\n let minValue = 0\n let maxValue = 0\n data.forEach((d, i) => {\n let positiveStack = 0\n let negativeStack = 0\n for (const a of acs as NumericAccessor<Datum>[]) {\n const value = getNumber(d, a, i) || 0\n if (value >= 0) positiveStack += value\n else negativeStack += value\n }\n\n if (positiveStack > maxValue) maxValue = positiveStack\n if (negativeStack < minValue) minValue = negativeStack\n })\n return [minValue, maxValue]\n }\n}\n\nexport function getStackedValues<Datum> (d: Datum, index: number, ...acs: NumericAccessor<Datum>[]): (number | undefined)[] {\n const values = []\n\n let positiveStack = 0\n let negativeStack = 0\n for (const a of acs as NumericAccessor<Datum>[]) {\n const value = getNumber(d, a, index) || 0\n if (value >= 0) {\n values.push(positiveStack += value)\n } else {\n values.push(negativeStack += value)\n }\n }\n\n return values\n}\n\nexport function getStackedData<Datum> (\n data: Datum[],\n baseline: NumericAccessor<Datum>,\n acs: NumericAccessor<Datum>[],\n prevNegative?: boolean[] // to help guessing the stack direction (positive/negative) when the values are 0 or null\n): StackValuesRecord[] {\n const baselineValues = data.map((d, i) => getNumber(d, baseline, i) || 0)\n const isNegativeStack = acs.map((a, j) => {\n const average = mean(data, (d, i) => getNumber(d, a, i) || 0)\n return (average === 0 && Array.isArray(prevNegative)) ? prevNegative[j] : average < 0\n })\n\n const stackedData = acs.map(() => [] as StackValuesRecord)\n data.forEach((d, i) => {\n let positiveStack = baselineValues[i]\n let negativeStack = baselineValues[i]\n acs.forEach((a, j) => {\n const value = getNumber(d, a, i) || 0\n if (value >= 0) {\n stackedData[j].push([positiveStack, positiveStack += value])\n } else {\n stackedData[j].push([negativeStack, negativeStack += value])\n }\n })\n })\n\n // Fill in additional stack information\n stackedData.forEach((stack, i) => {\n stack.isMostlyNegative = isNegativeStack[i]\n })\n\n return stackedData\n}\n\nexport function getMin<Datum> (data: Datum[], ...acs: NumericAccessor<Datum>[]): number | undefined {\n if (!data) return undefined\n const minValue = min(data, (d, i) => min(acs as NumericAccessor<Datum>[], a => getNumber(d, a, i)))\n return minValue\n}\n\nexport function getMax<Datum> (data: Datum[], ...acs: NumericAccessor<Datum>[]): number | undefined {\n if (!data) return undefined\n const maxValue = max(data, (d, i) => max(acs as NumericAccessor<Datum>[], a => getNumber(d, a, i)))\n return maxValue\n}\n\nexport function getExtent<Datum> (data: Datum[], ...acs: NumericAccessor<Datum>[]): (number | undefined)[] {\n return [getMin(data, ...acs), getMax(data, ...acs)]\n}\n\nexport function getNearest<Datum> (\n data: Datum[],\n value: number,\n accessor: NumericAccessor<Datum>,\n direction: FindNearestDirection = FindNearestDirection.Auto\n): Datum {\n if (data.length <= 1) return data[0]\n\n const dataWithIndex = data.map((d, i) => ([d, i])) as [Datum, number][]\n const dataWithIndexSorted = dataWithIndex\n .sort(([a, i], [b, j]) => getNumber(a, accessor, i) - getNumber(b, accessor, j))\n const values = dataWithIndexSorted.map(([d, i]) => getNumber(d, accessor, i))\n\n const index = direction === FindNearestDirection.Left\n ? bisectRight(values, value, 1, data.length)\n : bisectLeft(values, value, 0, data.length - 1)\n\n if (direction === FindNearestDirection.Left) {\n return dataWithIndexSorted[index - 1][0]\n } else if (direction === FindNearestDirection.Right) {\n return dataWithIndexSorted[index][0]\n }\n\n return value - values[index - 1] > values[index] - value ? dataWithIndexSorted[index][0] : dataWithIndexSorted[index - 1][0]\n}\n\nexport function filterDataByRange<Datum> (\n data: Datum[],\n range: [number, number],\n accessor: NumericAccessor<Datum>,\n includeNeighbors = false\n): Datum[] {\n if (!accessor) return []\n\n const filteredData = data.filter((d, i) => {\n const value = getNumber(d, accessor, i)\n return (value >= range[0]) && (value <= range[1])\n })\n\n if (includeNeighbors) {\n // If `filteredData` is empty and `includeNeighbors` is true, try to find nearest points\n if (filteredData.length === 0) {\n const nearestLeft = getNearest(data, range[0], accessor, FindNearestDirection.Left)\n const nearestRight = getNearest(data, range[1], accessor, FindNearestDirection.Right)\n return [nearestLeft, nearestRight].filter(Boolean)\n }\n\n // Find indices of first and last filtered points in original data\n const firstFilteredItem = filteredData[0]\n const lastFilteredItem = filteredData[filteredData.length - 1]\n\n const firstFilteredIndex = data.findIndex((d: Datum) => d === firstFilteredItem)\n const lastFilteredIndex = data.findIndex((d: Datum) => d === lastFilteredItem)\n\n // Include neighbors (if they exist)\n const startIndex = Math.max(0, firstFilteredIndex - 1)\n const endIndex = Math.min(data.length - 1, lastFilteredIndex + 1)\n\n // Return data from startIndex to endIndex (inclusive)\n return data.slice(startIndex, endIndex + 1)\n }\n return filteredData\n}\n\nexport function isNumberWithinRange (value: number, range: [number, number]): boolean {\n return (value >= range[0] && value <= range[1]) || (value >= range[1] && value <= range[0])\n}\n\nexport const ensureArray = <T>(value: T | T[] | null): T[] => {\n if (value === null || value === undefined) {\n return []\n }\n\n if (Array.isArray(value)) {\n return value\n }\n\n return [value]\n}\n"],"names":["_throttle"],"mappings":";;;;AAOO,MAAM,QAAQ,GAAG,CAAI,CAAI,KAAwC,OAAO,CAAC,KAAK,SAAQ;AAC7F;AACO,MAAM,UAAU,GAAG,CAAI,CAAI,KAA0C,OAAO,CAAC,KAAK,WAAU;AAC5F,MAAM,WAAW,GAAG,CAAI,CAAI,KAA2C,CAAC,KAAK,UAAS;AACtF,MAAM,KAAK,GAAG,CAAI,CAAI,KAA4B,CAAC,IAAI,KAAI;AAC3D,MAAM,QAAQ,GAAG,CAAI,CAAI,KAAwC,OAAO,CAAC,KAAK,SAAQ;AACtF,MAAM,OAAO,GAAG,CAAI,CAAI,KAAuC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAC;AAC/E,MAAM,QAAQ,GAAG,CAAI,CAAI,MAAe,CAAC,YAAY,MAAM,EAAC;AACtD,MAAA,gBAAgB,GAAG,CAAI,CAAI,KAAc,CAAC,CAAC,WAAW,CAAC,IAAI,KAAK,UAAU,IAAI,CAAC,CAAC,WAAW,CAAC,IAAI,KAAK,SAAQ;AACnH,MAAM,aAAa,GAAG,CAAI,CAAI,KAAc,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,EAAC;AAE1G,MAAA,OAAO,GAAG,CAAI,GAAM,KAAa;AAC5C,IAAA,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,WAAmD,CAAC;AAC9F,QAAA,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,CAAC,MAAM,CAAA;AACvC,EAAC;AAED;AACa,MAAA,OAAO,GAAG,CACrB,CAA6B,EAC7B,CAA6B,EAC7B,QAAA,GAAqB,EAAE,EACvB,OAAA,GAAoB,IAAI,GAAG,EAAE,KAClB;AACX,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;AACpB,QAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;AAAE,YAAA,OAAO,KAAK,CAAA;AAE5D,QAAA,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;AAAE,YAAA,OAAO,IAAI,CAAA;;AAC1B,YAAA,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;AAEnB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACjC,YAAA,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC;AAAE,gBAAA,OAAO,KAAK,CAAA;AAC1D,SAAA;AAED,QAAA,OAAO,IAAI,CAAA;AACZ,KAAA;AAED,IAAA,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,IAAI,EAAE;QAC1C,OAAO,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,OAAO,EAAE,CAAA;AACnC,KAAA;AAED,IAAA,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE;AACrD,QAAA,IAAI,EAAE,OAAO,CAAC,KAAK,QAAQ,CAAC;AAAE,YAAA,OAAO,KAAK,CAAA;QAC1C,IAAI,CAAC,KAAK,CAAC;AAAE,YAAA,OAAO,IAAI,CAAA;QAExB,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAA;QACnE,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAA;AAEnE,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;AAAE,YAAA,OAAO,KAAK,CAAA;AAE/C,QAAA,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;AAAE,YAAA,OAAO,IAAI,CAAA;;AAC1B,YAAA,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;AAEnB,QAAA,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE;AACvB,YAAA,IAAI,CAAC,OAAO,CAAE,CAA6B,CAAC,GAAG,CAAC,EAAG,CAA6B,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC;AAAE,gBAAA,OAAO,KAAK,CAAA;AACxH,SAAA;AAED,QAAA,OAAO,IAAI,CAAA;AACZ,KAAA;IAED,OAAO,CAAC,KAAK,CAAC,CAAA;AAChB,EAAC;AAEM,MAAM,OAAO,GAAG,CAAI,GAAa,EAAE,GAAG,IAAS,KAAe,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAC;AACtG,MAAM,OAAO,GAAG,CAAI,GAAmB,KAAe,GAAG,CAAC,IAAI,GAAS;AACvE,MAAM,SAAS,GAAG,CAAI,GAAM,EAAE,KAAA,GAAuB,IAAI,GAAG,EAAE,KAAO;IAC1E,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE;AAC3C,QAAA,OAAO,GAAG,CAAA;AACX,KAAA;IAED,IAAI,GAAG,YAAY,IAAI,EAAE;QACvB,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAiB,CAAA;AAC/C,KAAA;IAED,IAAI,GAAG,YAAY,KAAK,EAAE;QACxB,MAAM,KAAK,GAAc,EAAE,CAAA;AAC3B,QAAA,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;AACrB,QAAA,KAAK,MAAM,IAAI,IAAI,GAAG,EAAE;AACtB,YAAA,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAA;AACvE,SAAA;AACD,QAAA,OAAO,KAAqB,CAAA;AAC7B,KAAA;;AAGD,IAAA,IAAI,gBAAgB,CAAC,GAAG,CAAC,EAAE;QACzB,MAAM,KAAK,GAAG,GAAG,CAAA;AACjB,QAAA,OAAO,KAAK,CAAA;AACb,KAAA;IAED,IAAI,GAAG,YAAY,MAAM,EAAE;QACzB,MAAM,KAAK,GAAG,EAAO,CAAA;AACrB,QAAA,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QACrB,MAAM,WAAW,GAAG,GAAuC,CAAA;AAC3D,QAAA,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;AACb,aAAA,MAAM,CAAC,CAAC,MAA0B,EAAE,GAAoB,KAAwB;AAC/E,YAAA,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAA;AAC5G,YAAA,OAAO,MAAM,CAAA;SACd,EAAE,KAA2B,CAAC,CAAA;AAEjC,QAAA,OAAO,KAAK,CAAA;AACb,KAAA;AAED,IAAA,OAAO,GAAG,CAAA;AACZ,EAAC;AAGM,MAAM,KAAK,GAAG,CAAO,IAAO,EAAE,IAAO,EAAE,OAAyB,GAAA,IAAI,GAAG,EAAE,KAAW;AAGzF,IAAA,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI;AAAE,QAAA,OAAO,IAAa,CAAA;IACxC,IAAK,IAAgB,KAAM,IAAgB;AAAE,QAAA,OAAO,IAAa,CAAA;AAEjE,IAAA,MAAM,MAAM,IAAI,gBAAgB,CAAC,IAAW,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAU,CAAA;;AAGhF,IAAA,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AAAE,QAAA,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;;AAC1C,QAAA,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IAE9B,MAAM,CAAC,IAAI,CAAC,IAAW,CAAC,CAAC,OAAO,CAAC,GAAG,IAAG;;AAErC,QAAA,IAAI,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,aAAa;YAAE,OAAM;AAExD,QAAA,IAAI,aAAa,CAAE,IAAY,CAAC,GAAG,CAAC,CAAC,IAAI,aAAa,CAAE,IAAY,CAAC,GAAG,CAAC,CAAC,EAAE;AACzE,YAAA,MAAc,CAAC,GAAG,CAAC,GAAG,KAAK,CAAE,IAAY,CAAC,GAAG,CAAC,EAAG,IAAY,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAA;AAC9E,SAAA;AAAM,aAAA,IAAI,gBAAgB,CAAC,IAAW,CAAC,EAAE;AACvC,YAAA,MAAc,CAAC,GAAG,CAAC,GAAG,IAAI,CAAA;AAC5B,SAAA;AAAM,aAAA;YACJ,MAAc,CAAC,GAAG,CAAC,GAAG,SAAS,CAAE,IAAY,CAAC,GAAG,CAAC,CAAC,CAAA;AACrD,SAAA;AACH,KAAC,CAAC,CAAA;AAEF,IAAA,OAAO,MAAM,CAAA;AACf,EAAC;MAEY,IAAI,GAAG,CAAsD,GAAM,EAAE,KAAqB,KAAgB;IACrH,GAAG,GAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAAQ,GAAG,CAAE,CAAA;AAChB,IAAA,KAAK,CAAC,OAAO,CAAC,IAAI,IAAI,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAA;AACvC,IAAA,OAAO,GAAG,CAAA;AACZ,EAAC;MAEY,OAAO,GAAG,CAA0C,GAAQ,EAAE,QAAkD,KAAkC;IAC7J,OAAO,GAAG,CAAC,MAAM,CACf,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,EAChG,EAAkC,CACnC,CAAA;AACH,EAAC;MAEY,MAAM,GAAG,CAAI,GAAa,EAAE,QAAmC,KAAc;AACxF,IAAA,OAAO,GAAG,CAAC,MAAM,EAAE;AAChB,SAAA,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAY;AACrB,QAAA,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;AACjF,KAAC,CAAC,CAAA;AACN,EAAC;MAEY,QAAQ,GAAG,CACtB,CAAI,EACJ,KAAa,EACb,OAIC,KACgBA,UAAS,CAAC,KAAK,EAAE,CAAC,EAAE,OAAO,EAAC;SAE/B,QAAQ,CACtB,CAAI,EACJ,QAAyH,EACzH,KAAc,EAAA;;IAGd,IAAI,UAAU,CAAC,QAAQ,CAAC;AAAE,QAAA,OAAQ,QAAqB,CAAC,CAAC,EAAE,KAAK,CAAoC,CAAA;;AAC/F,QAAA,OAAO,QAAsD,CAAA;AACpE,CAAC;SAEe,SAAS,CAAK,CAAI,EAAE,QAA2B,EAAE,CAAU,EAAA;IACzE,OAAO,QAAQ,CAAY,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAA;AAC5C,CAAC;SAEe,SAAS,CAAK,CAAI,EAAE,QAA4B,EAAE,CAAU,EAAA;IAC1E,OAAO,QAAQ,CAAY,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAA;AAC5C,CAAC;SAEe,UAAU,CAAK,CAAI,EAAE,QAA4B,EAAE,CAAU,EAAA;IAC3E,OAAO,QAAQ,CAAa,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAA;AAC7C,CAAC;AAEK,SAAU,KAAK,CAAK,IAAS,EAAA;AACjC,IAAA,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;AAC5C,CAAC;SAEe,KAAK,CAAE,CAAS,EAAE,GAAW,EAAE,GAAW,EAAA;AACxD,IAAA,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAA;AACxC,CAAC;AAEK,SAAU,MAAM,CAAK,KAAU,EAAA;IACnC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAA;AACnC,CAAC;AAEK,SAAU,WAAW,CAAK,KAAU,EAAE,QAAW,GAAA,CAAC,CAAU,KAAK,CAAC,EAAA;AACtE,IAAA,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;AAClD,CAAC;AAEK,SAAU,cAAc,CAAE,CAAS,EAAA;IACvC,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;AAC7B,CAAC;SAEe,WAAW,CAAE,KAA8B,EAAE,EAAE,KAA8B,EAAE,EAAA;AAC7F,IAAA,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,GAAG,KAAI;QAC1C,IAAI,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC;AAAE,YAAA,OAAO,IAAI,CAAA;QACpC,OACK,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAAA,IAAI,CACP,EAAA,EAAA,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,EACf,CAAA,CAAA;KACF,EAAE,EAAE,CAAC,CAAA;AACR,CAAC;SAEe,gBAAgB,CAAS,IAAa,EAAE,GAAG,GAA6B,EAAA;AACtF,IAAA,IAAI,CAAC,IAAI;AAAE,QAAA,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;AACxC,IAAA,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE;QAChB,IAAI,QAAQ,GAAG,CAAC,CAAA;QAChB,IAAI,QAAQ,GAAG,CAAC,CAAA;QAChB,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;YACpB,IAAI,aAAa,GAAG,CAAC,CAAA;YACrB,IAAI,aAAa,GAAG,CAAC,CAAA;AACrB,YAAA,KAAK,MAAM,CAAC,IAAI,GAA+B,EAAE;AAC/C,gBAAA,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAA;gBACrC,IAAI,KAAK,IAAI,CAAC;oBAAE,aAAa,IAAI,KAAK,CAAA;;oBACjC,aAAa,IAAI,KAAK,CAAA;AAC5B,aAAA;YAED,IAAI,aAAa,GAAG,QAAQ;gBAAE,QAAQ,GAAG,aAAa,CAAA;YACtD,IAAI,aAAa,GAAG,QAAQ;gBAAE,QAAQ,GAAG,aAAa,CAAA;AACxD,SAAC,CAAC,CAAA;AACF,QAAA,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;AAC5B,KAAA;AACH,CAAC;AAEK,SAAU,gBAAgB,CAAS,CAAQ,EAAE,KAAa,EAAE,GAAG,GAA6B,EAAA;IAChG,MAAM,MAAM,GAAG,EAAE,CAAA;IAEjB,IAAI,aAAa,GAAG,CAAC,CAAA;IACrB,IAAI,aAAa,GAAG,CAAC,CAAA;AACrB,IAAA,KAAK,MAAM,CAAC,IAAI,GAA+B,EAAE;AAC/C,QAAA,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;QACzC,IAAI,KAAK,IAAI,CAAC,EAAE;AACd,YAAA,MAAM,CAAC,IAAI,CAAC,aAAa,IAAI,KAAK,CAAC,CAAA;AACpC,SAAA;AAAM,aAAA;AACL,YAAA,MAAM,CAAC,IAAI,CAAC,aAAa,IAAI,KAAK,CAAC,CAAA;AACpC,SAAA;AACF,KAAA;AAED,IAAA,OAAO,MAAM,CAAA;AACf,CAAC;AAEK,SAAU,cAAc,CAC5B,IAAa,EACb,QAAgC,EAChC,GAA6B,EAC7B,YAAwB;;IAExB,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,SAAS,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;IACzE,MAAM,eAAe,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;QAC7D,OAAO,CAAC,OAAO,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,CAAC,CAAA;AACvF,KAAC,CAAC,CAAA;IAEF,MAAM,WAAW,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,EAAuB,CAAC,CAAA;IAC1D,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;AACpB,QAAA,IAAI,aAAa,GAAG,cAAc,CAAC,CAAC,CAAC,CAAA;AACrC,QAAA,IAAI,aAAa,GAAG,cAAc,CAAC,CAAC,CAAC,CAAA;QACrC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;AACnB,YAAA,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAA;YACrC,IAAI,KAAK,IAAI,CAAC,EAAE;AACd,gBAAA,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,aAAa,IAAI,KAAK,CAAC,CAAC,CAAA;AAC7D,aAAA;AAAM,iBAAA;AACL,gBAAA,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,aAAa,IAAI,KAAK,CAAC,CAAC,CAAA;AAC7D,aAAA;AACH,SAAC,CAAC,CAAA;AACJ,KAAC,CAAC,CAAA;;IAGF,WAAW,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,KAAI;AAC/B,QAAA,KAAK,CAAC,gBAAgB,GAAG,eAAe,CAAC,CAAC,CAAC,CAAA;AAC7C,KAAC,CAAC,CAAA;AAEF,IAAA,OAAO,WAAW,CAAA;AACpB,CAAC;SAEe,MAAM,CAAS,IAAa,EAAE,GAAG,GAA6B,EAAA;AAC5E,IAAA,IAAI,CAAC,IAAI;AAAE,QAAA,OAAO,SAAS,CAAA;AAC3B,IAAA,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,GAA+B,EAAE,CAAC,IAAI,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;AACnG,IAAA,OAAO,QAAQ,CAAA;AACjB,CAAC;SAEe,MAAM,CAAS,IAAa,EAAE,GAAG,GAA6B,EAAA;AAC5E,IAAA,IAAI,CAAC,IAAI;AAAE,QAAA,OAAO,SAAS,CAAA;AAC3B,IAAA,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,GAA+B,EAAE,CAAC,IAAI,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;AACnG,IAAA,OAAO,QAAQ,CAAA;AACjB,CAAC;SAEe,SAAS,CAAS,IAAa,EAAE,GAAG,GAA6B,EAAA;AAC/E,IAAA,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,MAAM,CAAC,IAAI,EAAE,GAAG,GAAG,CAAC,CAAC,CAAA;AACrD,CAAC;AAEe,SAAA,UAAU,CACxB,IAAa,EACb,KAAa,EACb,QAAgC,EAChC,SAAA,GAAkC,oBAAoB,CAAC,IAAI,EAAA;AAE3D,IAAA,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC;AAAE,QAAA,OAAO,IAAI,CAAC,CAAC,CAAC,CAAA;IAEpC,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAsB,CAAA;IACvE,MAAM,mBAAmB,GAAG,aAAa;AACtC,SAAA,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAA;IAClF,MAAM,MAAM,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAA;AAE7E,IAAA,MAAM,KAAK,GAAG,SAAS,KAAK,oBAAoB,CAAC,IAAI;AACnD,UAAE,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC;AAC5C,UAAE,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;AAEjD,IAAA,IAAI,SAAS,KAAK,oBAAoB,CAAC,IAAI,EAAE;QAC3C,OAAO,mBAAmB,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AACzC,KAAA;AAAM,SAAA,IAAI,SAAS,KAAK,oBAAoB,CAAC,KAAK,EAAE;AACnD,QAAA,OAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;AACrC,KAAA;AAED,IAAA,OAAO,KAAK,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,mBAAmB,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAC9H,CAAC;AAEK,SAAU,iBAAiB,CAC/B,IAAa,EACb,KAAuB,EACvB,QAAgC,EAChC,gBAAgB,GAAG,KAAK,EAAA;AAExB,IAAA,IAAI,CAAC,QAAQ;AAAE,QAAA,OAAO,EAAE,CAAA;IAExB,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;QACxC,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAA;AACvC,QAAA,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;AACnD,KAAC,CAAC,CAAA;AAEF,IAAA,IAAI,gBAAgB,EAAE;;AAEpB,QAAA,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE;AAC7B,YAAA,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,oBAAoB,CAAC,IAAI,CAAC,CAAA;AACnF,YAAA,MAAM,YAAY,GAAG,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,oBAAoB,CAAC,KAAK,CAAC,CAAA;YACrF,OAAO,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;AACnD,SAAA;;AAGD,QAAA,MAAM,iBAAiB,GAAG,YAAY,CAAC,CAAC,CAAC,CAAA;QACzC,MAAM,gBAAgB,GAAG,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;AAE9D,QAAA,MAAM,kBAAkB,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAQ,KAAK,CAAC,KAAK,iBAAiB,CAAC,CAAA;AAChF,QAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAQ,KAAK,CAAC,KAAK,gBAAgB,CAAC,CAAA;;AAG9E,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,kBAAkB,GAAG,CAAC,CAAC,CAAA;AACtD,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,iBAAiB,GAAG,CAAC,CAAC,CAAA;;QAGjE,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAA;AAC5C,KAAA;AACD,IAAA,OAAO,YAAY,CAAA;AACrB,CAAC;AAEe,SAAA,mBAAmB,CAAE,KAAa,EAAE,KAAuB,EAAA;AACzE,IAAA,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;AAC7F,CAAC;AAEY,MAAA,WAAW,GAAG,CAAI,KAAqB,KAAS;AAC3D,IAAA,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE;AACzC,QAAA,OAAO,EAAE,CAAA;AACV,KAAA;AAED,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACxB,QAAA,OAAO,KAAK,CAAA;AACb,KAAA;IAED,OAAO,CAAC,KAAK,CAAC,CAAA;AAChB;;;;"}