{
  "version": 3,
  "sources": ["../src/index.ts", "../src/YagrCore/defaults.ts", "../src/plugins/aggregates/utils.ts", "../src/plugins/aggregates/aggregates.ts", "../src/YagrCore/plugins/tooltip/utils.ts", "../src/YagrCore/plugins/tooltip/render.ts", "../src/YagrCore/utils/common.ts", "../src/YagrCore/plugins/tooltip/placement.ts", "../src/YagrCore/utils/colors.ts", "../src/YagrCore/plugins/cursor/cursor.ts", "../src/YagrCore/utils/events.ts", "../src/YagrCore/plugins/legend/utils.ts", "../src/YagrCore/plugins/legend/legend.ts", "../node_modules/uplot/dist/uPlot.esm.js", "../src/YagrCore/utils/types.ts", "../src/YagrCore/utils/axes.ts", "../src/YagrCore/utils/scales.ts", "../src/YagrCore/locale.ts", "../src/YagrCore/plugins/tooltip/tooltip.ts", "../src/YagrCore/plugins/markers/index.ts", "../src/YagrCore/utils/paths.ts", "../src/YagrCore/utils/series.ts", "../src/YagrCore/utils/chart.ts", "../src/YagrCore/plugins/plotLines/utils/calculateFromTo.ts", "../src/YagrCore/plugins/plotLines/plotLines.ts", "../src/YagrCore/mixins/create-options.ts", "../src/YagrCore/mixins/transform-series.ts", "../src/YagrCore/mixins/dynamic-updates.ts", "../src/YagrCore/utils/mixins.ts", "../src/YagrCore/mixins/batch-updates.ts", "../src/YagrCore/index.ts"],
  "sourcesContent": ["export * from './YagrCore/types';\nexport * from './YagrCore/plugins/tooltip/types';\nexport * from './plugins/aggregates/aggregates';\nexport * from './YagrCore/plugins/tooltip';\n\nexport {default as aggregatesPlugin} from './plugins/aggregates/aggregates';\n\nexport {CursorOptions} from './YagrCore/plugins/cursor/cursor';\nexport {\n    LegendOptions,\n    getSeriesInLegend,\n    hasOneVisibleLine,\n} from './YagrCore/plugins/legend/legend';\n\nexport * from './YagrCore/utils';\n\nimport * as DEF from './YagrCore/defaults';\nexport const defaults = DEF;\n\nimport Yagr from './YagrCore/index';\n\nif (typeof window !== 'undefined') {\n    Object.assign(window, {\n        Yagr,\n    });\n}\n\nexport default Yagr;\n", "import uPlot, {Padding} from 'uplot';\nimport {YagrTheme} from './types';\nimport type ColorParser from './utils/colors';\n\nexport const DEFAULT_X_SERIE_NAME = 'date';\nexport const DEFAULT_X_SCALE = 'x';\nexport const DEFAULT_Y_SCALE = 'y';\nexport const DEFAULT_FOCUS_ALPHA = 0.3;\nexport const DEFAULT_CANVAS_PIXEL_RATIO = typeof window === 'undefined' ? 1 : window.devicePixelRatio;\nexport const DEFAULT_MAX_TICKS = 5;\nexport const DEFAULT_Y_AXIS_OFFSET = 0.05;\nexport const DEFAULT_SCALE_MIN_RANGE = 0.01;\nexport const DEFAULT_LOGARITHMIC_MIN_SCALE_VALUE = 0.001;\nexport const DEFAULT_POINT_SIZE = DEFAULT_CANVAS_PIXEL_RATIO >= 2 ? 4 : 2;\n\nexport const DEFAULT_SYNC_KEY = 'sync';\nexport const DEFAULT_TITLE_FONT_SIZE = 14;\n\nexport const LIGHT_DEFAULT_LINE_COLOR = '#222222';\nexport const DARK_DEFAULT_LINE_COLOR = '#eeeeee';\n\nexport const DEFAULT_AXIS_FONT_SIZE = 11;\nexport const AXIS_LABEL_FONT = 'normal 11px Lucida Grande, Arial, Helvetica, sans-serif';\nexport const AXIS_VALUES_FONT = '11px Lucida Grande, Arial, Helvetica, sans-serif';\n\nexport const Y_AXIS_TICK_GAP = 6;\nexport const DEFAULT_Y_AXIS_SIZE = 12;\nexport const DEFAULT_Y_AXIS_PADDING = 12;\nexport const DEFAULT_Y_AXIS_LABEL_PADDING = 2;\nexport const Y_AXIS_SIZE = (self: uPlot, values: string[], axisIdx: number) => {\n    if (!values) {\n        return DEFAULT_Y_AXIS_SIZE;\n    }\n\n    const longesValue = values.reduce((l, c) => (l.length > c.length ? l : c));\n    const {ctx} = self;\n    ctx.save();\n    const axis = self.axes[axisIdx];\n\n    ctx.font = axis.font ? axis.font[0] : AXIS_VALUES_FONT;\n    const {width: textSize} = ctx.measureText(longesValue);\n    ctx.restore();\n\n    let labelSize = 0;\n    if (axis.label) {\n        labelSize = axis.labelSize || DEFAULT_AXIS_FONT_SIZE;\n\n        ctx.font = axis.labelFont ? axis.labelFont[0] : AXIS_LABEL_FONT;\n\n        let labelText: string;\n        if (typeof axis.label === 'function') {\n            labelText = axis.label(self, axisIdx, 0, 0);\n        } else {\n            labelText = axis.label;\n        }\n\n        const {fontBoundingBoxAscent: size} = ctx.measureText(labelText);\n        labelSize = size;\n        ctx.restore();\n    }\n\n    return labelSize\n        ? textSize / DEFAULT_CANVAS_PIXEL_RATIO + labelSize / DEFAULT_CANVAS_PIXEL_RATIO + DEFAULT_Y_AXIS_LABEL_PADDING\n        : textSize / DEFAULT_CANVAS_PIXEL_RATIO + DEFAULT_Y_AXIS_PADDING;\n};\nexport const Y_AXIS_LABEL_SIZE = 11;\n\nexport const SECOND = 1000;\nexport const MINUTE = SECOND * 60;\nexport const HOUR = MINUTE * 60;\nexport const DAY = HOUR * 24;\nexport const YEAR = DAY * 365;\nexport const DECADE = YEAR * 10;\n\nexport const X_AXIS_TICK_GAP = 6;\nexport const X_AXIS_SIZE = 32;\nexport const X_AXIS_SPACE = 80;\nexport const X_AXIS_INCRS = [\n    // seconds divisors (# os ms)\n    1,\n    10,\n    50,\n    100,\n    200,\n    500,\n    // minute divisors\n    SECOND,\n    SECOND * 2,\n    SECOND * 5,\n    SECOND * 10,\n    SECOND * 15,\n    SECOND * 30,\n    // hour divisors\n    MINUTE,\n    MINUTE * 5,\n    MINUTE * 10,\n    MINUTE * 30,\n    // day divisors\n    HOUR,\n    HOUR * 2,\n    HOUR * 3,\n    HOUR * 4,\n    HOUR * 6,\n    HOUR * 12,\n    // month divisors\n    DAY,\n    DAY * 2,\n    DAY * 3,\n    DAY * 5,\n    DAY * 10,\n    DAY * 15,\n    DAY * 30,\n    DAY * 60,\n    DAY * 120,\n    DAY * 180,\n    // year divisors\n    YEAR,\n    YEAR * 2,\n    YEAR * 5,\n    YEAR * 10,\n];\n\nexport const TYPES_ORDER = ['dots', 'line', 'area', 'column'];\n\nexport const BARS_DRAW_FACTOR = 0.5;\nexport const BARS_DRAW_MAX = 100;\n\nexport const PADDING_LEFT: Padding = [14, 14, 0, 4];\nexport const PADDING_RIGHT: Padding = [14, 4, 0, 14];\nexport const PADDING_BOTH: Padding = [14, 4, 0, 4];\n\nexport const SERIE_COLOR = 'rgba(0, 0, 0, 1)';\nexport const SERIE_LINE_WIDTH = 2;\nexport const SERIE_AREA_BORDER_COLOR = 'rgba(0, 0, 0, 0.2)';\nexport const SERIE_AREA_BORDER_WIDTH = 1;\n\nexport const MARKER_DIAMETER = 8;\nexport const CURSOR_STYLE = '1px solid #ffa0a0';\n\nexport const MIN_SELECTION_WIDTH = 15;\n\nconst LIGHTEN_COLOR_SHIFT = 0.68;\nconst DARKEN_COLOR_SHIFT = -0.6;\n\nexport default class ThemedDefaults {\n    theme?: YagrTheme;\n    colors: ColorParser;\n\n    constructor(colors: ColorParser, theme: YagrTheme = 'light') {\n        this.setTheme(theme);\n        this.colors = colors;\n    }\n\n    setTheme(theme: YagrTheme) {\n        this.theme = theme;\n    }\n\n    get GRID() {\n        return {\n            show: true,\n            stroke: () => this.colors.parse('--yagr-grid'),\n            width: 1,\n        };\n    }\n\n    get X_AXIS_TICKS() {\n        return {size: 8, ...this.GRID};\n    }\n\n    get Y_AXIS_TICKS() {\n        return {size: 6, ...this.GRID};\n    }\n\n    get AXIS_STROKE() {\n        return this.colors.parse('--yagr-axis-stroke');\n    }\n\n    get BACKGROUND() {\n        return this.colors.parse('--yagr-background');\n    }\n\n    get SHIFT() {\n        return this.theme?.startsWith('light') ? LIGHTEN_COLOR_SHIFT : DARKEN_COLOR_SHIFT;\n    }\n\n    get DEFAULT_LINE_COLOR() {\n        return this.theme?.startsWith('light') ? LIGHT_DEFAULT_LINE_COLOR : DARK_DEFAULT_LINE_COLOR;\n    }\n}\n\nexport const TOOLTIP_Y_OFFSET = 24;\nexport const TOOLTIP_X_OFFSET = 24;\nexport const TOOLTIP_DEFAULT_MAX_LINES = 10;\nexport const TIME_MULTIPLIER = 1;\n", "import {DataSeriesExtended} from '../../types';\n\nexport function integrate(timestamps: number[], values: DataSeriesExtended) {\n    if (timestamps.length < 2) {\n        return 0;\n    }\n\n    let t0 = timestamps[0];\n    let x0 = Number(values[0]);\n    let t1: number;\n    let x1: number;\n    let integral = 0;\n\n    for (let i = 1; i < timestamps.length; i++) {\n        x1 = Number(values[i]);\n        t1 = timestamps[i];\n\n        // we skip over all non-numeric values in a serie\n        // so that all holes and single points (surrounded by\n        // empty void) do not add anything to the integral\n        if (!Number.isNaN(x1) && !Number.isNaN(x0)) {\n            const dt = t1 - t0;\n            const dx = x1 - x0;\n            const area = (x0 + dx / 2) * dt;\n            integral += area;\n        }\n\n        t0 = t1;\n        x0 = x1;\n    }\n\n    return integral;\n}\n\nexport function countNumbers(values: DataSeriesExtended, from = 0, to = values.length - 1) {\n    let cnt = 0;\n    for (let i = from; i <= to; i++) {\n        const val = values[i];\n        if (typeof val === 'number') {\n            cnt++;\n        }\n    }\n\n    return cnt;\n}\n\nexport function getLast(values: DataSeriesExtended, from = 0, to = values.length - 1): number | null {\n    for (let i = to; i >= from; i--) {\n        const val = values[i];\n        if (val !== null && typeof val === 'number') {\n            return val;\n        }\n    }\n\n    return null;\n}\n\nexport const safeMin = (values: DataSeriesExtended, from = 0, to = values.length - 1) => {\n    if (values.length === 0) {\n        return null;\n    }\n    let min = null;\n\n    for (let i = from; i <= to; i++) {\n        const v = values[i];\n\n        if (v === null || typeof v === 'string') {\n            continue;\n        }\n\n        if (min === null || v < min) {\n            min = v;\n        }\n    }\n\n    return min;\n};\n\nexport const safeMax = (values: DataSeriesExtended, from = 0, to = values.length - 1) => {\n    if (values.length === 0) {\n        return null;\n    }\n    let max = null;\n\n    for (let i = from; i <= to; i++) {\n        const v = values[i];\n\n        if (v === null || typeof v === 'string') {\n            continue;\n        }\n\n        if (max === null || v > max) {\n            max = v;\n        }\n    }\n\n    return max;\n};\n\nexport const safeSum = (values: DataSeriesExtended, from = 0, to = values.length - 1) => {\n    if (values.length === 0) {\n        return null;\n    }\n\n    let sum = null;\n\n    for (let i = from; i <= to; i++) {\n        const v = values[i];\n\n        if (v === null || typeof v === 'string') {\n            continue;\n        }\n\n        if (sum === null) {\n            sum = v;\n        } else {\n            sum += v;\n        }\n    }\n\n    return sum;\n};\n", "import {DataSeriesExtended, YagrPlugin} from '../../types';\nimport uPlot, {Series} from 'uplot';\nimport {DEFAULT_X_SCALE} from '../../YagrCore/defaults';\nimport type Yagr from '../../YagrCore/index';\nimport {countNumbers, getLast, integrate, safeMax, safeMin, safeSum} from './utils';\n\nexport type Aggregates = {\n    min: number | null;\n    max: number | null;\n    sum: number | null;\n    avg: number | null;\n    count: number;\n    integral: number | null;\n    last: number | null;\n};\nexport type AggregatesPerScale = Record<string, Aggregates>;\nexport type AggregatesPerSeries = Record<\n    string,\n    {\n        series: Record<string, Aggregates>;\n        total: Aggregates;\n    }\n>;\n\nexport type AggregatesPluginOptions = {\n    /** Should calc aggregates on ready event (true by default) */\n    calcOnReady?: boolean;\n};\n\nconst DataRef = (opst: AggregatesPluginOptions) => {\n    const plugin: YagrPlugin<{\n        get: (from?: number, to?: number) => AggregatesPerScale | AggregatesPerSeries;\n        calc: (from: number, to: number, id: string) => Aggregates;\n    }> = (yagr: Yagr) => {\n        const aggrs: AggregatesPerScale = {};\n\n        const pluginMethods = {\n            get: (fromIdx?: number, toIdx?: number) => {\n                if (fromIdx === undefined && toIdx === undefined) {\n                    return aggrs;\n                }\n\n                if (fromIdx === undefined) {\n                    fromIdx = 0;\n                }\n\n                if (toIdx === undefined) {\n                    toIdx = yagr.uplot.data[0].length - 1;\n                }\n\n                const result: AggregatesPerSeries = {};\n\n                yagr.uplot.series.forEach(({scale, id}) => {\n                    if (scale === DEFAULT_X_SCALE || !scale) {\n                        return;\n                    }\n                    result[scale] = result[scale] || {};\n                    result[scale].series = result[scale].series || {};\n                    result[scale].series[id] = pluginMethods.calc(fromIdx as number, toIdx as number, id);\n                });\n\n                Object.keys(result).forEach((scale) => {\n                    const total: Aggregates = {\n                        min: safeMin(Object.values(result[scale].series).map(({min}) => min)),\n                        max: safeMax(Object.values(result[scale].series).map(({max}) => max)),\n                        sum: safeSum(Object.values(result[scale].series).map(({sum}) => sum)),\n                        avg: 0,\n                        count: Object.values(result[scale].series).reduce((acc, {count}) => acc + count, 0),\n                        integral: Object.values(result[scale].series).reduce(\n                            (acc, {integral}) => acc + (integral ?? 0),\n                            0,\n                        ),\n                        last: 0,\n                    };\n\n                    total.avg = total.sum === null ? null : total.sum / total.count;\n                    total.last = null;\n\n                    result[scale].total = total;\n                });\n\n                return result;\n            },\n            calc: (fromIdx: number, toIdx: number, seriesId: string) => {\n                const seriesIdx = yagr.state.y2uIdx[seriesId];\n                const timestamps = yagr.uplot.data[0].slice(fromIdx, toIdx + 1) as number[];\n                const values = yagr.uplot.series[seriesIdx].$c;\n                const integral = integrate(timestamps, values.slice(fromIdx, toIdx + 1));\n                const sum = safeSum(values, fromIdx, toIdx);\n                const min = safeMin(values, fromIdx, toIdx);\n                const max = safeMax(values, fromIdx, toIdx);\n                const cnt = countNumbers(values, fromIdx, toIdx);\n                const avg = sum === null ? null : sum / cnt;\n                const last = getLast(values, fromIdx, toIdx);\n\n                return {min, max, sum, avg, count: cnt, integral, last};\n            },\n\n            uplot: {\n                hooks:\n                    opst.calcOnReady === false\n                        ? {}\n                        : {\n                              ready: (u: uPlot) => {\n                                  Object.keys(u.scales).forEach((key) => {\n                                      if (key === DEFAULT_X_SCALE) {\n                                          return;\n                                      }\n                                      aggrs[key] = {\n                                          min: null,\n                                          max: null,\n                                          sum: null,\n                                          avg: null,\n                                          integral: null,\n                                          count: 0,\n                                          last: null,\n                                      };\n                                  });\n\n                                  (u.series as Required<Series>[]).forEach(({scale, $c, count}) => {\n                                      if (scale === DEFAULT_X_SCALE) {\n                                          return;\n                                      }\n                                      const numericValues = $c.filter(\n                                          (v) => typeof v === 'number' && v !== null,\n                                      ) as number[];\n\n                                      aggrs[scale].min = safeMin([...numericValues, aggrs[scale].min]);\n                                      aggrs[scale].max = safeMax([...numericValues, aggrs[scale].max]);\n                                      const sum = aggrs[scale].sum;\n                                      const rowSum = safeSum(numericValues);\n                                      aggrs[scale].sum =\n                                          sum === null ? safeSum(numericValues) : rowSum === null ? sum : sum + rowSum;\n                                      aggrs[scale].count += count;\n                                      const integral = aggrs[scale].integral;\n                                      const rowIntegral = integrate(\n                                          u.data[0] as number[],\n                                          $c as DataSeriesExtended,\n                                      );\n                                      aggrs[scale].integral = integral === null ? rowIntegral : integral + rowIntegral;\n                                  });\n\n                                  Object.keys(aggrs).forEach((key) => {\n                                      const sum = aggrs[key].sum;\n                                      aggrs[key].avg = sum === null ? null : sum / aggrs[key].count;\n                                  });\n                              },\n                          },\n            },\n        };\n\n        return pluginMethods;\n    };\n    return plugin;\n};\n\nexport default DataRef;\n\nif (typeof window !== 'undefined') {\n    Object.assign(window, {YagrAggregates: DataRef});\n}\n", "export function getOptionValue<T>(option: T | {[key in string]: T}, scale: string): T {\n    return (typeof option === 'object' ? (option as {[key in string]: T})[scale] : option) as T;\n}\n\nexport function escapeHTML(html: string) {\n    const elem = document.createElement('span');\n\n    elem.innerText = html;\n    return elem.innerHTML;\n}\n", "/* eslint-disable complexity, no-nested-ternary */\nimport {TooltipRenderOptions, TooltipRow} from './types';\nimport {getOptionValue, escapeHTML} from './utils';\n\nfunction renderItems(rows: TooltipRow[], opts: TooltipRenderOptions['options'], scale: string) {\n    const rowsMax = rows.slice(0, getOptionValue(opts.maxLines, scale));\n\n    return (\n        rowsMax\n            .map(({value, name = 'unnamed', color, active, transformed, seriesIdx}, i) => {\n                const val = `\n<span class=\"yagr-tooltip__val\">${value}</span>\n    ${typeof transformed === 'number' ? `<span class=\"yagr-tooltip__tf\">${transformed.toFixed(2)}</span>` : ''}\n`;\n                return `\n<div class=\"yagr-tooltip__item ${active ? '_active' : ''}\" data-series=\"${seriesIdx}\">\n    ${opts.showIndicies ? `<span class=\"yagr-tooltip__idx\">${rows.length - i}</span>` : ''}\n    <span class=\"yagr-tooltip__mark\" style=\"background-color: ${color}\"></span>${escapeHTML(name)}&nbsp;&nbsp;${val}\n</div>`;\n            })\n            .join('') +\n        (rows.length > rowsMax.length\n            ? `<div class=\"yagr-tooltip__item _more\">+${rows.length - rowsMax.length}</div>`\n            : '')\n    );\n}\n\nexport function renderTooltip(data: TooltipRenderOptions) {\n    if (data.scales.length === 0) {\n        return data.yagr.utils.i18n('nodata');\n    }\n\n    const [allTitle, sectionTitle] = data.options.title\n        ? typeof data.options.title === 'string'\n            ? [data.options.title, false]\n            : typeof data.options.title === 'function'\n              ? [data.options.title(data), false]\n              : ['', true]\n        : ['', false];\n\n    const sections = data.scales.map((x) => {\n        const xScaleTitle = getOptionValue(data.options.title, x.scale);\n        const sectionTitleBody =\n            typeof xScaleTitle === 'function' ? xScaleTitle(data) : xScaleTitle;\n        const scaleBody =\n            data.scales.length > 1\n                ? data.options.scales\n                    ? `${getOptionValue(data.options.scales, x.scale) || ''}`\n                    : `${data.yagr.utils.i18n('scale')}: ${x.scale}`\n                : '';\n        return `\n<div class=\"__section\" data-scale=${x.scale}>\n    ${sectionTitle && sectionTitleBody ? `<div class=\"_section_title\">${sectionTitleBody}</div>` : ''}\n    ${scaleBody ? `<div class=\"__section_scale\">${scaleBody}</div>` : ''}\n    <div class=\"__section_body\">${renderItems(x.rows, data.options, x.scale)}</div>\n    ${\n        getOptionValue(data.options.sum, x.scale)\n            ? `\n        <div class=\"__section_sum\">\n            ${data.yagr.utils.i18n('sum')}: ${x.sum}\n        </div>\n    `\n            : ''\n    }\n</div>`;\n    });\n\n    return `${allTitle ? `<div class=\"__title\">${allTitle}</div>` : ''}${sections.join('')}`;\n}\n", "/* eslint-disable no-nested-ternary */\n\nimport {Series} from 'uplot';\nimport {DataSeriesExtended, DataSeries, SnapToValue, ProcessingSettings, ProcessingInterpolation} from '../types';\nimport {TooltipSection} from '../plugins/tooltip/types';\n\n/**\n * Finds index of point in ranges of Y-Axis values.\n * Returns index of starting range when idx < Y <= idx next\n *\n * @param {TooltipSection} section - tooltip section\n * @param {number} value - Y value of cursor\n * @param {boolean} stickToRanges - if true, then always return index of range\n * @returns {number | null}\n */\nexport const findInRange = (section: TooltipSection, value: number, stickToRanges = true): number | null => {\n    const positive = value >= 0;\n    let max = -Infinity,\n        maxIdx = null;\n    let min = Infinity,\n        minIdx = null;\n\n    const diffs: Array<number | null> = [];\n    let result: number | null = null;\n\n    for (let r = section.rows.length - 1; r >= 0; r--) {\n        const row = section.rows[r];\n        const {displayY: y, rowIdx} = row;\n\n        let diff: number | null;\n\n        if (y !== null) {\n            if (y > max) {\n                max = y;\n                maxIdx = row.rowIdx;\n            }\n\n            if (y < min) {\n                min = y;\n                minIdx = row.rowIdx;\n            }\n        }\n\n        if (y === null || (positive ? y < 0 : y >= 0)) {\n            diff = null;\n        } else if (positive) {\n            diff = value > y ? null : y - value;\n        } else {\n            diff = value < y ? null : Math.abs(y - value);\n        }\n\n        const currentMin = result === null ? Infinity : (diffs[result] as number);\n        const nextMin = diff === null ? currentMin : Math.min(currentMin, diff);\n\n        if ((diff !== null && currentMin === diff) || nextMin !== currentMin) {\n            result = rowIdx;\n        }\n    }\n\n    if (result === null && stickToRanges) {\n        return value >= max ? maxIdx : value <= min ? minIdx : null;\n    }\n\n    return result;\n};\n\n/* Gets sum of all values of given data index by all series */\nexport const getSumByIdx = (seriesOptions: Series[], idx: number, scale: string) => {\n    let sum = 0;\n    let i = 0;\n    while (i < seriesOptions.length) {\n        const seriesIdx = seriesOptions.length - i - 1;\n        const opts = seriesOptions[seriesIdx];\n        const seriesValues = opts.$c;\n        i += 1;\n        if (opts.scale !== scale || opts.show === false || opts.showInGraph === false) {\n            continue;\n        }\n        const value = seriesValues[idx];\n        sum += typeof value === 'number' ? value : 0;\n    }\n    return sum;\n};\n\n/**\n * Finds index of nearest non-null point in range of Y-Axis values\n *\n * @param {TooltipSection} section\n * @param {number} value\n * @returns {number | null}\n */\nexport const findSticky = (section: TooltipSection, value: number): number | null => {\n    let nearestIndex;\n    let nearestValue;\n\n    let i = 0;\n    while (!nearestValue && i < section.rows.length) {\n        const r = section.rows[i].displayY;\n        if (r !== null) {\n            nearestIndex = i;\n            nearestValue = Math.abs(r - (value || 0));\n        }\n        i += 1;\n    }\n\n    if (!nearestValue || nearestIndex === undefined) {\n        return null;\n    }\n\n    for (i = nearestIndex + 1; i < section.rows.length; i++) {\n        const v = section.rows[i].displayY;\n\n        if (v === null) {\n            continue;\n        }\n\n        const diff = Math.abs(v - value);\n\n        if (nearestValue > diff) {\n            nearestValue = diff;\n            nearestIndex = i;\n        }\n    }\n\n    return nearestIndex;\n};\n\nexport const getUnitSuffix = (value: number): [number, string] => {\n    if (value >= 1e18) {\n        return [1e18, 'E'];\n    } else if (value >= 1e15) {\n        return [1e15, 'P'];\n    } else if (value >= 1e12) {\n        return [1e12, 'T'];\n    } else if (value >= 1e9) {\n        return [1e9, 'G'];\n    } else if (value >= 1e6) {\n        return [1e6, 'M'];\n    } else if (value >= 1e3) {\n        return [1e3, 'K'];\n    }\n    return [1, ''];\n};\n\n/* Number.toFixed() wihout rounding */\nexport function toFixed(num: number, fixed: number) {\n    if (fixed === 0) {\n        return parseInt(num as unknown as string);\n    }\n\n    if (Number.isInteger(num)) {\n        return num + '.' + '0'.repeat(fixed);\n    }\n\n    const [int, frac] = num.toString().split('.');\n    return frac.length >= fixed ? `${int}.${frac.slice(0, fixed)}` : `${int}.${frac}${'0'.repeat(fixed - frac.length)}`;\n}\n\n/**\n * Finds nearest non-null value's index in data series by given direction\n *\n * @param {DataSeriesExtended} data - Series data\n * @param {Series} series - Series options\n * @param {number} idx - cursor index\n * @param {SnapToValue | false} defaultSnapTo - default value for direction\n * @param {unknown} skipValue - value to skip\n * @returns {number}\n */\nexport function findDataIdx(\n    data: DataSeriesExtended,\n    series: Series,\n    idx: number,\n    defaultSnapTo: SnapToValue | false = 'closest',\n    skipValue: unknown = null,\n) {\n    let corL = idx,\n        corR = idx;\n\n    const direction = series.snapToValues ?? defaultSnapTo;\n\n    if (direction === false) {\n        return idx;\n    }\n\n    if (direction === 'left' || direction === 'closest') {\n        for (let i = idx - 1; i >= 0; i--) {\n            if (data[i] !== skipValue) {\n                corL = i;\n                break;\n            }\n        }\n    }\n\n    if (direction === 'right' || direction === 'closest') {\n        for (let i = idx + 1; i < data.length; i++) {\n            if (data[i] !== skipValue) {\n                corR = i;\n                break;\n            }\n        }\n    }\n\n    if (direction === 'left') {\n        return corL;\n    }\n    if (direction === 'right') {\n        return corR;\n    }\n\n    return corR - idx > idx - corL ? corL : corR;\n}\n\n/*\n * Interpolation function\n */\nconst interpolateImpl = (\n    timeline: number[],\n    y1: number | null,\n    y2: number | null,\n    x1: number,\n    x2: number,\n    xIdx: number,\n    iGroup: number[],\n    type: ProcessingInterpolation['type'] | number = 'linear',\n) => {\n    let result = null;\n    const x = timeline[xIdx];\n\n    switch (type) {\n        case 'linear': {\n            if (y1 === null || y2 === null) {\n                return null;\n            }\n\n            result = y1 + ((x - x1) * (y2 - y1)) / (x2 - x1);\n\n            if (isNaN(result) || Math.abs(result) === Infinity) {\n                result = null;\n            }\n            break;\n        }\n        case 'previous': {\n            result = y1;\n            break;\n        }\n        case 'next': {\n            result = y2;\n            break;\n        }\n        case 'left': {\n            result = iGroup[iGroup.length - 1] === timeline.length - 1 || y2 === null ? null : y1;\n            break;\n        }\n        case 'right': {\n            result = iGroup[0] === 0 ? null : y2;\n            break;\n        }\n        case 'closest': {\n            const lD = Math.abs(x1 - timeline[xIdx]);\n            const rD = Math.abs(x2 - timeline[xIdx]);\n            result = lD < rD ? y1 : y2;\n            break;\n        }\n        default: {\n            result = type;\n        }\n    }\n    return result;\n};\n\n// https://stackoverflow.com/a/53116778\nexport const genId = () => Date.now().toString(36) + Math.random().toString(36).substring(2);\n\n/**\n * Processing data series to:\n *  1. Find missing data and interpolate these points\n *  2. Find string special values to convert them to nulls\n *\n * @param {DataSeriesExtended[]} series\n * @param {number[]} timeline\n * @param {ProcessingSettings} settings\n * @returns {DataSeries[]}\n */\nexport const preprocess = (\n    series: DataSeriesExtended[],\n    timeline: number[],\n    settings: ProcessingSettings,\n): DataSeries[] => {\n    const result = [];\n    const nullValues = settings.nullValues || {};\n    const interpolation = settings.interpolation;\n    for (let sIdx = 0; sIdx < series.length; sIdx++) {\n        const line = series[sIdx];\n        const resultLine = [];\n\n        let iGroup = [];\n        let y1 = null,\n            y2 = null,\n            x1,\n            x2;\n\n        for (let idx = 0; idx < line.length; idx++) {\n            let val = line[idx];\n\n            if (interpolation && val === interpolation.value) {\n                iGroup.push(idx);\n                continue;\n            }\n\n            if (nullValues[val as string]) {\n                val = null;\n            }\n\n            if (iGroup.length) {\n                y2 = val;\n                x2 = timeline[idx];\n                for (const iIdx of iGroup) {\n                    resultLine[iIdx] = interpolateImpl(\n                        timeline,\n                        y1 as number | null,\n                        y2 as number | null,\n                        x1 || timeline[0],\n                        x2 || timeline[timeline.length - 1],\n                        iIdx,\n                        iGroup,\n                        interpolation && interpolation.type,\n                    );\n                }\n                iGroup = [];\n            }\n\n            y1 = val;\n            x1 = timeline[idx];\n            resultLine.push(val);\n        }\n\n        y2 = null;\n\n        if (iGroup.length) {\n            for (const iIdx of iGroup) {\n                resultLine.push(\n                    interpolateImpl(\n                        timeline,\n                        y1 as number | null,\n                        y2 as number | null,\n                        x1 || timeline[0],\n                        x2 || timeline[timeline.length - 1],\n                        iIdx,\n                        iGroup,\n                        interpolation && interpolation.type,\n                    ),\n                );\n            }\n        }\n        result.push(resultLine);\n    }\n\n    return result as DataSeries[];\n};\n\nexport const exec = <T, ArgsT extends unknown[]>(s: T | ((...a: ArgsT) => T), ...args: ArgsT) => {\n    return typeof s === 'function' ? (s as (...a: ArgsT) => T)(...args) : s;\n};\n\nexport function debounce<T extends Array<unknown> = []>(func: (...args: T) => void, timeout = 300) {\n    let timer: ReturnType<typeof setTimeout>;\n\n    return (...args: T) => {\n        clearTimeout(timer);\n        timer = setTimeout(() => func(...args), timeout);\n    };\n}\n\nexport const px = (x: number) => x + 'px';\nexport const html = (\n    tag: string,\n    attrs: Record<string, string | Record<string, string>> = {},\n    content?: string | HTMLElement,\n) => {\n    const el = document.createElement(tag);\n    Object.keys(attrs).forEach((key) => {\n        const attr = attrs[key];\n        el.setAttribute(\n            key,\n            typeof attr === 'object'\n                ? Object.entries(attr)\n                      .map(([a, b]) => `${a}:${b}`)\n                      .join(';')\n                : attr,\n        );\n    });\n    if (content) {\n        if (typeof content === 'string') {\n            el.innerHTML = content;\n        } else {\n            el.appendChild(content);\n        }\n    }\n    return el;\n};\n\ntype Prev = [never, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...0[]];\ntype Join<K, P> = K extends string | number\n    ? P extends string | number\n        ? `${K}${'' extends P ? '' : '.'}${P}`\n        : never\n    : never;\nexport type Paths<T, D extends number = 10> = [D] extends [never]\n    ? never\n    : T extends object\n    ? {\n          [K in keyof T]-?: K extends string | number ? `${K}` | Join<K, Paths<T[K], Prev[D]>> : never;\n      }[keyof T]\n    : '';\n\nexport function get(obj: object, key: string) {\n    return key.split('.').reduce((acc, key) => Object.getOwnPropertyDescriptor(acc, key)?.value ?? {}, obj);\n}\n\nexport function deepIsEqual(a: unknown, b: unknown): boolean {\n    if (typeof a !== typeof b) {\n        return false;\n    }\n\n    if (typeof a === 'function' || typeof b === 'function') {\n        a = (a as Function).toString();\n        b = (b as Function).toString();\n    }\n\n    if (typeof a !== 'object' || isNil(a) || isNil(b)) {\n        return a === b;\n    }\n\n    const aObject = a as Record<string, unknown>;\n    const bObject = b as Record<string, unknown>;\n\n    const aKeys = Object.keys(aObject);\n    const bKeys = Object.keys(bObject);\n\n    if (aKeys.length !== bKeys.length) {\n        return false;\n    }\n\n    for (const key of aKeys) {\n        if (!bObject.hasOwnProperty(key)) {\n            return false;\n        }\n\n        if (!deepIsEqual(aObject[key], bObject[key])) {\n            return false;\n        }\n    }\n\n    return true;\n}\n\nexport function asFn<T>(t: T) {\n    return typeof t === 'function' ? t : typeof t === 'undefined' ? t : () => t;\n}\n\nexport function asPlain<T>(t: T): T extends (...args: any[]) => any ? ReturnType<T> : T {\n    return typeof t === 'function' ? t() : t;\n}\n\nexport function isNil(v: unknown): v is null | undefined {\n    return v === null || v === undefined;\n}\n\nexport function inBetween(value: number, start: number, end: number) {\n    return value >= start && value <= end ? value : value < start ? start : end;\n}\n", "import {px} from '../../utils/common';\n\nconst NAMES = {\n    size: ['height', 'width'],\n    clientSize: ['clientHeight', 'clientWidth'],\n    offsetSize: ['offsetHeight', 'offsetWidth'],\n    maxSize: ['maxHeight', 'maxWidth'],\n    before: ['top', 'left'],\n    marginBefore: ['marginTop', 'marginLeft'],\n    after: ['bottom', 'right'],\n    marginAfter: ['marginBottom', 'marginRight'],\n    scrollOffset: ['pageYOffset', 'pageXOffset'],\n    offset: ['offsetY', 'offsetY'],\n    offsetOpt: ['yOffset', 'xOffset'],\n    bodyScroll: ['scrollHeight', 'scrollWidth'],\n    inner: ['innerHeight', 'innerWidth'],\n};\n\ninterface Props {\n    size: 'height' | 'width';\n    clientSize: 'clientHeight' | 'clientWidth';\n    offsetSize: 'offsetHeight' | 'offsetWidth';\n    maxSize: 'maxHeight' | 'maxWidth';\n    before: 'top' | 'left';\n    marginBefore: 'marginTop' | 'marginLeft';\n    after: 'bottom' | 'right';\n    marginAfter: 'marginBottom' | 'marginRight';\n    scrollOffset: 'pageYOffset' | 'pageXOffset';\n    offset: 'offsetY' | 'offsetY';\n    offsetOpt: 'yOffset' | 'xOffset';\n    bodyScroll: 'scrollHeight' | 'scrollWidth';\n    inner: 'innerHeight' | 'innerWidth';\n}\n\ntype Side = 'top' | 'bottom' | 'left' | 'right';\n\ntype Coordinates = {\n    top?: number;\n    bottom?: number;\n    left?: number;\n    right?: number;\n};\n\ntype Options = {\n    bound?: Element | Range | Coordinates;\n    xOffset?: number;\n    yOffset?: number;\n};\n\nfunction normalizeRect(rect: DOMRect | ClientRect): Coordinates {\n    return {\n        top: rect.top,\n        bottom: rect.bottom,\n        left: rect.left,\n        right: rect.right,\n    };\n}\n\n// eslint-disable-next-line complexity\nexport const placement = function (\n    elem: HTMLElement,\n    initialAnchor: Element | Range | Coordinates,\n    side: Side = 'bottom',\n    options: Options = {},\n) {\n    let anchor;\n\n    if (initialAnchor instanceof Element || initialAnchor instanceof Range) {\n        anchor = normalizeRect(elem.getBoundingClientRect());\n    } else {\n        anchor = initialAnchor;\n    }\n\n    const anchorRect = Object.assign(\n        {\n            top: anchor.bottom || 0,\n            bottom: anchor.top || 0,\n            left: anchor.right || 0,\n            right: anchor.left || 0,\n        },\n        anchor,\n    );\n\n    const boundRect = {\n        top: 0,\n        left: 0,\n        bottom: window.innerHeight,\n        right: window.innerWidth,\n    };\n\n    if (options.bound) {\n        if (options.bound instanceof Element || options.bound instanceof Range) {\n            options.bound = normalizeRect(options.bound.getBoundingClientRect());\n        }\n        Object.assign(boundRect, options.bound);\n    }\n\n    const elemStyle = getComputedStyle(elem);\n\n    const {primary, secondary} = Object.entries(NAMES).reduce(\n        (acc, [key, value]) => ({\n            primary: {...acc.primary, [key]: value[side === 'top' || side === 'bottom' ? 0 : 1]},\n            secondary: {\n                ...acc.secondary,\n                [key]: value[side === 'top' || side === 'bottom' ? 1 : 0],\n            },\n        }),\n        {primary: {}, secondary: {}},\n    ) as {\n        primary: Props;\n        secondary: Props;\n    };\n\n    elem.style.position = 'absolute';\n    elem.style.maxWidth = '';\n    elem.style.maxHeight = '';\n\n    const offset = options[primary.offsetOpt] || 0;\n\n    // Constrain the maximum size of the popup along the secondary axis.\n    const secondaryMarginBefore = parseInt(elemStyle[secondary.marginBefore], 10);\n    const secondaryMarginAfter = parseInt(elemStyle[secondary.marginAfter], 10);\n    const secondaryMargin = secondaryMarginBefore + secondaryMarginAfter;\n\n    const secondaryMaxSize =\n        boundRect[secondary.after] - boundRect[secondary.before] - secondaryMargin;\n    const styledSecondaryMaxSize = parseInt(elemStyle[secondary.maxSize], 10);\n\n    if (!styledSecondaryMaxSize || secondaryMaxSize < styledSecondaryMaxSize) {\n        elem.style[secondary.maxSize] = px(secondaryMaxSize);\n    }\n\n    // Calculate the available room on either side of the anchor element. If\n    // the size of the popup is more than is available on the given side, then we\n    // will switch to the side with more room.\n    const margin =\n        parseInt(elemStyle[primary.marginBefore], 10) +\n        parseInt(elemStyle[primary.marginAfter], 10);\n    const roomBefore = anchorRect[primary.before] - boundRect[primary.before] - margin;\n    const roomAfter = boundRect[primary.after] - anchorRect[primary.after] - margin - offset;\n\n    if (\n        (side === primary.before && elem[primary.offsetSize] > roomBefore) ||\n        (side === primary.after && elem[primary.offsetSize] > roomAfter)\n    ) {\n        side = roomBefore > roomAfter ? primary.before : primary.after;\n    }\n\n    // If the size of the popup exceeds the room available on this side, then\n    // we will give the popup an explicit size so that it doesn't go off-screen.\n    const primaryMaxSize = side === primary.before ? roomBefore : roomAfter;\n    const styledPrimaryMaxSize = parseInt(elemStyle[primary.maxSize], 10);\n\n    if (!styledPrimaryMaxSize || primaryMaxSize < styledPrimaryMaxSize) {\n        elem.style[primary.maxSize] = px(primaryMaxSize);\n    }\n\n    // Set the position of the popup element along the primary axis using the\n    // anchor's bounding rect. If we are working in the context of position:\n    // absolute, then we will need to add the window's scroll position as well.\n    const maxOffset = document.body[primary.bodyScroll] - window[primary.inner];\n    const scrollOffset = Math.max(\n        Math.min(window[primary.scrollOffset] as unknown as number, maxOffset),\n        0,\n    );\n\n    const boundPrimaryPos = (pos: number) => {\n        return Math.max(\n            boundRect[primary.before],\n            Math.min(pos, boundRect[primary.after] - elem[primary.offsetSize] - margin),\n        );\n    };\n\n    const boundSecondaryPos = (pos: number) => {\n        return Math.max(\n            boundRect[secondary.before],\n            Math.min(\n                pos,\n                boundRect[secondary.after] - elem[secondary.offsetSize] - secondaryMargin,\n            ),\n        );\n    };\n\n    if (side === primary.before) {\n        // top or left\n        elem.style[primary.before] =\n            scrollOffset +\n            boundPrimaryPos(anchorRect[primary.before] - elem[primary.offsetSize] - margin) -\n            offset +\n            'px';\n        elem.style[primary.after] = 'auto';\n    } else {\n        // bottom or right\n        elem.style[primary.before] = px(\n            scrollOffset + boundPrimaryPos(anchorRect[primary.after]) + offset,\n        );\n        elem.style[primary.after] = 'auto';\n    }\n\n    // Set the position of the popup element along the secondary axis.\n    const maxSecondaryOffset = document.body[secondary.bodyScroll] - window[secondary.inner];\n    const secondaryScrollOffset = Math.max(\n        Math.min(window[secondary.scrollOffset] as unknown as number, maxSecondaryOffset),\n        0,\n    );\n\n    elem.style[secondary.before] = px(\n        secondaryScrollOffset +\n            boundSecondaryPos(anchorRect[secondary.before] - secondaryMarginBefore),\n    );\n    elem.style[secondary.after] = 'auto';\n\n    elem.dataset.side = side;\n\n    return {\n        side,\n        anchorRect,\n        boundRect,\n    };\n};\n", "import UPlot, {Series} from 'uplot';\nimport type Yagr from '../index';\n\nconst DEFAULT_SHADE_COLOR = [0, 0, 0, 0.6];\n\n/**\n * This class implements:\n *  - color parsing from RGBA, HEX or CSS color name\n *  - linear shade/lighten @see https://github.com/PimpTrizkit/PJs/wiki/12.-Shade,-Blend-and-Convert-a-Web-Color-(pSBC.js)#stackoverflow-archive-begin\n */\nexport default class ColorParser {\n    static parseRgba(rgbaColor: string) {\n        const m = rgbaColor.match(/rgba?\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,?\\s*(\\d+\\.?\\d*)?\\s*\\)/);\n        return m ? [m[1], m[2], m[3], m[4] || 1].map(Number) : null;\n    }\n\n    private context?: HTMLElement;\n\n    parse(color = '000') {\n        const isVar = color.startsWith('var(--');\n        let res = color,\n            pure = true,\n            prop;\n        const ctx = this.context as HTMLElement;\n\n        const pColor = ctx.style.color;\n\n        if (isVar || color.startsWith('--')) {\n            pure = false;\n            prop = isVar ? color.slice(4, -1) : color;\n        } else if (!color.startsWith('#') && !color.startsWith('rgb')) {\n            ctx.style.color = color;\n            prop = 'color';\n            pure = false;\n        }\n\n        res = pure ? res : getComputedStyle(ctx).getPropertyValue(prop as string);\n        ctx.style.color = pColor;\n        return res;\n    }\n\n    setContext(context: HTMLElement) {\n        this.context = context;\n    }\n\n    rgba(color: number[]) {\n        return `rgba(${color[0]}, ${color[1]}, ${color[2]}, ${color[3]})`;\n    }\n\n    toRgba(color: string, fallbackRgba: number[]) {\n        return ColorParser.parseRgba(this.parse(color)) || fallbackRgba;\n    }\n\n    shade([r, g, b, a]: number[], value: number) {\n        const direction = value < 0;\n        const tOffset = direction ? 0 : 255 * value;\n        const transition = direction ? 1 + value : 1 - value;\n        const _r = Math.round(r * transition + tOffset);\n        const _g = Math.round(g * transition + tOffset);\n        const _b = Math.round(b * transition + tOffset);\n        return 'rgba(' + _r + ',' + _g + ',' + _b + ',' + a + ')';\n    }\n}\n\nexport const getFocusedColor = (y: Yagr, seriesIdx: number) => {\n    const shift = y.utils.theme.SHIFT;\n    const s = y.uplot.series[seriesIdx];\n    const mainColor = ColorParser.parseRgba(s.color) || DEFAULT_SHADE_COLOR;\n    return y.utils.colors.shade(mainColor, shift);\n};\n\nexport const getSerieFocusColors = (y: Yagr, field: keyof Series) => {\n    return (u: UPlot, idx: number) => {\n        const s = u.series[idx];\n        return s._focus === false ? s.getFocusedColor(y, idx) : (s[field] as string);\n    };\n};\n", "import {SnapToValue} from '../../types';\nimport UPlot, {Plugin, Series} from 'uplot';\n\nimport {CURSOR_STYLE, DEFAULT_X_SCALE, MARKER_DIAMETER, SERIE_COLOR} from '../../defaults';\nimport CP from '../../utils/colors';\nimport {findDataIdx, html, isNil} from '../../utils/common';\nimport type Yagr from '../..';\n\n/**\n * Options for cursor plugin.\n */\nexport interface CursorOptions {\n    /** Diameter of point markers */\n    markersSize?: number;\n    /** Snap cursor to non-null value (default: SnapToValue.Closest) */\n    snapToValues?: false | SnapToValue;\n    /** X crosshair options */\n    x?: {\n        visible?: boolean;\n        style?: string; // css style\n    };\n    /** Y crosshair options */\n    y?: {\n        visible?: boolean;\n        style?: string;\n    };\n    /** Max count of visible markers. If lines > value then markers will be hidden (default: 50) */\n    maxMarkers?: number;\n\n    /** Cursror sync key (default if true) */\n    sync?: true | string;\n\n    /** Hide cursor markers by predicate */\n    hideMarkers?: (value: number | null | string, seriesIdx: number) => boolean;\n}\n\nconst MAX_CURSORS = 50;\n\nfunction paintCursorPoint(series: Series, pt: HTMLElement, span?: HTMLElement) {\n    span ||= pt.querySelector('span') as HTMLElement;\n\n    if (!span) {\n        return;\n    }\n\n    pt.style.background = `${series.color}`;\n    span.style.background = series.color || SERIE_COLOR;\n    const colorRgba = CP.parseRgba(series.color) || [256, 256, 256, 0];\n    pt.style.boxShadow = `0px 0px 0px 1px rgba(${colorRgba[0]}, ${colorRgba[1]}, ${colorRgba[2]}, 0.5)`;\n}\n\n/*\n * Draws HTML points for cursor to transform\n */\nexport function cursorPoint(u: UPlot, seriesIndex: number) {\n    const serie = u.series[seriesIndex];\n    const span = html('span');\n    const pt = html(\n        'div',\n        {\n            class: 'yagr-point',\n            'data-idx': String(seriesIndex),\n        },\n        serie.empty ? undefined : span,\n    );\n\n    // @TODO possibly not to render at all. Requires PR into uPlot\n    if (serie.empty) {\n        pt.style.display = 'none';\n        return pt;\n    }\n\n    paintCursorPoint(serie, pt, span);\n\n    return pt;\n}\n\nfunction getPointsByIdx(over: HTMLDivElement, idx?: number) {\n    return idx === undefined\n        ? (Array.from(over.querySelectorAll('.yagr-point')) as HTMLDivElement[])\n        : [over.querySelector(`.yagr-point[data-idx=\"${idx}\"]`) as HTMLDivElement];\n}\n\n/*\n * Cursor plugin responsible for drawing cursor points and crosshairs,\n * and for syncing cursors.\n */\nexport default function CursorPlugin(\n    yagr: Yagr,\n    opts: CursorOptions,\n): {\n    pin: (v: boolean) => void;\n    focus: (i: number | null, f: boolean) => void;\n    uplot: Plugin;\n    updatePoints: () => void;\n    showPoints: (idx?: number) => void;\n    hidePoints: (idx?: number) => void;\n} {\n    const config = yagr.config;\n    const processing = config.processing || {};\n    const pInterpolation = Boolean(processing.interpolation);\n    const iValue = processing.interpolation?.value;\n\n    const snapToNulls = opts.snapToValues === false ? false : opts.snapToValues || 'closest';\n    const snapToInterpolated = pInterpolation\n        ? (processing.interpolation?.snapToValues ?? 'closest')\n        : false;\n\n    let mem: Record<string, HTMLElement> = {};\n\n    /*\n     * This function finds non null value index and returns\n     * it's value for drawIdx hook for cursor\n     */\n    const snapOnValues = (self: UPlot, seriesIdx: number, hoveredIdx: number) => {\n        const series = self.series[seriesIdx];\n\n        if (series.scale === DEFAULT_X_SCALE) {\n            return hoveredIdx;\n        }\n\n        const seriesData = series.$c || self.data[seriesIdx];\n        const value = seriesData[hoveredIdx];\n\n        if (pInterpolation && value === iValue) {\n            return findDataIdx(seriesData, series, hoveredIdx, snapToInterpolated, iValue);\n        } else if (value === null) {\n            return findDataIdx(seriesData, series, hoveredIdx, snapToNulls, null);\n        }\n\n        return hoveredIdx;\n    };\n\n    return {\n        showPoints: (idx?: number) => {\n            const over = yagr.uplot.over;\n\n            if (!over) {\n                return;\n            }\n\n            const points = getPointsByIdx(over, idx);\n            points.forEach((pt) => {\n                pt.style.visibility = 'visible';\n            });\n        },\n        hidePoints: (idx?: number) => {\n            const over = yagr.uplot.over;\n\n            if (!over) {\n                return;\n            }\n\n            const points = getPointsByIdx(over, idx);\n            points.forEach((pt) => {\n                pt.style.visibility = 'hidden';\n            });\n        },\n        pin: (pinState: boolean) => {\n            const over = yagr.root.querySelector('.u-over');\n\n            if (!over) {\n                return;\n            }\n\n            if (pinState) {\n                const pointsHolder = document.createElement('div');\n                pointsHolder.classList.add('yagr-points-holder');\n                over.querySelectorAll('.yagr-point').forEach((elem) => {\n                    const newElem = elem.cloneNode(true) as HTMLElement;\n                    pointsHolder.appendChild(newElem);\n                    const idx = newElem.dataset['idx'];\n                    if (idx) {\n                        mem[idx] = newElem;\n                    }\n                });\n                over.appendChild(pointsHolder);\n            } else {\n                mem = {};\n                over.querySelector('.yagr-points-holder')?.remove();\n            }\n        },\n        updatePoints: () => {\n            (yagr.root.querySelectorAll('.yagr-point') as NodeListOf<HTMLElement>).forEach((pt) => {\n                const idx = Number(pt.dataset['idx']);\n                if (isNaN(idx)) {\n                    return;\n                }\n\n                const series = yagr.uplot.series[idx];\n\n                paintCursorPoint(series, pt);\n            });\n        },\n        focus: (serieIdx: number | null, focus: boolean) => {\n            Object.entries(mem).forEach(([idx, item]) => {\n                if (serieIdx === null) {\n                    item.style.display = focus ? 'block' : 'none';\n                    return;\n                }\n\n                item.style.display = idx === String(serieIdx) && focus ? 'block' : 'none';\n            });\n        },\n        uplot: {\n            opts: (_, uplotOptions) => {\n                uplotOptions.cursor = uplotOptions.cursor || {};\n\n                let emptyLines = 0;\n                let hiddenLines = 0;\n                for (const s of uplotOptions.series) {\n                    if (s.empty) {\n                        emptyLines += 1;\n                    }\n                    if (!s.show) {\n                        hiddenLines += 1;\n                    }\n                }\n                const totalLines = uplotOptions.series.length - 1;\n                const maxCursors = opts?.maxMarkers ?? MAX_CURSORS;\n\n                uplotOptions.cursor.points = {\n                    show: totalLines - emptyLines - hiddenLines <= maxCursors ? cursorPoint : false,\n                    size: (u: uPlot, seriesIdx: number) => {\n                        const serie = u.series[seriesIdx];\n                        return (\n                            (serie.cursorOptions\n                                ? serie.cursorOptions.markersSize\n                                : opts?.markersSize) || MARKER_DIAMETER\n                        );\n                    },\n                };\n\n                uplotOptions.cursor.dataIdx = snapOnValues;\n            },\n            hooks: {\n                ...(opts.hideMarkers && {\n                    setCursor: (u: uPlot) => {\n                        const idx = u.cursor.idx;\n\n                        if (isNil(idx)) {\n                            return;\n                        }\n\n                        for (let i = 1; i < u.series.length; i++) {\n                            const seriesValue = u.series[i].$c[idx];\n\n                            if (opts.hideMarkers!(seriesValue, i)) {\n                                yagr.plugins.cursor?.hidePoints(i);\n                            } else {\n                                yagr.plugins.cursor?.showPoints(i);\n                            }\n                        }\n                    },\n                }),\n                init: (u) => {\n                    const cX: HTMLElement | null = u.root.querySelector('.u-cursor-x');\n                    if (cX) {\n                        if (opts.x && opts.x.visible === false) {\n                            cX.style.display = 'none';\n                        }\n                        cX.style.borderRight = (opts.x && opts.x.style) || CURSOR_STYLE;\n                    }\n\n                    const cY: HTMLElement | null = u.root.querySelector('.u-cursor-y');\n                    if (cY) {\n                        if (opts.y && opts.y.visible !== false) {\n                            cY.style.borderBottom = opts.y.style || CURSOR_STYLE;\n                        } else {\n                            cY.style.display = 'none';\n                        }\n                    }\n                },\n            },\n        },\n    };\n}\n", "export const preventMouseEvents = (e: MouseEvent) => e.preventDefault();\n", "export function escapeAttribute(value: string): string {\n    return value\n        .replace(/&/g, '&amp;')\n        .replace(/</g, '&lt;')\n        .replace(/>/g, '&gt;')\n        .replace(/\"/g, '&quot;')\n        .replace(/'/g, '&apos;');\n}", "import UPlot, {Options, Series} from 'uplot';\n\nimport Yagr from '../../index';\nimport {DEFAULT_X_SERIE_NAME} from '../../defaults';\nimport {html} from '../../utils/common';\nimport {preventMouseEvents} from '../../utils/events';\nimport {escapeAttribute} from './utils';\n\nexport type LegendPosition = 'top' | 'bottom';\nexport interface LegendOptions {\n    /** Show legend (default: false) */\n    show?: boolean;\n    /** Root classname */\n    className?: string;\n    /** Legend placement position */\n    position?: LegendPosition;\n    /** Maximal space fro legend as a fraction of chart height (default: 0.3) */\n    maxLegendSpace?: number;\n    /** @TODO Maybe bugs here  */\n    fontSize?: number;\n    /** Basic behaviour includes only toggle behaviuor (\"Hide/show all\" button exists) */\n    behaviour?: 'basic' | 'extended';\n}\n\ninterface LegendState {\n    page: number;\n    pages: number;\n    paginated: boolean;\n    rowsPerPage: number;\n    pageSize: number;\n    requiredSpace: number;\n    totalSpace: number;\n    startSerieRange?: UPlot.Series;\n}\n\nconst ALL_SERIES_IDX = 'null' as const;\nconst PAGINATION_BUTTON_HEIGHT = 18;\nconst TOTAL_LEGEND_VERTICAL_PADDING_BOTTOM = 20;\nconst TOTAL_LEGEND_VERTICAL_PADDING_TOP = 48;\nconst DEFAULT_FONT_SIZE = 12;\nconst DEFAULT_LEGEND_PLACE_RATIO = 0.3;\n\nexport const getSeriesInLegend = (series: Series[]) => {\n    return series.filter(\n        ({id, showInLegend}) => id !== DEFAULT_X_SERIE_NAME && showInLegend !== false,\n    );\n};\n\nexport const hasOneVisibleLine = (series: Series[]) => {\n    return series.some(\n        ({id, show, showInLegend, showInGraph}) =>\n            id !== DEFAULT_X_SERIE_NAME && showInLegend !== false && show && showInGraph !== false,\n    );\n};\n\n/**\n * Any series with show: true in the legend (regardless of showInGraph).\n * Needed for behaviour: 'extended' \u2014 solo / show all are tied to show, as before showInGraph.\n */\nconst hasAnySeriesWithShowTrue = (series: Series[]) => {\n    return series.some(\n        ({id, show, showInLegend}) => id !== DEFAULT_X_SERIE_NAME && showInLegend !== false && show,\n    );\n};\n\nconst isSeriesVisibleOnGraph = (serie: Series) => {\n    return serie.show !== false && serie.showInGraph !== false;\n};\n\n/** If the line hidden with option showInGraph, but it showed at tooltip \u2014 we are disabling legend item. */\nconst isLegendItemDisabled = (serie: Series) => {\n    return serie.showInGraph === false;\n};\n\nconst shouldRestoreShowAfterShowAll = (serie: Series) => {\n    return serie.show === false && serie.showInGraph === false;\n};\n\nconst getPrependingTitle = (i18n: Yagr['utils']['i18n'], series: Series[]) => {\n    return series.length > 3 && i18n(hasOneVisibleLine(series) ? 'hide-all' : 'show-all');\n};\n\nconst getPrependingTitleId = (series: Series[]): typeof ALL_SERIES_IDX | undefined => {\n    return (series.length > 3 && ALL_SERIES_IDX) || undefined;\n};\n\nexport default class LegendPlugin {\n    yagr!: Yagr;\n    uplot?: UPlot;\n    options!: LegendOptions;\n    pagesCount = 0;\n    state: LegendState = {\n        page: 0,\n        pages: 1,\n        pageSize: 0,\n        rowsPerPage: 1,\n        paginated: false,\n        requiredSpace: 0,\n        totalSpace: 0,\n    };\n    itemsHtml = '';\n    legendEl?: HTMLElement;\n    items?: HTMLElement;\n    container?: HTMLElement;\n    private _onDestroy?: () => void;\n\n    redraw() {\n        if (!this.options.show) {\n            return;\n        }\n        this.render();\n    }\n\n    destroy() {\n        if (this._onDestroy) {\n            this._onDestroy();\n        }\n        this.legendEl?.remove();\n    }\n\n    preInit = (yagr: Yagr, options: LegendOptions, uplotOptions: Options) => {\n        this.yagr = yagr;\n        this.options = Object.assign(\n            {\n                show: false,\n                position: 'bottom',\n                fontSize: DEFAULT_FONT_SIZE,\n                maxLegendSpace: DEFAULT_LEGEND_PLACE_RATIO,\n                className: undefined,\n                behaviour: 'basic',\n            },\n            options || {},\n        );\n        this.calc(uplotOptions);\n    };\n\n    init = (u: uPlot) => {\n        if (!this.options.show) {\n            return;\n        }\n\n        this.uplot = u;\n\n        /** Removing native uPlot legend */\n        u.root.querySelector('.u-legend')?.remove();\n        this.render();\n    };\n\n    update = () => {\n        const series: NodeListOf<HTMLDivElement> =\n            this.yagr.root.querySelectorAll('[data-serie-id]');\n\n        series.forEach((serieNode) => {\n            const serieId = serieNode.getAttribute('data-serie-id');\n            if (!serieId || serieId === ALL_SERIES_IDX) {\n                return;\n            }\n            const serie = this.uplot?.series[this.yagr.state.y2uIdx[serieId]];\n            const hidden = serie?.show === false;\n            const disabled = Boolean(serie && isLegendItemDisabled(serie));\n\n            serieNode.classList[hidden ? 'add' : 'remove']('yagr-legend__item_hidden');\n            serieNode.classList[disabled ? 'add' : 'remove']('yagr-legend__item_disabled');\n        });\n    };\n\n    private applyHandlers() {\n        const {yagr, uplot: u} = this;\n\n        if (!u) {\n            return () => {};\n        }\n\n        const series: NodeListOf<HTMLDivElement> = yagr.root.querySelectorAll('[data-serie-id]');\n        const unsubsribe: (() => void)[] = [];\n\n        const onSerieClickBasic = (serieNode: HTMLElement) => () => {\n            if (serieNode.classList.contains('yagr-legend__item_disabled')) {\n                return;\n            }\n            const serieId = serieNode.getAttribute('data-serie-id');\n            const seriesToToggle: [Series, boolean][] = [];\n            const series = getSeriesInLegend(u.series);\n            let isShowAll = false;\n\n            if (serieId === ALL_SERIES_IDX) {\n                const nextToggleState = !hasOneVisibleLine(series);\n                isShowAll = nextToggleState;\n\n                series.forEach((s) => {\n                    if (isLegendItemDisabled(s)) {\n                        return;\n                    }\n                    seriesToToggle.push([s, nextToggleState]);\n                });\n            } else {\n                const serie = series.find(({id}) => id === serieId);\n                if (!serie || isLegendItemDisabled(serie)) {\n                    return;\n                }\n                seriesToToggle.push([serie, !isSeriesVisibleOnGraph(serie)]);\n            }\n\n            seriesToToggle.forEach(([serie, nextState]) => {\n                if (isSeriesVisibleOnGraph(serie) === nextState) {\n                    return;\n                }\n                const node = yagr.root.querySelector(\n                    `[data-serie-id=\"${escapeAttribute(serie.id)}\"]`,\n                );\n                yagr.setVisible(serie.id, nextState, false);\n                node?.classList[nextState ? 'remove' : 'add']('yagr-legend__item_hidden');\n            });\n\n            if (serieId === ALL_SERIES_IDX && isShowAll) {\n                series.forEach((s) => {\n                    if (!shouldRestoreShowAfterShowAll(s)) {\n                        return;\n                    }\n                    const node = yagr.root.querySelector(\n                        `[data-serie-id=\"${escapeAttribute(s.id)}\"]`,\n                    );\n                    yagr.setVisible(s.id, true, false);\n                    node?.classList.remove('yagr-legend__item_hidden');\n                });\n            }\n\n            const allSeriesItem = yagr.root.querySelector('.yagr-legend__all-series');\n\n            if (allSeriesItem) {\n                const title = getPrependingTitle(this.yagr.utils.i18n, series);\n                allSeriesItem.innerHTML = title || '';\n            }\n        };\n\n        const onSerieClickExtended = (serieNode: HTMLElement) => {\n            const changeVisibility = (id: string, visibility: boolean) => {\n                const node = yagr.root.querySelector(`[data-serie-id=\"${escapeAttribute(id)}\"]`);\n                yagr.setVisible(id, visibility, false);\n                node?.classList[visibility ? 'remove' : 'add']('yagr-legend__item_hidden');\n            };\n\n            const toggleSerie = (serie: UPlot.Series) => {\n                changeVisibility(serie.id, !isSeriesVisibleOnGraph(serie));\n            };\n\n            const selectSerie = (serie: UPlot.Series) => {\n                this.state.startSerieRange = serie;\n                const series = getSeriesInLegend(u.series);\n\n                const otherSeries = series.filter((s) => s.id !== serie.id);\n                const otherVisibility =\n                    !hasAnySeriesWithShowTrue(otherSeries) && serie.show !== false;\n\n                series.forEach((s) => {\n                    if (isLegendItemDisabled(s)) {\n                        return;\n                    }\n                    const visibility = serie.id === s.id ? true : otherVisibility;\n                    changeVisibility(s.id, visibility);\n                });\n\n                if (otherVisibility) {\n                    series.forEach((s) => {\n                        if (!shouldRestoreShowAfterShowAll(s)) {\n                            return;\n                        }\n                        const node = yagr.root.querySelector(\n                            `[data-serie-id=\"${escapeAttribute(s.id)}\"]`,\n                        );\n                        yagr.setVisible(s.id, true, false);\n                        node?.classList.remove('yagr-legend__item_hidden');\n                    });\n                } else {\n                    // In solo mode, hide series with showInGraph: false from tooltip\n                    series.forEach((s) => {\n                        if (s.showInGraph === false) {\n                            yagr.setVisible(s.id, false, false);\n                        }\n                    });\n                }\n            };\n\n            const selectRange = (serie: UPlot.Series) => {\n                const series = getSeriesInLegend(u.series);\n\n                // If startSerieRange is undefined then startSerieRange = first valid legend element\n                if (!this.state.startSerieRange) {\n                    this.state.startSerieRange = series[0];\n                }\n\n                const range: number[] = [];\n\n                series.forEach((s, i) => {\n                    if (s.id === serie.id) {\n                        range.push(i);\n                    }\n                    // There is no 'else' because exist case when startSerieRange and target serie are same elements\n                    if (s.id === this.state.startSerieRange?.id) {\n                        range.push(i);\n                    }\n                });\n\n                series.forEach((s, i) => {\n                    if (isLegendItemDisabled(s)) {\n                        return;\n                    }\n                    const visibility = i >= range[0] && i <= range[1];\n                    changeVisibility(s.id, visibility);\n                });\n            };\n\n            return (e: MouseEvent) => {\n                const serieId = serieNode.getAttribute('data-serie-id');\n\n                const serie = u.series.find(({id}) => id === serieId);\n\n                if (!serie) {\n                    return;\n                }\n\n                if (isLegendItemDisabled(serie)) {\n                    e.preventDefault();\n                    return;\n                }\n\n                e.preventDefault();\n\n                if (e.ctrlKey || e.metaKey) {\n                    toggleSerie(serie);\n                } else if (e.shiftKey) {\n                    selectRange(serie);\n                } else {\n                    selectSerie(serie);\n                }\n            };\n        };\n\n        const onSerieClick = {\n            basic: onSerieClickBasic,\n            extended: onSerieClickExtended,\n        };\n\n        const onSerieMouseEnter = (serieNode: HTMLElement) => () => {\n            const serieId = serieNode.getAttribute('data-serie-id');\n\n            if (\n                serieNode.classList.contains('yagr-legend__item_hidden') ||\n                serieNode.classList.contains('yagr-legend__item_disabled') ||\n                serieId === ALL_SERIES_IDX\n            ) {\n                return;\n            }\n\n            const targetSerie = this.yagr.uplot.series.find(({id}) => id === serieId);\n            if (targetSerie) {\n                yagr.setFocus(targetSerie.id, true);\n\n                // fix bug with focus in stacking column chart\n                yagr.redraw(true, false);\n            }\n        };\n\n        const onSerieMouseLeave = () => {\n            yagr.setFocus(null, true);\n\n            // fix bug with focus in stacking column chart\n            yagr.redraw(true, false);\n        };\n\n        series.forEach((serieNode) => {\n            const onClick = onSerieClick[this.options.behaviour || 'basic'](serieNode);\n            const onFocus = onSerieMouseEnter(serieNode);\n\n            serieNode.addEventListener('click', onClick);\n            serieNode.addEventListener('mouseenter', onFocus);\n            serieNode.addEventListener('mouseleave', onSerieMouseLeave);\n            serieNode.addEventListener('mousedown', preventMouseEvents);\n\n            unsubsribe.push(() => {\n                serieNode.removeEventListener('click', onClick);\n                serieNode.removeEventListener('mouseenter', onFocus);\n                serieNode.removeEventListener('mouseleave', onSerieMouseLeave);\n                serieNode.removeEventListener('mousedown', preventMouseEvents);\n            });\n        });\n\n        const destroy = () => unsubsribe.forEach((fn) => fn());\n        this._onDestroy = destroy;\n        return destroy;\n    }\n\n    private render() {\n        let reRender = false;\n        const {uplot: u, options} = this;\n        if (!u) {\n            return;\n        }\n\n        let legendEl = this.yagr.root.querySelector('.yagr-legend') as HTMLElement;\n\n        if (legendEl) {\n            reRender = true;\n        } else {\n            legendEl = html('div', {\n                class: `yagr-legend yagr-legend__${this.options.position} ${options?.className || ''}`,\n            });\n        }\n\n        if (!legendEl) {\n            return;\n        }\n\n        if (!reRender) {\n            if (options.position === 'top') {\n                u.root.before(legendEl);\n            } else {\n                u.root?.after(legendEl);\n            }\n        }\n\n        this.legendEl = legendEl;\n\n        if (!this.itemsHtml || reRender) {\n            this.calc(this.yagr.options);\n        }\n\n        legendEl.innerHTML = `<div class=\"yagr-legend__container\" style=\"height: ${this.state.requiredSpace}px\">${this.itemsHtml}</div>`;\n\n        this.items = legendEl.querySelector('.yagr-legend__items') as HTMLElement;\n        this.container = legendEl.querySelector('.yagr-legend__container') as HTMLElement;\n\n        if (this.state.paginated) {\n            const pagination = this.renderPagination();\n            this.container?.after(pagination);\n        } else {\n            this.items.style.justifyContent = 'center';\n        }\n\n        this.applyHandlers();\n    }\n\n    private measureLegend = (body: string) => {\n        const rootEl = this.yagr.root;\n        const pseudo = html(\n            'div',\n            {\n                class: 'yagr-legend',\n                style: {visibility: 'hidden'},\n            },\n            body,\n        );\n\n        rootEl.appendChild(pseudo);\n\n        const items = pseudo.childNodes[0] as HTMLElement;\n        const result = items.getBoundingClientRect();\n        pseudo.remove();\n\n        return result;\n    };\n\n    private nextPage = () => {\n        const {state} = this;\n        this.state.page += 1;\n\n        if (this.items) {\n            this.items.style.transform = `translate(0, ${-1 * state.page * state.pageSize}px)`;\n            this.renderPagination();\n        }\n    };\n\n    private prevPage = () => {\n        const {state} = this;\n        this.state.page -= 1;\n\n        if (this.items) {\n            this.items.style.transform = `translate(0, ${-1 * state.page * state.pageSize}px)`;\n            this.renderPagination();\n        }\n    };\n\n    private renderPagination() {\n        const {state} = this;\n\n        let pagination = this.yagr.root.querySelector('.yagr-legend__pagination');\n\n        if (pagination) {\n            const nextPage = pagination.querySelector('.yagr-legend__icon-down') as HTMLElement;\n            const prevPage = pagination.querySelector('.yagr-legend__icon-up') as HTMLElement;\n\n            nextPage.removeEventListener('click', this.nextPage);\n            prevPage.removeEventListener('click', this.prevPage);\n        } else {\n            pagination = html('div', {\n                class: 'yagr-legend__pagination',\n            });\n        }\n\n        const upClassName = state.page === 0 ? 'yagr-legend__icon-up_disabled' : '';\n        const downClassName =\n            state.page === state.pages - 1 ? 'yagr-legend__icon-down_disabled' : '';\n\n        pagination.innerHTML = `<span class=\"yagr-legend__icon-up ${upClassName}\"></span>\n<span class=\"yagr-legend__pagination-text\">${state.page + 1}/${state.pages}</span>\n<span class=\"yagr-legend__icon-down ${downClassName}\"></span>`;\n\n        const nextPage = pagination.querySelector('.yagr-legend__icon-down') as HTMLElement;\n        const prevPage = pagination.querySelector('.yagr-legend__icon-up') as HTMLElement;\n\n        if (!downClassName) {\n            nextPage.addEventListener('click', this.nextPage);\n        }\n        if (!upClassName) {\n            prevPage.addEventListener('click', this.prevPage);\n        }\n\n        return pagination;\n    }\n\n    private createIconLineElement(serie: Series) {\n        const iconLineElement = html('span', {\n            class: `yagr-legend__icon yagr-legend__icon_${serie.type}`,\n            style: {'background-color': this.yagr.getSerieLegendColor(serie)},\n        });\n\n        return iconLineElement;\n    }\n\n    private createSerieNameElement(serie: Series) {\n        const serieNameElement = html('span', {class: 'yagr-legend__name'});\n        serieNameElement.textContent = serie.name || 'unnamed';\n\n        return serieNameElement;\n    }\n\n    private renderItems(uplotOptions: Options) {\n        const seriesInLegend = getSeriesInLegend(uplotOptions.series);\n        const title = getPrependingTitle(this.yagr.utils.i18n, seriesInLegend);\n        const titleId =\n            this.options.behaviour !== 'extended' && getPrependingTitleId(seriesInLegend);\n        const series: (Series | typeof ALL_SERIES_IDX)[] = titleId\n            ? [titleId, ...seriesInLegend]\n            : [...seriesInLegend];\n\n        const content = series\n            .map((serie) => {\n                let serieContent;\n                let sId;\n                let additionalCn = ' ';\n\n                if (serie === ALL_SERIES_IDX) {\n                    serieContent = title;\n                    sId = titleId;\n                    additionalCn = ' yagr-legend__all-series ';\n                } else {\n                    sId = escapeAttribute(serie.id);\n                    const icon = this.createIconLineElement(serie);\n                    const name = this.createSerieNameElement(serie);\n\n                    serieContent = `${icon.outerHTML}${name.outerHTML}`;\n                }\n\n                if (typeof serie === 'string') {\n                    return `<div class=\"yagr-legend__item${additionalCn}\" data-serie-id=\"${sId}\">${serieContent}</div>`;\n                }\n\n                const isHidden = !isSeriesVisibleOnGraph(serie);\n                const isDisabled = isLegendItemDisabled(serie);\n                let itemClass = `yagr-legend__item${additionalCn}`.trim();\n                if (isHidden) {\n                    itemClass += ' yagr-legend__item_hidden';\n                }\n                if (isDisabled) {\n                    itemClass += ' yagr-legend__item_disabled';\n                }\n\n                const aria = isDisabled ? ' aria-disabled=\"true\"' : '';\n                return `<div class=\"${itemClass}\" data-serie-id=\"${sId}\"${aria}>${serieContent}</div>`;\n            })\n            .join('');\n\n        return `<div class=\"yagr-legend__items\">${content}</div>`;\n    }\n\n    private calc(uplotOptions: Options) {\n        if (!this.options.show) {\n            return;\n        }\n\n        const chartHeight = uplotOptions.height - this.VERTICAL_PADDING;\n        const html = this.renderItems(uplotOptions);\n        const {height: requiredHeight} = this.measureLegend(html);\n        const rowHeight = (this.options.fontSize as number) + 2;\n\n        const maxPossiblePlace = chartHeight * (this.options.maxLegendSpace as number);\n        const rowsPerPage = Math.floor(maxPossiblePlace / rowHeight);\n        const itemsRowsPerPage = rowsPerPage - 1;\n        const itemsPageSize = Math.min(itemsRowsPerPage * rowHeight, maxPossiblePlace);\n        const paginatedPageSize = Math.min(rowsPerPage * rowHeight, maxPossiblePlace);\n        const paginated = requiredHeight > itemsPageSize && itemsPageSize > 0;\n        const requiredSpace = Math.min(\n            paginated ? paginatedPageSize : itemsPageSize,\n            requiredHeight,\n        );\n        const pages = Math.ceil(requiredHeight / itemsPageSize);\n        const additionalSpace = paginated\n            ? this.VERTICAL_PADDING + PAGINATION_BUTTON_HEIGHT\n            : this.VERTICAL_PADDING;\n\n        this.state.requiredSpace = requiredSpace;\n        this.state.totalSpace = requiredSpace + additionalSpace;\n        this.state.paginated = paginated;\n        this.state.page = this.state.page || 0;\n        this.state.pages = pages;\n        this.state.pageSize = itemsPageSize;\n        this.state.rowsPerPage = rowsPerPage;\n        this.itemsHtml = html;\n    }\n\n    private get VERTICAL_PADDING() {\n        return this.options.position === 'bottom'\n            ? TOTAL_LEGEND_VERTICAL_PADDING_BOTTOM\n            : TOTAL_LEGEND_VERTICAL_PADDING_TOP;\n    }\n}\n", "/**\n* Copyright (c) 2025, Leon Sorokin\n* All rights reserved. (MIT Licensed)\n*\n* uPlot.js (\u03BCPlot)\n* A small, fast chart for time series, lines, areas, ohlc & bars\n* https://github.com/leeoniya/uPlot (v1.6.32)\n*/\n\nconst FEAT_TIME          = true;\n\nconst pre = \"u-\";\n\nconst UPLOT          =       \"uplot\";\nconst ORI_HZ         = pre + \"hz\";\nconst ORI_VT         = pre + \"vt\";\nconst TITLE          = pre + \"title\";\nconst WRAP           = pre + \"wrap\";\nconst UNDER          = pre + \"under\";\nconst OVER           = pre + \"over\";\nconst AXIS           = pre + \"axis\";\nconst OFF            = pre + \"off\";\nconst SELECT         = pre + \"select\";\nconst CURSOR_X       = pre + \"cursor-x\";\nconst CURSOR_Y       = pre + \"cursor-y\";\nconst CURSOR_PT      = pre + \"cursor-pt\";\nconst LEGEND         = pre + \"legend\";\nconst LEGEND_LIVE    = pre + \"live\";\nconst LEGEND_INLINE  = pre + \"inline\";\nconst LEGEND_SERIES  = pre + \"series\";\nconst LEGEND_MARKER  = pre + \"marker\";\nconst LEGEND_LABEL   = pre + \"label\";\nconst LEGEND_VALUE   = pre + \"value\";\n\nconst WIDTH       = \"width\";\nconst HEIGHT      = \"height\";\nconst TOP         = \"top\";\nconst BOTTOM      = \"bottom\";\nconst LEFT        = \"left\";\nconst RIGHT       = \"right\";\nconst hexBlack    = \"#000\";\nconst transparent = hexBlack + \"0\";\n\nconst mousemove   = \"mousemove\";\nconst mousedown   = \"mousedown\";\nconst mouseup     = \"mouseup\";\nconst mouseenter  = \"mouseenter\";\nconst mouseleave  = \"mouseleave\";\nconst dblclick    = \"dblclick\";\nconst resize      = \"resize\";\nconst scroll      = \"scroll\";\n\nconst change      = \"change\";\nconst dppxchange  = \"dppxchange\";\n\nconst LEGEND_DISP = \"--\";\n\nconst domEnv = typeof window != 'undefined';\n\nconst doc = domEnv ? document  : null;\nconst win = domEnv ? window    : null;\nconst nav = domEnv ? navigator : null;\n\nlet pxRatio;\n\n//export const canHover = domEnv && !win.matchMedia('(hover: none)').matches;\n\nlet query;\n\nfunction setPxRatio() {\n\tlet _pxRatio = devicePixelRatio;\n\n\t// during print preview, Chrome fires off these dppx queries even without changes\n\tif (pxRatio != _pxRatio) {\n\t\tpxRatio = _pxRatio;\n\n\t\tquery && off(change, query, setPxRatio);\n\t\tquery = matchMedia(`(min-resolution: ${pxRatio - 0.001}dppx) and (max-resolution: ${pxRatio + 0.001}dppx)`);\n\t\ton(change, query, setPxRatio);\n\n\t\twin.dispatchEvent(new CustomEvent(dppxchange));\n\t}\n}\n\nfunction addClass(el, c) {\n\tif (c != null) {\n\t\tlet cl = el.classList;\n\t\t!cl.contains(c) && cl.add(c);\n\t}\n}\n\nfunction remClass(el, c) {\n\tlet cl = el.classList;\n\tcl.contains(c) && cl.remove(c);\n}\n\nfunction setStylePx(el, name, value) {\n\tel.style[name] = value + \"px\";\n}\n\nfunction placeTag(tag, cls, targ, refEl) {\n\tlet el = doc.createElement(tag);\n\n\tif (cls != null)\n\t\taddClass(el, cls);\n\n\tif (targ != null)\n\t\ttarg.insertBefore(el, refEl);\n\n\treturn el;\n}\n\nfunction placeDiv(cls, targ) {\n\treturn placeTag(\"div\", cls, targ);\n}\n\nconst xformCache = new WeakMap();\n\nfunction elTrans(el, xPos, yPos, xMax, yMax) {\n\tlet xform = \"translate(\" + xPos + \"px,\" + yPos + \"px)\";\n\tlet xformOld = xformCache.get(el);\n\n\tif (xform != xformOld) {\n\t\tel.style.transform = xform;\n\t\txformCache.set(el, xform);\n\n\t\tif (xPos < 0 || yPos < 0 || xPos > xMax || yPos > yMax)\n\t\t\taddClass(el, OFF);\n\t\telse\n\t\t\tremClass(el, OFF);\n\t}\n}\n\nconst colorCache = new WeakMap();\n\nfunction elColor(el, background, borderColor) {\n\tlet newColor = background + borderColor;\n\tlet oldColor = colorCache.get(el);\n\n\tif (newColor != oldColor) {\n\t\tcolorCache.set(el, newColor);\n\t\tel.style.background = background;\n\t\tel.style.borderColor = borderColor;\n\t}\n}\n\nconst sizeCache = new WeakMap();\n\nfunction elSize(el, newWid, newHgt, centered) {\n\tlet newSize = newWid + \"\" + newHgt;\n\tlet oldSize = sizeCache.get(el);\n\n\tif (newSize != oldSize) {\n\t\tsizeCache.set(el, newSize);\n\t\tel.style.height = newHgt + \"px\";\n\t\tel.style.width = newWid + \"px\";\n\t\tel.style.marginLeft = centered ? -newWid/2 + \"px\" : 0;\n\t\tel.style.marginTop = centered ? -newHgt/2 + \"px\" : 0;\n\t}\n}\n\nconst evOpts = {passive: true};\nconst evOpts2 = {...evOpts, capture: true};\n\nfunction on(ev, el, cb, capt) {\n\tel.addEventListener(ev, cb, capt ? evOpts2 : evOpts);\n}\n\nfunction off(ev, el, cb, capt) {\n\tel.removeEventListener(ev, cb, evOpts);\n}\n\ndomEnv && setPxRatio();\n\n// binary search for index of closest value\nfunction closestIdx(num, arr, lo, hi) {\n\tlet mid;\n\tlo = lo || 0;\n\thi = hi || arr.length - 1;\n\tlet bitwise = hi <= 2147483647;\n\n\twhile (hi - lo > 1) {\n\t\tmid = bitwise ? (lo + hi) >> 1 : floor((lo + hi) / 2);\n\n\t\tif (arr[mid] < num)\n\t\t\tlo = mid;\n\t\telse\n\t\t\thi = mid;\n\t}\n\n\tif (num - arr[lo] <= arr[hi] - num)\n\t\treturn lo;\n\n\treturn hi;\n}\n\nfunction makeIndexOfs(predicate) {\n\t let indexOfs = (data, _i0, _i1) => {\n\t\tlet i0 = -1;\n\t\tlet i1 = -1;\n\n\t\tfor (let i = _i0; i <= _i1; i++) {\n\t\t\tif (predicate(data[i])) {\n\t\t\t\ti0 = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tfor (let i = _i1; i >= _i0; i--) {\n\t\t\tif (predicate(data[i])) {\n\t\t\t\ti1 = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn [i0, i1];\n\t };\n\n\t return indexOfs;\n}\n\nconst notNullish = v => v != null;\nconst isPositive = v => v != null && v > 0;\n\nconst nonNullIdxs = makeIndexOfs(notNullish);\nconst positiveIdxs = makeIndexOfs(isPositive);\n\nfunction getMinMax(data, _i0, _i1, sorted = 0, log = false) {\n//\tconsole.log(\"getMinMax()\");\n\n\tlet getEdgeIdxs = log ? positiveIdxs : nonNullIdxs;\n\tlet predicate = log ? isPositive : notNullish;\n\n\t[_i0, _i1] = getEdgeIdxs(data, _i0, _i1);\n\n\tlet _min = data[_i0];\n\tlet _max = data[_i0];\n\n\tif (_i0 > -1) {\n\t\tif (sorted == 1) {\n\t\t\t_min = data[_i0];\n\t\t\t_max = data[_i1];\n\t\t}\n\t\telse if (sorted == -1) {\n\t\t\t_min = data[_i1];\n\t\t\t_max = data[_i0];\n\t\t}\n\t\telse {\n\t\t\tfor (let i = _i0; i <= _i1; i++) {\n\t\t\t\tlet v = data[i];\n\n\t\t\t\tif (predicate(v)) {\n\t\t\t\t\tif (v < _min)\n\t\t\t\t\t\t_min = v;\n\t\t\t\t\telse if (v > _max)\n\t\t\t\t\t\t_max = v;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn [_min ?? inf, _max ?? -inf]; // todo: fix to return nulls\n}\n\nfunction rangeLog(min, max, base, fullMags) {\n\tlet minSign = sign(min);\n\tlet maxSign = sign(max);\n\n\tif (min == max) {\n\t\tif (minSign == -1) {\n\t\t\tmin *= base;\n\t\t\tmax /= base;\n\t\t}\n\t\telse {\n\t\t\tmin /= base;\n\t\t\tmax *= base;\n\t\t}\n\t}\n\n\tlet logFn = base == 10 ? log10 : log2;\n\n\tlet growMinAbs = minSign == 1 ? floor : ceil;\n\tlet growMaxAbs = maxSign == 1 ? ceil : floor;\n\n\tlet minExp = growMinAbs(logFn(abs(min)));\n\tlet maxExp = growMaxAbs(logFn(abs(max)));\n\n\tlet minIncr = pow(base, minExp);\n\tlet maxIncr = pow(base, maxExp);\n\n\t// fix values like Math.pow(10, -5) === 0.000009999999999999999\n\tif (base == 10) {\n\t\tif (minExp < 0)\n\t\t\tminIncr = roundDec(minIncr, -minExp);\n\t\tif (maxExp < 0)\n\t\t\tmaxIncr = roundDec(maxIncr, -maxExp);\n\t}\n\n\tif (fullMags || base == 2) {\n\t\tmin = minIncr * minSign;\n\t\tmax = maxIncr * maxSign;\n\t}\n\telse {\n\t\tmin = incrRoundDn(min, minIncr);\n\t\tmax = incrRoundUp(max, maxIncr);\n\t}\n\n\treturn [min, max];\n}\n\nfunction rangeAsinh(min, max, base, fullMags) {\n\tlet minMax = rangeLog(min, max, base, fullMags);\n\n\tif (min == 0)\n\t\tminMax[0] = 0;\n\n\tif (max == 0)\n\t\tminMax[1] = 0;\n\n\treturn minMax;\n}\n\nconst rangePad = 0.1;\n\nconst autoRangePart = {\n\tmode: 3,\n\tpad: rangePad,\n};\n\nconst _eqRangePart = {\n\tpad:  0,\n\tsoft: null,\n\tmode: 0,\n};\n\nconst _eqRange = {\n\tmin: _eqRangePart,\n\tmax: _eqRangePart,\n};\n\n// this ensures that non-temporal/numeric y-axes get multiple-snapped padding added above/below\n// TODO: also account for incrs when snapping to ensure top of axis gets a tick & value\nfunction rangeNum(_min, _max, mult, extra) {\n\tif (isObj(mult))\n\t\treturn _rangeNum(_min, _max, mult);\n\n\t_eqRangePart.pad  = mult;\n\t_eqRangePart.soft = extra ? 0 : null;\n\t_eqRangePart.mode = extra ? 3 : 0;\n\n\treturn _rangeNum(_min, _max, _eqRange);\n}\n\n// nullish coalesce\nfunction ifNull(lh, rh) {\n\treturn lh == null ? rh : lh;\n}\n\n// checks if given index range in an array contains a non-null value\n// aka a range-bounded Array.some()\nfunction hasData(data, idx0, idx1) {\n\tidx0 = ifNull(idx0, 0);\n\tidx1 = ifNull(idx1, data.length - 1);\n\n\twhile (idx0 <= idx1) {\n\t\tif (data[idx0] != null)\n\t\t\treturn true;\n\t\tidx0++;\n\t}\n\n\treturn false;\n}\n\nfunction _rangeNum(_min, _max, cfg) {\n\tlet cmin = cfg.min;\n\tlet cmax = cfg.max;\n\n\tlet padMin = ifNull(cmin.pad, 0);\n\tlet padMax = ifNull(cmax.pad, 0);\n\n\tlet hardMin = ifNull(cmin.hard, -inf);\n\tlet hardMax = ifNull(cmax.hard,  inf);\n\n\tlet softMin = ifNull(cmin.soft,  inf);\n\tlet softMax = ifNull(cmax.soft, -inf);\n\n\tlet softMinMode = ifNull(cmin.mode, 0);\n\tlet softMaxMode = ifNull(cmax.mode, 0);\n\n\tlet delta = _max - _min;\n\tlet deltaMag = log10(delta);\n\n\tlet scalarMax = max(abs(_min), abs(_max));\n\tlet scalarMag = log10(scalarMax);\n\n\tlet scalarMagDelta = abs(scalarMag - deltaMag);\n\n\t// this handles situations like 89.7, 89.69999999999999\n\t// by assuming 0.001x deltas are precision errors\n//\tif (delta > 0 && delta < abs(_max) / 1e3)\n//\t\tdelta = 0;\n\n\t// treat data as flat if delta is less than 1e-24\n\t// or range is 11+ orders of magnitude below raw values, e.g. 99999999.99999996 - 100000000.00000004\n\tif (delta < 1e-24 || scalarMagDelta > 10) {\n\t\tdelta = 0;\n\n\t\t// if soft mode is 2 and all vals are flat at 0, avoid the 0.1 * 1e3 fallback\n\t\t// this prevents 0,0,0 from ranging to -100,100 when softMin/softMax are -1,1\n\t\tif (_min == 0 || _max == 0) {\n\t\t\tdelta = 1e-24;\n\n\t\t\tif (softMinMode == 2 && softMin != inf)\n\t\t\t\tpadMin = 0;\n\n\t\t\tif (softMaxMode == 2 && softMax != -inf)\n\t\t\t\tpadMax = 0;\n\t\t}\n\t}\n\n\tlet nonZeroDelta = delta || scalarMax || 1e3;\n\tlet mag          = log10(nonZeroDelta);\n\tlet base         = pow(10, floor(mag));\n\n\tlet _padMin  = nonZeroDelta * (delta == 0 ? (_min == 0 ? .1 : 1) : padMin);\n\tlet _newMin  = roundDec(incrRoundDn(_min - _padMin, base/10), 24);\n\tlet _softMin = _min >= softMin && (softMinMode == 1 || softMinMode == 3 && _newMin <= softMin || softMinMode == 2 && _newMin >= softMin) ? softMin : inf;\n\tlet minLim   = max(hardMin, _newMin < _softMin && _min >= _softMin ? _softMin : min(_softMin, _newMin));\n\n\tlet _padMax  = nonZeroDelta * (delta == 0 ? (_max == 0 ? .1 : 1) : padMax);\n\tlet _newMax  = roundDec(incrRoundUp(_max + _padMax, base/10), 24);\n\tlet _softMax = _max <= softMax && (softMaxMode == 1 || softMaxMode == 3 && _newMax >= softMax || softMaxMode == 2 && _newMax <= softMax) ? softMax : -inf;\n\tlet maxLim   = min(hardMax, _newMax > _softMax && _max <= _softMax ? _softMax : max(_softMax, _newMax));\n\n\tif (minLim == maxLim && minLim == 0)\n\t\tmaxLim = 100;\n\n\treturn [minLim, maxLim];\n}\n\n// alternative: https://stackoverflow.com/a/2254896\nconst numFormatter = new Intl.NumberFormat(domEnv ? nav.language : 'en-US');\nconst fmtNum = val => numFormatter.format(val);\n\nconst M = Math;\n\nconst PI = M.PI;\nconst abs = M.abs;\nconst floor = M.floor;\nconst round = M.round;\nconst ceil = M.ceil;\nconst min = M.min;\nconst max = M.max;\nconst pow = M.pow;\nconst sign = M.sign;\nconst log10 = M.log10;\nconst log2 = M.log2;\n// TODO: seems like this needs to match asinh impl if the passed v is tweaked?\nconst sinh =  (v, linthresh = 1) => M.sinh(v) * linthresh;\nconst asinh = (v, linthresh = 1) => M.asinh(v / linthresh);\n\nconst inf = Infinity;\n\nfunction numIntDigits(x) {\n\treturn (log10((x ^ (x >> 31)) - (x >> 31)) | 0) + 1;\n}\n\nfunction clamp(num, _min, _max) {\n\treturn min(max(num, _min), _max);\n}\n\nfunction isFn(v) {\n\treturn typeof v == \"function\";\n}\n\nfunction fnOrSelf(v) {\n\treturn isFn(v) ? v : () => v;\n}\n\nconst noop = () => {};\n\n// note: these identity fns may get deoptimized if reused for different arg types\n// a TS version would enforce they stay monotyped and require making variants\nconst retArg0 = _0 => _0;\n\nconst retArg1 = (_0, _1) => _1;\n\nconst retNull = _ => null;\n\nconst retTrue = _ => true;\n\nconst retEq = (a, b) => a == b;\n\nconst regex6 = /\\.\\d*?(?=9{6,}|0{6,})/gm;\n\n// e.g. 17999.204999999998 -> 17999.205\nconst fixFloat = val => {\n\tif (isInt(val) || fixedDec.has(val))\n\t\treturn val;\n\n\tconst str = `${val}`;\n\n\tconst match = str.match(regex6);\n\n\tif (match == null)\n\t\treturn val;\n\n\tlet len = match[0].length - 1;\n\n\t// e.g. 1.0000000000000001e-24\n\tif (str.indexOf('e-') != -1) {\n\t\tlet [num, exp] = str.split('e');\n\t\treturn +`${fixFloat(num)}e${exp}`;\n\t}\n\n\treturn roundDec(val, len);\n};\n\nfunction incrRound(num, incr) {\n\treturn fixFloat(roundDec(fixFloat(num/incr))*incr);\n}\n\nfunction incrRoundUp(num, incr) {\n\treturn fixFloat(ceil(fixFloat(num/incr))*incr);\n}\n\nfunction incrRoundDn(num, incr) {\n\treturn fixFloat(floor(fixFloat(num/incr))*incr);\n}\n\n// https://stackoverflow.com/a/48764436\n// rounds half away from zero\nfunction roundDec(val, dec = 0) {\n\tif (isInt(val))\n\t\treturn val;\n//\telse if (dec == 0)\n//\t\treturn round(val);\n\n\tlet p = 10 ** dec;\n\tlet n = (val * p) * (1 + Number.EPSILON);\n\treturn round(n) / p;\n}\n\nconst fixedDec = new Map();\n\nfunction guessDec(num) {\n\treturn ((\"\"+num).split(\".\")[1] || \"\").length;\n}\n\nfunction genIncrs(base, minExp, maxExp, mults) {\n\tlet incrs = [];\n\n\tlet multDec = mults.map(guessDec);\n\n\tfor (let exp = minExp; exp < maxExp; exp++) {\n\t\tlet expa = abs(exp);\n\t\tlet mag = roundDec(pow(base, exp), expa);\n\n\t\tfor (let i = 0; i < mults.length; i++) {\n\t\t\tlet _incr = base == 10 ? +`${mults[i]}e${exp}` : mults[i] * mag;\n\t\t\tlet dec = (exp >= 0 ? 0 : expa) + (exp >= multDec[i] ? 0 : multDec[i]);\n\t\t\tlet incr = base == 10 ? _incr : roundDec(_incr, dec);\n\t\t\tincrs.push(incr);\n\t\t\tfixedDec.set(incr, dec);\n\t\t}\n\t}\n\n\treturn incrs;\n}\n\n//export const assign = Object.assign;\n\nconst EMPTY_OBJ = {};\nconst EMPTY_ARR = [];\n\nconst nullNullTuple = [null, null];\n\nconst isArr = Array.isArray;\nconst isInt = Number.isInteger;\nconst isUndef = v => v === void 0;\n\nfunction isStr(v) {\n\treturn typeof v == 'string';\n}\n\nfunction isObj(v) {\n\tlet is = false;\n\n\tif (v != null) {\n\t\tlet c = v.constructor;\n\t\tis = c == null || c == Object;\n\t}\n\n\treturn is;\n}\n\nfunction fastIsObj(v) {\n\treturn v != null && typeof v == 'object';\n}\n\nconst TypedArray = Object.getPrototypeOf(Uint8Array);\n\nconst __proto__ = \"__proto__\";\n\nfunction copy(o, _isObj = isObj) {\n\tlet out;\n\n\tif (isArr(o)) {\n\t\tlet val = o.find(v => v != null);\n\n\t\tif (isArr(val) || _isObj(val)) {\n\t\t\tout = Array(o.length);\n\t\t\tfor (let i = 0; i < o.length; i++)\n\t\t\t\tout[i] = copy(o[i], _isObj);\n\t\t}\n\t\telse\n\t\t\tout = o.slice();\n\t}\n\telse if (o instanceof TypedArray) // also (ArrayBuffer.isView(o) && !(o instanceof DataView))\n\t\tout = o.slice();\n\telse if (_isObj(o)) {\n\t\tout = {};\n\t\tfor (let k in o) {\n\t\t\tif (k != __proto__)\n\t\t\t\tout[k] = copy(o[k], _isObj);\n\t\t}\n\t}\n\telse\n\t\tout = o;\n\n\treturn out;\n}\n\nfunction assign(targ) {\n\tlet args = arguments;\n\n\tfor (let i = 1; i < args.length; i++) {\n\t\tlet src = args[i];\n\n\t\tfor (let key in src) {\n\t\t\tif (key != __proto__) {\n\t\t\t\tif (isObj(targ[key]))\n\t\t\t\t\tassign(targ[key], copy(src[key]));\n\t\t\t\telse\n\t\t\t\t\ttarg[key] = copy(src[key]);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn targ;\n}\n\n// nullModes\nconst NULL_REMOVE = 0;  // nulls are converted to undefined (e.g. for spanGaps: true)\nconst NULL_RETAIN = 1;  // nulls are retained, with alignment artifacts set to undefined (default)\nconst NULL_EXPAND = 2;  // nulls are expanded to include any adjacent alignment artifacts\n\n// sets undefined values to nulls when adjacent to existing nulls (minesweeper)\nfunction nullExpand(yVals, nullIdxs, alignedLen) {\n\tfor (let i = 0, xi, lastNullIdx = -1; i < nullIdxs.length; i++) {\n\t\tlet nullIdx = nullIdxs[i];\n\n\t\tif (nullIdx > lastNullIdx) {\n\t\t\txi = nullIdx - 1;\n\t\t\twhile (xi >= 0 && yVals[xi] == null)\n\t\t\t\tyVals[xi--] = null;\n\n\t\t\txi = nullIdx + 1;\n\t\t\twhile (xi < alignedLen && yVals[xi] == null)\n\t\t\t\tyVals[lastNullIdx = xi++] = null;\n\t\t}\n\t}\n}\n\n// nullModes is a tables-matched array indicating how to treat nulls in each series\n// output is sorted ASC on the joined field (table[0]) and duplicate join values are collapsed\nfunction join(tables, nullModes) {\n\tif (allHeadersSame(tables)) {\n\t//\tconsole.log('cheap join!');\n\n\t\tlet table = tables[0].slice();\n\n\t\tfor (let i = 1; i < tables.length; i++)\n\t\t\ttable.push(...tables[i].slice(1));\n\n\t\tif (!isAsc(table[0]))\n\t\t\ttable = sortCols(table);\n\n\t\treturn table;\n\t}\n\n\tlet xVals = new Set();\n\n\tfor (let ti = 0; ti < tables.length; ti++) {\n\t\tlet t = tables[ti];\n\t\tlet xs = t[0];\n\t\tlet len = xs.length;\n\n\t\tfor (let i = 0; i < len; i++)\n\t\t\txVals.add(xs[i]);\n\t}\n\n\tlet data = [Array.from(xVals).sort((a, b) => a - b)];\n\n\tlet alignedLen = data[0].length;\n\n\tlet xIdxs = new Map();\n\n\tfor (let i = 0; i < alignedLen; i++)\n\t\txIdxs.set(data[0][i], i);\n\n\tfor (let ti = 0; ti < tables.length; ti++) {\n\t\tlet t = tables[ti];\n\t\tlet xs = t[0];\n\n\t\tfor (let si = 1; si < t.length; si++) {\n\t\t\tlet ys = t[si];\n\n\t\t\tlet yVals = Array(alignedLen).fill(undefined);\n\n\t\t\tlet nullMode = nullModes ? nullModes[ti][si] : NULL_RETAIN;\n\n\t\t\tlet nullIdxs = [];\n\n\t\t\tfor (let i = 0; i < ys.length; i++) {\n\t\t\t\tlet yVal = ys[i];\n\t\t\t\tlet alignedIdx = xIdxs.get(xs[i]);\n\n\t\t\t\tif (yVal === null) {\n\t\t\t\t\tif (nullMode != NULL_REMOVE) {\n\t\t\t\t\t\tyVals[alignedIdx] = yVal;\n\n\t\t\t\t\t\tif (nullMode == NULL_EXPAND)\n\t\t\t\t\t\t\tnullIdxs.push(alignedIdx);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tyVals[alignedIdx] = yVal;\n\t\t\t}\n\n\t\t\tnullExpand(yVals, nullIdxs, alignedLen);\n\n\t\t\tdata.push(yVals);\n\t\t}\n\t}\n\n\treturn data;\n}\n\nconst microTask = typeof queueMicrotask == \"undefined\" ? fn => Promise.resolve().then(fn) : queueMicrotask;\n\n// TODO: https://github.com/dy/sort-ids (~2x faster for 1e5+ arrays)\nfunction sortCols(table) {\n\tlet head = table[0];\n\tlet rlen = head.length;\n\n\tlet idxs = Array(rlen);\n\tfor (let i = 0; i < idxs.length; i++)\n\t\tidxs[i] = i;\n\n\tidxs.sort((i0, i1) => head[i0] - head[i1]);\n\n\tlet table2 = [];\n\tfor (let i = 0; i < table.length; i++) {\n\t\tlet row = table[i];\n\t\tlet row2 = Array(rlen);\n\n\t\tfor (let j = 0; j < rlen; j++)\n\t\t\trow2[j] = row[idxs[j]];\n\n\t\ttable2.push(row2);\n\t}\n\n\treturn table2;\n}\n\n// test if we can do cheap join (all join fields same)\nfunction allHeadersSame(tables) {\n\tlet vals0 = tables[0][0];\n\tlet len0 = vals0.length;\n\n\tfor (let i = 1; i < tables.length; i++) {\n\t\tlet vals1 = tables[i][0];\n\n\t\tif (vals1.length != len0)\n\t\t\treturn false;\n\n\t\tif (vals1 != vals0) {\n\t\t\tfor (let j = 0; j < len0; j++) {\n\t\t\t\tif (vals1[j] != vals0[j])\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn true;\n}\n\nfunction isAsc(vals, samples = 100) {\n\tconst len = vals.length;\n\n\t// empty or single value\n\tif (len <= 1)\n\t\treturn true;\n\n\t// skip leading & trailing nullish\n\tlet firstIdx = 0;\n\tlet lastIdx = len - 1;\n\n\twhile (firstIdx <= lastIdx && vals[firstIdx] == null)\n\t\tfirstIdx++;\n\n\twhile (lastIdx >= firstIdx && vals[lastIdx] == null)\n\t\tlastIdx--;\n\n\t// all nullish or one value surrounded by nullish\n\tif (lastIdx <= firstIdx)\n\t\treturn true;\n\n\tconst stride = max(1, floor((lastIdx - firstIdx + 1) / samples));\n\n\tfor (let prevVal = vals[firstIdx], i = firstIdx + stride; i <= lastIdx; i += stride) {\n\t\tconst v = vals[i];\n\n\t\tif (v != null) {\n\t\t\tif (v <= prevVal)\n\t\t\t\treturn false;\n\n\t\t\tprevVal = v;\n\t\t}\n\t}\n\n\treturn true;\n}\n\nconst months = [\n\t\"January\",\n\t\"February\",\n\t\"March\",\n\t\"April\",\n\t\"May\",\n\t\"June\",\n\t\"July\",\n\t\"August\",\n\t\"September\",\n\t\"October\",\n\t\"November\",\n\t\"December\",\n];\n\nconst days = [\n\t\"Sunday\",\n\t\"Monday\",\n\t\"Tuesday\",\n\t\"Wednesday\",\n\t\"Thursday\",\n\t\"Friday\",\n\t\"Saturday\",\n];\n\nfunction slice3(str) {\n\treturn str.slice(0, 3);\n}\n\nconst days3 = days.map(slice3);\n\nconst months3 = months.map(slice3);\n\nconst engNames = {\n\tMMMM: months,\n\tMMM:  months3,\n\tWWWW: days,\n\tWWW:  days3,\n};\n\nfunction zeroPad2(int) {\n\treturn (int < 10 ? '0' : '') + int;\n}\n\nfunction zeroPad3(int) {\n\treturn (int < 10 ? '00' : int < 100 ? '0' : '') + int;\n}\n\n/*\nfunction suffix(int) {\n\tlet mod10 = int % 10;\n\n\treturn int + (\n\t\tmod10 == 1 && int != 11 ? \"st\" :\n\t\tmod10 == 2 && int != 12 ? \"nd\" :\n\t\tmod10 == 3 && int != 13 ? \"rd\" : \"th\"\n\t);\n}\n*/\n\nconst subs = {\n\t// 2019\n\tYYYY:\td => d.getFullYear(),\n\t// 19\n\tYY:\t\td => (d.getFullYear()+'').slice(2),\n\t// July\n\tMMMM:\t(d, names) => names.MMMM[d.getMonth()],\n\t// Jul\n\tMMM:\t(d, names) => names.MMM[d.getMonth()],\n\t// 07\n\tMM:\t\td => zeroPad2(d.getMonth()+1),\n\t// 7\n\tM:\t\td => d.getMonth()+1,\n\t// 09\n\tDD:\t\td => zeroPad2(d.getDate()),\n\t// 9\n\tD:\t\td => d.getDate(),\n\t// Monday\n\tWWWW:\t(d, names) => names.WWWW[d.getDay()],\n\t// Mon\n\tWWW:\t(d, names) => names.WWW[d.getDay()],\n\t// 03\n\tHH:\t\td => zeroPad2(d.getHours()),\n\t// 3\n\tH:\t\td => d.getHours(),\n\t// 9 (12hr, unpadded)\n\th:\t\td => {let h = d.getHours(); return h == 0 ? 12 : h > 12 ? h - 12 : h;},\n\t// AM\n\tAA:\t\td => d.getHours() >= 12 ? 'PM' : 'AM',\n\t// am\n\taa:\t\td => d.getHours() >= 12 ? 'pm' : 'am',\n\t// a\n\ta:\t\td => d.getHours() >= 12 ? 'p' : 'a',\n\t// 09\n\tmm:\t\td => zeroPad2(d.getMinutes()),\n\t// 9\n\tm:\t\td => d.getMinutes(),\n\t// 09\n\tss:\t\td => zeroPad2(d.getSeconds()),\n\t// 9\n\ts:\t\td => d.getSeconds(),\n\t// 374\n\tfff:\td => zeroPad3(d.getMilliseconds()),\n};\n\nfunction fmtDate(tpl, names) {\n\tnames = names || engNames;\n\tlet parts = [];\n\n\tlet R = /\\{([a-z]+)\\}|[^{]+/gi, m;\n\n\twhile (m = R.exec(tpl))\n\t\tparts.push(m[0][0] == '{' ? subs[m[1]] : m[0]);\n\n\treturn d => {\n\t\tlet out = '';\n\n\t\tfor (let i = 0; i < parts.length; i++)\n\t\t\tout += typeof parts[i] == \"string\" ? parts[i] : parts[i](d, names);\n\n\t\treturn out;\n\t}\n}\n\nconst localTz = new Intl.DateTimeFormat().resolvedOptions().timeZone;\n\n// https://stackoverflow.com/questions/15141762/how-to-initialize-a-javascript-date-to-a-particular-time-zone/53652131#53652131\nfunction tzDate(date, tz) {\n\tlet date2;\n\n\t// perf optimization\n\tif (tz == 'UTC' || tz == 'Etc/UTC')\n\t\tdate2 = new Date(+date + date.getTimezoneOffset() * 6e4);\n\telse if (tz == localTz)\n\t\tdate2 = date;\n\telse {\n\t\tdate2 = new Date(date.toLocaleString('en-US', {timeZone: tz}));\n\t\tdate2.setMilliseconds(date.getMilliseconds());\n\t}\n\n\treturn date2;\n}\n\n//export const series = [];\n\n// default formatters:\n\nconst onlyWhole = v => v % 1 == 0;\n\nconst allMults = [1,2,2.5,5];\n\n// ...0.01, 0.02, 0.025, 0.05, 0.1, 0.2, 0.25, 0.5\nconst decIncrs = genIncrs(10, -32, 0, allMults);\n\n// 1, 2, 2.5, 5, 10, 20, 25, 50...\nconst oneIncrs = genIncrs(10, 0, 32, allMults);\n\n// 1, 2,      5, 10, 20, 25, 50...\nconst wholeIncrs = oneIncrs.filter(onlyWhole);\n\nconst numIncrs = decIncrs.concat(oneIncrs);\n\nconst NL = \"\\n\";\n\nconst yyyy    = \"{YYYY}\";\nconst NLyyyy  = NL + yyyy;\nconst md      = \"{M}/{D}\";\nconst NLmd    = NL + md;\nconst NLmdyy  = NLmd + \"/{YY}\";\n\nconst aa      = \"{aa}\";\nconst hmm     = \"{h}:{mm}\";\nconst hmmaa   = hmm + aa;\nconst NLhmmaa = NL + hmmaa;\nconst ss      = \":{ss}\";\n\nconst _ = null;\n\nfunction genTimeStuffs(ms) {\n\tlet\ts  = ms * 1e3,\n\t\tm  = s  * 60,\n\t\th  = m  * 60,\n\t\td  = h  * 24,\n\t\tmo = d  * 30,\n\t\ty  = d  * 365;\n\n\t// min of 1e-3 prevents setting a temporal x ticks too small since Date objects cannot advance ticks smaller than 1ms\n\tlet subSecIncrs = ms == 1 ? genIncrs(10, 0, 3, allMults).filter(onlyWhole) : genIncrs(10, -3, 0, allMults);\n\n\tlet timeIncrs = subSecIncrs.concat([\n\t\t// minute divisors (# of secs)\n\t\ts,\n\t\ts * 5,\n\t\ts * 10,\n\t\ts * 15,\n\t\ts * 30,\n\t\t// hour divisors (# of mins)\n\t\tm,\n\t\tm * 5,\n\t\tm * 10,\n\t\tm * 15,\n\t\tm * 30,\n\t\t// day divisors (# of hrs)\n\t\th,\n\t\th * 2,\n\t\th * 3,\n\t\th * 4,\n\t\th * 6,\n\t\th * 8,\n\t\th * 12,\n\t\t// month divisors TODO: need more?\n\t\td,\n\t\td * 2,\n\t\td * 3,\n\t\td * 4,\n\t\td * 5,\n\t\td * 6,\n\t\td * 7,\n\t\td * 8,\n\t\td * 9,\n\t\td * 10,\n\t\td * 15,\n\t\t// year divisors (# months, approx)\n\t\tmo,\n\t\tmo * 2,\n\t\tmo * 3,\n\t\tmo * 4,\n\t\tmo * 6,\n\t\t// century divisors\n\t\ty,\n\t\ty * 2,\n\t\ty * 5,\n\t\ty * 10,\n\t\ty * 25,\n\t\ty * 50,\n\t\ty * 100,\n\t]);\n\n\t// [0]:   minimum num secs in the tick incr\n\t// [1]:   default tick format\n\t// [2-7]: rollover tick formats\n\t// [8]:   mode: 0: replace [1] -> [2-7], 1: concat [1] + [2-7]\n\tconst _timeAxisStamps = [\n\t//   tick incr    default          year                    month   day                   hour    min       sec   mode\n\t\t[y,           yyyy,            _,                      _,      _,                    _,      _,        _,       1],\n\t\t[d * 28,      \"{MMM}\",         NLyyyy,                 _,      _,                    _,      _,        _,       1],\n\t\t[d,           md,              NLyyyy,                 _,      _,                    _,      _,        _,       1],\n\t\t[h,           \"{h}\" + aa,      NLmdyy,                 _,      NLmd,                 _,      _,        _,       1],\n\t\t[m,           hmmaa,           NLmdyy,                 _,      NLmd,                 _,      _,        _,       1],\n\t\t[s,           ss,              NLmdyy + \" \" + hmmaa,   _,      NLmd + \" \" + hmmaa,   _,      NLhmmaa,  _,       1],\n\t\t[ms,          ss + \".{fff}\",   NLmdyy + \" \" + hmmaa,   _,      NLmd + \" \" + hmmaa,   _,      NLhmmaa,  _,       1],\n\t];\n\n\t// the ensures that axis ticks, values & grid are aligned to logical temporal breakpoints and not an arbitrary timestamp\n\t// https://www.timeanddate.com/time/dst/\n\t// https://www.timeanddate.com/time/dst/2019.html\n\t// https://www.epochconverter.com/timezones\n\tfunction timeAxisSplits(tzDate) {\n\t\treturn (self, axisIdx, scaleMin, scaleMax, foundIncr, foundSpace) => {\n\t\t\tlet splits = [];\n\t\t\tlet isYr = foundIncr >= y;\n\t\t\tlet isMo = foundIncr >= mo && foundIncr < y;\n\n\t\t\t// get the timezone-adjusted date\n\t\t\tlet minDate = tzDate(scaleMin);\n\t\t\tlet minDateTs = roundDec(minDate * ms, 3);\n\n\t\t\t// get ts of 12am (this lands us at or before the original scaleMin)\n\t\t\tlet minMin = mkDate(minDate.getFullYear(), isYr ? 0 : minDate.getMonth(), isMo || isYr ? 1 : minDate.getDate());\n\t\t\tlet minMinTs = roundDec(minMin * ms, 3);\n\n\t\t\tif (isMo || isYr) {\n\t\t\t\tlet moIncr = isMo ? foundIncr / mo : 0;\n\t\t\t\tlet yrIncr = isYr ? foundIncr / y  : 0;\n\t\t\t//\tlet tzOffset = scaleMin - minDateTs;\t\t// needed?\n\t\t\t\tlet split = minDateTs == minMinTs ? minDateTs : roundDec(mkDate(minMin.getFullYear() + yrIncr, minMin.getMonth() + moIncr, 1) * ms, 3);\n\t\t\t\tlet splitDate = new Date(round(split / ms));\n\t\t\t\tlet baseYear = splitDate.getFullYear();\n\t\t\t\tlet baseMonth = splitDate.getMonth();\n\n\t\t\t\tfor (let i = 0; split <= scaleMax; i++) {\n\t\t\t\t\tlet next = mkDate(baseYear + yrIncr * i, baseMonth + moIncr * i, 1);\n\t\t\t\t\tlet offs = next - tzDate(roundDec(next * ms, 3));\n\n\t\t\t\t\tsplit = roundDec((+next + offs) * ms, 3);\n\n\t\t\t\t\tif (split <= scaleMax)\n\t\t\t\t\t\tsplits.push(split);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet incr0 = foundIncr >= d ? d : foundIncr;\n\t\t\t\tlet tzOffset = floor(scaleMin) - floor(minDateTs);\n\t\t\t\tlet split = minMinTs + tzOffset + incrRoundUp(minDateTs - minMinTs, incr0);\n\t\t\t\tsplits.push(split);\n\n\t\t\t\tlet date0 = tzDate(split);\n\n\t\t\t\tlet prevHour = date0.getHours() + (date0.getMinutes() / m) + (date0.getSeconds() / h);\n\t\t\t\tlet incrHours = foundIncr / h;\n\n\t\t\t\tlet minSpace = self.axes[axisIdx]._space;\n\t\t\t\tlet pctSpace = foundSpace / minSpace;\n\n\t\t\t\twhile (1) {\n\t\t\t\t\tsplit = roundDec(split + foundIncr, ms == 1 ? 0 : 3);\n\n\t\t\t\t\tif (split > scaleMax)\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tif (incrHours > 1) {\n\t\t\t\t\t\tlet expectedHour = floor(roundDec(prevHour + incrHours, 6)) % 24;\n\t\t\t\t\t\tlet splitDate = tzDate(split);\n\t\t\t\t\t\tlet actualHour = splitDate.getHours();\n\n\t\t\t\t\t\tlet dstShift = actualHour - expectedHour;\n\n\t\t\t\t\t\tif (dstShift > 1)\n\t\t\t\t\t\t\tdstShift = -1;\n\n\t\t\t\t\t\tsplit -= dstShift * h;\n\n\t\t\t\t\t\tprevHour = (prevHour + incrHours) % 24;\n\n\t\t\t\t\t\t// add a tick only if it's further than 70% of the min allowed label spacing\n\t\t\t\t\t\tlet prevSplit = splits[splits.length - 1];\n\t\t\t\t\t\tlet pctIncr = roundDec((split - prevSplit) / foundIncr, 3);\n\n\t\t\t\t\t\tif (pctIncr * pctSpace >= .7)\n\t\t\t\t\t\t\tsplits.push(split);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tsplits.push(split);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn splits;\n\t\t}\n\t}\n\n\treturn [\n\t\ttimeIncrs,\n\t\t_timeAxisStamps,\n\t\ttimeAxisSplits,\n\t];\n}\n\nconst [ timeIncrsMs, _timeAxisStampsMs, timeAxisSplitsMs ] = genTimeStuffs(1);\nconst [ timeIncrsS,  _timeAxisStampsS,  timeAxisSplitsS  ] = genTimeStuffs(1e-3);\n\n// base 2\ngenIncrs(2, -53, 53, [1]);\n\n/*\nconsole.log({\n\tdecIncrs,\n\toneIncrs,\n\twholeIncrs,\n\tnumIncrs,\n\ttimeIncrs,\n\tfixedDec,\n});\n*/\n\nfunction timeAxisStamps(stampCfg, fmtDate) {\n\treturn stampCfg.map(s => s.map((v, i) =>\n\t\ti == 0 || i == 8 || v == null ? v : fmtDate(i == 1 || s[8] == 0 ? v : s[1] + v)\n\t));\n}\n\n// TODO: will need to accept spaces[] and pull incr into the loop when grid will be non-uniform, eg for log scales.\n// currently we ignore this for months since they're *nearly* uniform and the added complexity is not worth it\nfunction timeAxisVals(tzDate, stamps) {\n\treturn (self, splits, axisIdx, foundSpace, foundIncr) => {\n\t\tlet s = stamps.find(s => foundIncr >= s[0]) || stamps[stamps.length - 1];\n\n\t\t// these track boundaries when a full label is needed again\n\t\tlet prevYear;\n\t\tlet prevMnth;\n\t\tlet prevDate;\n\t\tlet prevHour;\n\t\tlet prevMins;\n\t\tlet prevSecs;\n\n\t\treturn splits.map(split => {\n\t\t\tlet date = tzDate(split);\n\n\t\t\tlet newYear = date.getFullYear();\n\t\t\tlet newMnth = date.getMonth();\n\t\t\tlet newDate = date.getDate();\n\t\t\tlet newHour = date.getHours();\n\t\t\tlet newMins = date.getMinutes();\n\t\t\tlet newSecs = date.getSeconds();\n\n\t\t\tlet stamp = (\n\t\t\t\tnewYear != prevYear && s[2] ||\n\t\t\t\tnewMnth != prevMnth && s[3] ||\n\t\t\t\tnewDate != prevDate && s[4] ||\n\t\t\t\tnewHour != prevHour && s[5] ||\n\t\t\t\tnewMins != prevMins && s[6] ||\n\t\t\t\tnewSecs != prevSecs && s[7] ||\n\t\t\t\t                       s[1]\n\t\t\t);\n\n\t\t\tprevYear = newYear;\n\t\t\tprevMnth = newMnth;\n\t\t\tprevDate = newDate;\n\t\t\tprevHour = newHour;\n\t\t\tprevMins = newMins;\n\t\t\tprevSecs = newSecs;\n\n\t\t\treturn stamp(date);\n\t\t});\n\t}\n}\n\n// for when axis.values is defined as a static fmtDate template string\nfunction timeAxisVal(tzDate, dateTpl) {\n\tlet stamp = fmtDate(dateTpl);\n\treturn (self, splits, axisIdx, foundSpace, foundIncr) => splits.map(split => stamp(tzDate(split)));\n}\n\nfunction mkDate(y, m, d) {\n\treturn new Date(y, m, d);\n}\n\nfunction timeSeriesStamp(stampCfg, fmtDate) {\n\treturn fmtDate(stampCfg);\n}\nconst _timeSeriesStamp = '{YYYY}-{MM}-{DD} {h}:{mm}{aa}';\n\nfunction timeSeriesVal(tzDate, stamp) {\n\treturn (self, val, seriesIdx, dataIdx) => dataIdx == null ? LEGEND_DISP : stamp(tzDate(val));\n}\n\nfunction legendStroke(self, seriesIdx) {\n\tlet s = self.series[seriesIdx];\n\treturn s.width ? s.stroke(self, seriesIdx) : s.points.width ? s.points.stroke(self, seriesIdx) : null;\n}\n\nfunction legendFill(self, seriesIdx) {\n\treturn self.series[seriesIdx].fill(self, seriesIdx);\n}\n\nconst legendOpts = {\n\tshow: true,\n\tlive: true,\n\tisolate: false,\n\tmount: noop,\n\tmarkers: {\n\t\tshow: true,\n\t\twidth: 2,\n\t\tstroke: legendStroke,\n\t\tfill: legendFill,\n\t\tdash: \"solid\",\n\t},\n\tidx: null,\n\tidxs: null,\n\tvalues: [],\n};\n\nfunction cursorPointShow(self, si) {\n\tlet o = self.cursor.points;\n\n\tlet pt = placeDiv();\n\n\tlet size = o.size(self, si);\n\tsetStylePx(pt, WIDTH, size);\n\tsetStylePx(pt, HEIGHT, size);\n\n\tlet mar = size / -2;\n\tsetStylePx(pt, \"marginLeft\", mar);\n\tsetStylePx(pt, \"marginTop\", mar);\n\n\tlet width = o.width(self, si, size);\n\twidth && setStylePx(pt, \"borderWidth\", width);\n\n\treturn pt;\n}\n\nfunction cursorPointFill(self, si) {\n\tlet sp = self.series[si].points;\n\treturn sp._fill || sp._stroke;\n}\n\nfunction cursorPointStroke(self, si) {\n\tlet sp = self.series[si].points;\n\treturn sp._stroke || sp._fill;\n}\n\nfunction cursorPointSize(self, si) {\n\tlet sp = self.series[si].points;\n\treturn sp.size;\n}\n\nconst moveTuple = [0,0];\n\nfunction cursorMove(self, mouseLeft1, mouseTop1) {\n\tmoveTuple[0] = mouseLeft1;\n\tmoveTuple[1] = mouseTop1;\n\treturn moveTuple;\n}\n\nfunction filtBtn0(self, targ, handle, onlyTarg = true) {\n\treturn e => {\n\t\te.button == 0 && (!onlyTarg || e.target == targ) && handle(e);\n\t};\n}\n\nfunction filtTarg(self, targ, handle, onlyTarg = true) {\n\treturn e => {\n\t\t(!onlyTarg || e.target == targ) && handle(e);\n\t};\n}\n\nconst cursorOpts = {\n\tshow: true,\n\tx: true,\n\ty: true,\n\tlock: false,\n\tmove: cursorMove,\n\tpoints: {\n\t\tone:    false,\n\t\tshow:   cursorPointShow,\n\t\tsize:   cursorPointSize,\n\t\twidth:  0,\n\t\tstroke: cursorPointStroke,\n\t\tfill:   cursorPointFill,\n\t},\n\n\tbind: {\n\t\tmousedown:   filtBtn0,\n\t\tmouseup:     filtBtn0,\n\t\tclick:       filtBtn0, // legend clicks, not .u-over clicks\n\t\tdblclick:    filtBtn0,\n\n\t\tmousemove:   filtTarg,\n\t\tmouseleave:  filtTarg,\n\t\tmouseenter:  filtTarg,\n\t},\n\n\tdrag: {\n\t\tsetScale: true,\n\t\tx: true,\n\t\ty: false,\n\t\tdist: 0,\n\t\tuni: null,\n\t\tclick: (self, e) => {\n\t\t//\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\te.stopImmediatePropagation();\n\t\t},\n\t\t_x: false,\n\t\t_y: false,\n\t},\n\n\tfocus: {\n\t\tdist: (self, seriesIdx, dataIdx, valPos, curPos) => valPos - curPos,\n\t\tprox: -1,\n\t\tbias: 0,\n\t},\n\n\thover: {\n\t\tskip: [void 0],\n\t\tprox: null,\n\t\tbias: 0,\n\t},\n\n\tleft: -10,\n\ttop: -10,\n\tidx: null,\n\tdataIdx: null,\n\tidxs: null,\n\n\tevent: null,\n};\n\nconst axisLines = {\n\tshow: true,\n\tstroke: \"rgba(0,0,0,0.07)\",\n\twidth: 2,\n//\tdash: [],\n};\n\nconst grid = assign({}, axisLines, {\n\tfilter: retArg1,\n});\n\nconst ticks = assign({}, grid, {\n\tsize: 10,\n});\n\nconst border = assign({}, axisLines, {\n\tshow: false,\n});\n\nconst font      = '12px system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\"';\nconst labelFont = \"bold \" + font;\nconst lineGap = 1.5;\t// font-size multiplier\n\nconst xAxisOpts = {\n\tshow: true,\n\tscale: \"x\",\n\tstroke: hexBlack,\n\tspace: 50,\n\tgap: 5,\n\talignTo: 1,\n\tsize: 50,\n\tlabelGap: 0,\n\tlabelSize: 30,\n\tlabelFont,\n\tside: 2,\n//\tclass: \"x-vals\",\n//\tincrs: timeIncrs,\n//\tvalues: timeVals,\n//\tfilter: retArg1,\n\tgrid,\n\tticks,\n\tborder,\n\tfont,\n\tlineGap,\n\trotate: 0,\n};\n\nconst numSeriesLabel = \"Value\";\nconst timeSeriesLabel = \"Time\";\n\nconst xSeriesOpts = {\n\tshow: true,\n\tscale: \"x\",\n\tauto: false,\n\tsorted: 1,\n//\tlabel: \"Time\",\n//\tvalue: v => stamp(new Date(v * 1e3)),\n\n\t// internal caches\n\tmin: inf,\n\tmax: -inf,\n\tidxs: [],\n};\n\nfunction numAxisVals(self, splits, axisIdx, foundSpace, foundIncr) {\n\treturn splits.map(v => v == null ? \"\" : fmtNum(v));\n}\n\nfunction numAxisSplits(self, axisIdx, scaleMin, scaleMax, foundIncr, foundSpace, forceMin) {\n\tlet splits = [];\n\n\tlet numDec = fixedDec.get(foundIncr) || 0;\n\n\tscaleMin = forceMin ? scaleMin : roundDec(incrRoundUp(scaleMin, foundIncr), numDec);\n\n\tfor (let val = scaleMin; val <= scaleMax; val = roundDec(val + foundIncr, numDec))\n\t\tsplits.push(Object.is(val, -0) ? 0 : val);\t\t// coalesces -0\n\n\treturn splits;\n}\n\n// this doesnt work for sin, which needs to come off from 0 independently in pos and neg dirs\nfunction logAxisSplits(self, axisIdx, scaleMin, scaleMax, foundIncr, foundSpace, forceMin) {\n\tconst splits = [];\n\n\tconst logBase = self.scales[self.axes[axisIdx].scale].log;\n\n\tconst logFn = logBase == 10 ? log10 : log2;\n\n\tconst exp = floor(logFn(scaleMin));\n\n\tfoundIncr = pow(logBase, exp);\n\n\t// boo: 10 ** -24 === 1.0000000000000001e-24\n\t// this grabs the proper 1e-24 one\n\tif (logBase == 10)\n\t\tfoundIncr = numIncrs[closestIdx(foundIncr, numIncrs)];\n\n\tlet split = scaleMin;\n\tlet nextMagIncr = foundIncr * logBase;\n\n\tif (logBase == 10)\n\t\tnextMagIncr = numIncrs[closestIdx(nextMagIncr, numIncrs)];\n\n\tdo {\n\t\tsplits.push(split);\n\t\tsplit = split + foundIncr;\n\n\t\tif (logBase == 10 && !fixedDec.has(split))\n\t\t\tsplit = roundDec(split, fixedDec.get(foundIncr));\n\n\t\tif (split >= nextMagIncr) {\n\t\t\tfoundIncr = split;\n\t\t\tnextMagIncr = foundIncr * logBase;\n\n\t\t\tif (logBase == 10)\n\t\t\t\tnextMagIncr = numIncrs[closestIdx(nextMagIncr, numIncrs)];\n\t\t}\n\t} while (split <= scaleMax);\n\n\treturn splits;\n}\n\nfunction asinhAxisSplits(self, axisIdx, scaleMin, scaleMax, foundIncr, foundSpace, forceMin) {\n\tlet sc = self.scales[self.axes[axisIdx].scale];\n\n\tlet linthresh = sc.asinh;\n\n\tlet posSplits = scaleMax > linthresh ? logAxisSplits(self, axisIdx, max(linthresh, scaleMin), scaleMax, foundIncr) : [linthresh];\n\tlet zero = scaleMax >= 0 && scaleMin <= 0 ? [0] : [];\n\tlet negSplits = scaleMin < -linthresh ? logAxisSplits(self, axisIdx, max(linthresh, -scaleMax), -scaleMin, foundIncr): [linthresh];\n\n\treturn negSplits.reverse().map(v => -v).concat(zero, posSplits);\n}\n\nconst RE_ALL   = /./;\nconst RE_12357 = /[12357]/;\nconst RE_125   = /[125]/;\nconst RE_1     = /1/;\n\nconst _filt = (splits, distr, re, keepMod) => splits.map((v, i) => ((distr == 4 && v == 0) || i % keepMod == 0 && re.test(v.toExponential()[v < 0 ? 1 : 0])) ? v : null);\n\nfunction log10AxisValsFilt(self, splits, axisIdx, foundSpace, foundIncr) {\n\tlet axis = self.axes[axisIdx];\n\tlet scaleKey = axis.scale;\n\tlet sc = self.scales[scaleKey];\n\n//\tif (sc.distr == 3 && sc.log == 2)\n//\t\treturn splits;\n\n\tlet valToPos = self.valToPos;\n\n\tlet minSpace = axis._space;\n\n\tlet _10 = valToPos(10, scaleKey);\n\n\tlet re = (\n\t\tvalToPos(9, scaleKey) - _10 >= minSpace ? RE_ALL :\n\t\tvalToPos(7, scaleKey) - _10 >= minSpace ? RE_12357 :\n\t\tvalToPos(5, scaleKey) - _10 >= minSpace ? RE_125 :\n\t\tRE_1\n\t);\n\n\tif (re == RE_1) {\n\t\tlet magSpace = abs(valToPos(1, scaleKey) - _10);\n\n\t\tif (magSpace < minSpace)\n\t\t\treturn _filt(splits.slice().reverse(), sc.distr, re, ceil(minSpace / magSpace)).reverse(); // max->min skip\n\t}\n\n\treturn _filt(splits, sc.distr, re, 1);\n}\n\nfunction log2AxisValsFilt(self, splits, axisIdx, foundSpace, foundIncr) {\n\tlet axis = self.axes[axisIdx];\n\tlet scaleKey = axis.scale;\n\tlet minSpace = axis._space;\n\tlet valToPos = self.valToPos;\n\n\tlet magSpace = abs(valToPos(1, scaleKey) - valToPos(2, scaleKey));\n\n\tif (magSpace < minSpace)\n\t\treturn _filt(splits.slice().reverse(), 3, RE_ALL, ceil(minSpace / magSpace)).reverse(); // max->min skip\n\n\treturn splits;\n}\n\nfunction numSeriesVal(self, val, seriesIdx, dataIdx) {\n\treturn dataIdx == null ? LEGEND_DISP : val == null ? \"\" : fmtNum(val);\n}\n\nconst yAxisOpts = {\n\tshow: true,\n\tscale: \"y\",\n\tstroke: hexBlack,\n\tspace: 30,\n\tgap: 5,\n\talignTo: 1,\n\tsize: 50,\n\tlabelGap: 0,\n\tlabelSize: 30,\n\tlabelFont,\n\tside: 3,\n//\tclass: \"y-vals\",\n//\tincrs: numIncrs,\n//\tvalues: (vals, space) => vals,\n//\tfilter: retArg1,\n\tgrid,\n\tticks,\n\tborder,\n\tfont,\n\tlineGap,\n\trotate: 0,\n};\n\n// takes stroke width\nfunction ptDia(width, mult) {\n\tlet dia = 3 + (width || 1) * 2;\n\treturn roundDec(dia * mult, 3);\n}\n\nfunction seriesPointsShow(self, si) {\n\tlet { scale, idxs } = self.series[0];\n\tlet xData = self._data[0];\n\tlet p0 = self.valToPos(xData[idxs[0]], scale, true);\n\tlet p1 = self.valToPos(xData[idxs[1]], scale, true);\n\tlet dim = abs(p1 - p0);\n\n\tlet s = self.series[si];\n//\tconst dia = ptDia(s.width, pxRatio);\n\tlet maxPts = dim / (s.points.space * pxRatio);\n\treturn idxs[1] - idxs[0] <= maxPts;\n}\n\nconst facet = {\n\tscale: null,\n\tauto: true,\n\tsorted: 0,\n\n\t// internal caches\n\tmin: inf,\n\tmax: -inf,\n};\n\nconst gaps = (self, seriesIdx, idx0, idx1, nullGaps) => nullGaps;\n\nconst xySeriesOpts = {\n\tshow: true,\n\tauto: true,\n\tsorted: 0,\n\tgaps,\n\talpha: 1,\n\tfacets: [\n\t\tassign({}, facet, {scale: 'x'}),\n\t\tassign({}, facet, {scale: 'y'}),\n\t],\n};\n\nconst ySeriesOpts = {\n\tscale: \"y\",\n\tauto: true,\n\tsorted: 0,\n\tshow: true,\n\tspanGaps: false,\n\tgaps,\n\talpha: 1,\n\tpoints: {\n\t\tshow: seriesPointsShow,\n\t\tfilter: null,\n\t//  paths:\n\t//\tstroke: \"#000\",\n\t//\tfill: \"#fff\",\n\t//\twidth: 1,\n\t//\tsize: 10,\n\t},\n//\tlabel: \"Value\",\n//\tvalue: v => v,\n\tvalues: null,\n\n\t// internal caches\n\tmin: inf,\n\tmax: -inf,\n\tidxs: [],\n\n\tpath: null,\n\tclip: null,\n};\n\nfunction clampScale(self, val, scaleMin, scaleMax, scaleKey) {\n/*\n\tif (val < 0) {\n\t\tlet cssHgt = self.bbox.height / pxRatio;\n\t\tlet absPos = self.valToPos(abs(val), scaleKey);\n\t\tlet fromBtm = cssHgt - absPos;\n\t\treturn self.posToVal(cssHgt + fromBtm, scaleKey);\n\t}\n*/\n\treturn scaleMin / 10;\n}\n\nconst xScaleOpts = {\n\ttime: FEAT_TIME,\n\tauto: true,\n\tdistr: 1,\n\tlog: 10,\n\tasinh: 1,\n\tmin: null,\n\tmax: null,\n\tdir: 1,\n\tori: 0,\n};\n\nconst yScaleOpts = assign({}, xScaleOpts, {\n\ttime: false,\n\tori: 1,\n});\n\nconst syncs = {};\n\nfunction _sync(key, opts) {\n\tlet s = syncs[key];\n\n\tif (!s) {\n\t\ts = {\n\t\t\tkey,\n\t\t\tplots: [],\n\t\t\tsub(plot) {\n\t\t\t\ts.plots.push(plot);\n\t\t\t},\n\t\t\tunsub(plot) {\n\t\t\t\ts.plots = s.plots.filter(c => c != plot);\n\t\t\t},\n\t\t\tpub(type, self, x, y, w, h, i) {\n\t\t\t\tfor (let j = 0; j < s.plots.length; j++)\n\t\t\t\t\ts.plots[j] != self && s.plots[j].pub(type, self, x, y, w, h, i);\n\t\t\t},\n\t\t};\n\n\t\tif (key != null)\n\t\t\tsyncs[key] = s;\n\t}\n\n\treturn s;\n}\n\nconst BAND_CLIP_FILL   = 1 << 0;\nconst BAND_CLIP_STROKE = 1 << 1;\n\nfunction orient(u, seriesIdx, cb) {\n\tconst mode = u.mode;\n\tconst series = u.series[seriesIdx];\n\tconst data = mode == 2 ? u._data[seriesIdx] : u._data;\n\tconst scales = u.scales;\n\tconst bbox   = u.bbox;\n\n\tlet dx = data[0],\n\t\tdy = mode == 2 ? data[1] : data[seriesIdx],\n\t\tsx = mode == 2 ? scales[series.facets[0].scale] : scales[u.series[0].scale],\n\t\tsy = mode == 2 ? scales[series.facets[1].scale] : scales[series.scale],\n\t\tl = bbox.left,\n\t\tt = bbox.top,\n\t\tw = bbox.width,\n\t\th = bbox.height,\n\t\tH = u.valToPosH,\n\t\tV = u.valToPosV;\n\n\treturn (sx.ori == 0\n\t\t? cb(\n\t\t\tseries,\n\t\t\tdx,\n\t\t\tdy,\n\t\t\tsx,\n\t\t\tsy,\n\t\t\tH,\n\t\t\tV,\n\t\t\tl,\n\t\t\tt,\n\t\t\tw,\n\t\t\th,\n\t\t\tmoveToH,\n\t\t\tlineToH,\n\t\t\trectH,\n\t\t\tarcH,\n\t\t\tbezierCurveToH,\n\t\t)\n\t\t: cb(\n\t\t\tseries,\n\t\t\tdx,\n\t\t\tdy,\n\t\t\tsx,\n\t\t\tsy,\n\t\t\tV,\n\t\t\tH,\n\t\t\tt,\n\t\t\tl,\n\t\t\th,\n\t\t\tw,\n\t\t\tmoveToV,\n\t\t\tlineToV,\n\t\t\trectV,\n\t\t\tarcV,\n\t\t\tbezierCurveToV,\n\t\t)\n\t);\n}\n\nfunction bandFillClipDirs(self, seriesIdx) {\n\tlet fillDir = 0;\n\n\t// 2 bits, -1 | 1\n\tlet clipDirs = 0;\n\n\tlet bands = ifNull(self.bands, EMPTY_ARR);\n\n\tfor (let i = 0; i < bands.length; i++) {\n\t\tlet b = bands[i];\n\n\t\t// is a \"from\" band edge\n\t\tif (b.series[0] == seriesIdx)\n\t\t\tfillDir = b.dir;\n\t\t// is a \"to\" band edge\n\t\telse if (b.series[1] == seriesIdx) {\n\t\t\tif (b.dir == 1)\n\t\t\t\tclipDirs |= 1;\n\t\t\telse\n\t\t\t\tclipDirs |= 2;\n\t\t}\n\t}\n\n\treturn [\n\t\tfillDir,\n\t\t(\n\t\t\tclipDirs == 1 ? -1 : // neg only\n\t\t\tclipDirs == 2 ?  1 : // pos only\n\t\t\tclipDirs == 3 ?  2 : // both\n\t\t\t                 0   // neither\n\t\t)\n\t];\n}\n\nfunction seriesFillTo(self, seriesIdx, dataMin, dataMax, bandFillDir) {\n\tlet mode = self.mode;\n\tlet series = self.series[seriesIdx];\n\tlet scaleKey = mode == 2 ? series.facets[1].scale : series.scale;\n\tlet scale = self.scales[scaleKey];\n\n\treturn (\n\t\tbandFillDir == -1 ? scale.min :\n\t\tbandFillDir ==  1 ? scale.max :\n\t\tscale.distr ==  3 ? (\n\t\t\tscale.dir == 1 ? scale.min :\n\t\t\tscale.max\n\t\t) : 0\n\t);\n}\n\n// creates inverted band clip path (from stroke path -> yMax || yMin)\n// clipDir is always inverse of fillDir\n// default clip dir is upwards (1), since default band fill is downwards/fillBelowTo (-1) (highIdx -> lowIdx)\nfunction clipBandLine(self, seriesIdx, idx0, idx1, strokePath, clipDir) {\n\treturn orient(self, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => {\n\t\tlet pxRound = series.pxRound;\n\n\t\tconst dir = scaleX.dir * (scaleX.ori == 0 ? 1 : -1);\n\t\tconst lineTo = scaleX.ori == 0 ? lineToH : lineToV;\n\n\t\tlet frIdx, toIdx;\n\n\t\tif (dir == 1) {\n\t\t\tfrIdx = idx0;\n\t\t\ttoIdx = idx1;\n\t\t}\n\t\telse {\n\t\t\tfrIdx = idx1;\n\t\t\ttoIdx = idx0;\n\t\t}\n\n\t\t// path start\n\t\tlet x0 = pxRound(valToPosX(dataX[frIdx], scaleX, xDim, xOff));\n\t\tlet y0 = pxRound(valToPosY(dataY[frIdx], scaleY, yDim, yOff));\n\t\t// path end x\n\t\tlet x1 = pxRound(valToPosX(dataX[toIdx], scaleX, xDim, xOff));\n\t\t// upper or lower y limit\n\t\tlet yLimit = pxRound(valToPosY(clipDir == 1 ? scaleY.max : scaleY.min, scaleY, yDim, yOff));\n\n\t\tlet clip = new Path2D(strokePath);\n\n\t\tlineTo(clip, x1, yLimit);\n\t\tlineTo(clip, x0, yLimit);\n\t\tlineTo(clip, x0, y0);\n\n\t\treturn clip;\n\t});\n}\n\nfunction clipGaps(gaps, ori, plotLft, plotTop, plotWid, plotHgt) {\n\tlet clip = null;\n\n\t// create clip path (invert gaps and non-gaps)\n\tif (gaps.length > 0) {\n\t\tclip = new Path2D();\n\n\t\tconst rect = ori == 0 ? rectH : rectV;\n\n\t\tlet prevGapEnd = plotLft;\n\n\t\tfor (let i = 0; i < gaps.length; i++) {\n\t\t\tlet g = gaps[i];\n\n\t\t\tif (g[1] > g[0]) {\n\t\t\t\tlet w = g[0] - prevGapEnd;\n\n\t\t\t\tw > 0 && rect(clip, prevGapEnd, plotTop, w, plotTop + plotHgt);\n\n\t\t\t\tprevGapEnd = g[1];\n\t\t\t}\n\t\t}\n\n\t\tlet w = plotLft + plotWid - prevGapEnd;\n\n\t\t// hack to ensure we expand the clip enough to avoid cutting off strokes at edges\n\t\tlet maxStrokeWidth = 10;\n\n\t\tw > 0 && rect(clip, prevGapEnd, plotTop - maxStrokeWidth / 2, w, plotTop + plotHgt + maxStrokeWidth);\n\t}\n\n\treturn clip;\n}\n\nfunction addGap(gaps, fromX, toX) {\n\tlet prevGap = gaps[gaps.length - 1];\n\n\tif (prevGap && prevGap[0] == fromX)\t\t\t// TODO: gaps must be encoded at stroke widths?\n\t\tprevGap[1] = toX;\n\telse\n\t\tgaps.push([fromX, toX]);\n}\n\nfunction findGaps(xs, ys, idx0, idx1, dir, pixelForX, align) {\n\tlet gaps = [];\n\tlet len = xs.length;\n\n\tfor (let i = dir == 1 ? idx0 : idx1; i >= idx0 && i <= idx1; i += dir) {\n\t\tlet yVal = ys[i];\n\n\t\tif (yVal === null) {\n\t\t\tlet fr = i, to = i;\n\n\t\t\tif (dir == 1) {\n\t\t\t\twhile (++i <= idx1 && ys[i] === null)\n\t\t\t\t\tto = i;\n\t\t\t}\n\t\t\telse {\n\t\t\t\twhile (--i >= idx0 && ys[i] === null)\n\t\t\t\t\tto = i;\n\t\t\t}\n\n\t\t\tlet frPx = pixelForX(xs[fr]);\n\t\t\tlet toPx = to == fr ? frPx : pixelForX(xs[to]);\n\n\t\t\t// if value adjacent to edge null is same pixel, then it's partially\n\t\t\t// filled and gap should start at next pixel\n\t\t\tlet fri2 = fr - dir;\n\t\t\tlet frPx2 = align <= 0 && fri2 >= 0 && fri2 < len ? pixelForX(xs[fri2]) : frPx;\n\t\t//\tif (frPx2 == frPx)\n\t\t//\t\tfrPx++;\n\t\t//\telse\n\t\t\t\tfrPx = frPx2;\n\n\t\t\tlet toi2 = to + dir;\n\t\t\tlet toPx2 = align >= 0 && toi2 >= 0 && toi2 < len ? pixelForX(xs[toi2]) : toPx;\n\t\t//\tif (toPx2 == toPx)\n\t\t//\t\ttoPx--;\n\t\t//\telse\n\t\t\t\ttoPx = toPx2;\n\n\t\t\tif (toPx >= frPx)\n\t\t\t\tgaps.push([frPx, toPx]); // addGap\n\t\t}\n\t}\n\n\treturn gaps;\n}\n\nfunction pxRoundGen(pxAlign) {\n\treturn pxAlign == 0 ? retArg0 : pxAlign == 1 ? round : v => incrRound(v, pxAlign);\n}\n\n/*\n// inefficient linear interpolation that does bi-directinal scans on each call\nexport function costlyLerp(i, idx0, idx1, _dirX, dataY) {\n\tlet prevNonNull = nonNullIdx(dataY, _dirX == 1 ? idx0 : idx1, i, -_dirX);\n\tlet nextNonNull = nonNullIdx(dataY, i, _dirX == 1 ? idx1 : idx0,  _dirX);\n\n\tlet prevVal = dataY[prevNonNull];\n\tlet nextVal = dataY[nextNonNull];\n\n\treturn prevVal + (i - prevNonNull) / (nextNonNull - prevNonNull) * (nextVal - prevVal);\n}\n*/\n\nfunction rect(ori) {\n\tlet moveTo = ori == 0 ?\n\t\tmoveToH :\n\t\tmoveToV;\n\n\tlet arcTo = ori == 0 ?\n\t\t(p, x1, y1, x2, y2, r) => { p.arcTo(x1, y1, x2, y2, r); } :\n\t\t(p, y1, x1, y2, x2, r) => { p.arcTo(x1, y1, x2, y2, r); };\n\n\tlet rect = ori == 0 ?\n\t\t(p, x, y, w, h) => { p.rect(x, y, w, h); } :\n\t\t(p, y, x, h, w) => { p.rect(x, y, w, h); };\n\n\t// TODO (pending better browser support): https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/roundRect\n\treturn (p, x, y, w, h, endRad = 0, baseRad = 0) => {\n\t\tif (endRad == 0 && baseRad == 0)\n\t\t\trect(p, x, y, w, h);\n\t\telse {\n\t\t\tendRad  = min(endRad,  w / 2, h / 2);\n\t\t\tbaseRad = min(baseRad, w / 2, h / 2);\n\n\t\t\t// adapted from https://stackoverflow.com/questions/1255512/how-to-draw-a-rounded-rectangle-using-html-canvas/7838871#7838871\n\t\t\tmoveTo(p, x + endRad, y);\n\t\t\tarcTo(p, x + w, y, x + w, y + h, endRad);\n\t\t\tarcTo(p, x + w, y + h, x, y + h, baseRad);\n\t\t\tarcTo(p, x, y + h, x, y, baseRad);\n\t\t\tarcTo(p, x, y, x + w, y, endRad);\n\t\t\tp.closePath();\n\t\t}\n\t};\n}\n\n// orientation-inverting canvas functions\nconst moveToH = (p, x, y) => { p.moveTo(x, y); };\nconst moveToV = (p, y, x) => { p.moveTo(x, y); };\nconst lineToH = (p, x, y) => { p.lineTo(x, y); };\nconst lineToV = (p, y, x) => { p.lineTo(x, y); };\nconst rectH = rect(0);\nconst rectV = rect(1);\nconst arcH = (p, x, y, r, startAngle, endAngle) => { p.arc(x, y, r, startAngle, endAngle); };\nconst arcV = (p, y, x, r, startAngle, endAngle) => { p.arc(x, y, r, startAngle, endAngle); };\nconst bezierCurveToH = (p, bp1x, bp1y, bp2x, bp2y, p2x, p2y) => { p.bezierCurveTo(bp1x, bp1y, bp2x, bp2y, p2x, p2y); };\nconst bezierCurveToV = (p, bp1y, bp1x, bp2y, bp2x, p2y, p2x) => { p.bezierCurveTo(bp1x, bp1y, bp2x, bp2y, p2x, p2y); };\n\n// TODO: drawWrap(seriesIdx, drawPoints) (save, restore, translate, clip)\nfunction points(opts) {\n\treturn (u, seriesIdx, idx0, idx1, filtIdxs) => {\n\t//\tlog(\"drawPoints()\", arguments);\n\n\t\treturn orient(u, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => {\n\t\t\tlet { pxRound, points } = series;\n\n\t\t\tlet moveTo, arc;\n\n\t\t\tif (scaleX.ori == 0) {\n\t\t\t\tmoveTo = moveToH;\n\t\t\t\tarc = arcH;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tmoveTo = moveToV;\n\t\t\t\tarc = arcV;\n\t\t\t}\n\n\t\t\tconst width = roundDec(points.width * pxRatio, 3);\n\n\t\t\tlet rad = (points.size - points.width) / 2 * pxRatio;\n\t\t\tlet dia = roundDec(rad * 2, 3);\n\n\t\t\tlet fill = new Path2D();\n\t\t\tlet clip = new Path2D();\n\n\t\t\tlet { left: lft, top: top, width: wid, height: hgt } = u.bbox;\n\n\t\t\trectH(clip,\n\t\t\t\tlft - dia,\n\t\t\t\ttop - dia,\n\t\t\t\twid + dia * 2,\n\t\t\t\thgt + dia * 2,\n\t\t\t);\n\n\t\t\tconst drawPoint = pi => {\n\t\t\t\tif (dataY[pi] != null) {\n\t\t\t\t\tlet x = pxRound(valToPosX(dataX[pi], scaleX, xDim, xOff));\n\t\t\t\t\tlet y = pxRound(valToPosY(dataY[pi], scaleY, yDim, yOff));\n\n\t\t\t\t\tmoveTo(fill, x + rad, y);\n\t\t\t\t\tarc(fill, x, y, rad, 0, PI * 2);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tif (filtIdxs)\n\t\t\t\tfiltIdxs.forEach(drawPoint);\n\t\t\telse {\n\t\t\t\tfor (let pi = idx0; pi <= idx1; pi++)\n\t\t\t\t\tdrawPoint(pi);\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tstroke: width > 0 ? fill : null,\n\t\t\t\tfill,\n\t\t\t\tclip,\n\t\t\t\tflags: BAND_CLIP_FILL | BAND_CLIP_STROKE,\n\t\t\t};\n\t\t});\n\t};\n}\n\nfunction _drawAcc(lineTo) {\n\treturn (stroke, accX, minY, maxY, inY, outY) => {\n\t\tif (minY != maxY) {\n\t\t\tif (inY != minY && outY != minY)\n\t\t\t\tlineTo(stroke, accX, minY);\n\t\t\tif (inY != maxY && outY != maxY)\n\t\t\t\tlineTo(stroke, accX, maxY);\n\n\t\t\tlineTo(stroke, accX, outY);\n\t\t}\n\t};\n}\n\nconst drawAccH = _drawAcc(lineToH);\nconst drawAccV = _drawAcc(lineToV);\n\nfunction linear(opts) {\n\tconst alignGaps = ifNull(opts?.alignGaps, 0);\n\n\treturn (u, seriesIdx, idx0, idx1) => {\n\t\treturn orient(u, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => {\n\t\t\t[idx0, idx1] = nonNullIdxs(dataY, idx0, idx1);\n\n\t\t\tlet pxRound = series.pxRound;\n\n\t\t\tlet pixelForX = val => pxRound(valToPosX(val, scaleX, xDim, xOff));\n\t\t\tlet pixelForY = val => pxRound(valToPosY(val, scaleY, yDim, yOff));\n\n\t\t\tlet lineTo, drawAcc;\n\n\t\t\tif (scaleX.ori == 0) {\n\t\t\t\tlineTo = lineToH;\n\t\t\t\tdrawAcc = drawAccH;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlineTo = lineToV;\n\t\t\t\tdrawAcc = drawAccV;\n\t\t\t}\n\n\t\t\tconst dir = scaleX.dir * (scaleX.ori == 0 ? 1 : -1);\n\n\t\t\tconst _paths = {stroke: new Path2D(), fill: null, clip: null, band: null, gaps: null, flags: BAND_CLIP_FILL};\n\t\t\tconst stroke = _paths.stroke;\n\n\t\t\tlet hasGap = false;\n\n\t\t\t// decimate when number of points >= 4x available pixels\n\t\t\tconst decimate = idx1 - idx0 >= xDim * 4;\n\n\t\t\tif (decimate) {\n\t\t\t\tlet xForPixel = pos => u.posToVal(pos, scaleX.key, true);\n\n\t\t\t\tlet minY = null,\n\t\t\t\t\tmaxY = null,\n\t\t\t\t\tinY, outY, drawnAtX;\n\n\t\t\t\tlet accX = pixelForX(dataX[dir == 1 ? idx0 : idx1]);\n\n\t\t\t\tlet idx0px = pixelForX(dataX[idx0]);\n\t\t\t\tlet idx1px = pixelForX(dataX[idx1]);\n\n\t\t\t\t// tracks limit of current x bucket to avoid having to get x pixel for every x value\n\t\t\t\tlet nextAccXVal = xForPixel(dir == 1 ? idx0px + 1 : idx1px - 1);\n\n\t\t\t\tfor (let i = dir == 1 ? idx0 : idx1; i >= idx0 && i <= idx1; i += dir) {\n\t\t\t\t\tlet xVal = dataX[i];\n\t\t\t\t\tlet reuseAccX = dir == 1 ? (xVal < nextAccXVal) : (xVal > nextAccXVal);\n\t\t\t\t\tlet x = reuseAccX ? accX :  pixelForX(xVal);\n\n\t\t\t\t\tlet yVal = dataY[i];\n\n\t\t\t\t\tif (x == accX) {\n\t\t\t\t\t\tif (yVal != null) {\n\t\t\t\t\t\t\toutY = yVal;\n\n\t\t\t\t\t\t\tif (minY == null) {\n\t\t\t\t\t\t\t\tlineTo(stroke, x, pixelForY(outY));\n\t\t\t\t\t\t\t\tinY = minY = maxY = outY;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tif (outY < minY)\n\t\t\t\t\t\t\t\t\tminY = outY;\n\t\t\t\t\t\t\t\telse if (outY > maxY)\n\t\t\t\t\t\t\t\t\tmaxY = outY;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tif (yVal === null)\n\t\t\t\t\t\t\t\thasGap = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tif (minY != null)\n\t\t\t\t\t\t\tdrawAcc(stroke, accX, pixelForY(minY), pixelForY(maxY), pixelForY(inY), pixelForY(outY));\n\n\t\t\t\t\t\tif (yVal != null) {\n\t\t\t\t\t\t\toutY = yVal;\n\t\t\t\t\t\t\tlineTo(stroke, x, pixelForY(outY));\n\t\t\t\t\t\t\tminY = maxY = inY = outY;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tminY = maxY = null;\n\n\t\t\t\t\t\t\tif (yVal === null)\n\t\t\t\t\t\t\t\thasGap = true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\taccX = x;\n\t\t\t\t\t\tnextAccXVal = xForPixel(accX + dir);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (minY != null && minY != maxY && drawnAtX != accX)\n\t\t\t\t\tdrawAcc(stroke, accX, pixelForY(minY), pixelForY(maxY), pixelForY(inY), pixelForY(outY));\n\t\t\t}\n\t\t\telse {\n\t\t\t\tfor (let i = dir == 1 ? idx0 : idx1; i >= idx0 && i <= idx1; i += dir) {\n\t\t\t\t\tlet yVal = dataY[i];\n\n\t\t\t\t\tif (yVal === null)\n\t\t\t\t\t\thasGap = true;\n\t\t\t\t\telse if (yVal != null)\n\t\t\t\t\t\tlineTo(stroke, pixelForX(dataX[i]), pixelForY(yVal));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet [ bandFillDir, bandClipDir ] = bandFillClipDirs(u, seriesIdx);\n\n\t\t\tif (series.fill != null || bandFillDir != 0) {\n\t\t\t\tlet fill = _paths.fill = new Path2D(stroke);\n\n\t\t\t\tlet fillToVal = series.fillTo(u, seriesIdx, series.min, series.max, bandFillDir);\n\t\t\t\tlet fillToY = pixelForY(fillToVal);\n\n\t\t\t\tlet frX = pixelForX(dataX[idx0]);\n\t\t\t\tlet toX = pixelForX(dataX[idx1]);\n\n\t\t\t\tif (dir == -1)\n\t\t\t\t\t[toX, frX] = [frX, toX];\n\n\t\t\t\tlineTo(fill, toX, fillToY);\n\t\t\t\tlineTo(fill, frX, fillToY);\n\t\t\t}\n\n\t\t\tif (!series.spanGaps) { // skip in mode: 2?\n\t\t\t//\tconsole.time('gaps');\n\t\t\t\tlet gaps = [];\n\n\t\t\t\thasGap && gaps.push(...findGaps(dataX, dataY, idx0, idx1, dir, pixelForX, alignGaps));\n\n\t\t\t//\tconsole.timeEnd('gaps');\n\n\t\t\t//\tconsole.log('gaps', JSON.stringify(gaps));\n\n\t\t\t\t_paths.gaps = gaps = series.gaps(u, seriesIdx, idx0, idx1, gaps);\n\n\t\t\t\t_paths.clip = clipGaps(gaps, scaleX.ori, xOff, yOff, xDim, yDim);\n\t\t\t}\n\n\t\t\tif (bandClipDir != 0) {\n\t\t\t\t_paths.band = bandClipDir == 2 ? [\n\t\t\t\t\tclipBandLine(u, seriesIdx, idx0, idx1, stroke, -1),\n\t\t\t\t\tclipBandLine(u, seriesIdx, idx0, idx1, stroke,  1),\n\t\t\t\t] : clipBandLine(u, seriesIdx, idx0, idx1, stroke, bandClipDir);\n\t\t\t}\n\n\t\t\treturn _paths;\n\t\t});\n\t};\n}\n\n// BUG: align: -1 behaves like align: 1 when scale.dir: -1\nfunction stepped(opts) {\n\tconst align = ifNull(opts.align, 1);\n\t// whether to draw ascenders/descenders at null/gap bondaries\n\tconst ascDesc = ifNull(opts.ascDesc, false);\n\tconst alignGaps = ifNull(opts.alignGaps, 0);\n\tconst extend = ifNull(opts.extend, false);\n\n\treturn (u, seriesIdx, idx0, idx1) => {\n\t\treturn orient(u, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => {\n\t\t\t[idx0, idx1] = nonNullIdxs(dataY, idx0, idx1);\n\n\t\t\tlet pxRound = series.pxRound;\n\n\t\t\tlet { left, width } = u.bbox;\n\n\t\t\tlet pixelForX = val => pxRound(valToPosX(val, scaleX, xDim, xOff));\n\t\t\tlet pixelForY = val => pxRound(valToPosY(val, scaleY, yDim, yOff));\n\n\t\t\tlet lineTo = scaleX.ori == 0 ? lineToH : lineToV;\n\n\t\t\tconst _paths = {stroke: new Path2D(), fill: null, clip: null, band: null, gaps: null, flags: BAND_CLIP_FILL};\n\t\t\tconst stroke = _paths.stroke;\n\n\t\t\tconst dir = scaleX.dir * (scaleX.ori == 0 ? 1 : -1);\n\n\t\t\tlet prevYPos  = pixelForY(dataY[dir == 1 ? idx0 : idx1]);\n\t\t\tlet firstXPos = pixelForX(dataX[dir == 1 ? idx0 : idx1]);\n\t\t\tlet prevXPos = firstXPos;\n\n\t\t\tlet firstXPosExt = firstXPos;\n\n\t\t\tif (extend && align == -1) {\n\t\t\t\tfirstXPosExt = left;\n\t\t\t\tlineTo(stroke, firstXPosExt, prevYPos);\n\t\t\t}\n\n\t\t\tlineTo(stroke, firstXPos, prevYPos);\n\n\t\t\tfor (let i = dir == 1 ? idx0 : idx1; i >= idx0 && i <= idx1; i += dir) {\n\t\t\t\tlet yVal1 = dataY[i];\n\n\t\t\t\tif (yVal1 == null)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tlet x1 = pixelForX(dataX[i]);\n\t\t\t\tlet y1 = pixelForY(yVal1);\n\n\t\t\t\tif (align == 1)\n\t\t\t\t\tlineTo(stroke, x1, prevYPos);\n\t\t\t\telse\n\t\t\t\t\tlineTo(stroke, prevXPos, y1);\n\n\t\t\t\tlineTo(stroke, x1, y1);\n\n\t\t\t\tprevYPos = y1;\n\t\t\t\tprevXPos = x1;\n\t\t\t}\n\n\t\t\tlet prevXPosExt = prevXPos;\n\n\t\t\tif (extend && align == 1) {\n\t\t\t\tprevXPosExt = left + width;\n\t\t\t\tlineTo(stroke, prevXPosExt, prevYPos);\n\t\t\t}\n\n\t\t\tlet [ bandFillDir, bandClipDir ] = bandFillClipDirs(u, seriesIdx);\n\n\t\t\tif (series.fill != null || bandFillDir != 0) {\n\t\t\t\tlet fill = _paths.fill = new Path2D(stroke);\n\n\t\t\t\tlet fillTo = series.fillTo(u, seriesIdx, series.min, series.max, bandFillDir);\n\t\t\t\tlet fillToY = pixelForY(fillTo);\n\n\t\t\t\tlineTo(fill, prevXPosExt, fillToY);\n\t\t\t\tlineTo(fill, firstXPosExt, fillToY);\n\t\t\t}\n\n\t\t\tif (!series.spanGaps) {\n\t\t\t//\tconsole.time('gaps');\n\t\t\t\tlet gaps = [];\n\n\t\t\t\tgaps.push(...findGaps(dataX, dataY, idx0, idx1, dir, pixelForX, alignGaps));\n\n\t\t\t//\tconsole.timeEnd('gaps');\n\n\t\t\t//\tconsole.log('gaps', JSON.stringify(gaps));\n\n\t\t\t\t// expand/contract clips for ascenders/descenders\n\t\t\t\tlet halfStroke = (series.width * pxRatio) / 2;\n\t\t\t\tlet startsOffset = (ascDesc || align ==  1) ?  halfStroke : -halfStroke;\n\t\t\t\tlet endsOffset   = (ascDesc || align == -1) ? -halfStroke :  halfStroke;\n\n\t\t\t\tgaps.forEach(g => {\n\t\t\t\t\tg[0] += startsOffset;\n\t\t\t\t\tg[1] += endsOffset;\n\t\t\t\t});\n\n\t\t\t\t_paths.gaps = gaps = series.gaps(u, seriesIdx, idx0, idx1, gaps);\n\n\t\t\t\t_paths.clip = clipGaps(gaps, scaleX.ori, xOff, yOff, xDim, yDim);\n\t\t\t}\n\n\t\t\tif (bandClipDir != 0) {\n\t\t\t\t_paths.band = bandClipDir == 2 ? [\n\t\t\t\t\tclipBandLine(u, seriesIdx, idx0, idx1, stroke, -1),\n\t\t\t\t\tclipBandLine(u, seriesIdx, idx0, idx1, stroke,  1),\n\t\t\t\t] : clipBandLine(u, seriesIdx, idx0, idx1, stroke, bandClipDir);\n\t\t\t}\n\n\t\t\treturn _paths;\n\t\t});\n\t};\n}\n\nfunction findColWidth(dataX, dataY, valToPosX, scaleX, xDim, xOff, colWid = inf) {\n\tif (dataX.length > 1) {\n\t\t// prior index with non-undefined y data\n\t\tlet prevIdx = null;\n\n\t\t// scan full dataset for smallest adjacent delta\n\t\t// will not work properly for non-linear x scales, since does not do expensive valToPosX calcs till end\n\t\tfor (let i = 0, minDelta = Infinity; i < dataX.length; i++) {\n\t\t\tif (dataY[i] !== undefined) {\n\t\t\t\tif (prevIdx != null) {\n\t\t\t\t\tlet delta = abs(dataX[i] - dataX[prevIdx]);\n\n\t\t\t\t\tif (delta < minDelta) {\n\t\t\t\t\t\tminDelta = delta;\n\t\t\t\t\t\tcolWid = abs(valToPosX(dataX[i], scaleX, xDim, xOff) - valToPosX(dataX[prevIdx], scaleX, xDim, xOff));\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tprevIdx = i;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn colWid;\n}\n\nfunction bars(opts) {\n\topts = opts || EMPTY_OBJ;\n\tconst size = ifNull(opts.size, [0.6, inf, 1]);\n\tconst align = opts.align || 0;\n\tconst _extraGap = (opts.gap || 0);\n\n\tlet ro = opts.radius;\n\n\tro =\n\t\t// [valueRadius, baselineRadius]\n\t\tro == null ? [0, 0] :\n\t\ttypeof ro == 'number' ? [ro, 0] : ro;\n\n\tconst radiusFn = fnOrSelf(ro);\n\n\tconst gapFactor = 1 - size[0];\n\tconst _maxWidth  = ifNull(size[1], inf);\n\tconst _minWidth  = ifNull(size[2], 1);\n\n\tconst disp = ifNull(opts.disp, EMPTY_OBJ);\n\tconst _each = ifNull(opts.each, _ => {});\n\n\tconst { fill: dispFills, stroke: dispStrokes } = disp;\n\n\treturn (u, seriesIdx, idx0, idx1) => {\n\t\treturn orient(u, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => {\n\t\t\tlet pxRound = series.pxRound;\n\t\t\tlet _align = align;\n\n\t\t\tlet extraGap = _extraGap * pxRatio;\n\t\t\tlet maxWidth = _maxWidth * pxRatio;\n\t\t\tlet minWidth = _minWidth * pxRatio;\n\n\t\t\tlet valRadius, baseRadius;\n\n\t\t\tif (scaleX.ori == 0)\n\t\t\t\t[valRadius, baseRadius] = radiusFn(u, seriesIdx);\n\t\t\telse\n\t\t\t\t[baseRadius, valRadius] = radiusFn(u, seriesIdx);\n\n\t\t\tconst _dirX = scaleX.dir * (scaleX.ori == 0 ? 1 : -1);\n\t\t//\tconst _dirY = scaleY.dir * (scaleY.ori == 1 ? 1 : -1);\n\n\t\t\tlet rect = scaleX.ori == 0 ? rectH : rectV;\n\n\t\t\tlet each = scaleX.ori == 0 ? _each : (u, seriesIdx, i, top, lft, hgt, wid) => {\n\t\t\t\t_each(u, seriesIdx, i, lft, top, wid, hgt);\n\t\t\t};\n\n\t\t\t// band where this series is the \"from\" edge\n\t\t\tlet band = ifNull(u.bands, EMPTY_ARR).find(b => b.series[0] == seriesIdx);\n\n\t\t\tlet fillDir = band != null ? band.dir : 0;\n\t\t\tlet fillTo = series.fillTo(u, seriesIdx, series.min, series.max, fillDir);\n\t\t\tlet fillToY = pxRound(valToPosY(fillTo, scaleY, yDim, yOff));\n\n\t\t\t// barWid is to center of stroke\n\t\t\tlet xShift, barWid, fullGap, colWid = xDim;\n\n\t\t\tlet strokeWidth = pxRound(series.width * pxRatio);\n\n\t\t\tlet multiPath = false;\n\n\t\t\tlet fillColors = null;\n\t\t\tlet fillPaths = null;\n\t\t\tlet strokeColors = null;\n\t\t\tlet strokePaths = null;\n\n\t\t\tif (dispFills != null && (strokeWidth == 0 || dispStrokes != null)) {\n\t\t\t\tmultiPath = true;\n\n\t\t\t\tfillColors = dispFills.values(u, seriesIdx, idx0, idx1);\n\t\t\t\tfillPaths = new Map();\n\t\t\t\t(new Set(fillColors)).forEach(color => {\n\t\t\t\t\tif (color != null)\n\t\t\t\t\t\tfillPaths.set(color, new Path2D());\n\t\t\t\t});\n\n\t\t\t\tif (strokeWidth > 0) {\n\t\t\t\t\tstrokeColors = dispStrokes.values(u, seriesIdx, idx0, idx1);\n\t\t\t\t\tstrokePaths = new Map();\n\t\t\t\t\t(new Set(strokeColors)).forEach(color => {\n\t\t\t\t\t\tif (color != null)\n\t\t\t\t\t\t\tstrokePaths.set(color, new Path2D());\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet { x0, size } = disp;\n\n\t\t\tif (x0 != null && size != null) {\n\t\t\t\t_align = 1;\n\t\t\t\tdataX = x0.values(u, seriesIdx, idx0, idx1);\n\n\t\t\t\tif (x0.unit == 2)\n\t\t\t\t\tdataX = dataX.map(pct => u.posToVal(xOff + pct * xDim, scaleX.key, true));\n\n\t\t\t\t// assumes uniform sizes, for now\n\t\t\t\tlet sizes = size.values(u, seriesIdx, idx0, idx1);\n\n\t\t\t\tif (size.unit == 2)\n\t\t\t\t\tbarWid = sizes[0] * xDim;\n\t\t\t\telse\n\t\t\t\t\tbarWid = valToPosX(sizes[0], scaleX, xDim, xOff) - valToPosX(0, scaleX, xDim, xOff); // assumes linear scale (delta from 0)\n\n\t\t\t\tcolWid = findColWidth(dataX, dataY, valToPosX, scaleX, xDim, xOff, colWid);\n\n\t\t\t\tlet gapWid = colWid - barWid;\n\t\t\t\tfullGap = gapWid + extraGap;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tcolWid = findColWidth(dataX, dataY, valToPosX, scaleX, xDim, xOff, colWid);\n\n\t\t\t\tlet gapWid = colWid * gapFactor;\n\n\t\t\t\tfullGap = gapWid + extraGap;\n\t\t\t\tbarWid = colWid - fullGap;\n\t\t\t}\n\n\t\t\tif (fullGap < 1)\n\t\t\t\tfullGap = 0;\n\n\t\t\tif (strokeWidth >= barWid / 2)\n\t\t\t\tstrokeWidth = 0;\n\n\t\t\t// for small gaps, disable pixel snapping since gap inconsistencies become noticible and annoying\n\t\t\tif (fullGap < 5)\n\t\t\t\tpxRound = retArg0;\n\n\t\t\tlet insetStroke = fullGap > 0;\n\n\t\t\tlet rawBarWid = colWid - fullGap - (insetStroke ? strokeWidth : 0);\n\n\t\t\tbarWid = pxRound(clamp(rawBarWid, minWidth, maxWidth));\n\n\t\t\txShift = (_align == 0 ? barWid / 2 : _align == _dirX ? 0 : barWid) - _align * _dirX * ((_align == 0 ? extraGap / 2 : 0) + (insetStroke ? strokeWidth / 2 : 0));\n\n\n\t\t\tconst _paths = {stroke: null, fill: null, clip: null, band: null, gaps: null, flags: 0};  // disp, geom\n\n\t\t\tconst stroke = multiPath ? null : new Path2D();\n\n\t\t\tlet dataY0 = null;\n\n\t\t\tif (band != null)\n\t\t\t\tdataY0 = u.data[band.series[1]];\n\t\t\telse {\n\t\t\t\tlet { y0, y1 } = disp;\n\n\t\t\t\tif (y0 != null && y1 != null) {\n\t\t\t\t\tdataY = y1.values(u, seriesIdx, idx0, idx1);\n\t\t\t\t\tdataY0 = y0.values(u, seriesIdx, idx0, idx1);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet radVal = valRadius * barWid;\n\t\t\tlet radBase = baseRadius * barWid;\n\n\t\t\tfor (let i = _dirX == 1 ? idx0 : idx1; i >= idx0 && i <= idx1; i += _dirX) {\n\t\t\t\tlet yVal = dataY[i];\n\n\t\t\t\tif (yVal == null)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tif (dataY0 != null) {\n\t\t\t\t\tlet yVal0 = dataY0[i] ?? 0;\n\n\t\t\t\t\tif (yVal - yVal0 == 0)\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tfillToY = valToPosY(yVal0, scaleY, yDim, yOff);\n\t\t\t\t}\n\n\t\t\t\tlet xVal = scaleX.distr != 2 || disp != null ? dataX[i] : i;\n\n\t\t\t\t// TODO: all xPos can be pre-computed once for all series in aligned set\n\t\t\t\tlet xPos = valToPosX(xVal, scaleX, xDim, xOff);\n\t\t\t\tlet yPos = valToPosY(ifNull(yVal, fillTo), scaleY, yDim, yOff);\n\n\t\t\t\tlet lft = pxRound(xPos - xShift);\n\t\t\t\tlet btm = pxRound(max(yPos, fillToY));\n\t\t\t\tlet top = pxRound(min(yPos, fillToY));\n\t\t\t\t// this includes the stroke\n\t\t\t\tlet barHgt = btm - top;\n\n\t\t\t\tif (yVal != null) {  // && yVal != fillTo (0 height bar)\n\t\t\t\t\tlet rv = yVal < 0 ? radBase : radVal;\n\t\t\t\t\tlet rb = yVal < 0 ? radVal : radBase;\n\n\t\t\t\t\tif (multiPath) {\n\t\t\t\t\t\tif (strokeWidth > 0 && strokeColors[i] != null)\n\t\t\t\t\t\t\trect(strokePaths.get(strokeColors[i]), lft, top + floor(strokeWidth / 2), barWid, max(0, barHgt - strokeWidth), rv, rb);\n\n\t\t\t\t\t\tif (fillColors[i] != null)\n\t\t\t\t\t\t\trect(fillPaths.get(fillColors[i]), lft, top + floor(strokeWidth / 2), barWid, max(0, barHgt - strokeWidth), rv, rb);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\trect(stroke, lft, top + floor(strokeWidth / 2), barWid, max(0, barHgt - strokeWidth), rv, rb);\n\n\t\t\t\t\teach(u, seriesIdx, i,\n\t\t\t\t\t\tlft    - strokeWidth / 2,\n\t\t\t\t\t\ttop,\n\t\t\t\t\t\tbarWid + strokeWidth,\n\t\t\t\t\t\tbarHgt,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (strokeWidth > 0)\n\t\t\t\t_paths.stroke = multiPath ? strokePaths : stroke;\n\t\t\telse if (!multiPath) {\n\t\t\t\t_paths._fill = series.width == 0 ? series._fill : series._stroke ?? series._fill;\n\t\t\t\t_paths.width = 0;\n\t\t\t}\n\n\t\t\t_paths.fill = multiPath ? fillPaths : stroke;\n\n\t\t\treturn _paths;\n\t\t});\n\t};\n}\n\nfunction splineInterp(interp, opts) {\n\tconst alignGaps = ifNull(opts?.alignGaps, 0);\n\n\treturn (u, seriesIdx, idx0, idx1) => {\n\t\treturn orient(u, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => {\n\t\t\t[idx0, idx1] = nonNullIdxs(dataY, idx0, idx1);\n\n\t\t\tlet pxRound = series.pxRound;\n\n\t\t\tlet pixelForX = val => pxRound(valToPosX(val, scaleX, xDim, xOff));\n\t\t\tlet pixelForY = val => pxRound(valToPosY(val, scaleY, yDim, yOff));\n\n\t\t\tlet moveTo, bezierCurveTo, lineTo;\n\n\t\t\tif (scaleX.ori == 0) {\n\t\t\t\tmoveTo = moveToH;\n\t\t\t\tlineTo = lineToH;\n\t\t\t\tbezierCurveTo = bezierCurveToH;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tmoveTo = moveToV;\n\t\t\t\tlineTo = lineToV;\n\t\t\t\tbezierCurveTo = bezierCurveToV;\n\t\t\t}\n\n\t\t\tconst dir = scaleX.dir * (scaleX.ori == 0 ? 1 : -1);\n\n\t\t\tlet firstXPos = pixelForX(dataX[dir == 1 ? idx0 : idx1]);\n\t\t\tlet prevXPos = firstXPos;\n\n\t\t\tlet xCoords = [];\n\t\t\tlet yCoords = [];\n\n\t\t\tfor (let i = dir == 1 ? idx0 : idx1; i >= idx0 && i <= idx1; i += dir) {\n\t\t\t\tlet yVal = dataY[i];\n\n\t\t\t\tif (yVal != null) {\n\t\t\t\t\tlet xVal = dataX[i];\n\t\t\t\t\tlet xPos = pixelForX(xVal);\n\n\t\t\t\t\txCoords.push(prevXPos = xPos);\n\t\t\t\t\tyCoords.push(pixelForY(dataY[i]));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst _paths = {stroke: interp(xCoords, yCoords, moveTo, lineTo, bezierCurveTo, pxRound), fill: null, clip: null, band: null, gaps: null, flags: BAND_CLIP_FILL};\n\t\t\tconst stroke = _paths.stroke;\n\n\t\t\tlet [ bandFillDir, bandClipDir ] = bandFillClipDirs(u, seriesIdx);\n\n\t\t\tif (series.fill != null || bandFillDir != 0) {\n\t\t\t\tlet fill = _paths.fill = new Path2D(stroke);\n\n\t\t\t\tlet fillTo = series.fillTo(u, seriesIdx, series.min, series.max, bandFillDir);\n\t\t\t\tlet fillToY = pixelForY(fillTo);\n\n\t\t\t\tlineTo(fill, prevXPos, fillToY);\n\t\t\t\tlineTo(fill, firstXPos, fillToY);\n\t\t\t}\n\n\t\t\tif (!series.spanGaps) {\n\t\t\t//\tconsole.time('gaps');\n\t\t\t\tlet gaps = [];\n\n\t\t\t\tgaps.push(...findGaps(dataX, dataY, idx0, idx1, dir, pixelForX, alignGaps));\n\n\t\t\t//\tconsole.timeEnd('gaps');\n\n\t\t\t//\tconsole.log('gaps', JSON.stringify(gaps));\n\n\t\t\t\t_paths.gaps = gaps = series.gaps(u, seriesIdx, idx0, idx1, gaps);\n\n\t\t\t\t_paths.clip = clipGaps(gaps, scaleX.ori, xOff, yOff, xDim, yDim);\n\t\t\t}\n\n\t\t\tif (bandClipDir != 0) {\n\t\t\t\t_paths.band = bandClipDir == 2 ? [\n\t\t\t\t\tclipBandLine(u, seriesIdx, idx0, idx1, stroke, -1),\n\t\t\t\t\tclipBandLine(u, seriesIdx, idx0, idx1, stroke,  1),\n\t\t\t\t] : clipBandLine(u, seriesIdx, idx0, idx1, stroke, bandClipDir);\n\t\t\t}\n\n\t\t\treturn _paths;\n\n\t\t\t//  if FEAT_PATHS: false in rollup.config.js\n\t\t\t//\tu.ctx.save();\n\t\t\t//\tu.ctx.beginPath();\n\t\t\t//\tu.ctx.rect(u.bbox.left, u.bbox.top, u.bbox.width, u.bbox.height);\n\t\t\t//\tu.ctx.clip();\n\t\t\t//\tu.ctx.strokeStyle = u.series[sidx].stroke;\n\t\t\t//\tu.ctx.stroke(stroke);\n\t\t\t//\tu.ctx.fillStyle = u.series[sidx].fill;\n\t\t\t//\tu.ctx.fill(fill);\n\t\t\t//\tu.ctx.restore();\n\t\t\t//\treturn null;\n\t\t});\n\t};\n}\n\nfunction monotoneCubic(opts) {\n\treturn splineInterp(_monotoneCubic, opts);\n}\n\n// Monotone Cubic Spline interpolation, adapted from the Chartist.js implementation:\n// https://github.com/gionkunz/chartist-js/blob/e7e78201bffe9609915e5e53cfafa29a5d6c49f9/src/scripts/interpolation.js#L240-L369\nfunction _monotoneCubic(xs, ys, moveTo, lineTo, bezierCurveTo, pxRound) {\n\tconst n = xs.length;\n\n\tif (n < 2)\n\t\treturn null;\n\n\tconst path = new Path2D();\n\n\tmoveTo(path, xs[0], ys[0]);\n\n\tif (n == 2)\n\t\tlineTo(path, xs[1], ys[1]);\n\telse {\n\t\tlet ms  = Array(n),\n\t\t\tds  = Array(n - 1),\n\t\t\tdys = Array(n - 1),\n\t\t\tdxs = Array(n - 1);\n\n\t\t// calc deltas and derivative\n\t\tfor (let i = 0; i < n - 1; i++) {\n\t\t\tdys[i] = ys[i + 1] - ys[i];\n\t\t\tdxs[i] = xs[i + 1] - xs[i];\n\t\t\tds[i]  = dys[i] / dxs[i];\n\t\t}\n\n\t\t// determine desired slope (m) at each point using Fritsch-Carlson method\n\t\t// http://math.stackexchange.com/questions/45218/implementation-of-monotone-cubic-interpolation\n\t\tms[0] = ds[0];\n\n\t\tfor (let i = 1; i < n - 1; i++) {\n\t\t\tif (ds[i] === 0 || ds[i - 1] === 0 || (ds[i - 1] > 0) !== (ds[i] > 0))\n\t\t\t\tms[i] = 0;\n\t\t\telse {\n\t\t\t\tms[i] = 3 * (dxs[i - 1] + dxs[i]) / (\n\t\t\t\t\t(2 * dxs[i] + dxs[i - 1]) / ds[i - 1] +\n\t\t\t\t\t(dxs[i] + 2 * dxs[i - 1]) / ds[i]\n\t\t\t\t);\n\n\t\t\t\tif (!isFinite(ms[i]))\n\t\t\t\t\tms[i] = 0;\n\t\t\t}\n\t\t}\n\n\t\tms[n - 1] = ds[n - 2];\n\n\t\tfor (let i = 0; i < n - 1; i++) {\n\t\t\tbezierCurveTo(\n\t\t\t\tpath,\n\t\t\t\txs[i] + dxs[i] / 3,\n\t\t\t\tys[i] + ms[i] * dxs[i] / 3,\n\t\t\t\txs[i + 1] - dxs[i] / 3,\n\t\t\t\tys[i + 1] - ms[i + 1] * dxs[i] / 3,\n\t\t\t\txs[i + 1],\n\t\t\t\tys[i + 1],\n\t\t\t);\n\t\t}\n\t}\n\n\treturn path;\n}\n\nconst cursorPlots = new Set();\n\nfunction invalidateRects() {\n\tfor (let u of cursorPlots)\n\t\tu.syncRect(true);\n}\n\nif (domEnv) {\n\ton(resize, win, invalidateRects);\n\ton(scroll, win, invalidateRects, true);\n\ton(dppxchange, win, () => { uPlot.pxRatio = pxRatio; });\n}\n\nconst linearPath = linear() ;\nconst pointsPath = points() ;\n\nfunction setDefaults(d, xo, yo, initY) {\n\tlet d2 = initY ? [d[0], d[1]].concat(d.slice(2)) : [d[0]].concat(d.slice(1));\n\treturn d2.map((o, i) => setDefault(o, i, xo, yo));\n}\n\nfunction setDefaults2(d, xyo) {\n\treturn d.map((o, i) => i == 0 ? {} : assign({}, xyo, o));  // todo: assign() will not merge facet arrays\n}\n\nfunction setDefault(o, i, xo, yo) {\n\treturn assign({}, (i == 0 ? xo : yo), o);\n}\n\nfunction snapNumX(self, dataMin, dataMax) {\n\treturn dataMin == null ? nullNullTuple : [dataMin, dataMax];\n}\n\nconst snapTimeX = snapNumX;\n\n// this ensures that non-temporal/numeric y-axes get multiple-snapped padding added above/below\n// TODO: also account for incrs when snapping to ensure top of axis gets a tick & value\nfunction snapNumY(self, dataMin, dataMax) {\n\treturn dataMin == null ? nullNullTuple : rangeNum(dataMin, dataMax, rangePad, true);\n}\n\nfunction snapLogY(self, dataMin, dataMax, scale) {\n\treturn dataMin == null ? nullNullTuple : rangeLog(dataMin, dataMax, self.scales[scale].log, false);\n}\n\nconst snapLogX = snapLogY;\n\nfunction snapAsinhY(self, dataMin, dataMax, scale) {\n\treturn dataMin == null ? nullNullTuple : rangeAsinh(dataMin, dataMax, self.scales[scale].log, false);\n}\n\nconst snapAsinhX = snapAsinhY;\n\n// dim is logical (getClientBoundingRect) pixels, not canvas pixels\nfunction findIncr(minVal, maxVal, incrs, dim, minSpace) {\n\tlet intDigits = max(numIntDigits(minVal), numIntDigits(maxVal));\n\n\tlet delta = maxVal - minVal;\n\n\tlet incrIdx = closestIdx((minSpace / dim) * delta, incrs);\n\n\tdo {\n\t\tlet foundIncr = incrs[incrIdx];\n\t\tlet foundSpace = dim * foundIncr / delta;\n\n\t\tif (foundSpace >= minSpace && intDigits + (foundIncr < 5 ? fixedDec.get(foundIncr) : 0) <= 17)\n\t\t\treturn [foundIncr, foundSpace];\n\t} while (++incrIdx < incrs.length);\n\n\treturn [0, 0];\n}\n\nfunction pxRatioFont(font) {\n\tlet fontSize, fontSizeCss;\n\tfont = font.replace(/(\\d+)px/, (m, p1) => (fontSize = round((fontSizeCss = +p1) * pxRatio)) + 'px');\n\treturn [font, fontSize, fontSizeCss];\n}\n\nfunction syncFontSize(axis) {\n\tif (axis.show) {\n\t\t[axis.font, axis.labelFont].forEach(f => {\n\t\t\tlet size = roundDec(f[2] * pxRatio, 1);\n\t\t\tf[0] = f[0].replace(/[0-9.]+px/, size + 'px');\n\t\t\tf[1] = size;\n\t\t});\n\t}\n}\n\nfunction uPlot(opts, data, then) {\n\tconst self = {\n\t\tmode: ifNull(opts.mode, 1),\n\t};\n\n\tconst mode = self.mode;\n\n\tfunction getHPos(val, scale, dim, off) {\n\t\tlet pct = scale.valToPct(val);\n\t\treturn off + dim * (scale.dir == -1 ? (1 - pct) : pct);\n\t}\n\n\tfunction getVPos(val, scale, dim, off) {\n\t\tlet pct = scale.valToPct(val);\n\t\treturn off + dim * (scale.dir == -1 ? pct : (1 - pct));\n\t}\n\n\tfunction getPos(val, scale, dim, off) {\n\t\treturn scale.ori == 0 ? getHPos(val, scale, dim, off) : getVPos(val, scale, dim, off);\n\t}\n\n\tself.valToPosH = getHPos;\n\tself.valToPosV = getVPos;\n\n\tlet ready = false;\n\tself.status = 0;\n\n\tconst root = self.root = placeDiv(UPLOT);\n\n\tif (opts.id != null)\n\t\troot.id = opts.id;\n\n\taddClass(root, opts.class);\n\n\tif (opts.title) {\n\t\tlet title = placeDiv(TITLE, root);\n\t\ttitle.textContent = opts.title;\n\t}\n\n\tconst can = placeTag(\"canvas\");\n\tconst ctx = self.ctx = can.getContext(\"2d\");\n\n\tconst wrap = placeDiv(WRAP, root);\n\n\ton(\"click\", wrap, e => {\n\t\tif (e.target === over) {\n\t\t\tlet didDrag = mouseLeft1 != mouseLeft0 || mouseTop1 != mouseTop0;\n\t\t\tdidDrag && drag.click(self, e);\n\t\t}\n\t}, true);\n\n\tconst under = self.under = placeDiv(UNDER, wrap);\n\twrap.appendChild(can);\n\tconst over = self.over = placeDiv(OVER, wrap);\n\n\topts = copy(opts);\n\n\tconst pxAlign = +ifNull(opts.pxAlign, 1);\n\n\tconst pxRound = pxRoundGen(pxAlign);\n\n\t(opts.plugins || []).forEach(p => {\n\t\tif (p.opts)\n\t\t\topts = p.opts(self, opts) || opts;\n\t});\n\n\tconst ms = opts.ms || 1e-3;\n\n\tconst series  = self.series = mode == 1 ?\n\t\tsetDefaults(opts.series || [], xSeriesOpts, ySeriesOpts, false) :\n\t\tsetDefaults2(opts.series || [null], xySeriesOpts);\n\tconst axes    = self.axes   = setDefaults(opts.axes   || [], xAxisOpts,   yAxisOpts,    true);\n\tconst scales  = self.scales = {};\n\tconst bands   = self.bands  = opts.bands || [];\n\n\tbands.forEach(b => {\n\t\tb.fill = fnOrSelf(b.fill || null);\n\t\tb.dir = ifNull(b.dir, -1);\n\t});\n\n\tconst xScaleKey = mode == 2 ? series[1].facets[0].scale : series[0].scale;\n\n\tconst drawOrderMap = {\n\t\taxes: drawAxesGrid,\n\t\tseries: drawSeries,\n\t};\n\n\tconst drawOrder = (opts.drawOrder || [\"axes\", \"series\"]).map(key => drawOrderMap[key]);\n\n\tfunction initValToPct(sc) {\n\t\tconst getVal = (\n\t\t\tsc.distr == 3   ? val => log10(val > 0 ? val : sc.clamp(self, val, sc.min, sc.max, sc.key)) :\n\t\t\tsc.distr == 4   ? val => asinh(val, sc.asinh) :\n\t\t\tsc.distr == 100 ? val => sc.fwd(val) :\n\t\t\tval => val\n\t\t);\n\n\t\treturn val => {\n\t\t\tlet _val = getVal(val);\n\t\t\tlet { _min, _max } = sc;\n\t\t\tlet delta = _max - _min;\n\t\t\treturn (_val - _min) / delta;\n\t\t};\n\t}\n\n\tfunction initScale(scaleKey) {\n\t\tlet sc = scales[scaleKey];\n\n\t\tif (sc == null) {\n\t\t\tlet scaleOpts = (opts.scales || EMPTY_OBJ)[scaleKey] || EMPTY_OBJ;\n\n\t\t\tif (scaleOpts.from != null) {\n\t\t\t\t// ensure parent is initialized\n\t\t\t\tinitScale(scaleOpts.from);\n\t\t\t\t// dependent scales inherit\n\t\t\t\tlet sc = assign({}, scales[scaleOpts.from], scaleOpts, {key: scaleKey});\n\t\t\t\tsc.valToPct = initValToPct(sc);\n\t\t\t\tscales[scaleKey] = sc;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tsc = scales[scaleKey] = assign({}, (scaleKey == xScaleKey ? xScaleOpts : yScaleOpts), scaleOpts);\n\n\t\t\t\tsc.key = scaleKey;\n\n\t\t\t\tlet isTime = sc.time;\n\n\t\t\t\tlet rn = sc.range;\n\n\t\t\t\tlet rangeIsArr = isArr(rn);\n\n\t\t\t\tif (scaleKey != xScaleKey || (mode == 2 && !isTime)) {\n\t\t\t\t\t// if range array has null limits, it should be auto\n\t\t\t\t\tif (rangeIsArr && (rn[0] == null || rn[1] == null)) {\n\t\t\t\t\t\trn = {\n\t\t\t\t\t\t\tmin: rn[0] == null ? autoRangePart : {\n\t\t\t\t\t\t\t\tmode: 1,\n\t\t\t\t\t\t\t\thard: rn[0],\n\t\t\t\t\t\t\t\tsoft: rn[0],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tmax: rn[1] == null ? autoRangePart : {\n\t\t\t\t\t\t\t\tmode: 1,\n\t\t\t\t\t\t\t\thard: rn[1],\n\t\t\t\t\t\t\t\tsoft: rn[1],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t};\n\t\t\t\t\t\trangeIsArr = false;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!rangeIsArr && isObj(rn)) {\n\t\t\t\t\t\tlet cfg = rn;\n\t\t\t\t\t\t// this is similar to snapNumY\n\t\t\t\t\t\trn = (self, dataMin, dataMax) => dataMin == null ? nullNullTuple : rangeNum(dataMin, dataMax, cfg);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tsc.range = fnOrSelf(rn || (isTime ? snapTimeX : scaleKey == xScaleKey ?\n\t\t\t\t\t(sc.distr == 3 ? snapLogX : sc.distr == 4 ? snapAsinhX : snapNumX) :\n\t\t\t\t\t(sc.distr == 3 ? snapLogY : sc.distr == 4 ? snapAsinhY : snapNumY)\n\t\t\t\t));\n\n\t\t\t\tsc.auto = fnOrSelf(rangeIsArr ? false : sc.auto);\n\n\t\t\t\tsc.clamp = fnOrSelf(sc.clamp || clampScale);\n\n\t\t\t\t// caches for expensive ops like asinh() & log()\n\t\t\t\tsc._min = sc._max = null;\n\n\t\t\t\tsc.valToPct = initValToPct(sc);\n\t\t\t}\n\t\t}\n\t}\n\n\tinitScale(\"x\");\n\tinitScale(\"y\");\n\n\t// TODO: init scales from facets in mode: 2\n\tif (mode == 1) {\n\t\tseries.forEach(s => {\n\t\t\tinitScale(s.scale);\n\t\t});\n\t}\n\n\taxes.forEach(a => {\n\t\tinitScale(a.scale);\n\t});\n\n\tfor (let k in opts.scales)\n\t\tinitScale(k);\n\n\tconst scaleX = scales[xScaleKey];\n\n\tconst xScaleDistr = scaleX.distr;\n\n\tlet valToPosX, valToPosY;\n\n\tif (scaleX.ori == 0) {\n\t\taddClass(root, ORI_HZ);\n\t\tvalToPosX = getHPos;\n\t\tvalToPosY = getVPos;\n\t\t/*\n\t\tupdOriDims = () => {\n\t\t\txDimCan = plotWid;\n\t\t\txOffCan = plotLft;\n\t\t\tyDimCan = plotHgt;\n\t\t\tyOffCan = plotTop;\n\n\t\t\txDimCss = plotWidCss;\n\t\t\txOffCss = plotLftCss;\n\t\t\tyDimCss = plotHgtCss;\n\t\t\tyOffCss = plotTopCss;\n\t\t};\n\t\t*/\n\t}\n\telse {\n\t\taddClass(root, ORI_VT);\n\t\tvalToPosX = getVPos;\n\t\tvalToPosY = getHPos;\n\t\t/*\n\t\tupdOriDims = () => {\n\t\t\txDimCan = plotHgt;\n\t\t\txOffCan = plotTop;\n\t\t\tyDimCan = plotWid;\n\t\t\tyOffCan = plotLft;\n\n\t\t\txDimCss = plotHgtCss;\n\t\t\txOffCss = plotTopCss;\n\t\t\tyDimCss = plotWidCss;\n\t\t\tyOffCss = plotLftCss;\n\t\t};\n\t\t*/\n\t}\n\n\tconst pendScales = {};\n\n\t// explicitly-set initial scales\n\tfor (let k in scales) {\n\t\tlet sc = scales[k];\n\n\t\tif (sc.min != null || sc.max != null) {\n\t\t\tpendScales[k] = {min: sc.min, max: sc.max};\n\t\t\tsc.min = sc.max = null;\n\t\t}\n\t}\n\n//\tself.tz = opts.tz || Intl.DateTimeFormat().resolvedOptions().timeZone;\n\tconst _tzDate  = (opts.tzDate || (ts => new Date(round(ts / ms))));\n\tconst _fmtDate = (opts.fmtDate || fmtDate);\n\n\tconst _timeAxisSplits = (ms == 1 ? timeAxisSplitsMs(_tzDate) : timeAxisSplitsS(_tzDate));\n\tconst _timeAxisVals   = timeAxisVals(_tzDate, timeAxisStamps((ms == 1 ? _timeAxisStampsMs : _timeAxisStampsS), _fmtDate));\n\tconst _timeSeriesVal  = timeSeriesVal(_tzDate, timeSeriesStamp(_timeSeriesStamp, _fmtDate));\n\n\tconst activeIdxs = [];\n\n\tconst legend     = (self.legend = assign({}, legendOpts, opts.legend));\n\tconst cursor     =                (self.cursor = assign({}, cursorOpts, {drag: {y: mode == 2}}, opts.cursor));\n\tconst showLegend = legend.show;\n\tconst showCursor =                cursor.show;\n\tconst markers    = legend.markers;\n\n\t{\n\t\tlegend.idxs = activeIdxs;\n\n\t\tmarkers.width  = fnOrSelf(markers.width);\n\t\tmarkers.dash   = fnOrSelf(markers.dash);\n\t\tmarkers.stroke = fnOrSelf(markers.stroke);\n\t\tmarkers.fill   = fnOrSelf(markers.fill);\n\t}\n\n\tlet legendTable;\n\tlet legendHead;\n\tlet legendBody;\n\tlet legendRows = [];\n\tlet legendCells = [];\n\tlet legendCols;\n\tlet multiValLegend = false;\n\tlet NULL_LEGEND_VALUES = {};\n\n\tif (legend.live) {\n\t\tconst getMultiVals = series[1] ? series[1].values : null;\n\t\tmultiValLegend = getMultiVals != null;\n\t\tlegendCols = multiValLegend ? getMultiVals(self, 1, 0) : {_: 0};\n\n\t\tfor (let k in legendCols)\n\t\t\tNULL_LEGEND_VALUES[k] = LEGEND_DISP;\n\t}\n\n\tif (showLegend) {\n\t\tlegendTable = placeTag(\"table\", LEGEND, root);\n\t\tlegendBody = placeTag(\"tbody\", null, legendTable);\n\n\t\t// allows legend to be moved out of root\n\t\tlegend.mount(self, legendTable);\n\n\t\tif (multiValLegend) {\n\t\t\tlegendHead = placeTag(\"thead\", null, legendTable, legendBody);\n\n\t\t\tlet head = placeTag(\"tr\", null, legendHead);\n\t\t\tplaceTag(\"th\", null, head);\n\n\t\t\tfor (var key in legendCols)\n\t\t\t\tplaceTag(\"th\", LEGEND_LABEL, head).textContent = key;\n\t\t}\n\t\telse {\n\t\t\taddClass(legendTable, LEGEND_INLINE);\n\t\t\tlegend.live && addClass(legendTable, LEGEND_LIVE);\n\t\t}\n\t}\n\n\tconst son  = {show: true};\n\tconst soff = {show: false};\n\n\tfunction initLegendRow(s, i) {\n\t\tif (i == 0 && (multiValLegend || !legend.live || mode == 2))\n\t\t\treturn nullNullTuple;\n\n\t\tlet cells = [];\n\n\t\tlet row = placeTag(\"tr\", LEGEND_SERIES, legendBody, legendBody.childNodes[i]);\n\n\t\taddClass(row, s.class);\n\n\t\tif (!s.show)\n\t\t\taddClass(row, OFF);\n\n\t\tlet label = placeTag(\"th\", null, row);\n\n\t\tif (markers.show) {\n\t\t\tlet indic = placeDiv(LEGEND_MARKER, label);\n\n\t\t\tif (i > 0) {\n\t\t\t\tlet width  = markers.width(self, i);\n\n\t\t\t\tif (width)\n\t\t\t\t\tindic.style.border = width + \"px \" + markers.dash(self, i) + \" \" + markers.stroke(self, i);\n\n\t\t\t\tindic.style.background = markers.fill(self, i);\n\t\t\t}\n\t\t}\n\n\t\tlet text = placeDiv(LEGEND_LABEL, label);\n\n\t\tif (s.label instanceof HTMLElement)\n\t\t\ttext.appendChild(s.label);\n\t\telse\n\t\t\ttext.textContent = s.label;\n\n\t\tif (i > 0) {\n\t\t\tif (!markers.show)\n\t\t\t\ttext.style.color = s.width > 0 ? markers.stroke(self, i) : markers.fill(self, i);\n\n\t\t\tonMouse(\"click\", label, e => {\n\t\t\t\tif (cursor._lock)\n\t\t\t\t\treturn;\n\n\t\t\t\tsetCursorEvent(e);\n\n\t\t\t\tlet seriesIdx = series.indexOf(s);\n\n\t\t\t\tif ((e.ctrlKey || e.metaKey) != legend.isolate) {\n\t\t\t\t\t// if any other series is shown, isolate this one. else show all\n\t\t\t\t\tlet isolate = series.some((s, i) => i > 0 && i != seriesIdx && s.show);\n\n\t\t\t\t\tseries.forEach((s, i) => {\n\t\t\t\t\t\ti > 0 && setSeries(i, isolate ? (i == seriesIdx ? son : soff) : son, true, syncOpts.setSeries);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tsetSeries(seriesIdx, {show: !s.show}, true, syncOpts.setSeries);\n\t\t\t}, false);\n\n\t\t\tif (cursorFocus) {\n\t\t\t\tonMouse(mouseenter, label, e => {\n\t\t\t\t\tif (cursor._lock)\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\tsetCursorEvent(e);\n\n\t\t\t\t\tsetSeries(series.indexOf(s), FOCUS_TRUE, true, syncOpts.setSeries);\n\t\t\t\t}, false);\n\t\t\t}\n\t\t}\n\n\t\tfor (var key in legendCols) {\n\t\t\tlet v = placeTag(\"td\", LEGEND_VALUE, row);\n\t\t\tv.textContent = \"--\";\n\t\t\tcells.push(v);\n\t\t}\n\n\t\treturn [row, cells];\n\t}\n\n\tconst mouseListeners = new Map();\n\n\tfunction onMouse(ev, targ, fn, onlyTarg = true) {\n\t\tconst targListeners = mouseListeners.get(targ) || {};\n\t\tconst listener = cursor.bind[ev](self, targ, fn, onlyTarg);\n\n\t\tif (listener) {\n\t\t\ton(ev, targ, targListeners[ev] = listener);\n\t\t\tmouseListeners.set(targ, targListeners);\n\t\t}\n\t}\n\n\tfunction offMouse(ev, targ, fn) {\n\t\tconst targListeners = mouseListeners.get(targ) || {};\n\n\t\tfor (let k in targListeners) {\n\t\t\tif (ev == null || k == ev) {\n\t\t\t\toff(k, targ, targListeners[k]);\n\t\t\t\tdelete targListeners[k];\n\t\t\t}\n\t\t}\n\n\t\tif (ev == null)\n\t\t\tmouseListeners.delete(targ);\n\t}\n\n\tlet fullWidCss = 0;\n\tlet fullHgtCss = 0;\n\n\tlet plotWidCss = 0;\n\tlet plotHgtCss = 0;\n\n\t// plot margins to account for axes\n\tlet plotLftCss = 0;\n\tlet plotTopCss = 0;\n\n\t// previous values for diffing\n\tlet _plotLftCss = plotLftCss;\n\tlet _plotTopCss = plotTopCss;\n\tlet _plotWidCss = plotWidCss;\n\tlet _plotHgtCss = plotHgtCss;\n\n\n\tlet plotLft = 0;\n\tlet plotTop = 0;\n\tlet plotWid = 0;\n\tlet plotHgt = 0;\n\n\tself.bbox = {};\n\n\tlet shouldSetScales = false;\n\tlet shouldSetSize = false;\n\tlet shouldConvergeSize = false;\n\tlet shouldSetCursor = false;\n\tlet shouldSetSelect = false;\n\tlet shouldSetLegend = false;\n\n\tfunction _setSize(width, height, force) {\n\t\tif (force || (width != self.width || height != self.height))\n\t\t\tcalcSize(width, height);\n\n\t\tresetYSeries(false);\n\n\t\tshouldConvergeSize = true;\n\t\tshouldSetSize = true;\n\n\t\tcommit();\n\t}\n\n\tfunction calcSize(width, height) {\n\t//\tlog(\"calcSize()\", arguments);\n\n\t\tself.width  = fullWidCss = plotWidCss = width;\n\t\tself.height = fullHgtCss = plotHgtCss = height;\n\t\tplotLftCss  = plotTopCss = 0;\n\n\t\tcalcPlotRect();\n\t\tcalcAxesRects();\n\n\t\tlet bb = self.bbox;\n\n\t\tplotLft = bb.left   = incrRound(plotLftCss * pxRatio, 0.5);\n\t\tplotTop = bb.top    = incrRound(plotTopCss * pxRatio, 0.5);\n\t\tplotWid = bb.width  = incrRound(plotWidCss * pxRatio, 0.5);\n\t\tplotHgt = bb.height = incrRound(plotHgtCss * pxRatio, 0.5);\n\n\t//\tupdOriDims();\n\t}\n\n\t// ensures size calc convergence\n\tconst CYCLE_LIMIT = 3;\n\n\tfunction convergeSize() {\n\t\tlet converged = false;\n\n\t\tlet cycleNum = 0;\n\n\t\twhile (!converged) {\n\t\t\tcycleNum++;\n\n\t\t\tlet axesConverged = axesCalc(cycleNum);\n\t\t\tlet paddingConverged = paddingCalc(cycleNum);\n\n\t\t\tconverged = cycleNum == CYCLE_LIMIT || (axesConverged && paddingConverged);\n\n\t\t\tif (!converged) {\n\t\t\t\tcalcSize(self.width, self.height);\n\t\t\t\tshouldSetSize = true;\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction setSize({width, height}) {\n\t\t_setSize(width, height);\n\t}\n\n\tself.setSize = setSize;\n\n\t// accumulate axis offsets, reduce canvas width\n\tfunction calcPlotRect() {\n\t\t// easements for edge labels\n\t\tlet hasTopAxis = false;\n\t\tlet hasBtmAxis = false;\n\t\tlet hasRgtAxis = false;\n\t\tlet hasLftAxis = false;\n\n\t\taxes.forEach((axis, i) => {\n\t\t\tif (axis.show && axis._show) {\n\t\t\t\tlet {side, _size} = axis;\n\t\t\t\tlet isVt = side % 2;\n\t\t\t\tlet labelSize = axis.label != null ? axis.labelSize : 0;\n\n\t\t\t\tlet fullSize = _size + labelSize;\n\n\t\t\t\tif (fullSize > 0) {\n\t\t\t\t\tif (isVt) {\n\t\t\t\t\t\tplotWidCss -= fullSize;\n\n\t\t\t\t\t\tif (side == 3) {\n\t\t\t\t\t\t\tplotLftCss += fullSize;\n\t\t\t\t\t\t\thasLftAxis = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\thasRgtAxis = true;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tplotHgtCss -= fullSize;\n\n\t\t\t\t\t\tif (side == 0) {\n\t\t\t\t\t\t\tplotTopCss += fullSize;\n\t\t\t\t\t\t\thasTopAxis = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\thasBtmAxis = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tsidesWithAxes[0] = hasTopAxis;\n\t\tsidesWithAxes[1] = hasRgtAxis;\n\t\tsidesWithAxes[2] = hasBtmAxis;\n\t\tsidesWithAxes[3] = hasLftAxis;\n\n\t\t// hz padding\n\t\tplotWidCss -= _padding[1] + _padding[3];\n\t\tplotLftCss += _padding[3];\n\n\t\t// vt padding\n\t\tplotHgtCss -= _padding[2] + _padding[0];\n\t\tplotTopCss += _padding[0];\n\t}\n\n\tfunction calcAxesRects() {\n\t\t// will accum +\n\t\tlet off1 = plotLftCss + plotWidCss;\n\t\tlet off2 = plotTopCss + plotHgtCss;\n\t\t// will accum -\n\t\tlet off3 = plotLftCss;\n\t\tlet off0 = plotTopCss;\n\n\t\tfunction incrOffset(side, size) {\n\t\t\tswitch (side) {\n\t\t\t\tcase 1: off1 += size; return off1 - size;\n\t\t\t\tcase 2: off2 += size; return off2 - size;\n\t\t\t\tcase 3: off3 -= size; return off3 + size;\n\t\t\t\tcase 0: off0 -= size; return off0 + size;\n\t\t\t}\n\t\t}\n\n\t\taxes.forEach((axis, i) => {\n\t\t\tif (axis.show && axis._show) {\n\t\t\t\tlet side = axis.side;\n\n\t\t\t\taxis._pos = incrOffset(side, axis._size);\n\n\t\t\t\tif (axis.label != null)\n\t\t\t\t\taxis._lpos = incrOffset(side, axis.labelSize);\n\t\t\t}\n\t\t});\n\t}\n\n\tif (cursor.dataIdx == null) {\n\t\tlet hov = cursor.hover;\n\n\t\tlet skip = hov.skip = new Set(hov.skip ?? []);\n\t\tskip.add(void 0); // alignment artifacts\n\t\tlet prox = hov.prox = fnOrSelf(hov.prox);\n\t\tlet bias = hov.bias ??= 0;\n\n\t\t// TODO: only scan between in-view idxs (i0, i1)\n\t\tcursor.dataIdx = (self, seriesIdx, cursorIdx, valAtPosX) => {\n\t\t\tif (seriesIdx == 0)\n\t\t\t\treturn cursorIdx;\n\n\t\t\tlet idx2 = cursorIdx;\n\n\t\t\tlet _prox = prox(self, seriesIdx, cursorIdx, valAtPosX) ?? inf;\n\t\t\tlet withProx = _prox >= 0 && _prox < inf;\n\t\t\tlet xDim = scaleX.ori == 0 ? plotWidCss : plotHgtCss;\n\t\t\tlet cursorLft = cursor.left;\n\n\t\t\tlet xValues = data[0];\n\t\t\tlet yValues = data[seriesIdx];\n\n\t\t\tif (skip.has(yValues[cursorIdx])) {\n\t\t\t\tidx2 = null;\n\n\t\t\t\tlet nonNullLft = null,\n\t\t\t\t\tnonNullRgt = null,\n\t\t\t\t\tj;\n\n\t\t\t\tif (bias == 0 || bias == -1) {\n\t\t\t\t\tj = cursorIdx;\n\t\t\t\t\twhile (nonNullLft == null && j-- > 0) {\n\t\t\t\t\t\tif (!skip.has(yValues[j]))\n\t\t\t\t\t\t\tnonNullLft = j;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (bias == 0 || bias == 1) {\n\t\t\t\t\tj = cursorIdx;\n\t\t\t\t\twhile (nonNullRgt == null && j++ < yValues.length) {\n\t\t\t\t\t\tif (!skip.has(yValues[j]))\n\t\t\t\t\t\t\tnonNullRgt = j;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (nonNullLft != null || nonNullRgt != null) {\n\t\t\t\t\tif (withProx) {\n\t\t\t\t\t\tlet lftPos = nonNullLft == null ? -Infinity : valToPosX(xValues[nonNullLft], scaleX, xDim, 0);\n\t\t\t\t\t\tlet rgtPos = nonNullRgt == null ?  Infinity : valToPosX(xValues[nonNullRgt], scaleX, xDim, 0);\n\n\t\t\t\t\t\tlet lftDelta = cursorLft - lftPos;\n\t\t\t\t\t\tlet rgtDelta = rgtPos - cursorLft;\n\n\t\t\t\t\t\tif (lftDelta <= rgtDelta) {\n\t\t\t\t\t\t\tif (lftDelta <= _prox)\n\t\t\t\t\t\t\t\tidx2 = nonNullLft;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif (rgtDelta <= _prox)\n\t\t\t\t\t\t\t\tidx2 = nonNullRgt;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tidx2 =\n\t\t\t\t\t\t\tnonNullRgt == null ? nonNullLft :\n\t\t\t\t\t\t\tnonNullLft == null ? nonNullRgt :\n\t\t\t\t\t\t\tcursorIdx - nonNullLft <= nonNullRgt - cursorIdx ? nonNullLft : nonNullRgt;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (withProx) {\n\t\t\t\tlet dist = abs(cursorLft - valToPosX(xValues[cursorIdx], scaleX, xDim, 0));\n\n\t\t\t\tif (dist > _prox)\n\t\t\t\t\tidx2 = null;\n\t\t\t}\n\n\t\t\treturn idx2;\n\t\t};\n\t}\n\n\tconst setCursorEvent = e => { cursor.event = e; };\n\n\tcursor.idxs = activeIdxs;\n\n\tcursor._lock = false;\n\n\tlet points = cursor.points;\n\n\tpoints.show   = fnOrSelf(points.show);\n\tpoints.size   = fnOrSelf(points.size);\n\tpoints.stroke = fnOrSelf(points.stroke);\n\tpoints.width  = fnOrSelf(points.width);\n\tpoints.fill   = fnOrSelf(points.fill);\n\n\tconst focus = self.focus = assign({}, opts.focus || {alpha: 0.3}, cursor.focus);\n\n\tconst cursorFocus = focus.prox >= 0;\n\tconst cursorOnePt = cursorFocus && points.one;\n\n\t// series-intersection markers\n\tlet cursorPts = [];\n\t// position caches in CSS pixels\n\tlet cursorPtsLft = [];\n\tlet cursorPtsTop = [];\n\n\tfunction initCursorPt(s, si) {\n\t\tlet pt = points.show(self, si);\n\n\t\tif (pt instanceof HTMLElement) {\n\t\t\taddClass(pt, CURSOR_PT);\n\t\t\taddClass(pt, s.class);\n\t\t\telTrans(pt, -10, -10, plotWidCss, plotHgtCss);\n\t\t\tover.insertBefore(pt, cursorPts[si]);\n\n\t\t\treturn pt;\n\t\t}\n\t}\n\n\tfunction initSeries(s, i) {\n\t\tif (mode == 1 || i > 0) {\n\t\t\tlet isTime = mode == 1 && scales[s.scale].time;\n\n\t\t\tlet sv = s.value;\n\t\t\ts.value = isTime ? (isStr(sv) ? timeSeriesVal(_tzDate, timeSeriesStamp(sv, _fmtDate)) : sv || _timeSeriesVal) : sv || numSeriesVal;\n\t\t\ts.label = s.label || (isTime ? timeSeriesLabel : numSeriesLabel);\n\t\t}\n\n\t\tif (cursorOnePt || i > 0) {\n\t\t\ts.width  = s.width == null ? 1 : s.width;\n\t\t\ts.paths  = s.paths || linearPath || retNull;\n\t\t\ts.fillTo = fnOrSelf(s.fillTo || seriesFillTo);\n\t\t\ts.pxAlign = +ifNull(s.pxAlign, pxAlign);\n\t\t\ts.pxRound = pxRoundGen(s.pxAlign);\n\n\t\t\ts.stroke = fnOrSelf(s.stroke || null);\n\t\t\ts.fill   = fnOrSelf(s.fill || null);\n\t\t\ts._stroke = s._fill = s._paths = s._focus = null;\n\n\t\t\tlet _ptDia = ptDia(max(1, s.width), 1);\n\t\t\tlet points = s.points = assign({}, {\n\t\t\t\tsize: _ptDia,\n\t\t\t\twidth: max(1, _ptDia * .2),\n\t\t\t\tstroke: s.stroke,\n\t\t\t\tspace: _ptDia * 2,\n\t\t\t\tpaths: pointsPath,\n\t\t\t\t_stroke: null,\n\t\t\t\t_fill: null,\n\t\t\t}, s.points);\n\t\t\tpoints.show   = fnOrSelf(points.show);\n\t\t\tpoints.filter = fnOrSelf(points.filter);\n\t\t\tpoints.fill   = fnOrSelf(points.fill);\n\t\t\tpoints.stroke = fnOrSelf(points.stroke);\n\t\t\tpoints.paths  = fnOrSelf(points.paths);\n\t\t\tpoints.pxAlign = s.pxAlign;\n\t\t}\n\n\t\tif (showLegend) {\n\t\t\tlet rowCells = initLegendRow(s, i);\n\t\t\tlegendRows.splice(i, 0, rowCells[0]);\n\t\t\tlegendCells.splice(i, 0, rowCells[1]);\n\t\t\tlegend.values.push(null);\t// NULL_LEGEND_VALS not yet avil here :(\n\t\t}\n\n\t\tif (showCursor) {\n\t\t\tactiveIdxs.splice(i, 0, null);\n\n\t\t\tlet pt = null;\n\n\t\t\tif (cursorOnePt) {\n\t\t\t\tif (i == 0)\n\t\t\t\t\tpt = initCursorPt(s, i);\n\t\t\t}\n\t\t\telse if (i > 0)\n\t\t\t\tpt = initCursorPt(s, i);\n\n\t\t\tcursorPts.splice(i, 0, pt);\n\t\t\tcursorPtsLft.splice(i, 0, 0);\n\t\t\tcursorPtsTop.splice(i, 0, 0);\n\t\t}\n\n\t\tfire(\"addSeries\", i);\n\t}\n\n\tfunction addSeries(opts, si) {\n\t\tsi = si == null ? series.length : si;\n\n\t\topts = mode == 1 ? setDefault(opts, si, xSeriesOpts, ySeriesOpts) : setDefault(opts, si, {}, xySeriesOpts);\n\n\t\tseries.splice(si, 0, opts);\n\t\tinitSeries(series[si], si);\n\t}\n\n\tself.addSeries = addSeries;\n\n\tfunction delSeries(i) {\n\t\tseries.splice(i, 1);\n\n\t\tif (showLegend) {\n\t\t\tlegend.values.splice(i, 1);\n\n\t\t\tlegendCells.splice(i, 1);\n\t\t\tlet tr = legendRows.splice(i, 1)[0];\n\t\t\toffMouse(null, tr.firstChild);\n\t\t\ttr.remove();\n\t\t}\n\n\t\tif (showCursor) {\n\t\t\tactiveIdxs.splice(i, 1);\n\t\t\tcursorPts.splice(i, 1)[0].remove();\n\t\t\tcursorPtsLft.splice(i, 1);\n\t\t\tcursorPtsTop.splice(i, 1);\n\t\t}\n\n\t\t// TODO: de-init no-longer-needed scales?\n\n\t\tfire(\"delSeries\", i);\n\t}\n\n\tself.delSeries = delSeries;\n\n\tconst sidesWithAxes = [false, false, false, false];\n\n\tfunction initAxis(axis, i) {\n\t\taxis._show = axis.show;\n\n\t\tif (axis.show) {\n\t\t\tlet isVt = axis.side % 2;\n\n\t\t\tlet sc = scales[axis.scale];\n\n\t\t\t// this can occur if all series specify non-default scales\n\t\t\tif (sc == null) {\n\t\t\t\taxis.scale = isVt ? series[1].scale : xScaleKey;\n\t\t\t\tsc = scales[axis.scale];\n\t\t\t}\n\n\t\t\t// also set defaults for incrs & values based on axis distr\n\t\t\tlet isTime = sc.time;\n\n\t\t\taxis.size   = fnOrSelf(axis.size);\n\t\t\taxis.space  = fnOrSelf(axis.space);\n\t\t\taxis.rotate = fnOrSelf(axis.rotate);\n\n\t\t\tif (isArr(axis.incrs)) {\n\t\t\t\taxis.incrs.forEach(incr => {\n\t\t\t\t\t!fixedDec.has(incr) && fixedDec.set(incr, guessDec(incr));\n\t\t\t\t});\n\t\t\t}\n\n\t\t\taxis.incrs  = fnOrSelf(axis.incrs  || (          sc.distr == 2 ? wholeIncrs : (isTime ? (ms == 1 ? timeIncrsMs : timeIncrsS) : numIncrs)));\n\t\t\taxis.splits = fnOrSelf(axis.splits || (isTime && sc.distr == 1 ? _timeAxisSplits : sc.distr == 3 ? logAxisSplits : sc.distr == 4 ? asinhAxisSplits : numAxisSplits));\n\n\t\t\taxis.stroke        = fnOrSelf(axis.stroke);\n\t\t\taxis.grid.stroke   = fnOrSelf(axis.grid.stroke);\n\t\t\taxis.ticks.stroke  = fnOrSelf(axis.ticks.stroke);\n\t\t\taxis.border.stroke = fnOrSelf(axis.border.stroke);\n\n\t\t\tlet av = axis.values;\n\n\t\t\taxis.values = (\n\t\t\t\t// static array of tick values\n\t\t\t\tisArr(av) && !isArr(av[0]) ? fnOrSelf(av) :\n\t\t\t\t// temporal\n\t\t\t\tisTime ? (\n\t\t\t\t\t// config array of fmtDate string tpls\n\t\t\t\t\tisArr(av) ?\n\t\t\t\t\t\ttimeAxisVals(_tzDate, timeAxisStamps(av, _fmtDate)) :\n\t\t\t\t\t// fmtDate string tpl\n\t\t\t\t\tisStr(av) ?\n\t\t\t\t\t\ttimeAxisVal(_tzDate, av) :\n\t\t\t\t\tav || _timeAxisVals\n\t\t\t\t) : av || numAxisVals\n\t\t\t);\n\n\t\t\taxis.filter = fnOrSelf(axis.filter || (          sc.distr >= 3 && sc.log == 10 ? log10AxisValsFilt : sc.distr == 3 && sc.log == 2 ? log2AxisValsFilt : retArg1));\n\n\t\t\taxis.font      = pxRatioFont(axis.font);\n\t\t\taxis.labelFont = pxRatioFont(axis.labelFont);\n\n\t\t\taxis._size   = axis.size(self, null, i, 0);\n\n\t\t\taxis._space  =\n\t\t\taxis._rotate =\n\t\t\taxis._incrs  =\n\t\t\taxis._found  =\t// foundIncrSpace\n\t\t\taxis._splits =\n\t\t\taxis._values = null;\n\n\t\t\tif (axis._size > 0) {\n\t\t\t\tsidesWithAxes[i] = true;\n\t\t\t\taxis._el = placeDiv(AXIS, wrap);\n\t\t\t}\n\n\t\t\t// debug\n\t\t//\taxis._el.style.background = \"#\"  + Math.floor(Math.random()*16777215).toString(16) + '80';\n\t\t}\n\t}\n\n\tfunction autoPadSide(self, side, sidesWithAxes, cycleNum) {\n\t\tlet [hasTopAxis, hasRgtAxis, hasBtmAxis, hasLftAxis] = sidesWithAxes;\n\n\t\tlet ori = side % 2;\n\t\tlet size = 0;\n\n\t\tif (ori == 0 && (hasLftAxis || hasRgtAxis))\n\t\t\tsize = (side == 0 && !hasTopAxis || side == 2 && !hasBtmAxis ? round(xAxisOpts.size / 3) : 0);\n\t\tif (ori == 1 && (hasTopAxis || hasBtmAxis))\n\t\t\tsize = (side == 1 && !hasRgtAxis || side == 3 && !hasLftAxis ? round(yAxisOpts.size / 2) : 0);\n\n\t\treturn size;\n\t}\n\n\tconst padding = self.padding = (opts.padding || [autoPadSide,autoPadSide,autoPadSide,autoPadSide]).map(p => fnOrSelf(ifNull(p, autoPadSide)));\n\tconst _padding = self._padding = padding.map((p, i) => p(self, i, sidesWithAxes, 0));\n\n\tlet dataLen;\n\n\t// rendered data window\n\tlet i0 = null;\n\tlet i1 = null;\n\tconst idxs = mode == 1 ? series[0].idxs : null;\n\n\tlet data0 = null;\n\n\tlet viaAutoScaleX = false;\n\n\tfunction setData(_data, _resetScales) {\n\t\tdata = _data == null ? [] : _data;\n\n\t\tself.data = self._data = data;\n\n\t\tif (mode == 2) {\n\t\t\tdataLen = 0;\n\t\t\tfor (let i = 1; i < series.length; i++)\n\t\t\t\tdataLen += data[i][0].length;\n\t\t}\n\t\telse {\n\t\t\tif (data.length == 0)\n\t\t\t\tself.data = self._data = data = [[]];\n\n\t\t\tdata0 = data[0];\n\t\t\tdataLen = data0.length;\n\n\t\t\tlet scaleData = data;\n\n\t\t\tif (xScaleDistr == 2) {\n\t\t\t\tscaleData = data.slice();\n\n\t\t\t\tlet _data0 = scaleData[0] = Array(dataLen);\n\t\t\t\tfor (let i = 0; i < dataLen; i++)\n\t\t\t\t\t_data0[i] = i;\n\t\t\t}\n\n\t\t\tself._data = data = scaleData;\n\t\t}\n\n\t\tresetYSeries(true);\n\n\t\tfire(\"setData\");\n\n\t\t// forces x axis tick values to re-generate when neither x scale nor y scale changes\n\t\t// in ordinal mode, scale range is by index, so will not change if new data has same length, but tick values are from data\n\t\tif (xScaleDistr == 2) {\n\t\t\tshouldConvergeSize = true;\n\n\t\t\t/* or somewhat cheaper, and uglier:\n\t\t\tif (ready) {\n\t\t\t\t// logic extracted from axesCalc()\n\t\t\t\tlet i = 0;\n\t\t\t\tlet axis = axes[i];\n\t\t\t\tlet _splits = axis._splits.map(i => data0[i]);\n\t\t\t\tlet [_incr, _space] = axis._found;\n\t\t\t\tlet incr = data0[_splits[1]] - data0[_splits[0]];\n\t\t\t\taxis._values = axis.values(self, axis.filter(self, _splits, i, _space, incr), i, _space, incr);\n\t\t\t}\n\t\t\t*/\n\t\t}\n\n\t\tif (_resetScales !== false) {\n\t\t\tlet xsc = scaleX;\n\n\t\t\tif (xsc.auto(self, viaAutoScaleX))\n\t\t\t\tautoScaleX();\n\t\t\telse\n\t\t\t\t_setScale(xScaleKey, xsc.min, xsc.max);\n\n\t\t\tshouldSetCursor = shouldSetCursor || cursor.left >= 0;\n\t\t\tshouldSetLegend = true;\n\t\t\tcommit();\n\t\t}\n\t}\n\n\tself.setData = setData;\n\n\tfunction autoScaleX() {\n\t\tviaAutoScaleX = true;\n\n\t\tlet _min, _max;\n\n\t\tif (mode == 1) {\n\t\t\tif (dataLen > 0) {\n\t\t\t\ti0 = idxs[0] = 0;\n\t\t\t\ti1 = idxs[1] = dataLen - 1;\n\n\t\t\t\t_min = data[0][i0];\n\t\t\t\t_max = data[0][i1];\n\n\t\t\t\tif (xScaleDistr == 2) {\n\t\t\t\t\t_min = i0;\n\t\t\t\t\t_max = i1;\n\t\t\t\t}\n\t\t\t\telse if (_min == _max) {\n\t\t\t\t\tif (xScaleDistr == 3)\n\t\t\t\t\t\t[_min, _max] = rangeLog(_min, _min, scaleX.log, false);\n\t\t\t\t\telse if (xScaleDistr == 4)\n\t\t\t\t\t\t[_min, _max] = rangeAsinh(_min, _min, scaleX.log, false);\n\t\t\t\t\telse if (scaleX.time)\n\t\t\t\t\t\t_max = _min + round(86400 / ms);\n\t\t\t\t\telse\n\t\t\t\t\t\t[_min, _max] = rangeNum(_min, _max, rangePad, true);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\ti0 = idxs[0] = _min = null;\n\t\t\t\ti1 = idxs[1] = _max = null;\n\t\t\t}\n\t\t}\n\n\t\t_setScale(xScaleKey, _min, _max);\n\t}\n\n\tlet ctxStroke, ctxFill, ctxWidth, ctxDash, ctxJoin, ctxCap, ctxFont, ctxAlign, ctxBaseline;\n\tlet ctxAlpha;\n\n\tfunction setCtxStyle(stroke, width, dash, cap, fill, join) {\n\t\tstroke ??= transparent;\n\t\tdash   ??= EMPTY_ARR;\n\t\tcap    ??= \"butt\"; // (\u203F|\u203F)\n\t\tfill   ??= transparent;\n\t\tjoin   ??= \"round\";\n\n\t\tif (stroke != ctxStroke)\n\t\t\tctx.strokeStyle = ctxStroke = stroke;\n\t\tif (fill != ctxFill)\n\t\t\tctx.fillStyle = ctxFill = fill;\n\t\tif (width != ctxWidth)\n\t\t\tctx.lineWidth = ctxWidth = width;\n\t\tif (join != ctxJoin)\n\t\t\tctx.lineJoin = ctxJoin = join;\n\t\tif (cap != ctxCap)\n\t\t\tctx.lineCap = ctxCap = cap;\n\t\tif (dash != ctxDash)\n\t\t\tctx.setLineDash(ctxDash = dash);\n\t}\n\n\tfunction setFontStyle(font, fill, align, baseline) {\n\t\tif (fill != ctxFill)\n\t\t\tctx.fillStyle = ctxFill = fill;\n\t\tif (font != ctxFont)\n\t\t\tctx.font = ctxFont = font;\n\t\tif (align != ctxAlign)\n\t\t\tctx.textAlign = ctxAlign = align;\n\t\tif (baseline != ctxBaseline)\n\t\t\tctx.textBaseline = ctxBaseline = baseline;\n\t}\n\n\tfunction accScale(wsc, psc, facet, data, sorted = 0) {\n\t\tif (data.length > 0 && wsc.auto(self, viaAutoScaleX) && (psc == null || psc.min == null)) {\n\t\t\tlet _i0 = ifNull(i0, 0);\n\t\t\tlet _i1 = ifNull(i1, data.length - 1);\n\n\t\t\t// only run getMinMax() for invalidated series data, else reuse\n\t\t\tlet minMax = facet.min == null ? getMinMax(data, _i0, _i1, sorted, wsc.distr == 3) : [facet.min, facet.max];\n\n\t\t\t// initial min/max\n\t\t\twsc.min = min(wsc.min, facet.min = minMax[0]);\n\t\t\twsc.max = max(wsc.max, facet.max = minMax[1]);\n\t\t}\n\t}\n\n\tconst AUTOSCALE = {min: null, max: null};\n\n\tfunction setScales() {\n\t//\tlog(\"setScales()\", arguments);\n\n\t\t// implicitly add auto scales, and unranged scales\n\t\tfor (let k in scales) {\n\t\t\tlet sc = scales[k];\n\n\t\t\tif (pendScales[k] == null &&\n\t\t\t\t(\n\t\t\t\t\t// scales that have never been set (on init)\n\t\t\t\t\tsc.min == null ||\n\t\t\t\t\t// or auto scales when the x scale was explicitly set\n\t\t\t\t\tpendScales[xScaleKey] != null && sc.auto(self, viaAutoScaleX)\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tpendScales[k] = AUTOSCALE;\n\t\t\t}\n\t\t}\n\n\t\t// implicitly add dependent scales\n\t\tfor (let k in scales) {\n\t\t\tlet sc = scales[k];\n\n\t\t\tif (pendScales[k] == null && sc.from != null && pendScales[sc.from] != null)\n\t\t\t\tpendScales[k] = AUTOSCALE;\n\t\t}\n\n\t\t// explicitly setting the x-scale invalidates everything (acts as redraw)\n\t\tif (pendScales[xScaleKey] != null)\n\t\t\tresetYSeries(true); // TODO: only reset series on auto scales?\n\n\t\tlet wipScales = {};\n\n\t\tfor (let k in pendScales) {\n\t\t\tlet psc = pendScales[k];\n\n\t\t\tif (psc != null) {\n\t\t\t\tlet wsc = wipScales[k] = copy(scales[k], fastIsObj);\n\n\t\t\t\tif (psc.min != null)\n\t\t\t\t\tassign(wsc, psc);\n\t\t\t\telse if (k != xScaleKey || mode == 2) {\n\t\t\t\t\tif (dataLen == 0 && wsc.from == null) {\n\t\t\t\t\t\tlet minMax = wsc.range(self, null, null, k);\n\t\t\t\t\t\twsc.min = minMax[0];\n\t\t\t\t\t\twsc.max = minMax[1];\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\twsc.min = inf;\n\t\t\t\t\t\twsc.max = -inf;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (dataLen > 0) {\n\t\t\t// pre-range y-scales from y series' data values\n\t\t\tseries.forEach((s, i) => {\n\t\t\t\tif (mode == 1) {\n\t\t\t\t\tlet k = s.scale;\n\t\t\t\t\tlet psc = pendScales[k];\n\n\t\t\t\t\tif (psc == null)\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\tlet wsc = wipScales[k];\n\n\t\t\t\t\tif (i == 0) {\n\t\t\t\t\t\tlet minMax = wsc.range(self, wsc.min, wsc.max, k);\n\n\t\t\t\t\t\twsc.min = minMax[0];\n\t\t\t\t\t\twsc.max = minMax[1];\n\n\t\t\t\t\t\ti0 = closestIdx(wsc.min, data[0]);\n\t\t\t\t\t\ti1 = closestIdx(wsc.max, data[0]);\n\n\t\t\t\t\t\t// don't try to contract same or adjacent idxs\n\t\t\t\t\t\tif (i1 - i0 > 1) {\n\t\t\t\t\t\t\t// closest indices can be outside of view\n\t\t\t\t\t\t\tif (data[0][i0] < wsc.min)\n\t\t\t\t\t\t\t\ti0++;\n\t\t\t\t\t\t\tif (data[0][i1] > wsc.max)\n\t\t\t\t\t\t\t\ti1--;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ts.min = data0[i0];\n\t\t\t\t\t\ts.max = data0[i1];\n\t\t\t\t\t}\n\t\t\t\t\telse if (s.show && s.auto)\n\t\t\t\t\t\taccScale(wsc, psc, s, data[i], s.sorted);\n\n\t\t\t\t\ts.idxs[0] = i0;\n\t\t\t\t\ts.idxs[1] = i1;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (i > 0) {\n\t\t\t\t\t\tif (s.show && s.auto) {\n\t\t\t\t\t\t\t// TODO: only handles, assumes and requires facets[0] / 'x' scale, and facets[1] / 'y' scale\n\t\t\t\t\t\t\tlet [ xFacet, yFacet ] = s.facets;\n\t\t\t\t\t\t\tlet xScaleKey = xFacet.scale;\n\t\t\t\t\t\t\tlet yScaleKey = yFacet.scale;\n\t\t\t\t\t\t\tlet [ xData, yData ] = data[i];\n\n\t\t\t\t\t\t\tlet wscx = wipScales[xScaleKey];\n\t\t\t\t\t\t\tlet wscy = wipScales[yScaleKey];\n\n\t\t\t\t\t\t\t// null can happen when only x is zoomed, but y has static range and doesnt get auto-added to pending\n\t\t\t\t\t\t\twscx != null && accScale(wscx, pendScales[xScaleKey], xFacet, xData, xFacet.sorted);\n\t\t\t\t\t\t\twscy != null && accScale(wscy, pendScales[yScaleKey], yFacet, yData, yFacet.sorted);\n\n\t\t\t\t\t\t\t// temp\n\t\t\t\t\t\t\ts.min = yFacet.min;\n\t\t\t\t\t\t\ts.max = yFacet.max;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// range independent scales\n\t\t\tfor (let k in wipScales) {\n\t\t\t\tlet wsc = wipScales[k];\n\t\t\t\tlet psc = pendScales[k];\n\n\t\t\t\tif (wsc.from == null && (psc == null || psc.min == null)) {\n\t\t\t\t\tlet minMax = wsc.range(\n\t\t\t\t\t\tself,\n\t\t\t\t\t\twsc.min ==  inf ? null : wsc.min,\n\t\t\t\t\t\twsc.max == -inf ? null : wsc.max,\n\t\t\t\t\t\tk\n\t\t\t\t\t);\n\t\t\t\t\twsc.min = minMax[0];\n\t\t\t\t\twsc.max = minMax[1];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// range dependent scales\n\t\tfor (let k in wipScales) {\n\t\t\tlet wsc = wipScales[k];\n\n\t\t\tif (wsc.from != null) {\n\t\t\t\tlet base = wipScales[wsc.from];\n\n\t\t\t\tif (base.min == null)\n\t\t\t\t\twsc.min = wsc.max = null;\n\t\t\t\telse {\n\t\t\t\t\tlet minMax = wsc.range(self, base.min, base.max, k);\n\t\t\t\t\twsc.min = minMax[0];\n\t\t\t\t\twsc.max = minMax[1];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlet changed = {};\n\t\tlet anyChanged = false;\n\n\t\tfor (let k in wipScales) {\n\t\t\tlet wsc = wipScales[k];\n\t\t\tlet sc = scales[k];\n\n\t\t\tif (sc.min != wsc.min || sc.max != wsc.max) {\n\t\t\t\tsc.min = wsc.min;\n\t\t\t\tsc.max = wsc.max;\n\n\t\t\t\tlet distr = sc.distr;\n\n\t\t\t\tsc._min = distr == 3 ? log10(sc.min) : distr == 4 ? asinh(sc.min, sc.asinh) : distr == 100 ? sc.fwd(sc.min) : sc.min;\n\t\t\t\tsc._max = distr == 3 ? log10(sc.max) : distr == 4 ? asinh(sc.max, sc.asinh) : distr == 100 ? sc.fwd(sc.max) : sc.max;\n\n\t\t\t\tchanged[k] = anyChanged = true;\n\t\t\t}\n\t\t}\n\n\t\tif (anyChanged) {\n\t\t\t// invalidate paths of all series on changed scales\n\t\t\tseries.forEach((s, i) => {\n\t\t\t\tif (mode == 2) {\n\t\t\t\t\tif (i > 0 && changed.y)\n\t\t\t\t\t\ts._paths = null;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (changed[s.scale])\n\t\t\t\t\t\ts._paths = null;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tfor (let k in changed) {\n\t\t\t\tshouldConvergeSize = true;\n\t\t\t\tfire(\"setScale\", k);\n\t\t\t}\n\n\t\t\tif (showCursor && cursor.left >= 0)\n\t\t\t\tshouldSetCursor = shouldSetLegend = true;\n\t\t}\n\n\t\tfor (let k in pendScales)\n\t\t\tpendScales[k] = null;\n\t}\n\n\t// grabs the nearest indices with y data outside of x-scale limits\n\tfunction getOuterIdxs(ydata) {\n\t\tlet _i0 = clamp(i0 - 1, 0, dataLen - 1);\n\t\tlet _i1 = clamp(i1 + 1, 0, dataLen - 1);\n\n\t\twhile (ydata[_i0] == null && _i0 > 0)\n\t\t\t_i0--;\n\n\t\twhile (ydata[_i1] == null && _i1 < dataLen - 1)\n\t\t\t_i1++;\n\n\t\treturn [_i0, _i1];\n\t}\n\n\tfunction drawSeries() {\n\t\tif (dataLen > 0) {\n\t\t\tlet shouldAlpha = series.some(s => s._focus) && ctxAlpha != focus.alpha;\n\n\t\t\tif (shouldAlpha)\n\t\t\t\tctx.globalAlpha = ctxAlpha = focus.alpha;\n\n\t\t\tseries.forEach((s, i) => {\n\t\t\t\tif (i > 0 && s.show) {\n\t\t\t\t\tcacheStrokeFill(i, false);\n\t\t\t\t\tcacheStrokeFill(i, true);\n\n\t\t\t\t\tif (s._paths == null) {\n\t\t\t\t\t\tlet _ctxAlpha = ctxAlpha;\n\n\t\t\t\t\t\tif (ctxAlpha != s.alpha)\n\t\t\t\t\t\t\tctx.globalAlpha = ctxAlpha = s.alpha;\n\n\t\t\t\t\t\tlet _idxs = mode == 2 ? [0, data[i][0].length - 1] : getOuterIdxs(data[i]);\n\t\t\t\t\t\ts._paths = s.paths(self, i, _idxs[0], _idxs[1]);\n\n\t\t\t\t\t\tif (ctxAlpha != _ctxAlpha)\n\t\t\t\t\t\t\tctx.globalAlpha = ctxAlpha = _ctxAlpha;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tseries.forEach((s, i) => {\n\t\t\t\tif (i > 0 && s.show) {\n\t\t\t\t\tlet _ctxAlpha = ctxAlpha;\n\n\t\t\t\t\tif (ctxAlpha != s.alpha)\n\t\t\t\t\t\tctx.globalAlpha = ctxAlpha = s.alpha;\n\n\t\t\t\t\ts._paths != null && drawPath(i, false);\n\n\t\t\t\t\t{\n\t\t\t\t\t\tlet _gaps = s._paths != null ? s._paths.gaps : null;\n\n\t\t\t\t\t\tlet show = s.points.show(self, i, i0, i1, _gaps);\n\t\t\t\t\t\tlet idxs = s.points.filter(self, i, show, _gaps);\n\n\t\t\t\t\t\tif (show || idxs) {\n\t\t\t\t\t\t\ts.points._paths = s.points.paths(self, i, i0, i1, idxs);\n\t\t\t\t\t\t\tdrawPath(i, true);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (ctxAlpha != _ctxAlpha)\n\t\t\t\t\t\tctx.globalAlpha = ctxAlpha = _ctxAlpha;\n\n\t\t\t\t\tfire(\"drawSeries\", i);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (shouldAlpha)\n\t\t\t\tctx.globalAlpha = ctxAlpha = 1;\n\t\t}\n\t}\n\n\tfunction cacheStrokeFill(si, _points) {\n\t\tlet s = _points ? series[si].points : series[si];\n\n\t\ts._stroke = s.stroke(self, si);\n\t\ts._fill   = s.fill(self, si);\n\t}\n\n\tfunction drawPath(si, _points) {\n\t\tlet s = _points ? series[si].points : series[si];\n\n\t\tlet {\n\t\t\tstroke,\n\t\t\tfill,\n\t\t\tclip: gapsClip,\n\t\t\tflags,\n\n\t\t\t_stroke: strokeStyle = s._stroke,\n\t\t\t_fill:   fillStyle   = s._fill,\n\t\t\t_width:  width       = s.width,\n\t\t} = s._paths;\n\n\t\twidth = roundDec(width * pxRatio, 3);\n\n\t\tlet boundsClip = null;\n\t\tlet offset = (width % 2) / 2;\n\n\t\tif (_points && fillStyle == null)\n\t\t\tfillStyle = width > 0 ? \"#fff\" : strokeStyle;\n\n\t\tlet _pxAlign = s.pxAlign == 1 && offset > 0;\n\n\t\t_pxAlign && ctx.translate(offset, offset);\n\n\t\tif (!_points) {\n\t\t\tlet lft = plotLft - width / 2,\n\t\t\t\ttop = plotTop - width / 2,\n\t\t\t\twid = plotWid + width,\n\t\t\t\thgt = plotHgt + width;\n\n\t\t\tboundsClip = new Path2D();\n\t\t\tboundsClip.rect(lft, top, wid, hgt);\n\t\t}\n\n\t\t// the points pathbuilder's gapsClip is its boundsClip, since points dont need gaps clipping, and bounds depend on point size\n\t\tif (_points)\n\t\t\tstrokeFill(strokeStyle, width, s.dash, s.cap, fillStyle, stroke, fill, flags, gapsClip);\n\t\telse\n\t\t\tfillStroke(si, strokeStyle, width, s.dash, s.cap, fillStyle, stroke, fill, flags, boundsClip, gapsClip);\n\n\t\t_pxAlign && ctx.translate(-offset, -offset);\n\t}\n\n\tfunction fillStroke(si, strokeStyle, lineWidth, lineDash, lineCap, fillStyle, strokePath, fillPath, flags, boundsClip, gapsClip) {\n\t\tlet didStrokeFill = false;\n\n\t\t// for all bands where this series is the top edge, create upwards clips using the bottom edges\n\t\t// and apply clips + fill with band fill or dfltFill\n\t\tflags != 0 && bands.forEach((b, bi) => {\n\t\t\t// isUpperEdge?\n\t\t\tif (b.series[0] == si) {\n\t\t\t\tlet lowerEdge = series[b.series[1]];\n\t\t\t\tlet lowerData = data[b.series[1]];\n\n\t\t\t\tlet bandClip = (lowerEdge._paths || EMPTY_OBJ).band;\n\n\t\t\t\tif (isArr(bandClip))\n\t\t\t\t\tbandClip = b.dir == 1 ? bandClip[0] : bandClip[1];\n\n\t\t\t\tlet gapsClip2;\n\n\t\t\t\tlet _fillStyle = null;\n\n\t\t\t\t// hasLowerEdge?\n\t\t\t\tif (lowerEdge.show && bandClip && hasData(lowerData, i0, i1)) {\n\t\t\t\t\t_fillStyle = b.fill(self, bi) || fillStyle;\n\t\t\t\t\tgapsClip2 = lowerEdge._paths.clip;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tbandClip = null;\n\n\t\t\t\tstrokeFill(strokeStyle, lineWidth, lineDash, lineCap, _fillStyle, strokePath, fillPath, flags, boundsClip, gapsClip, gapsClip2, bandClip);\n\n\t\t\t\tdidStrokeFill = true;\n\t\t\t}\n\t\t});\n\n\t\tif (!didStrokeFill)\n\t\t\tstrokeFill(strokeStyle, lineWidth, lineDash, lineCap, fillStyle, strokePath, fillPath, flags, boundsClip, gapsClip);\n\t}\n\n\tconst CLIP_FILL_STROKE = BAND_CLIP_FILL | BAND_CLIP_STROKE;\n\n\tfunction strokeFill(strokeStyle, lineWidth, lineDash, lineCap, fillStyle, strokePath, fillPath, flags, boundsClip, gapsClip, gapsClip2, bandClip) {\n\t\tsetCtxStyle(strokeStyle, lineWidth, lineDash, lineCap, fillStyle);\n\n\t\tif (boundsClip || gapsClip || bandClip) {\n\t\t\tctx.save();\n\t\t\tboundsClip && ctx.clip(boundsClip);\n\t\t\tgapsClip && ctx.clip(gapsClip);\n\t\t}\n\n\t\tif (bandClip) {\n\t\t\tif ((flags & CLIP_FILL_STROKE) == CLIP_FILL_STROKE) {\n\t\t\t\tctx.clip(bandClip);\n\t\t\t\tgapsClip2 && ctx.clip(gapsClip2);\n\t\t\t\tdoFill(fillStyle, fillPath);\n\t\t\t\tdoStroke(strokeStyle, strokePath, lineWidth);\n\t\t\t}\n\t\t\telse if (flags & BAND_CLIP_STROKE) {\n\t\t\t\tdoFill(fillStyle, fillPath);\n\t\t\t\tctx.clip(bandClip);\n\t\t\t\tdoStroke(strokeStyle, strokePath, lineWidth);\n\t\t\t}\n\t\t\telse if (flags & BAND_CLIP_FILL) {\n\t\t\t\tctx.save();\n\t\t\t\tctx.clip(bandClip);\n\t\t\t\tgapsClip2 && ctx.clip(gapsClip2);\n\t\t\t\tdoFill(fillStyle, fillPath);\n\t\t\t\tctx.restore();\n\t\t\t\tdoStroke(strokeStyle, strokePath, lineWidth);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tdoFill(fillStyle, fillPath);\n\t\t\tdoStroke(strokeStyle, strokePath, lineWidth);\n\t\t}\n\n\t\tif (boundsClip || gapsClip || bandClip)\n\t\t\tctx.restore();\n\t}\n\n\tfunction doStroke(strokeStyle, strokePath, lineWidth) {\n\t\tif (lineWidth > 0) {\n\t\t\tif (strokePath instanceof Map) {\n\t\t\t\tstrokePath.forEach((strokePath, strokeStyle) => {\n\t\t\t\t\tctx.strokeStyle = ctxStroke = strokeStyle;\n\t\t\t\t\tctx.stroke(strokePath);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse\n\t\t\t\tstrokePath != null && strokeStyle && ctx.stroke(strokePath);\n\t\t}\n\t}\n\n\tfunction doFill(fillStyle, fillPath) {\n\t\tif (fillPath instanceof Map) {\n\t\t\tfillPath.forEach((fillPath, fillStyle) => {\n\t\t\t\tctx.fillStyle = ctxFill = fillStyle;\n\t\t\t\tctx.fill(fillPath);\n\t\t\t});\n\t\t}\n\t\telse\n\t\t\tfillPath != null && fillStyle && ctx.fill(fillPath);\n\t}\n\n\tfunction getIncrSpace(axisIdx, min, max, fullDim) {\n\t\tlet axis = axes[axisIdx];\n\n\t\tlet incrSpace;\n\n\t\tif (fullDim <= 0)\n\t\t\tincrSpace = [0, 0];\n\t\telse {\n\t\t\tlet minSpace = axis._space = axis.space(self, axisIdx, min, max, fullDim);\n\t\t\tlet incrs    = axis._incrs = axis.incrs(self, axisIdx, min, max, fullDim, minSpace);\n\t\t\tincrSpace    = findIncr(min, max, incrs, fullDim, minSpace);\n\t\t}\n\n\t\treturn (axis._found = incrSpace);\n\t}\n\n\tfunction drawOrthoLines(offs, filts, ori, side, pos0, len, width, stroke, dash, cap) {\n\t\tlet offset = (width % 2) / 2;\n\n\t\tpxAlign == 1 && ctx.translate(offset, offset);\n\n\t\tsetCtxStyle(stroke, width, dash, cap, stroke);\n\n\t\tctx.beginPath();\n\n\t\tlet x0, y0, x1, y1, pos1 = pos0 + (side == 0 || side == 3 ? -len : len);\n\n\t\tif (ori == 0) {\n\t\t\ty0 = pos0;\n\t\t\ty1 = pos1;\n\t\t}\n\t\telse {\n\t\t\tx0 = pos0;\n\t\t\tx1 = pos1;\n\t\t}\n\n\t\tfor (let i = 0; i < offs.length; i++) {\n\t\t\tif (filts[i] != null) {\n\t\t\t\tif (ori == 0)\n\t\t\t\t\tx0 = x1 = offs[i];\n\t\t\t\telse\n\t\t\t\t\ty0 = y1 = offs[i];\n\n\t\t\t\tctx.moveTo(x0, y0);\n\t\t\t\tctx.lineTo(x1, y1);\n\t\t\t}\n\t\t}\n\n\t\tctx.stroke();\n\n\t\tpxAlign == 1 && ctx.translate(-offset, -offset);\n\t}\n\n\tfunction axesCalc(cycleNum) {\n\t//\tlog(\"axesCalc()\", arguments);\n\n\t\tlet converged = true;\n\n\t\taxes.forEach((axis, i) => {\n\t\t\tif (!axis.show)\n\t\t\t\treturn;\n\n\t\t\tlet scale = scales[axis.scale];\n\n\t\t\tif (scale.min == null) {\n\t\t\t\tif (axis._show) {\n\t\t\t\t\tconverged = false;\n\t\t\t\t\taxis._show = false;\n\t\t\t\t\tresetYSeries(false);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (!axis._show) {\n\t\t\t\t\tconverged = false;\n\t\t\t\t\taxis._show = true;\n\t\t\t\t\tresetYSeries(false);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet side = axis.side;\n\t\t\tlet ori = side % 2;\n\n\t\t\tlet {min, max} = scale;\t\t// \t\t// should this toggle them ._show = false\n\n\t\t\tlet [_incr, _space] = getIncrSpace(i, min, max, ori == 0 ? plotWidCss : plotHgtCss);\n\n\t\t\tif (_space == 0)\n\t\t\t\treturn;\n\n\t\t\t// if we're using index positions, force first tick to match passed index\n\t\t\tlet forceMin = scale.distr == 2;\n\n\t\t\tlet _splits = axis._splits = axis.splits(self, i, min, max, _incr, _space, forceMin);\n\n\t\t\t// tick labels\n\t\t\t// BOO this assumes a specific data/series\n\t\t\tlet splits = scale.distr == 2 ? _splits.map(i => data0[i]) : _splits;\n\t\t\tlet incr   = scale.distr == 2 ? data0[_splits[1]] - data0[_splits[0]] : _incr;\n\n\t\t\tlet values = axis._values = axis.values(self, axis.filter(self, splits, i, _space, incr), i, _space, incr);\n\n\t\t\t// rotating of labels only supported on bottom x axis\n\t\t\taxis._rotate = side == 2 ? axis.rotate(self, values, i, _space) : 0;\n\n\t\t\tlet oldSize = axis._size;\n\n\t\t\taxis._size = ceil(axis.size(self, values, i, cycleNum));\n\n\t\t\tif (oldSize != null && axis._size != oldSize)\t\t\t// ready && ?\n\t\t\t\tconverged = false;\n\t\t});\n\n\t\treturn converged;\n\t}\n\n\tfunction paddingCalc(cycleNum) {\n\t\tlet converged = true;\n\n\t\tpadding.forEach((p, i) => {\n\t\t\tlet _p = p(self, i, sidesWithAxes, cycleNum);\n\n\t\t\tif (_p != _padding[i])\n\t\t\t\tconverged = false;\n\n\t\t\t_padding[i] = _p;\n\t\t});\n\n\t\treturn converged;\n\t}\n\n\tfunction drawAxesGrid() {\n\t\tfor (let i = 0; i < axes.length; i++) {\n\t\t\tlet axis = axes[i];\n\n\t\t\tif (!axis.show || !axis._show)\n\t\t\t\tcontinue;\n\n\t\t\tlet side = axis.side;\n\t\t\tlet ori = side % 2;\n\n\t\t\tlet x, y;\n\n\t\t\tlet fillStyle = axis.stroke(self, i);\n\n\t\t\tlet shiftDir = side == 0 || side == 3 ? -1 : 1;\n\n\t\t\tlet [_incr, _space] = axis._found;\n\n\t\t\t// axis label\n\t\t\tif (axis.label != null) {\n\t\t\t\tlet shiftAmt = axis.labelGap * shiftDir;\n\t\t\t\tlet baseLpos = round((axis._lpos + shiftAmt) * pxRatio);\n\n\t\t\t\tsetFontStyle(axis.labelFont[0], fillStyle, \"center\", side == 2 ? TOP : BOTTOM);\n\n\t\t\t\tctx.save();\n\n\t\t\t\tif (ori == 1) {\n\t\t\t\t\tx = y = 0;\n\n\t\t\t\t\tctx.translate(\n\t\t\t\t\t\tbaseLpos,\n\t\t\t\t\t\tround(plotTop + plotHgt / 2),\n\t\t\t\t\t);\n\t\t\t\t\tctx.rotate((side == 3 ? -PI : PI) / 2);\n\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tx = round(plotLft + plotWid / 2);\n\t\t\t\t\ty = baseLpos;\n\t\t\t\t}\n\n\t\t\t\tlet _label = isFn(axis.label) ? axis.label(self, i, _incr, _space) : axis.label;\n\n\t\t\t\tctx.fillText(_label, x, y);\n\n\t\t\t\tctx.restore();\n\t\t\t}\n\n\t\t\tif (_space == 0)\n\t\t\t\tcontinue;\n\n\t\t\tlet scale = scales[axis.scale];\n\n\t\t\tlet plotDim = ori == 0 ? plotWid : plotHgt;\n\t\t\tlet plotOff = ori == 0 ? plotLft : plotTop;\n\n\t\t\tlet _splits = axis._splits;\n\n\t\t\t// tick labels\n\t\t\t// BOO this assumes a specific data/series\n\t\t\tlet splits = scale.distr == 2 ? _splits.map(i => data0[i]) : _splits;\n\t\t\tlet incr   = scale.distr == 2 ? data0[_splits[1]] - data0[_splits[0]] : _incr;\n\n\t\t\tlet ticks = axis.ticks;\n\t\t\tlet border = axis.border;\n\t\t\tlet _tickSize = ticks.show ? ticks.size : 0;\n\t\t\tlet tickSize = round(_tickSize * pxRatio);\n\t\t\tlet axisGap = round((axis.alignTo == 2 ? axis._size - _tickSize - axis.gap : axis.gap) * pxRatio);\n\n\t\t\t// rotating of labels only supported on bottom x axis\n\t\t\tlet angle = axis._rotate * -PI/180;\n\n\t\t\tlet basePos  = pxRound(axis._pos * pxRatio);\n\t\t\tlet shiftAmt = (tickSize + axisGap) * shiftDir;\n\t\t\tlet finalPos = basePos + shiftAmt;\n\t\t\t    y        = ori == 0 ? finalPos : 0;\n\t\t\t    x        = ori == 1 ? finalPos : 0;\n\n\t\t\tlet font         = axis.font[0];\n\t\t\tlet textAlign    = axis.align == 1 ? LEFT :\n\t\t\t                   axis.align == 2 ? RIGHT :\n\t\t\t                   angle > 0 ? LEFT :\n\t\t\t                   angle < 0 ? RIGHT :\n\t\t\t                   ori == 0 ? \"center\" : side == 3 ? RIGHT : LEFT;\n\t\t\tlet textBaseline = angle ||\n\t\t\t                   ori == 1 ? \"middle\" : side == 2 ? TOP   : BOTTOM;\n\n\t\t\tsetFontStyle(font, fillStyle, textAlign, textBaseline);\n\n\t\t\tlet lineHeight = axis.font[1] * axis.lineGap;\n\n\t\t\tlet canOffs = _splits.map(val => pxRound(getPos(val, scale, plotDim, plotOff)));\n\n\t\t\tlet _values = axis._values;\n\n\t\t\tfor (let i = 0; i < _values.length; i++) {\n\t\t\t\tlet val = _values[i];\n\n\t\t\t\tif (val != null) {\n\t\t\t\t\tif (ori == 0)\n\t\t\t\t\t\tx = canOffs[i];\n\t\t\t\t\telse\n\t\t\t\t\t\ty = canOffs[i];\n\n\t\t\t\t\tval = \"\" + val;\n\n\t\t\t\t\tlet _parts = val.indexOf(\"\\n\") == -1 ? [val] : val.split(/\\n/gm);\n\n\t\t\t\t\tfor (let j = 0; j < _parts.length; j++) {\n\t\t\t\t\t\tlet text = _parts[j];\n\n\t\t\t\t\t\tif (angle) {\n\t\t\t\t\t\t\tctx.save();\n\t\t\t\t\t\t\tctx.translate(x, y + j * lineHeight); // can this be replaced with position math?\n\t\t\t\t\t\t\tctx.rotate(angle); // can this be done once?\n\t\t\t\t\t\t\tctx.fillText(text, 0, 0);\n\t\t\t\t\t\t\tctx.restore();\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tctx.fillText(text, x, y + j * lineHeight);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// ticks\n\t\t\tif (ticks.show) {\n\t\t\t\tdrawOrthoLines(\n\t\t\t\t\tcanOffs,\n\t\t\t\t\tticks.filter(self, splits, i, _space, incr),\n\t\t\t\t\tori,\n\t\t\t\t\tside,\n\t\t\t\t\tbasePos,\n\t\t\t\t\ttickSize,\n\t\t\t\t\troundDec(ticks.width * pxRatio, 3),\n\t\t\t\t\tticks.stroke(self, i),\n\t\t\t\t\tticks.dash,\n\t\t\t\t\tticks.cap,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// grid\n\t\t\tlet grid = axis.grid;\n\n\t\t\tif (grid.show) {\n\t\t\t\tdrawOrthoLines(\n\t\t\t\t\tcanOffs,\n\t\t\t\t\tgrid.filter(self, splits, i, _space, incr),\n\t\t\t\t\tori,\n\t\t\t\t\tori == 0 ? 2 : 1,\n\t\t\t\t\tori == 0 ? plotTop : plotLft,\n\t\t\t\t\tori == 0 ? plotHgt : plotWid,\n\t\t\t\t\troundDec(grid.width * pxRatio, 3),\n\t\t\t\t\tgrid.stroke(self, i),\n\t\t\t\t\tgrid.dash,\n\t\t\t\t\tgrid.cap,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (border.show) {\n\t\t\t\tdrawOrthoLines(\n\t\t\t\t\t[basePos],\n\t\t\t\t\t[1],\n\t\t\t\t\tori == 0 ? 1 : 0,\n\t\t\t\t\tori == 0 ? 1 : 2,\n\t\t\t\t\tori == 1 ? plotTop : plotLft,\n\t\t\t\t\tori == 1 ? plotHgt : plotWid,\n\t\t\t\t\troundDec(border.width * pxRatio, 3),\n\t\t\t\t\tborder.stroke(self, i),\n\t\t\t\t\tborder.dash,\n\t\t\t\t\tborder.cap,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tfire(\"drawAxes\");\n\t}\n\n\tfunction resetYSeries(minMax) {\n\t//\tlog(\"resetYSeries()\", arguments);\n\n\t\tseries.forEach((s, i) => {\n\t\t\tif (i > 0) {\n\t\t\t\ts._paths = null;\n\n\t\t\t\tif (minMax) {\n\t\t\t\t\tif (mode == 1) {\n\t\t\t\t\t\ts.min = null;\n\t\t\t\t\t\ts.max = null;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\ts.facets.forEach(f => {\n\t\t\t\t\t\t\tf.min = null;\n\t\t\t\t\t\t\tf.max = null;\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tlet queuedCommit = false;\n\tlet deferHooks = false;\n\tlet hooksQueue = [];\n\n\tfunction flushHooks() {\n\t\tdeferHooks = false;\n\n\t\tfor (let i = 0; i < hooksQueue.length; i++)\n\t\t\tfire(...hooksQueue[i]);\n\n\t\thooksQueue.length = 0;\n\t}\n\n\tfunction commit() {\n\t\tif (!queuedCommit) {\n\t\t\tmicroTask(_commit);\n\t\t\tqueuedCommit = true;\n\t\t}\n\t}\n\n\t// manual batching (aka immediate mode), skips microtask queue\n\tfunction batch(fn, _deferHooks = false) {\n\t\tqueuedCommit = true;\n\t\tdeferHooks = _deferHooks;\n\n\t\tfn(self);\n\t\t_commit();\n\n\t\tif (_deferHooks && hooksQueue.length > 0)\n\t\t\tqueueMicrotask(flushHooks);\n\t}\n\n\tself.batch = batch;\n\n\tfunction _commit() {\n\t//\tlog(\"_commit()\", arguments);\n\n\t\tif (shouldSetScales) {\n\t\t\tsetScales();\n\t\t\tshouldSetScales = false;\n\t\t}\n\n\t\tif (shouldConvergeSize) {\n\t\t\tconvergeSize();\n\t\t\tshouldConvergeSize = false;\n\t\t}\n\n\t\tif (shouldSetSize) {\n\t\t\tsetStylePx(under, LEFT,   plotLftCss);\n\t\t\tsetStylePx(under, TOP,    plotTopCss);\n\t\t\tsetStylePx(under, WIDTH,  plotWidCss);\n\t\t\tsetStylePx(under, HEIGHT, plotHgtCss);\n\n\t\t\tsetStylePx(over, LEFT,    plotLftCss);\n\t\t\tsetStylePx(over, TOP,     plotTopCss);\n\t\t\tsetStylePx(over, WIDTH,   plotWidCss);\n\t\t\tsetStylePx(over, HEIGHT,  plotHgtCss);\n\n\t\t\tsetStylePx(wrap, WIDTH,   fullWidCss);\n\t\t\tsetStylePx(wrap, HEIGHT,  fullHgtCss);\n\n\t\t\t// NOTE: mutating this during print preview in Chrome forces transparent\n\t\t\t// canvas pixels to white, even when followed up with clearRect() below\n\t\t\tcan.width  = round(fullWidCss * pxRatio);\n\t\t\tcan.height = round(fullHgtCss * pxRatio);\n\n\t\t\taxes.forEach(({ _el, _show, _size, _pos, side }) => {\n\t\t\t\tif (_el != null) {\n\t\t\t\t\tif (_show) {\n\t\t\t\t\t\tlet posOffset = (side === 3 || side === 0 ? _size : 0);\n\t\t\t\t\t\tlet isVt = side % 2 == 1;\n\n\t\t\t\t\t\tsetStylePx(_el, isVt ? \"left\"   : \"top\",    _pos - posOffset);\n\t\t\t\t\t\tsetStylePx(_el, isVt ? \"width\"  : \"height\", _size);\n\t\t\t\t\t\tsetStylePx(_el, isVt ? \"top\"    : \"left\",   isVt ? plotTopCss : plotLftCss);\n\t\t\t\t\t\tsetStylePx(_el, isVt ? \"height\" : \"width\",  isVt ? plotHgtCss : plotWidCss);\n\n\t\t\t\t\t\tremClass(_el, OFF);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\taddClass(_el, OFF);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// invalidate ctx style cache\n\t\t\tctxStroke = ctxFill = ctxWidth = ctxJoin = ctxCap = ctxFont = ctxAlign = ctxBaseline = ctxDash = null;\n\t\t\tctxAlpha = 1;\n\n\t\t\tsyncRect(true);\n\n\t\t\tif (\n\t\t\t\tplotLftCss != _plotLftCss ||\n\t\t\t\tplotTopCss != _plotTopCss ||\n\t\t\t\tplotWidCss != _plotWidCss ||\n\t\t\t\tplotHgtCss != _plotHgtCss\n\t\t\t) {\n\t\t\t\tresetYSeries(false);\n\n\t\t\t\tlet pctWid = plotWidCss / _plotWidCss;\n\t\t\t\tlet pctHgt = plotHgtCss / _plotHgtCss;\n\n\t\t\t\tif (showCursor && !shouldSetCursor && cursor.left >= 0) {\n\t\t\t\t\tcursor.left *= pctWid;\n\t\t\t\t\tcursor.top  *= pctHgt;\n\n\t\t\t\t\tvCursor && elTrans(vCursor, round(cursor.left), 0, plotWidCss, plotHgtCss);\n\t\t\t\t\thCursor && elTrans(hCursor, 0, round(cursor.top), plotWidCss, plotHgtCss);\n\n\t\t\t\t\tfor (let i = 0; i < cursorPts.length; i++) {\n\t\t\t\t\t\tlet pt = cursorPts[i];\n\n\t\t\t\t\t\tif (pt != null) {\n\t\t\t\t\t\t\tcursorPtsLft[i] *= pctWid;\n\t\t\t\t\t\t\tcursorPtsTop[i] *= pctHgt;\n\t\t\t\t\t\t\telTrans(pt, ceil(cursorPtsLft[i]), ceil(cursorPtsTop[i]), plotWidCss, plotHgtCss);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (select.show && !shouldSetSelect && select.left >= 0 && select.width > 0) {\n\t\t\t\t\tselect.left   *= pctWid;\n\t\t\t\t\tselect.width  *= pctWid;\n\t\t\t\t\tselect.top    *= pctHgt;\n\t\t\t\t\tselect.height *= pctHgt;\n\n\t\t\t\t\tfor (let prop in _hideProps)\n\t\t\t\t\t\tsetStylePx(selectDiv, prop, select[prop]);\n\t\t\t\t}\n\n\t\t\t\t_plotLftCss = plotLftCss;\n\t\t\t\t_plotTopCss = plotTopCss;\n\t\t\t\t_plotWidCss = plotWidCss;\n\t\t\t\t_plotHgtCss = plotHgtCss;\n\t\t\t}\n\n\t\t\tfire(\"setSize\");\n\n\t\t\tshouldSetSize = false;\n\t\t}\n\n\t\tif (fullWidCss > 0 && fullHgtCss > 0) {\n\t\t\tctx.clearRect(0, 0, can.width, can.height);\n\t\t\tfire(\"drawClear\");\n\t\t\tdrawOrder.forEach(fn => fn());\n\t\t\tfire(\"draw\");\n\t\t}\n\n\t\tif (select.show && shouldSetSelect) {\n\t\t\tsetSelect(select);\n\t\t\tshouldSetSelect = false;\n\t\t}\n\n\t\tif (showCursor && shouldSetCursor) {\n\t\t\tupdateCursor(null, true, false);\n\t\t\tshouldSetCursor = false;\n\t\t}\n\n\t\tif (legend.show && legend.live && shouldSetLegend) {\n\t\t\tsetLegend();\n\t\t\tshouldSetLegend = false; // redundant currently\n\t\t}\n\n\t\tif (!ready) {\n\t\t\tready = true;\n\t\t\tself.status = 1;\n\n\t\t\tfire(\"ready\");\n\t\t}\n\n\t\tviaAutoScaleX = false;\n\n\t\tqueuedCommit = false;\n\t}\n\n\tself.redraw = (rebuildPaths, recalcAxes) => {\n\t\tshouldConvergeSize = recalcAxes || false;\n\n\t\tif (rebuildPaths !== false)\n\t\t\t_setScale(xScaleKey, scaleX.min, scaleX.max);\n\t\telse\n\t\t\tcommit();\n\t};\n\n\t// redraw() => setScale('x', scales.x.min, scales.x.max);\n\n\t// explicit, never re-ranged (is this actually true? for x and y)\n\tfunction setScale(key, opts) {\n\t\tlet sc = scales[key];\n\n\t\tif (sc.from == null) {\n\t\t\tif (dataLen == 0) {\n\t\t\t\tlet minMax = sc.range(self, opts.min, opts.max, key);\n\t\t\t\topts.min = minMax[0];\n\t\t\t\topts.max = minMax[1];\n\t\t\t}\n\n\t\t\tif (opts.min > opts.max) {\n\t\t\t\tlet _min = opts.min;\n\t\t\t\topts.min = opts.max;\n\t\t\t\topts.max = _min;\n\t\t\t}\n\n\t\t\tif (dataLen > 1 && opts.min != null && opts.max != null && opts.max - opts.min < 1e-16)\n\t\t\t\treturn;\n\n\t\t\tif (key == xScaleKey) {\n\t\t\t\tif (sc.distr == 2 && dataLen > 0) {\n\t\t\t\t\topts.min = closestIdx(opts.min, data[0]);\n\t\t\t\t\topts.max = closestIdx(opts.max, data[0]);\n\n\t\t\t\t\tif (opts.min == opts.max)\n\t\t\t\t\t\topts.max++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t//\tlog(\"setScale()\", arguments);\n\n\t\t\tpendScales[key] = opts;\n\n\t\t\tshouldSetScales = true;\n\t\t\tcommit();\n\t\t}\n\t}\n\n\tself.setScale = setScale;\n\n//\tINTERACTION\n\n\tlet xCursor;\n\tlet yCursor;\n\tlet vCursor;\n\tlet hCursor;\n\n\t// starting position before cursor.move\n\tlet rawMouseLeft0;\n\tlet rawMouseTop0;\n\n\t// starting position\n\tlet mouseLeft0;\n\tlet mouseTop0;\n\n\t// current position before cursor.move\n\tlet rawMouseLeft1;\n\tlet rawMouseTop1;\n\n\t// current position\n\tlet mouseLeft1;\n\tlet mouseTop1;\n\n\tlet dragging = false;\n\n\tconst drag = cursor.drag;\n\n\tlet dragX = drag.x;\n\tlet dragY = drag.y;\n\n\tif (showCursor) {\n\t\tif (cursor.x)\n\t\t\txCursor = placeDiv(CURSOR_X, over);\n\t\tif (cursor.y)\n\t\t\tyCursor = placeDiv(CURSOR_Y, over);\n\n\t\tif (scaleX.ori == 0) {\n\t\t\tvCursor = xCursor;\n\t\t\thCursor = yCursor;\n\t\t}\n\t\telse {\n\t\t\tvCursor = yCursor;\n\t\t\thCursor = xCursor;\n\t\t}\n\n\t\tmouseLeft1 = cursor.left;\n\t\tmouseTop1 = cursor.top;\n\t}\n\n\tconst select = self.select = assign({\n\t\tshow:   true,\n\t\tover:   true,\n\t\tleft:   0,\n\t\twidth:  0,\n\t\ttop:    0,\n\t\theight: 0,\n\t}, opts.select);\n\n\tconst selectDiv = select.show ? placeDiv(SELECT, select.over ? over : under) : null;\n\n\tfunction setSelect(opts, _fire) {\n\t\tif (select.show) {\n\t\t\tfor (let prop in opts) {\n\t\t\t\tselect[prop] = opts[prop];\n\n\t\t\t\tif (prop in _hideProps)\n\t\t\t\t\tsetStylePx(selectDiv, prop, opts[prop]);\n\t\t\t}\n\n\t\t\t_fire !== false && fire(\"setSelect\");\n\t\t}\n\t}\n\n\tself.setSelect = setSelect;\n\n\tfunction toggleDOM(i) {\n\t\tlet s = series[i];\n\n\t\tif (s.show)\n\t\t\tshowLegend && remClass(legendRows[i], OFF);\n\t\telse {\n\t\t\tshowLegend && addClass(legendRows[i], OFF);\n\n\t\t\tif (showCursor) {\n\t\t\t\tlet pt = cursorOnePt ? cursorPts[0] : cursorPts[i];\n\t\t\t\tpt != null && elTrans(pt, -10, -10, plotWidCss, plotHgtCss);\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction _setScale(key, min, max) {\n\t\tsetScale(key, {min, max});\n\t}\n\n\tfunction setSeries(i, opts, _fire, _pub) {\n\t//\tlog(\"setSeries()\", arguments);\n\n\t\tif (opts.focus != null)\n\t\t\tsetFocus(i);\n\n\t\tif (opts.show != null) {\n\t\t\tseries.forEach((s, si) => {\n\t\t\t\tif (si > 0 && (i == si || i == null)) {\n\t\t\t\t\ts.show = opts.show;\n\t\t\t\t\ttoggleDOM(si);\n\n\t\t\t\t\tif (mode == 2) {\n\t\t\t\t\t\t_setScale(s.facets[0].scale, null, null);\n\t\t\t\t\t\t_setScale(s.facets[1].scale, null, null);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\t_setScale(s.scale, null, null);\n\n\t\t\t\t\tcommit();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\t_fire !== false && fire(\"setSeries\", i, opts);\n\n\t\t_pub && pubSync(\"setSeries\", self, i, opts);\n\t}\n\n\tself.setSeries = setSeries;\n\n\tfunction setBand(bi, opts) {\n\t\tassign(bands[bi], opts);\n\t}\n\n\tfunction addBand(opts, bi) {\n\t\topts.fill = fnOrSelf(opts.fill || null);\n\t\topts.dir = ifNull(opts.dir, -1);\n\t\tbi = bi == null ? bands.length : bi;\n\t\tbands.splice(bi, 0, opts);\n\t}\n\n\tfunction delBand(bi) {\n\t\tif (bi == null)\n\t\t\tbands.length = 0;\n\t\telse\n\t\t\tbands.splice(bi, 1);\n\t}\n\n\tself.addBand = addBand;\n\tself.setBand = setBand;\n\tself.delBand = delBand;\n\n\tfunction setAlpha(i, value) {\n\t\tseries[i].alpha = value;\n\n\t\tif (showCursor && cursorPts[i] != null)\n\t\t\tcursorPts[i].style.opacity = value;\n\n\t\tif (showLegend && legendRows[i])\n\t\t\tlegendRows[i].style.opacity = value;\n\t}\n\n\t// y-distance\n\tlet closestDist;\n\tlet closestSeries;\n\tlet focusedSeries;\n\tconst FOCUS_TRUE  = {focus: true};\n\n\tfunction setFocus(i) {\n\t\tif (i != focusedSeries) {\n\t\t//\tlog(\"setFocus()\", arguments);\n\n\t\t\tlet allFocused = i == null;\n\n\t\t\tlet _setAlpha = focus.alpha != 1;\n\n\t\t\tseries.forEach((s, i2) => {\n\t\t\t\tif (mode == 1 || i2 > 0) {\n\t\t\t\t\tlet isFocused = allFocused || i2 == 0 || i2 == i;\n\t\t\t\t\ts._focus = allFocused ? null : isFocused;\n\t\t\t\t\t_setAlpha && setAlpha(i2, isFocused ? 1 : focus.alpha);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tfocusedSeries = i;\n\t\t\t_setAlpha && commit();\n\t\t}\n\t}\n\n\tif (showLegend && cursorFocus) {\n\t\tonMouse(mouseleave, legendTable, e => {\n\t\t\tif (cursor._lock)\n\t\t\t\treturn;\n\n\t\t\tsetCursorEvent(e);\n\n\t\t\tif (focusedSeries != null)\n\t\t\t\tsetSeries(null, FOCUS_TRUE, true, syncOpts.setSeries);\n\t\t});\n\t}\n\n\tfunction posToVal(pos, scale, can) {\n\t\tlet sc = scales[scale];\n\n\t\tif (can)\n\t\t\tpos = pos / pxRatio - (sc.ori == 1 ? plotTopCss : plotLftCss);\n\n\t\tlet dim = plotWidCss;\n\n\t\tif (sc.ori == 1) {\n\t\t\tdim = plotHgtCss;\n\t\t\tpos = dim - pos;\n\t\t}\n\n\t\tif (sc.dir == -1)\n\t\t\tpos = dim - pos;\n\n\t\tlet _min = sc._min,\n\t\t\t_max = sc._max,\n\t\t\tpct = pos / dim;\n\n\t\tlet sv = _min + (_max - _min) * pct;\n\n\t\tlet distr = sc.distr;\n\n\t\treturn (\n\t\t\tdistr == 3 ? pow(10, sv) :\n\t\t\tdistr == 4 ? sinh(sv, sc.asinh) :\n\t\t\tdistr == 100 ? sc.bwd(sv) :\n\t\t\tsv\n\t\t);\n\t}\n\n\tfunction closestIdxFromXpos(pos, can) {\n\t\tlet v = posToVal(pos, xScaleKey, can);\n\t\treturn closestIdx(v, data[0], i0, i1);\n\t}\n\n\tself.valToIdx = val => closestIdx(val, data[0]);\n\tself.posToIdx = closestIdxFromXpos;\n\tself.posToVal = posToVal;\n\tself.valToPos = (val, scale, can) => (\n\t\tscales[scale].ori == 0 ?\n\t\tgetHPos(val, scales[scale],\n\t\t\tcan ? plotWid : plotWidCss,\n\t\t\tcan ? plotLft : 0,\n\t\t) :\n\t\tgetVPos(val, scales[scale],\n\t\t\tcan ? plotHgt : plotHgtCss,\n\t\t\tcan ? plotTop : 0,\n\t\t)\n\t);\n\n\tself.setCursor = (opts, _fire, _pub) => {\n\t\tmouseLeft1 = opts.left;\n\t\tmouseTop1 = opts.top;\n\t//\tassign(cursor, opts);\n\t\tupdateCursor(null, _fire, _pub);\n\t};\n\n\tfunction setSelH(off, dim) {\n\t\tsetStylePx(selectDiv, LEFT,  select.left = off);\n\t\tsetStylePx(selectDiv, WIDTH, select.width = dim);\n\t}\n\n\tfunction setSelV(off, dim) {\n\t\tsetStylePx(selectDiv, TOP,    select.top = off);\n\t\tsetStylePx(selectDiv, HEIGHT, select.height = dim);\n\t}\n\n\tlet setSelX = scaleX.ori == 0 ? setSelH : setSelV;\n\tlet setSelY = scaleX.ori == 1 ? setSelH : setSelV;\n\n\tfunction syncLegend() {\n\t\tif (showLegend && legend.live) {\n\t\t\tfor (let i = mode == 2 ? 1 : 0; i < series.length; i++) {\n\t\t\t\tif (i == 0 && multiValLegend)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tlet vals = legend.values[i];\n\n\t\t\t\tlet j = 0;\n\n\t\t\t\tfor (let k in vals)\n\t\t\t\t\tlegendCells[i][j++].firstChild.nodeValue = vals[k];\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction setLegend(opts, _fire) {\n\t\tif (opts != null) {\n\t\t\tif (opts.idxs) {\n\t\t\t\topts.idxs.forEach((didx, sidx) => {\n\t\t\t\t\tactiveIdxs[sidx] = didx;\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (!isUndef(opts.idx))\n\t\t\t\tactiveIdxs.fill(opts.idx);\n\n\t\t\tlegend.idx = activeIdxs[0];\n\t\t}\n\n\t\tif (showLegend && legend.live) {\n\t\t\tfor (let sidx = 0; sidx < series.length; sidx++) {\n\t\t\t\tif (sidx > 0 || mode == 1 && !multiValLegend)\n\t\t\t\t\tsetLegendValues(sidx, activeIdxs[sidx]);\n\t\t\t}\n\n\t\t\tsyncLegend();\n\t\t}\n\n\t\tshouldSetLegend = false;\n\n\t\t_fire !== false && fire(\"setLegend\");\n\t}\n\n\tself.setLegend = setLegend;\n\n\tfunction setLegendValues(sidx, idx) {\n\t\tlet s = series[sidx];\n\t\tlet src = sidx == 0 && xScaleDistr == 2 ? data0 : data[sidx];\n\t\tlet val;\n\n\t\tif (multiValLegend)\n\t\t\tval = s.values(self, sidx, idx) ?? NULL_LEGEND_VALUES;\n\t\telse {\n\t\t\tval = s.value(self, idx == null ? null : src[idx], sidx, idx);\n\t\t\tval = val == null ? NULL_LEGEND_VALUES : {_: val};\n\t\t}\n\n\t\tlegend.values[sidx] = val;\n\t}\n\n\tfunction updateCursor(src, _fire, _pub) {\n\t//\tts == null && log(\"updateCursor()\", arguments);\n\n\t\trawMouseLeft1 = mouseLeft1;\n\t\trawMouseTop1 = mouseTop1;\n\n\t\t[mouseLeft1, mouseTop1] = cursor.move(self, mouseLeft1, mouseTop1);\n\n\t\tcursor.left = mouseLeft1;\n\t\tcursor.top = mouseTop1;\n\n\t\tif (showCursor) {\n\t\t\tvCursor && elTrans(vCursor, round(mouseLeft1), 0, plotWidCss, plotHgtCss);\n\t\t\thCursor && elTrans(hCursor, 0, round(mouseTop1), plotWidCss, plotHgtCss);\n\t\t}\n\n\t\tlet idx;\n\n\t\t// when zooming to an x scale range between datapoints the binary search\n\t\t// for nearest min/max indices results in this condition. cheap hack :D\n\t\tlet noDataInRange = i0 > i1; // works for mode 1 only\n\n\t\tclosestDist = inf;\n\t\tclosestSeries = null;\n\n\t\t// TODO: extract\n\t\tlet xDim = scaleX.ori == 0 ? plotWidCss : plotHgtCss;\n\t\tlet yDim = scaleX.ori == 1 ? plotWidCss : plotHgtCss;\n\n\t\t// if cursor hidden, hide points & clear legend vals\n\t\tif (mouseLeft1 < 0 || dataLen == 0 || noDataInRange) {\n\t\t\tidx = cursor.idx = null;\n\n\t\t\tfor (let i = 0; i < series.length; i++) {\n\t\t\t\tlet pt = cursorPts[i];\n\t\t\t\tpt != null && elTrans(pt, -10, -10, plotWidCss, plotHgtCss);\n\t\t\t}\n\n\t\t\tif (cursorFocus)\n\t\t\t\tsetSeries(null, FOCUS_TRUE, true, src == null && syncOpts.setSeries);\n\n\t\t\tif (legend.live) {\n\t\t\t\tactiveIdxs.fill(idx);\n\t\t\t\tshouldSetLegend = true;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t//\tlet pctY = 1 - (y / rect.height);\n\n\t\t\tlet mouseXPos, valAtPosX, xPos;\n\n\t\t\tif (mode == 1) {\n\t\t\t\tmouseXPos = scaleX.ori == 0 ? mouseLeft1 : mouseTop1;\n\t\t\t\tvalAtPosX = posToVal(mouseXPos, xScaleKey);\n\t\t\t\tidx = cursor.idx = closestIdx(valAtPosX, data[0], i0, i1);\n\t\t\t\txPos = valToPosX(data[0][idx], scaleX, xDim, 0);\n\t\t\t}\n\n\t\t\t// closest pt values\n\t\t\tlet _ptLft = -10;\n\t\t\tlet _ptTop = -10;\n\t\t\tlet _ptWid = 0;\n\t\t\tlet _ptHgt = 0;\n\t\t\tlet _centered = true;\n\t\t\tlet _ptFill = '';\n\t\t\tlet _ptStroke = '';\n\n\t\t\tfor (let i = mode == 2 ? 1 : 0; i < series.length; i++) {\n\t\t\t\tlet s = series[i];\n\n\t\t\t\tlet idx1  = activeIdxs[i];\n\t\t\t\tlet yVal1 = idx1 == null ? null : (mode == 1 ? data[i][idx1] : data[i][1][idx1]);\n\n\t\t\t\tlet idx2  = cursor.dataIdx(self, i, idx, valAtPosX);\n\t\t\t\tlet yVal2 = idx2 == null ? null : (mode == 1 ? data[i][idx2] : data[i][1][idx2]);\n\n\t\t\t\tshouldSetLegend = shouldSetLegend || yVal2 != yVal1 || idx2 != idx1;\n\n\t\t\t\tactiveIdxs[i] = idx2;\n\n\t\t\t\tif (i > 0 && s.show) {\n\t\t\t\t\tlet xPos2 = idx2 == null ? -10 : idx2 == idx ? xPos : valToPosX(mode == 1 ? data[0][idx2] : data[i][0][idx2], scaleX, xDim, 0);\n\n\t\t\t\t\t// this doesnt really work for state timeline, heatmap, status history (where the value maps to color, not y coords)\n\t\t\t\t\tlet yPos = yVal2 == null ? -10 : valToPosY(yVal2, mode == 1 ? scales[s.scale] : scales[s.facets[1].scale], yDim, 0);\n\n\t\t\t\t\tif (cursorFocus && yVal2 != null) {\n\t\t\t\t\t\tlet mouseYPos = scaleX.ori == 1 ? mouseLeft1 : mouseTop1;\n\t\t\t\t\t\tlet dist = abs(focus.dist(self, i, idx2, yPos, mouseYPos));\n\n\t\t\t\t\t\tif (dist < closestDist) {\n\t\t\t\t\t\t\tlet bias = focus.bias;\n\n\t\t\t\t\t\t\tif (bias != 0) {\n\t\t\t\t\t\t\t\tlet mouseYVal = posToVal(mouseYPos, s.scale);\n\n\t\t\t\t\t\t\t\tlet seriesYValSign = yVal2     >= 0 ? 1 : -1;\n\t\t\t\t\t\t\t\tlet mouseYValSign  = mouseYVal >= 0 ? 1 : -1;\n\n\t\t\t\t\t\t\t\t// with a focus bias, we will never cross zero when prox testing\n\t\t\t\t\t\t\t\t// it's either closest towards zero, or closest away from zero\n\t\t\t\t\t\t\t\tif (mouseYValSign == seriesYValSign && (\n\t\t\t\t\t\t\t\t\tmouseYValSign == 1 ?\n\t\t\t\t\t\t\t\t\t\t(bias == 1 ? yVal2 >= mouseYVal : yVal2 <= mouseYVal) :  // >= 0\n\t\t\t\t\t\t\t\t\t\t(bias == 1 ? yVal2 <= mouseYVal : yVal2 >= mouseYVal)    //  < 0\n\t\t\t\t\t\t\t\t)) {\n\t\t\t\t\t\t\t\t\tclosestDist = dist;\n\t\t\t\t\t\t\t\t\tclosestSeries = i;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tclosestDist = dist;\n\t\t\t\t\t\t\t\tclosestSeries = i;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (shouldSetLegend || cursorOnePt) {\n\t\t\t\t\t\tlet hPos, vPos;\n\n\t\t\t\t\t\tif (scaleX.ori == 0) {\n\t\t\t\t\t\t\thPos = xPos2;\n\t\t\t\t\t\t\tvPos = yPos;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\thPos = yPos;\n\t\t\t\t\t\t\tvPos = xPos2;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlet ptWid, ptHgt, ptLft, ptTop,\n\t\t\t\t\t\t\tptStroke, ptFill,\n\t\t\t\t\t\t\tcentered = true,\n\t\t\t\t\t\t\tgetBBox = points.bbox;\n\n\t\t\t\t\t\tif (getBBox != null) {\n\t\t\t\t\t\t\tcentered = false;\n\n\t\t\t\t\t\t\tlet bbox = getBBox(self, i);\n\n\t\t\t\t\t\t\tptLft = bbox.left;\n\t\t\t\t\t\t\tptTop = bbox.top;\n\t\t\t\t\t\t\tptWid = bbox.width;\n\t\t\t\t\t\t\tptHgt = bbox.height;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tptLft = hPos;\n\t\t\t\t\t\t\tptTop = vPos;\n\t\t\t\t\t\t\tptWid = ptHgt = points.size(self, i);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tptFill = points.fill(self, i);\n\t\t\t\t\t\tptStroke = points.stroke(self, i);\n\n\t\t\t\t\t\tif (cursorOnePt) {\n\t\t\t\t\t\t\tif (i == closestSeries && closestDist <= focus.prox) {\n\t\t\t\t\t\t\t\t_ptLft = ptLft;\n\t\t\t\t\t\t\t\t_ptTop = ptTop;\n\t\t\t\t\t\t\t\t_ptWid = ptWid;\n\t\t\t\t\t\t\t\t_ptHgt = ptHgt;\n\t\t\t\t\t\t\t\t_centered = centered;\n\t\t\t\t\t\t\t\t_ptFill = ptFill;\n\t\t\t\t\t\t\t\t_ptStroke = ptStroke;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tlet pt = cursorPts[i];\n\n\t\t\t\t\t\t\tif (pt != null) {\n\t\t\t\t\t\t\t\tcursorPtsLft[i] = ptLft;\n\t\t\t\t\t\t\t\tcursorPtsTop[i] = ptTop;\n\n\t\t\t\t\t\t\t\telSize(pt, ptWid, ptHgt, centered);\n\t\t\t\t\t\t\t\telColor(pt, ptFill, ptStroke);\n\t\t\t\t\t\t\t\telTrans(pt, ceil(ptLft), ceil(ptTop), plotWidCss, plotHgtCss);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// if only using single hover point (at cursorPts[0])\n\t\t\t// we have trigger styling at last visible series (once closestSeries is settled)\n\t\t\tif (cursorOnePt) {\n\t\t\t\t// some of this logic is similar to series focus below, since it matches the behavior by design\n\n\t\t\t\tlet p = focus.prox;\n\n\t\t\t\tlet focusChanged = focusedSeries == null ? closestDist <= p : (closestDist > p || closestSeries != focusedSeries);\n\n\t\t\t\tif (shouldSetLegend || focusChanged) {\n\t\t\t\t\tlet pt = cursorPts[0];\n\n\t\t\t\t\tif (pt != null) {\n\t\t\t\t\t\tcursorPtsLft[0] = _ptLft;\n\t\t\t\t\t\tcursorPtsTop[0] = _ptTop;\n\n\t\t\t\t\t\telSize(pt, _ptWid, _ptHgt, _centered);\n\t\t\t\t\t\telColor(pt, _ptFill, _ptStroke);\n\t\t\t\t\t\telTrans(pt, ceil(_ptLft), ceil(_ptTop), plotWidCss, plotHgtCss);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// nit: cursor.drag.setSelect is assumed always true\n\t\tif (select.show && dragging) {\n\t\t\tif (src != null) {\n\t\t\t\tlet [xKey, yKey] = syncOpts.scales;\n\t\t\t\tlet [matchXKeys, matchYKeys] = syncOpts.match;\n\t\t\t\tlet [xKeySrc, yKeySrc] = src.cursor.sync.scales;\n\n\t\t\t\t// match the dragX/dragY implicitness/explicitness of src\n\t\t\t\tlet sdrag = src.cursor.drag;\n\t\t\t\tdragX = sdrag._x;\n\t\t\t\tdragY = sdrag._y;\n\n\t\t\t\tif (dragX || dragY) {\n\t\t\t\t\tlet { left, top, width, height } = src.select;\n\n\t\t\t\t\tlet sori = src.scales[xKeySrc].ori;\n\t\t\t\t\tlet sPosToVal = src.posToVal;\n\n\t\t\t\t\tlet sOff, sDim, sc, a, b;\n\n\t\t\t\t\tlet matchingX = xKey != null && matchXKeys(xKey, xKeySrc);\n\t\t\t\t\tlet matchingY = yKey != null && matchYKeys(yKey, yKeySrc);\n\n\t\t\t\t\tif (matchingX && dragX) {\n\t\t\t\t\t\tif (sori == 0) {\n\t\t\t\t\t\t\tsOff = left;\n\t\t\t\t\t\t\tsDim = width;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tsOff = top;\n\t\t\t\t\t\t\tsDim = height;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsc = scales[xKey];\n\n\t\t\t\t\t\ta = valToPosX(sPosToVal(sOff, xKeySrc),        sc, xDim, 0);\n\t\t\t\t\t\tb = valToPosX(sPosToVal(sOff + sDim, xKeySrc), sc, xDim, 0);\n\n\t\t\t\t\t\tsetSelX(min(a,b), abs(b-a));\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tsetSelX(0, xDim);\n\n\t\t\t\t\tif (matchingY && dragY) {\n\t\t\t\t\t\tif (sori == 1) {\n\t\t\t\t\t\t\tsOff = left;\n\t\t\t\t\t\t\tsDim = width;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tsOff = top;\n\t\t\t\t\t\t\tsDim = height;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsc = scales[yKey];\n\n\t\t\t\t\t\ta = valToPosY(sPosToVal(sOff, yKeySrc),        sc, yDim, 0);\n\t\t\t\t\t\tb = valToPosY(sPosToVal(sOff + sDim, yKeySrc), sc, yDim, 0);\n\n\t\t\t\t\t\tsetSelY(min(a,b), abs(b-a));\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tsetSelY(0, yDim);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\thideSelect();\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet rawDX = abs(rawMouseLeft1 - rawMouseLeft0);\n\t\t\t\tlet rawDY = abs(rawMouseTop1 - rawMouseTop0);\n\n\t\t\t\tif (scaleX.ori == 1) {\n\t\t\t\t\tlet _rawDX = rawDX;\n\t\t\t\t\trawDX = rawDY;\n\t\t\t\t\trawDY = _rawDX;\n\t\t\t\t}\n\n\t\t\t\tdragX = drag.x && rawDX >= drag.dist;\n\t\t\t\tdragY = drag.y && rawDY >= drag.dist;\n\n\t\t\t\tlet uni = drag.uni;\n\n\t\t\t\tif (uni != null) {\n\t\t\t\t\t// only calc drag status if they pass the dist thresh\n\t\t\t\t\tif (dragX && dragY) {\n\t\t\t\t\t\tdragX = rawDX >= uni;\n\t\t\t\t\t\tdragY = rawDY >= uni;\n\n\t\t\t\t\t\t// force unidirectionality when both are under uni limit\n\t\t\t\t\t\tif (!dragX && !dragY) {\n\t\t\t\t\t\t\tif (rawDY > rawDX)\n\t\t\t\t\t\t\t\tdragY = true;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tdragX = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (drag.x && drag.y && (dragX || dragY))\n\t\t\t\t\t// if omni with no uni then both dragX / dragY should be true if either is true\n\t\t\t\t\tdragX = dragY = true;\n\n\t\t\t\tlet p0, p1;\n\n\t\t\t\tif (dragX) {\n\t\t\t\t\tif (scaleX.ori == 0) {\n\t\t\t\t\t\tp0 = mouseLeft0;\n\t\t\t\t\t\tp1 = mouseLeft1;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tp0 = mouseTop0;\n\t\t\t\t\t\tp1 = mouseTop1;\n\t\t\t\t\t}\n\n\t\t\t\t\tsetSelX(min(p0, p1), abs(p1 - p0));\n\n\t\t\t\t\tif (!dragY)\n\t\t\t\t\t\tsetSelY(0, yDim);\n\t\t\t\t}\n\n\t\t\t\tif (dragY) {\n\t\t\t\t\tif (scaleX.ori == 1) {\n\t\t\t\t\t\tp0 = mouseLeft0;\n\t\t\t\t\t\tp1 = mouseLeft1;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tp0 = mouseTop0;\n\t\t\t\t\t\tp1 = mouseTop1;\n\t\t\t\t\t}\n\n\t\t\t\t\tsetSelY(min(p0, p1), abs(p1 - p0));\n\n\t\t\t\t\tif (!dragX)\n\t\t\t\t\t\tsetSelX(0, xDim);\n\t\t\t\t}\n\n\t\t\t\t// the drag didn't pass the dist requirement\n\t\t\t\tif (!dragX && !dragY) {\n\t\t\t\t\tsetSelX(0, 0);\n\t\t\t\t\tsetSelY(0, 0);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tdrag._x = dragX;\n\t\tdrag._y = dragY;\n\n\t\tif (src == null) {\n\t\t\tif (_pub) {\n\t\t\t\tif (syncKey != null) {\n\t\t\t\t\tlet [xSyncKey, ySyncKey] = syncOpts.scales;\n\n\t\t\t\t\tsyncOpts.values[0] = xSyncKey != null ? posToVal(scaleX.ori == 0 ? mouseLeft1 : mouseTop1, xSyncKey) : null;\n\t\t\t\t\tsyncOpts.values[1] = ySyncKey != null ? posToVal(scaleX.ori == 1 ? mouseLeft1 : mouseTop1, ySyncKey) : null;\n\t\t\t\t}\n\n\t\t\t\tpubSync(mousemove, self, mouseLeft1, mouseTop1, plotWidCss, plotHgtCss, idx);\n\t\t\t}\n\n\t\t\tif (cursorFocus) {\n\t\t\t\tlet shouldPub = _pub && syncOpts.setSeries;\n\t\t\t\tlet p = focus.prox;\n\n\t\t\t\tif (focusedSeries == null) {\n\t\t\t\t\tif (closestDist <= p)\n\t\t\t\t\t\tsetSeries(closestSeries, FOCUS_TRUE, true, shouldPub);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (closestDist > p)\n\t\t\t\t\t\tsetSeries(null, FOCUS_TRUE, true, shouldPub);\n\t\t\t\t\telse if (closestSeries != focusedSeries)\n\t\t\t\t\t\tsetSeries(closestSeries, FOCUS_TRUE, true, shouldPub);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (shouldSetLegend) {\n\t\t\tlegend.idx = idx;\n\t\t\tsetLegend();\n\t\t}\n\n\t\t_fire !== false && fire(\"setCursor\");\n\t}\n\n\tlet rect = null;\n\n\tObject.defineProperty(self, 'rect', {\n\t\tget() {\n\t\t\tif (rect == null)\n\t\t\t\tsyncRect(false);\n\n\t\t\treturn rect;\n\t\t},\n\t});\n\n\tfunction syncRect(defer = false) {\n\t\tif (defer)\n\t\t\trect = null;\n\t\telse {\n\t\t\trect = over.getBoundingClientRect();\n\t\t\tfire(\"syncRect\", rect);\n\t\t}\n\t}\n\n\tfunction mouseMove(e, src, _l, _t, _w, _h, _i) {\n\t\tif (cursor._lock)\n\t\t\treturn;\n\n\t\t// Chrome on Windows has a bug which triggers a stray mousemove event after an initial mousedown event\n\t\t// when clicking into a plot as part of re-focusing the browser window.\n\t\t// we gotta ignore it to avoid triggering a phantom drag / setSelect\n\t\t// However, on touch-only devices Chrome-based browsers trigger a 0-distance mousemove before mousedown\n\t\t// so we don't ignore it when mousedown has set the dragging flag\n\t\tif (dragging && e != null && e.movementX == 0 && e.movementY == 0)\n\t\t\treturn;\n\n\t\tcacheMouse(e, src, _l, _t, _w, _h, _i, false, e != null);\n\n\t\tif (e != null)\n\t\t\tupdateCursor(null, true, true);\n\t\telse\n\t\t\tupdateCursor(src, true, false);\n\t}\n\n\tfunction cacheMouse(e, src, _l, _t, _w, _h, _i, initial, snap) {\n\t\tif (rect == null)\n\t\t\tsyncRect(false);\n\n\t\tsetCursorEvent(e);\n\n\t\tif (e != null) {\n\t\t\t_l = e.clientX - rect.left;\n\t\t\t_t = e.clientY - rect.top;\n\t\t}\n\t\telse {\n\t\t\tif (_l < 0 || _t < 0) {\n\t\t\t\tmouseLeft1 = -10;\n\t\t\t\tmouseTop1 = -10;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet [xKey, yKey] = syncOpts.scales;\n\n\t\t\tlet syncOptsSrc = src.cursor.sync;\n\t\t\tlet [xValSrc, yValSrc] = syncOptsSrc.values;\n\t\t\tlet [xKeySrc, yKeySrc] = syncOptsSrc.scales;\n\t\t\tlet [matchXKeys, matchYKeys] = syncOpts.match;\n\n\t\t\tlet rotSrc = src.axes[0].side % 2 == 1;\n\n\t\t\tlet xDim = scaleX.ori == 0 ? plotWidCss : plotHgtCss,\n\t\t\t\tyDim = scaleX.ori == 1 ? plotWidCss : plotHgtCss,\n\t\t\t\t_xDim = rotSrc ? _h : _w,\n\t\t\t\t_yDim = rotSrc ? _w : _h,\n\t\t\t\t_xPos = rotSrc ? _t : _l,\n\t\t\t\t_yPos = rotSrc ? _l : _t;\n\n\t\t\tif (xKeySrc != null)\n\t\t\t\t_l = matchXKeys(xKey, xKeySrc) ? getPos(xValSrc, scales[xKey], xDim, 0) : -10;\n\t\t\telse\n\t\t\t\t_l = xDim * (_xPos/_xDim);\n\n\t\t\tif (yKeySrc != null)\n\t\t\t\t_t = matchYKeys(yKey, yKeySrc) ? getPos(yValSrc, scales[yKey], yDim, 0) : -10;\n\t\t\telse\n\t\t\t\t_t = yDim * (_yPos/_yDim);\n\n\t\t\tif (scaleX.ori == 1) {\n\t\t\t\tlet __l = _l;\n\t\t\t\t_l = _t;\n\t\t\t\t_t = __l;\n\t\t\t}\n\t\t}\n\n\t\tif (snap && (src == null || src.cursor.event.type == mousemove)) {\n\t\t\tif (_l <= 1 || _l >= plotWidCss - 1)\n\t\t\t\t_l = incrRound(_l, plotWidCss);\n\n\t\t\tif (_t <= 1 || _t >= plotHgtCss - 1)\n\t\t\t\t_t = incrRound(_t, plotHgtCss);\n\t\t}\n\n\t\tif (initial) {\n\t\t\trawMouseLeft0 = _l;\n\t\t\trawMouseTop0 = _t;\n\n\t\t\t[mouseLeft0, mouseTop0] = cursor.move(self, _l, _t);\n\t\t}\n\t\telse {\n\t\t\tmouseLeft1 = _l;\n\t\t\tmouseTop1 = _t;\n\t\t}\n\t}\n\n\tconst _hideProps = {\n\t\twidth: 0,\n\t\theight: 0,\n\t\tleft: 0,\n\t\ttop: 0,\n\t};\n\n\tfunction hideSelect() {\n\t\tsetSelect(_hideProps, false);\n\t}\n\n\tlet downSelectLeft;\n\tlet downSelectTop;\n\tlet downSelectWidth;\n\tlet downSelectHeight;\n\n\tfunction mouseDown(e, src, _l, _t, _w, _h, _i) {\n\t\tdragging = true;\n\t\tdragX = dragY = drag._x = drag._y = false;\n\n\t\tcacheMouse(e, src, _l, _t, _w, _h, _i, true, false);\n\n\t\tif (e != null) {\n\t\t\tonMouse(mouseup, doc, mouseUp, false);\n\t\t\tpubSync(mousedown, self, mouseLeft0, mouseTop0, plotWidCss, plotHgtCss, null);\n\t\t}\n\n\t\tlet { left, top, width, height } = select;\n\n\t\tdownSelectLeft   = left;\n\t\tdownSelectTop    = top;\n\t\tdownSelectWidth  = width;\n\t\tdownSelectHeight = height;\n\n\t//\thideSelect();\n\t}\n\n\tfunction mouseUp(e, src, _l, _t, _w, _h, _i) {\n\t\tdragging = drag._x = drag._y = false;\n\n\t\tcacheMouse(e, src, _l, _t, _w, _h, _i, false, true);\n\n\t\tlet { left, top, width, height } = select;\n\n\t\tlet hasSelect = width > 0 || height > 0;\n\t\tlet chgSelect = (\n\t\t\tdownSelectLeft   != left   ||\n\t\t\tdownSelectTop    != top    ||\n\t\t\tdownSelectWidth  != width  ||\n\t\t\tdownSelectHeight != height\n\t\t);\n\n\t\thasSelect && chgSelect && setSelect(select);\n\n\t\tif (drag.setScale && hasSelect && chgSelect) {\n\t\t//\tif (syncKey != null) {\n\t\t//\t\tdragX = drag.x;\n\t\t//\t\tdragY = drag.y;\n\t\t//\t}\n\n\t\t\tlet xOff = left,\n\t\t\t\txDim = width,\n\t\t\t\tyOff = top,\n\t\t\t\tyDim = height;\n\n\t\t\tif (scaleX.ori == 1) {\n\t\t\t\txOff = top,\n\t\t\t\txDim = height,\n\t\t\t\tyOff = left,\n\t\t\t\tyDim = width;\n\t\t\t}\n\n\t\t\tif (dragX) {\n\t\t\t\t_setScale(xScaleKey,\n\t\t\t\t\tposToVal(xOff, xScaleKey),\n\t\t\t\t\tposToVal(xOff + xDim, xScaleKey)\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (dragY) {\n\t\t\t\tfor (let k in scales) {\n\t\t\t\t\tlet sc = scales[k];\n\n\t\t\t\t\tif (k != xScaleKey && sc.from == null && sc.min != inf) {\n\t\t\t\t\t\t_setScale(k,\n\t\t\t\t\t\t\tposToVal(yOff + yDim, k),\n\t\t\t\t\t\t\tposToVal(yOff, k)\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\thideSelect();\n\t\t}\n\t\telse if (cursor.lock) {\n\t\t\tcursor._lock = !cursor._lock;\n\t\t\tupdateCursor(src, true, e != null);\n\t\t}\n\n\t\tif (e != null) {\n\t\t\toffMouse(mouseup, doc);\n\t\t\tpubSync(mouseup, self, mouseLeft1, mouseTop1, plotWidCss, plotHgtCss, null);\n\t\t}\n\t}\n\n\tfunction mouseLeave(e, src, _l, _t, _w, _h, _i) {\n\t\tif (cursor._lock)\n\t\t\treturn;\n\n\t\tsetCursorEvent(e);\n\n\t\tlet _dragging = dragging;\n\n\t\tif (dragging) {\n\t\t\t// handle case when mousemove aren't fired all the way to edges by browser\n\t\t\tlet snapH = true;\n\t\t\tlet snapV = true;\n\t\t\tlet snapProx = 10;\n\n\t\t\tlet dragH, dragV;\n\n\t\t\tif (scaleX.ori == 0) {\n\t\t\t\tdragH = dragX;\n\t\t\t\tdragV = dragY;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tdragH = dragY;\n\t\t\t\tdragV = dragX;\n\t\t\t}\n\n\t\t\tif (dragH && dragV) {\n\t\t\t\t// maybe omni corner snap\n\t\t\t\tsnapH = mouseLeft1 <= snapProx || mouseLeft1 >= plotWidCss - snapProx;\n\t\t\t\tsnapV = mouseTop1  <= snapProx || mouseTop1  >= plotHgtCss - snapProx;\n\t\t\t}\n\n\t\t\tif (dragH && snapH)\n\t\t\t\tmouseLeft1 = mouseLeft1 < mouseLeft0 ? 0 : plotWidCss;\n\n\t\t\tif (dragV && snapV)\n\t\t\t\tmouseTop1 = mouseTop1 < mouseTop0 ? 0 : plotHgtCss;\n\n\t\t\tupdateCursor(null, true, true);\n\n\t\t\tdragging = false;\n\t\t}\n\n\t\tmouseLeft1 = -10;\n\t\tmouseTop1 = -10;\n\n\t\tactiveIdxs.fill(null);\n\n\t\t// passing a non-null timestamp to force sync/mousemove event\n\t\tupdateCursor(null, true, true);\n\n\t\tif (_dragging)\n\t\t\tdragging = _dragging;\n\t}\n\n\tfunction dblClick(e, src, _l, _t, _w, _h, _i) {\n\t\tif (cursor._lock)\n\t\t\treturn;\n\n\t\tsetCursorEvent(e);\n\n\t\tautoScaleX();\n\n\t\thideSelect();\n\n\t\tif (e != null)\n\t\t\tpubSync(dblclick, self, mouseLeft1, mouseTop1, plotWidCss, plotHgtCss, null);\n\t}\n\n\tfunction syncPxRatio() {\n\t\taxes.forEach(syncFontSize);\n\t\t_setSize(self.width, self.height, true);\n\t}\n\n\ton(dppxchange, win, syncPxRatio);\n\n\t// internal pub/sub\n\tconst events = {};\n\n\tevents.mousedown = mouseDown;\n\tevents.mousemove = mouseMove;\n\tevents.mouseup = mouseUp;\n\tevents.dblclick = dblClick;\n\tevents[\"setSeries\"] = (e, src, idx, opts) => {\n\t\tlet seriesIdxMatcher = syncOpts.match[2];\n\t\tidx = seriesIdxMatcher(self, src, idx);\n\t\tidx != -1 && setSeries(idx, opts, true, false);\n\t};\n\n\tif (showCursor) {\n\t\tonMouse(mousedown,  over, mouseDown);\n\t\tonMouse(mousemove,  over, mouseMove);\n\t\tonMouse(mouseenter, over, e => {\n\t\t\tsetCursorEvent(e);\n\t\t\tsyncRect(false);\n\t\t});\n\t\tonMouse(mouseleave, over, mouseLeave);\n\n\t\tonMouse(dblclick, over, dblClick);\n\n\t\tcursorPlots.add(self);\n\n\t\tself.syncRect = syncRect;\n\t}\n\n\t// external on/off\n\tconst hooks = self.hooks = opts.hooks || {};\n\n\tfunction fire(evName, a1, a2) {\n\t\tif (deferHooks)\n\t\t\thooksQueue.push([evName, a1, a2]);\n\t\telse {\n\t\t\tif (evName in hooks) {\n\t\t\t\thooks[evName].forEach(fn => {\n\t\t\t\t\tfn.call(null, self, a1, a2);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t(opts.plugins || []).forEach(p => {\n\t\tfor (let evName in p.hooks)\n\t\t\thooks[evName] = (hooks[evName] || []).concat(p.hooks[evName]);\n\t});\n\n\tconst seriesIdxMatcher = (self, src, srcSeriesIdx) => srcSeriesIdx;\n\n\tconst syncOpts = assign({\n\t\tkey: null,\n\t\tsetSeries: false,\n\t\tfilters: {\n\t\t\tpub: retTrue,\n\t\t\tsub: retTrue,\n\t\t},\n\t\tscales: [xScaleKey, series[1] ? series[1].scale : null],\n\t\tmatch: [retEq, retEq, seriesIdxMatcher],\n\t\tvalues: [null, null],\n\t}, cursor.sync);\n\n\tif (syncOpts.match.length == 2)\n\t\tsyncOpts.match.push(seriesIdxMatcher);\n\n\tcursor.sync = syncOpts;\n\n\tconst syncKey = syncOpts.key;\n\n\tconst sync = _sync(syncKey);\n\n\tfunction pubSync(type, src, x, y, w, h, i) {\n\t\tif (syncOpts.filters.pub(type, src, x, y, w, h, i))\n\t\t\tsync.pub(type, src, x, y, w, h, i);\n\t}\n\n\tsync.sub(self);\n\n\tfunction pub(type, src, x, y, w, h, i) {\n\t\tif (syncOpts.filters.sub(type, src, x, y, w, h, i))\n\t\t\tevents[type](null, src, x, y, w, h, i);\n\t}\n\n\tself.pub = pub;\n\n\tfunction destroy() {\n\t\tsync.unsub(self);\n\t\tcursorPlots.delete(self);\n\t\tmouseListeners.clear();\n\t\toff(dppxchange, win, syncPxRatio);\n\t\troot.remove();\n\t\tlegendTable?.remove(); // in case mounted outside of root\n\t\tfire(\"destroy\");\n\t}\n\n\tself.destroy = destroy;\n\n\tfunction _init() {\n\t\tfire(\"init\", opts, data);\n\n\t\tsetData(data || opts.data, false);\n\n\t\tif (pendScales[xScaleKey])\n\t\t\tsetScale(xScaleKey, pendScales[xScaleKey]);\n\t\telse\n\t\t\tautoScaleX();\n\n\t\tshouldSetSelect = select.show && (select.width > 0 || select.height > 0);\n\t\tshouldSetCursor = shouldSetLegend = true;\n\n\t\t_setSize(opts.width, opts.height);\n\t}\n\n\tseries.forEach(initSeries);\n\n\taxes.forEach(initAxis);\n\n\tif (then) {\n\t\tif (then instanceof HTMLElement) {\n\t\t\tthen.appendChild(root);\n\t\t\t_init();\n\t\t}\n\t\telse\n\t\t\tthen(self, _init);\n\t}\n\telse\n\t\t_init();\n\n\treturn self;\n}\n\nuPlot.assign = assign;\nuPlot.fmtNum = fmtNum;\nuPlot.rangeNum = rangeNum;\nuPlot.rangeLog = rangeLog;\nuPlot.rangeAsinh = rangeAsinh;\nuPlot.orient   = orient;\nuPlot.pxRatio = pxRatio;\n\n{\n\tuPlot.join = join;\n}\n\n{\n\tuPlot.fmtDate = fmtDate;\n\tuPlot.tzDate  = tzDate;\n}\n\nuPlot.sync = _sync;\n\n{\n\tuPlot.addGap = addGap;\n\tuPlot.clipGaps = clipGaps;\n\n\tlet paths = uPlot.paths = {\n\t\tpoints,\n\t};\n\n\t(paths.linear  = linear);\n\t(paths.stepped = stepped);\n\t(paths.bars    = bars);\n\t(paths.spline  = monotoneCubic);\n}\n\nexport { uPlot as default };\n", "import type {Scale as uScale, DrawOrderKey as uDrawOrderKey, Axis as uAxis} from 'uplot';\n\nexport const DrawOrderKey: Record<keyof typeof uDrawOrderKey, uDrawOrderKey> = {\n    Series: 'series' as uDrawOrderKey.Series,\n    Axes: 'axes' as uDrawOrderKey.Axes,\n};\n\ninterface YScale {\n    Distr: Record<keyof typeof uScale.Distr, uScale.Distr>;\n}\n\nexport const Scale: YScale = {\n    Distr: {\n        Linear: 1 as uScale.Distr.Linear,\n        Ordinal: 2 as uScale.Distr.Ordinal,\n        Logarithmic: 3 as uScale.Distr.Logarithmic,\n        ArcSinh: 4 as uScale.Distr.ArcSinh,\n        Custom: 5 as uScale.Distr.Custom,\n    },\n};\n\ninterface YAxis {\n    Side: Record<keyof typeof uAxis.Side, uAxis.Side>;\n    Align: Record<keyof typeof uAxis.Align, uAxis.Align>;\n}\n\nexport const Axis: YAxis = {\n    Side: {\n        Top: 0 as uAxis.Side.Top,\n        Right: 1 as uAxis.Side.Right,\n        Bottom: 2 as uAxis.Side.Bottom,\n        Left: 3 as uAxis.Side.Left,\n    },\n    Align: {\n        Right: 0 as uAxis.Align.Right,\n        Left: 1 as uAxis.Align.Left,\n    },\n};\n", "import uPlot from 'uplot';\nimport type {Axis} from 'uplot';\nimport * as defaults from '../defaults';\nimport type Yagr from '../../';\nimport {YagrConfig, AxisOptions} from '../types';\n\nimport {asFn, getUnitSuffix, isNil, px, toFixed} from './common';\nimport {Axis as TypedAxis} from './types';\n\nconst YAGR_AXIS_TO_UPLOT_AXIS = {\n    right: TypedAxis.Side.Right,\n    top: TypedAxis.Side.Top,\n    bottom: TypedAxis.Side.Bottom,\n    left: TypedAxis.Side.Left,\n};\n\nconst AXIS_SIDE_TO_ALIGN = {\n    left: TypedAxis.Align.Right,\n    right: TypedAxis.Align.Left,\n    top: undefined,\n    bottom: undefined,\n};\n\nexport const getAxisPositioning = (side: AxisOptions['side'], align: Axis['align']) => {\n    return {\n        side: side ? YAGR_AXIS_TO_UPLOT_AXIS[side] : TypedAxis.Side.Left,\n        align: align || (side ? AXIS_SIDE_TO_ALIGN[side] : undefined),\n    };\n};\n\nexport const getDefaultNumberFormatter = (precision: 'auto' | number, nullValue = '') => {\n    return (n: number | null) => {\n        if (isNil(n)) {\n            return nullValue;\n        }\n\n        if (n === 0) {\n            return '0';\n        }\n\n        const abs = Math.abs(n);\n        const precisionNum = precision === 'auto' ? 2 : precision;\n\n        const [pow, suffix] = getUnitSuffix(abs);\n        const transformedValue = n / pow;\n\n        return (\n            (precision === 'auto'\n                ? String(transformedValue).replace(/\\.(\\d{5,})/, (match) => {\n                      return match.slice(0, 6);\n                  })\n                : toFixed(transformedValue, precisionNum)) + suffix\n        );\n    };\n};\n\n/*\n * Generates ticks labels values\n */\nconst getNumericValueFormatter = (axisConfig: AxisOptions) => {\n    const p = axisConfig.precision;\n    const numFormatter = getDefaultNumberFormatter(typeof p === 'number' ? p : p || 'auto', '');\n    return function defaultNumericValueFormatter(_: unknown, ticks: number[]) {\n        return ticks.map(numFormatter);\n    };\n};\n\nconst dayTimeFormatter = uPlot.fmtDate('{DD}.{MM}.{YYYY}');\nconst dateTimeFormatter = uPlot.fmtDate('{HH}:{mm}:{ss}');\nconst minuteFormatter = uPlot.fmtDate('{mm}:{ss}');\nconst secondFormatter = uPlot.fmtDate('{mm}:{ss}.{fff}');\nconst yearFormatter = uPlot.fmtDate('{YYYY}');\n\nfunction getTimeFormatterByRange(range: number, ticksCount: number) {\n    let formatter = dayTimeFormatter;\n    const minRange = Math.ceil(range / ticksCount);\n\n    if (minRange <= defaults.SECOND) {\n        formatter = secondFormatter;\n    } else if (minRange <= defaults.MINUTE) {\n        formatter = minuteFormatter;\n    } else if (minRange <= defaults.DAY) {\n        formatter = dateTimeFormatter;\n    } else if (minRange >= defaults.YEAR) {\n        formatter = yearFormatter;\n    }\n\n    return (x: number) => formatter(new Date(x));\n}\n\nexport const getTimeFormatter = (config: YagrConfig) => {\n    const msm = config.chart.timeMultiplier || defaults.TIME_MULTIPLIER;\n    return (_: unknown, ticks: number[]) => {\n        const range = ticks[ticks.length - 1] - ticks[0];\n        const rangeMs = range / msm;\n        const formatter = getTimeFormatterByRange(rangeMs, ticks.length);\n\n        return ticks.map((rawValue) => {\n            return formatter(rawValue / msm);\n        });\n    };\n};\n\nfunction getSplits(splitsCount: number) {\n    return (_: uPlot, __: number, scaleMin: number, scaleMax: number) => {\n        if (splitsCount <= 2) {\n            return [scaleMin, scaleMax];\n        }\n\n        const dist = Math.abs(scaleMax - scaleMin);\n        const step = dist / (splitsCount - 1);\n        let i = step;\n        const splits = [];\n        while (scaleMin + i < scaleMax) {\n            splits.push(scaleMin + i);\n            i += step;\n        }\n        return [scaleMin, ...splits, scaleMax];\n    };\n}\n\n// eslint-disable-next-line complexity\nfunction getAxis(axisConfig: AxisOptions, yagr: Yagr): Axis {\n    const theme = yagr.utils.theme;\n    const config = yagr.config;\n\n    const axis: Axis = {\n        splits: axisConfig.splitsCount ? getSplits(axisConfig.splitsCount) : axisConfig.splits,\n        show: typeof axisConfig.show === 'undefined' ? true : axisConfig.show,\n        label: axisConfig.label || undefined,\n        labelSize: axisConfig.labelSize || defaults.Y_AXIS_LABEL_SIZE,\n        labelFont: axisConfig.labelFont || defaults.AXIS_LABEL_FONT,\n        font: axisConfig.font || defaults.AXIS_VALUES_FONT,\n        stroke: axisConfig.stroke || (() => theme.AXIS_STROKE),\n        ticks: axisConfig.ticks ? {...theme.Y_AXIS_TICKS, ...axisConfig.ticks} : theme.Y_AXIS_TICKS,\n        grid: config.grid || axisConfig.grid || theme.GRID,\n    };\n\n    if (axisConfig.scale === defaults.DEFAULT_X_SCALE) {\n        return Object.assign(axis, {\n            getFormatter: getTimeFormatterByRange,\n            gap: axisConfig.gap ?? defaults.X_AXIS_TICK_GAP,\n            size: asFn(axisConfig.size) || (() => defaults.X_AXIS_SIZE),\n            values: axisConfig.values || getTimeFormatter(config),\n            ticks: axisConfig.ticks ? {...theme.X_AXIS_TICKS, ...axisConfig.ticks} : theme.X_AXIS_TICKS,\n            scale: defaults.DEFAULT_X_SCALE,\n            space: axisConfig.space || (() => defaults.X_AXIS_SPACE),\n            incrs: axisConfig.incrs || (() => defaults.X_AXIS_INCRS.map((i) => i * (config.chart.timeMultiplier || defaults.TIME_MULTIPLIER))),\n            ...(axisConfig.side\n                ? getAxisPositioning(axisConfig.side, axisConfig.align)\n                : {side: TypedAxis.Side.Bottom}),\n            stroke: axisConfig.stroke || (() => theme.AXIS_STROKE),\n        });\n    }\n\n    Object.assign(axis, {\n        gap: axisConfig.gap ?? defaults.Y_AXIS_TICK_GAP,\n        size: asFn(axisConfig.size) || defaults.Y_AXIS_SIZE,\n        values: axisConfig.values || getNumericValueFormatter(axisConfig),\n        scale: axisConfig.scale || defaults.DEFAULT_Y_SCALE,\n        getFormatter: () =>\n            getDefaultNumberFormatter(\n                typeof axisConfig.precision === 'number' ? axisConfig.precision : axisConfig.precision || 'auto',\n                '',\n            ),\n        ...getAxisPositioning(axisConfig.side || 'left', axisConfig.align),\n    });\n\n    if (axisConfig.space) {\n        axis.space = axisConfig.space;\n    }\n\n    return axis;\n}\n\nexport function getRedrawOptionsForAxesUpdate(axes: YagrConfig['axes']) {\n    const options: [series: boolean, axes: boolean] = [false, true];\n\n    Object.values(axes).forEach((s) => {\n        const uOpts: (keyof AxisOptions)[] = ['align', 'side', 'size', 'label', 'labelFont', 'labelGap', 'labelSize'];\n        if (uOpts.some((t) => s[t] !== undefined)) {\n            options[1] = true;\n        }\n    });\n\n    return options;\n}\n\n\nfunction pxRatioFont(font: string) {\n\tlet fontSize, fontSizeCss;\n    // eslint-disable-next-line no-return-assign\n\tfont = font.replace(/(\\d+)px/, (_, p1) => px((fontSize = Math.round((fontSizeCss = Number(p1)) * window.devicePixelRatio))));\n\treturn [font, fontSize, fontSizeCss];\n}\n\nexport function updateAxis(yagr: Yagr, uAxis: Axis, axisConfig: AxisOptions) {\n    const upd = getAxis(\n        {\n            ...axisConfig,\n            font: uAxis.font,\n        },\n        yagr,\n    );\n\n    upd.ticks = {...uAxis.ticks, ...upd.ticks};\n    upd.grid = {...uAxis.grid, ...upd.grid};\n    upd.border = {...uAxis.border, ...upd.border};\n    upd.splits = upd.splits || uAxis.splits;\n\n    /**\n     * uPlot implicitly converts theese properties and mutate axis.font and axis.labelFont\n     * but doesn't cover it with typings.\n     * @see https://github.com/leeoniya/uPlot/blob/378faf6fab9b84d86fd25a5b4425dc44d486b64d/src/uPlot.js#L275\n     */\n    if (axisConfig.font && axisConfig.font !== uAxis.font?.[0]) {\n        //@ts-ignore \n        upd.font = pxRatioFont(axisConfig.font);\n    }\n    if (axisConfig.labelFont && axisConfig.labelFont !== uAxis.labelFont?.[0]) {\n        //@ts-ignore\n        upd.labelFont = pxRatioFont(axisConfig.labelFont);\n    }\n\n    Object.assign(uAxis, upd);\n\n    yagr.plugins.plotLines?.update(axisConfig.plotLines, axisConfig.scale);\n}\n\nexport function configureAxes(yagr: Yagr, config: YagrConfig) {\n    const axes: Axis[] = [];\n\n    Object.entries(config.axes).forEach(([scale, axisConfig]) => {\n        axes.push(getAxis({...axisConfig, scale}, yagr));\n    });\n\n    const x = defaults.DEFAULT_X_SCALE;\n    const y = defaults.DEFAULT_Y_SCALE;\n\n    if (!config.axes[x]) {\n        axes.push(getAxis({scale: x}, yagr));\n    }\n\n    if (!axes.find(({scale}) => scale !== x)) {\n        axes.push(getAxis({scale: y}, yagr));\n    }\n\n    return axes;\n}\n", "/* eslint-disable no-nested-ternary */\nimport UPlot, {Range} from 'uplot';\nimport {YagrConfig, Scale} from '../types';\nimport {\n    DEFAULT_MAX_TICKS,\n    DEFAULT_Y_AXIS_OFFSET,\n    DEFAULT_SCALE_MIN_RANGE,\n    DEFAULT_LOGARITHMIC_MIN_SCALE_VALUE,\n    DEFAULT_X_SCALE,\n} from '../defaults';\nimport type Yagr from '../index';\nimport {Scale as YScale} from './types';\n\ntype ScaleRangeType = (\n    min: number,\n    max: number,\n    scfg: Scale,\n    ycfg: YagrConfig,\n) => {min: number; max: number};\n\nexport const getScaleRange = (scale: Scale, config: YagrConfig) => {\n    const range = scale.range;\n    if (typeof range === 'function') {\n        return (u: UPlot, dataMin: number, dataMax: number) => {\n            return range(u, dataMin, dataMax, config);\n        };\n    }\n\n    if (scale.normalize) {\n        return [0, scale.normalizeBase || 100] as Range.MinMax;\n    }\n\n    if (scale.range === 'auto') {\n        return undefined;\n    }\n\n    let rangeFn: ScaleRangeType;\n\n    switch (scale.range) {\n        case undefined:\n        case 'nice': {\n            rangeFn = niceScale;\n            break;\n        }\n        case 'offset': {\n            rangeFn = offsetScale;\n            break;\n        }\n        default:\n            throw new Error(`Unknown scale range type ${scale.range}`);\n    }\n\n    return (_: UPlot, dMin: number, dMax: number): Range.MinMax => {\n        let {min, max} = rangeFn(dMin, dMax, scale, config);\n\n        const minRange = scale.minRange || DEFAULT_SCALE_MIN_RANGE;\n\n        if (Math.abs(max - min) < minRange) {\n            if (min >= 0) {\n                max += minRange;\n            } else {\n                max += minRange / 2;\n                min -= minRange / 2;\n            }\n        }\n\n        min = typeof scale.min === 'number' ? scale.min : min;\n        max = typeof scale.max === 'number' ? scale.max : max;\n\n        /** Protect logarithmic scale from impossible min values */\n        if (scale.type === 'logarithmic') {\n            const isScaleMinDefined = typeof scale.min === 'number';\n\n            if (min <= 0) {\n                min = DEFAULT_LOGARITHMIC_MIN_SCALE_VALUE;\n            } else if (!isScaleMinDefined) {\n                min = Math.min(min, DEFAULT_LOGARITHMIC_MIN_SCALE_VALUE);\n            }\n        }\n\n        if (min >= max || max <= min) {\n            if (typeof scale.max === 'number') {\n                min = max - (niceNum(max - max * 0.1, false) || 1);\n            } else {\n                max = min + (niceNum(min + min * 0.1, false) || 1);\n            }\n        }\n\n        return [min, max];\n    };\n};\n\nexport function offsetScale(dataMin: number, dataMax: number, scaleConfig: Scale) {\n    const startFromZero = dataMin >= 0 && scaleConfig.stacking;\n    const endWithZero = dataMax <= 0 && scaleConfig.stacking;\n\n    return {\n        min: startFromZero\n            ? 0\n            : Math.round(\n                  dataMin - Math.abs(dataMin) * (scaleConfig.offset || DEFAULT_Y_AXIS_OFFSET),\n              ),\n        max: endWithZero\n            ? 0\n            : Math.round(\n                  dataMax + Math.abs(dataMax) * (scaleConfig.offset || DEFAULT_Y_AXIS_OFFSET),\n              ),\n    };\n}\n\n/*\n * Implementation nice scale (see https://www.baeldung.com/cs/choosing-linear-scale-y-axis#procedure-for-identifying-scale-and-ticks)\n * with extra options inherited from Solomon stacked area visualization\n * with extra options implementing consistent incr proximity if dataMin ~= dataMax. (16.01.2020)\n * with extra options for small ranges between max and min (27.01.2020)\n */\nexport function niceScale(dataMin: number, dataMax: number, scaleConfig: Scale) {\n    const startFromZero = dataMin >= 0 && scaleConfig.stacking;\n    const endWithZero = dataMax <= 0 && scaleConfig.stacking;\n\n    /**\n     * This code handles case when scale has user max/min and niceScale's\n     * range after usage of given max-min from scale config creates not centered lines\n     */\n    const dMax = endWithZero ? 0 : typeof scaleConfig.max === 'number' ? scaleConfig.max : dataMax;\n    const dMin = startFromZero\n        ? 0\n        : typeof scaleConfig.min === 'number'\n          ? scaleConfig.min\n          : dataMin;\n\n    if (dMin === dMax) {\n        return dMin >= 0 ? {min: dMin, max: dMin + 2} : {min: dMin - 1, max: dMin + 1};\n    }\n\n    const difference = dMax - dMin;\n    const range = niceNum(difference, false);\n    const incr = niceNum(range / (DEFAULT_MAX_TICKS - 1), true);\n    let max = Math.ceil(dMax / incr) * incr;\n    max = isNaN(max) ? 100 : max;\n    let min = (startFromZero ? Math.min(0, dMin) : Math.floor(dMin / incr) * incr) || 0;\n\n    /** Workaround for weird ranges */\n    if (min === max) {\n        min -= 1;\n        max += 1;\n    }\n\n    return {\n        min,\n        max,\n    };\n}\n\nfunction niceNum(delta: number, round: boolean) {\n    const exp = Math.floor(Math.log10(delta));\n    const frac = delta / 10 ** exp;\n\n    const niceFrac = round\n        ? frac < 1.5\n            ? 1\n            : frac < 3\n              ? 2\n              : frac < 7\n                ? 5\n                : 10\n        : frac <= 1\n          ? 1\n          : frac <= 2\n            ? 2\n            : frac <= 5\n              ? 5\n              : 10;\n\n    return niceFrac * 10 ** exp;\n}\n\nexport function configureScales(yagr: Yagr, scales: UPlot.Scales, config: YagrConfig) {\n    const scalesToMap = config.scales ? {...config.scales} : {};\n\n    if (!Object.keys(config.scales).length) {\n        scalesToMap.y = {};\n    }\n\n    Object.entries(scalesToMap).forEach(([scaleName, scaleConfig]) => {\n        scales[scaleName] = scales[scaleName] || {};\n        const scale = scales[scaleName];\n\n        if (scaleConfig.time !== undefined) {\n            scale.time = scaleConfig.time;\n        }\n\n        if (scaleConfig.ori !== undefined) {\n            scale.ori = scaleConfig.ori;\n        }\n\n        if (scaleConfig.dir !== undefined) {\n            scale.dir = scaleConfig.dir;\n        }\n\n        const isLogScale = scaleConfig.type === 'logarithmic';\n\n        if (isLogScale) {\n            scale.distr = YScale.Distr.Logarithmic;\n        }\n\n        // The x scale range is managed by uPlot. Keep Yagr's range processing\n        // off it, while still forwarding the native scale options above.\n        if (scaleName === DEFAULT_X_SCALE) {\n            return;\n        }\n\n        const forceMin = typeof scaleConfig.min === 'number' ? scaleConfig.min : null;\n        const forceMax = typeof scaleConfig.max === 'number' ? scaleConfig.max : null;\n\n        /** At first handle case when scale has setted min and max */\n        if (forceMax !== null && forceMin !== null) {\n            if (forceMax <= forceMin) {\n                throw new Error('Invalid scale config. .max should be > .min');\n            }\n            scale.range = [forceMin, forceMax];\n        }\n\n        if (isLogScale) {\n            scale.range = getScaleRange(scaleConfig, config);\n\n            return;\n        }\n\n        if (yagr.isEmpty) {\n            scale.range = [\n                forceMin === null ? (isLogScale ? 1 : 0) : forceMin,\n                forceMax === null ? 100 : forceMax,\n            ];\n            return;\n        }\n\n        scale.range = getScaleRange(scaleConfig, config);\n    });\n\n    if (!scales.x) {\n        scales.x = {\n            time: true,\n        };\n    }\n\n    return scales;\n}\n", "const LOCALIZATIONS: Record<string, Record<string, string>> = {\n    ru: {\n        'hide-all': '\u0421\u043A\u0440\u044B\u0442\u044C \u0432\u0441\u0435',\n        'show-all': '\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0432\u0441\u0435',\n        sum: '\u0421\u0443\u043C\u043C\u0430',\n        scale: '\u0428\u043A\u0430\u043B\u0430',\n        series: '\u041B\u0438\u043D\u0438\u044F',\n        weekend: '\u0412\u044B\u0445\u043E\u0434\u043D\u043E\u0439',\n        nodata: '\u041D\u0435\u0442 \u0434\u0430\u043D\u043D\u044B\u0445',\n    },\n    en: {\n        'hide-all': 'Hide all',\n        'show-all': 'Show all',\n        sum: 'Total',\n        scale: 'Scale',\n        series: 'Series',\n        weekend: 'Weekend',\n        nodata: 'No data',\n    },\n};\n\nexport default (locale: keyof typeof LOCALIZATIONS | Record<string, string> = 'en') => {\n    if (typeof locale !== 'string') {\n        LOCALIZATIONS.custom = locale;\n        locale = 'custom';\n    }\n\n    return (key: string) => {\n        return LOCALIZATIONS[locale as string][key] || key;\n    };\n};\n", "/* eslint-disable complexity, no-nested-ternary */\n\nimport uPlot, {Series} from 'uplot';\n\nimport {CursorOptions} from '../cursor/cursor';\nimport {placement as placementFn} from './placement';\n\nimport Yagr from '../../index';\nimport {DataSeries, ProcessingInterpolation, YagrPlugin} from '../../types';\n\nimport {\n    TOOLTIP_Y_OFFSET,\n    TOOLTIP_X_OFFSET,\n    TOOLTIP_DEFAULT_MAX_LINES,\n    DEFAULT_Y_SCALE,\n} from '../../defaults';\n\nimport {findInRange, findDataIdx, findSticky, px, isNil, inBetween} from '../../utils/common';\nimport {\n    TooltipOptions,\n    TooltipRow,\n    TrackingOptions,\n    ValueFormatter,\n    TooltipSection,\n    TooltipHandler,\n    TooltipData,\n    TooltipState,\n    TooltipAction,\n    SelectionRange,\n} from './types';\n\nimport {renderTooltip} from './render';\nimport {getOptionValue} from './utils';\n\n// eslint-disable-next-line complexity\nconst findValue = (\n    cursor: CursorOptions,\n    data: DataSeries,\n    serie: Series,\n    idx: number,\n    interpolation?: ProcessingInterpolation,\n) => {\n    const source = Array.isArray(serie.$c) ? serie.$c : data;\n    let value = source[idx];\n\n    if (interpolation && value === interpolation.value) {\n        const snapTo = interpolation.snapToValues ?? 'closest';\n        const nonNullIdx = findDataIdx(source, serie, idx, snapTo, interpolation.value);\n        value = source[nonNullIdx];\n    } else if (value === null) {\n        const cursorSnapToValues = cursor.snapToValues ?? 'closest';\n        const snapTo = serie.snapToValues ?? cursorSnapToValues;\n        const nonNullIdx = findDataIdx(source, serie, idx, snapTo, null);\n        value = source[nonNullIdx];\n    }\n\n    return value;\n};\n\nconst DEFAULT_TOOLTIP_OPTIONS = {\n    maxLines: TOOLTIP_DEFAULT_MAX_LINES,\n    highlight: true,\n    sum: false,\n    render: renderTooltip,\n    pinable: true,\n    strategy: 'pin',\n    sort: undefined,\n    showIndicies: false,\n    hideNoData: false,\n    className: 'yagr-tooltip_default',\n    xOffset: TOOLTIP_X_OFFSET,\n    yOffset: TOOLTIP_Y_OFFSET,\n    virtual: false,\n    showEmpty: false,\n    onUpdate: 'reset',\n} as const;\n\nexport type TooltipPlugin = YagrPlugin<\n    {\n        state: TooltipState;\n        pin(pinState: boolean, position?: {x: number; y: number}): void;\n        show(): void;\n        hide(): void;\n        updateOptions: (o: Partial<TooltipOptions>) => void;\n        on: (event: TooltipAction, handler: TooltipHandler) => void;\n        off: (event: TooltipAction, handler: TooltipHandler) => void;\n        display: (props: {left: number; top: number; idx: number}) => void;\n        tooltip: YagrTooltip;\n        dispose: () => void;\n        reInit: (u: uPlot) => void;\n        reset: () => void;\n    },\n    [Partial<TooltipOptions>]\n>;\n\nclass YagrTooltip {\n    handlers: Record<TooltipAction, TooltipHandler[]> = {\n        init: [],\n        mount: [],\n        show: [],\n        pin: [],\n        unpin: [],\n        hide: [],\n        render: [],\n        destroy: [],\n        reset: [],\n    };\n\n    private placement: Function = placementFn;\n    private renderTooltipCloses = () => {};\n\n    private tOverlay: HTMLDivElement;\n    private bound: HTMLElement;\n    private renderNode: HTMLElement;\n    /**\n     * Flag to skip next mouseup event, used for unpinning\n     * tooltip on any mousedown, but continiously pinning on drag\n     */\n    private skipNextMouseUp = false;\n\n    yagr: Yagr;\n    opts: TooltipOptions;\n    state: TooltipState;\n    over: HTMLDivElement;\n\n    private bLeft: number;\n    private bTop: number;\n    private bWidth: number;\n\n    constructor(yagr: Yagr, options: Partial<TooltipOptions> = {}) {\n        this.yagr = yagr;\n        this.over = yagr?.uplot?.over;\n        this.opts = {\n            ...DEFAULT_TOOLTIP_OPTIONS,\n            strategy: options.pinable ? 'pin' : DEFAULT_TOOLTIP_OPTIONS.strategy,\n            tracking: yagr.config.chart.series?.type === 'area' ? 'area' : 'sticky',\n            value: this.defaultTooltipValueFormatter,\n            ...options,\n        };\n\n        this.bound = this.opts.boundClassName\n            ? document.querySelector(this.opts.boundClassName) || document.body\n            : document.body;\n        this.renderNode = this.opts.renderClassName\n            ? document.querySelector(this.opts.renderClassName) || document.body\n            : document.body;\n        this.tOverlay = document.createElement('div');\n\n        this.tOverlay.id = `${yagr.id}_tooltip`;\n        this.tOverlay.className = `yagr-tooltip ${this.opts.className || ''}`;\n        this.tOverlay.style.display = 'none';\n\n        this.state = {\n            mounted: false,\n            pinned: false,\n            visible: false,\n            range: null,\n            focusedSeries: null,\n        };\n\n        this.bLeft = 0;\n        this.bTop = 0;\n        this.bWidth = 0;\n\n        if (this.opts.virtual) {\n            this.placement = () => {};\n        }\n    }\n\n    emit = (action: TooltipAction, data?: TooltipData) => {\n        this.handlers[action].forEach((handler) => {\n            handler(this.tOverlay, {\n                state: this.state,\n                actions: {\n                    pin: this.pin,\n                    show: this.show,\n                    hide: this.hide,\n                    dispose: this.dispose,\n                    reset: this.reset,\n                },\n                data,\n                yagr: this.yagr,\n                event: action,\n            });\n        });\n    };\n\n    reset = () => {\n        if (this.opts.onUpdate === 'none') {\n            this.yagr.plugins.cursor?.pin(false);\n            return;\n        }\n\n        if (this.state.visible) {\n            this.hide();\n        }\n\n        if (this.state.pinned) {\n            this.pin(false);\n        }\n        this.emit('reset');\n    };\n\n    show = () => {\n        const shouldEmit = !this.state.visible;\n        this.state.visible = true;\n        this.tOverlay.style.display = 'block';\n        shouldEmit && this.emit('show');\n    };\n\n    hide = () => {\n        const shouldEmit = this.state.visible;\n        this.state.visible = false;\n        this.tOverlay.style.display = 'none';\n        this.emit('hide');\n        shouldEmit && this.emit('show');\n    };\n\n    pin = (pinState: boolean, position?: {x: number; y: number}) => {\n        this.state.pinned = pinState;\n        const range = this.state.range || [];\n\n        this.yagr.plugins.cursor?.pin(pinState && (range[1] === null || range.length < 2));\n\n        if (this.opts.virtual) {\n            return this.emit(pinState ? 'pin' : 'unpin');\n        }\n\n        if (position) {\n            this.placement(\n                this.tOverlay,\n                {\n                    left: position.x + this.bLeft,\n                    top: this.bTop + position.y - (this.opts.yOffset || 0),\n                },\n                'right',\n                {\n                    bound: this.bound,\n                    xOffset: this.opts.xOffset,\n                    yOffset: this.opts.yOffset,\n                },\n            );\n        }\n\n        const list = this.tOverlay.querySelector('._tooltip-list') as HTMLElement;\n\n        if (pinState) {\n            if (!this.state.visible) {\n                this.show();\n            }\n\n            this.tOverlay.classList.add('yagr-tooltip_pinned');\n            if (list && list?.clientHeight) {\n                list.style.height = px(list.clientHeight);\n            }\n\n            if (this.opts.render === renderTooltip) {\n                document.addEventListener('mousemove', this.checkFocus);\n                document.addEventListener('mousedown', this.detectClickOutside);\n            }\n        } else {\n            this.tOverlay.classList.remove('yagr-tooltip_pinned');\n\n            if (this.opts.render === renderTooltip) {\n                document.removeEventListener('mousemove', this.checkFocus);\n                document.removeEventListener('mousedown', this.detectClickOutside);\n            }\n        }\n\n        this.emit(pinState ? 'pin' : 'unpin');\n    };\n\n    checkFocus = (event: MouseEvent) => {\n        const target = event.target as HTMLElement | null;\n        let serieIdx: string | undefined;\n\n        if (\n            target &&\n            this.tOverlay.contains(target) &&\n            target.classList.contains('yagr-tooltip__item')\n        ) {\n            serieIdx = target.dataset['series'];\n        }\n\n        const serie = serieIdx ? this.yagr.uplot.series[Number(serieIdx)] : null;\n\n        if (serieIdx && serie) {\n            this.state.focusedSeries = serieIdx;\n            this.yagr.setFocus(serie.id, true);\n        } else if (this.state.focusedSeries) {\n            this.state.focusedSeries = null;\n            this.yagr.setFocus(null, true);\n        }\n    };\n\n    render = (props: {left: number; top: number; idx: number}) => {\n        const u = this.yagr.uplot;\n        let {left, top} = props;\n        const {idx} = props;\n        const {opts, state} = this;\n\n        if (opts.show && typeof opts.show === 'function' && opts.show(this.yagr) === false) {\n            this.hide();\n            return;\n        }\n\n        if ((left < 0 || top < 0) && !state.pinned && this.isNotInDrag) {\n            this.hide();\n        }\n\n        top = inBetween(top, 0, (u.bbox.top + u.bbox.height) / window.devicePixelRatio);\n        left = inBetween(left, 0, (u.bbox.left + u.bbox.width) / window.devicePixelRatio);\n\n        const {data} = u;\n\n        if (data === null || isNil(idx) || top === undefined) {\n            return;\n        }\n\n        const x = data[0][idx];\n\n        const sum: Record<string, number> = {};\n        const sections: Record<string, TooltipSection> = {};\n\n        const rowsBySections: Record<string, number[]> = {};\n\n        let i = u.series.length - 1;\n        while (i >= 1) {\n            const serie = u.series[i];\n\n            // Skip only if really hidden (not temporarily hidden for showInGraph)\n            if (!serie.show && !serie._tempHidden) {\n                i -= 1;\n                continue;\n            }\n\n            const scale = serie.scale || DEFAULT_Y_SCALE;\n\n            rowsBySections[scale] = rowsBySections[scale] || [];\n            rowsBySections[scale].push(i);\n            i -= 1;\n        }\n\n        const rowEntries = Object.entries(rowsBySections);\n\n        rowEntries.forEach(([scale, serieIndicies]) => {\n            sections[scale] = sections[scale] || {\n                rows: [],\n            };\n            const section = sections[scale];\n            const cursorPosition = u.scales[scale].ori === 0 ? left : top;\n            const cursorValue = Number(u.posToVal(cursorPosition, scale).toFixed(2));\n\n            const valueRender = getOptionValue<ValueFormatter>(opts.value, scale);\n\n            for (const seriesIdx of serieIndicies) {\n                const seriesData = u.data[seriesIdx] as DataSeries;\n                const serie = u.series[seriesIdx];\n\n                let value = findValue(\n                    this.yagr.config.cursor,\n                    seriesData,\n                    serie,\n                    idx,\n                    this.interpolation,\n                );\n                let dValue = value;\n\n                if (typeof value === 'string') {\n                    dValue = value;\n                    value = null;\n                }\n\n                if (getOptionValue(opts.sum, scale)) {\n                    sum[scale] = sum[scale] || 0;\n                    sum[scale] += value || 0;\n                }\n\n                const realY = seriesData[idx];\n                const yValue = serie.$c && serie.$c[idx] === this.stripValue ? value : realY;\n\n                if ((value === null && opts.hideNoData) || serie.showInTooltip === false) {\n                    continue;\n                }\n\n                const seriesPrecision = serie.precision ?? getOptionValue(opts.precision, scale);\n\n                const displayValue = serie.formatter\n                    ? serie.formatter(dValue, serie)\n                    : valueRender(dValue, seriesPrecision);\n\n                const rowData: TooltipRow = {\n                    id: serie.id,\n                    name: serie.name,\n                    dataValue: serie.$c[idx],\n                    originalValue: value,\n                    value: displayValue,\n                    y: yValue,\n                    displayY: realY,\n                    color: this.yagr.getSerieLegendColor(serie),\n                    seriesIdx,\n                    rowIdx: section.rows.length\n                        ? section.rows[section.rows.length - 1].rowIdx + 1\n                        : 0,\n                };\n\n                if (serie.normalizedData) {\n                    rowData.transformed = serie.normalizedData[idx];\n                }\n\n                if (serie._transformed) {\n                    rowData.transformed = seriesData[idx];\n                }\n\n                if (opts.omitBy && opts.omitBy(rowData)) {\n                    continue;\n                }\n\n                section.rows.push(rowData);\n            }\n\n            if (getOptionValue(opts.highlight, scale) && section.rows.length) {\n                const tracking = getOptionValue<TrackingOptions>(opts.tracking, scale);\n                let activeIndex: number | null = 0;\n                if (tracking === 'area') {\n                    activeIndex = findInRange(\n                        section,\n                        cursorValue,\n                        getOptionValue<boolean | undefined>(opts.stickToRanges, scale),\n                    );\n                } else if (tracking === 'sticky') {\n                    activeIndex = findSticky(section, cursorValue);\n                } else if (typeof tracking === 'function') {\n                    activeIndex = tracking(section, cursorValue, {\n                        x: u.posToVal(left, 'x'),\n                        y: u.posToVal(top, scale),\n                        idx,\n                        scale,\n                        series: this.yagr.series,\n                        serieIndicies,\n                        interpolation: this.interpolation,\n                    });\n                }\n\n                if (activeIndex !== null) {\n                    section.rows[activeIndex].active = true;\n                }\n            }\n\n            const sort = getOptionValue(opts.sort, scale);\n            if (sort) {\n                section.rows.sort(sort);\n            }\n        });\n\n        const hasOneRow = Object.values(sections).some(({rows}) => rows.length > 0);\n\n        if (hasOneRow || opts.showEmpty) {\n            this.onMouseEnter();\n        } else {\n            this.hide();\n            return;\n        }\n\n        const bbox = this.over.getBoundingClientRect();\n\n        this.bLeft = bbox.left;\n        this.bTop = bbox.top;\n        this.bWidth = bbox.width;\n\n        const anchor = {\n            left: left + this.bLeft,\n            top: this.bTop + top - (opts.yOffset || 0),\n        };\n\n        this.renderTooltipCloses = () => {\n            const renderData = {\n                scales: Object.entries(sections).map(([scale, sec]) => {\n                    return {\n                        scale,\n                        rows: sec.rows,\n                        sum: sum[scale],\n                    };\n                }),\n                options: opts,\n                x,\n            };\n\n            const hasDataNow = Object.values(sections).some(\n                ({rows}) => rows.filter(({id}) => this.yagr.getSeriesById(id)?.show).length > 0,\n            );\n\n            if (!hasDataNow && !opts.showEmpty) {\n                this.hide();\n                return;\n            }\n\n            if (!opts.virtual) {\n                this.tOverlay.innerHTML = opts.render({\n                    ...renderData,\n                    state,\n                    yagr: this.yagr,\n                    defaultRender: DEFAULT_TOOLTIP_OPTIONS.render,\n                });\n\n                this.placement(this.tOverlay, anchor, 'right', {\n                    bound: this.bound,\n                    xOffset: opts.xOffset,\n                    yOffset: opts.yOffset,\n                });\n            }\n\n            this.emit('render', {...renderData, anchor});\n        };\n\n        if (state.pinned) {\n            return;\n        }\n\n        this.renderTooltipCloses();\n    };\n\n    initWithUplot = (u: uPlot) => {\n        this.over = u.root.querySelector('.u-over') as HTMLDivElement;\n\n        this.over.addEventListener('mousedown', this.onMouseDown);\n        this.over.addEventListener('mousemove', this.onMouseMove);\n        this.over.addEventListener('mouseenter', this.onMouseEnter);\n        this.over.addEventListener('mouseleave', this.onMouseLeave);\n\n        document.addEventListener('mouseup', this.onMouseUp);\n\n        this.mountTooltip();\n    };\n\n    setSize = () => {\n        const bbox = this.over.getBoundingClientRect();\n\n        this.bLeft = bbox.left;\n        this.bTop = bbox.top;\n    };\n\n    dispose = () => {\n        /** Free overlay listeners */\n        this.over.removeEventListener('mousedown', this.onMouseDown);\n        this.over.removeEventListener('mousemove', this.onMouseMove);\n        this.over.removeEventListener('mouseenter', this.onMouseEnter);\n        this.over.removeEventListener('mouseleave', this.onMouseLeave);\n\n        document.removeEventListener('mouseup', this.onMouseUp);\n        document.removeEventListener('mousemove', this.checkFocus);\n        document.removeEventListener('mousedown', this.detectClickOutside);\n\n        /** Removing tooltip on destroy */\n        this.tOverlay.remove();\n        this.state.mounted = false;\n        this.emit('destroy');\n    };\n\n    updateOptions = (newOptions: Partial<TooltipOptions>) => {\n        Object.assign(this.opts, newOptions);\n        this.tOverlay.className = `yagr-tooltip ${this.opts.className || ''}`;\n    };\n\n    on = (event: TooltipAction, handler: TooltipHandler) => {\n        this.handlers[event].push(handler);\n    };\n\n    off = (event: TooltipAction, handler: TooltipHandler) => {\n        this.handlers[event] = this.handlers[event].filter((h) => h !== handler);\n    };\n\n    private mountTooltip = () => {\n        if (!this.opts.virtual) {\n            this.renderNode = this.opts.renderClassName\n                ? document.querySelector(this.opts.renderClassName) || document.body\n                : document.body;\n            this.renderNode.appendChild(this.tOverlay);\n            this.state.mounted = true;\n            this.emit('mount');\n        }\n    };\n\n    private detectClickOutside = (event: MouseEvent) => {\n        const target = event.target;\n\n        if (target instanceof Element) {\n            const isClickInsideTooltip = target && this.tOverlay.contains(target);\n            const isClickOnUplotOver = target && this.over.contains(target);\n\n            if (!isClickInsideTooltip && !isClickOnUplotOver) {\n                this.pin(false);\n                this.hide();\n            }\n        }\n    };\n\n    private onMouseDown = (evt: MouseEvent) => {\n        this.state.range = [this.getCursorPosition(), null];\n\n        if (this.state.pinned) {\n            this.pin(false);\n            this.hide();\n            this.render({\n                left: evt.clientX - this.bLeft,\n                top: evt.clientY - this.bTop,\n                idx: this.yagr.uplot.posToIdx(evt.clientX - this.bLeft),\n            });\n            this.skipNextMouseUp = true;\n        }\n    };\n\n    private onMouseMove = () => {\n        if (this.state.range?.length) {\n            this.state.range[1] = this.getCursorPosition();\n        }\n    };\n\n    /**\n     * Calculates where exactly cursor leaved the chart\n     * and sets range[1] to this position\n     */\n    private setCursorLeaved = (e: MouseEvent) => {\n        const rect = this.over.getBoundingClientRect();\n        const x = e.clientX;\n        const range = this.state.range!;\n        const startPoint = range[0]!;\n        const xInOver = x - rect.left;\n        const end = xInOver > startPoint.clientX;\n        const timeline = this.yagr.config.timeline;\n\n        let result;\n        if (end) {\n            range[1] = {\n                clientX: this.bWidth,\n                value: this.yagr.uplot.posToVal(this.bWidth, 'x'),\n                idx: timeline.length - 1,\n            };\n            result = range[1];\n        } else {\n            /** Swap range[1] and range[0] in case if tooltip leaved chart in begining of element */\n            range[1] = range[0];\n            range[0] = {\n                clientX: 0,\n                value: this.yagr.uplot.posToVal(0, 'x'),\n                idx: 0,\n            };\n\n            result = range[0];\n        }\n\n        this.yagr.uplot.setCursor({\n            left: result.clientX,\n            top: e.clientY - rect.top,\n        });\n    };\n\n    private onMouseUp = (e: MouseEvent) => {\n        if (this.state.range === null) {\n            return;\n        }\n\n        const [from] = this.state.range || [];\n        let cursor: SelectionRange[number];\n\n        if (e.target === this.over) {\n            cursor = this.getCursorPosition();\n        } else {\n            cursor = this.state.range[1];\n        }\n\n        if (this.opts.strategy === 'none') {\n            return;\n        }\n\n        const click = from && from.clientX === cursor?.clientX;\n        const drag = from && from.clientX !== cursor?.clientX;\n\n        const strategy = this.opts.strategy;\n\n        if (\n            (click && !this.skipNextMouseUp && strategy !== 'drag') ||\n            (drag && (strategy === 'all' || strategy === 'drag'))\n        ) {\n            this.pin(!this.state.pinned);\n            this.show();\n            this.renderTooltipCloses();\n        }\n\n        this.state.range = null;\n        this.skipNextMouseUp = false;\n    };\n\n    private onMouseEnter = () => {\n        this.show();\n    };\n\n    private onMouseLeave = (e: MouseEvent) => {\n        const isPinned = this.state.pinned;\n\n        if (this.state.range?.[0]) {\n            this.setCursorLeaved(e);\n        }\n\n        if (!isPinned && this.isNotInDrag) {\n            this.hide();\n        }\n    };\n\n    private defaultTooltipValueFormatter = (n: string | number | null, precision?: number) => {\n        const pSettings = this.yagr.config.processing || {};\n\n        if (typeof n === 'string') {\n            if (pSettings.nullValues && pSettings.nullValues.hasOwnProperty(n)) {\n                return pSettings.nullValues[n] as string;\n            }\n\n            return '-';\n        }\n\n        if (typeof n === 'number') {\n            return n.toFixed(\n                // eslint-disable-next-line no-nested-ternary\n                typeof precision === 'number'\n                    ? precision\n                    : typeof this.opts.precision === 'number'\n                      ? this.opts.precision\n                      : 2,\n            );\n        }\n\n        return '-';\n    };\n\n    private getCursorPosition = (): SelectionRange[number] => {\n        const x = this.yagr.uplot.cursor.left;\n\n        if (x === undefined) {\n            return null;\n        }\n\n        return {\n            clientX: x,\n            value: this.yagr.uplot.posToVal(x, 'x'),\n            idx: this.yagr.uplot.posToIdx(x),\n        };\n    };\n\n    get interpolation() {\n        return this.yagr.config.processing?.interpolation;\n    }\n    get stripValue() {\n        return this.interpolation ? this.interpolation.value : undefined;\n    }\n    get isNotInDrag() {\n        if (this.opts.strategy === 'none' || this.opts.strategy === 'pin') {\n            return true;\n        }\n\n        return !this.state.range?.[1];\n    }\n}\n\n/*\n * Tooltip plugin constructor .\n * Every charts has it's own tooltip plugin instance\n */\nfunction YagrTooltipPlugin(\n    yagr: Yagr,\n    options: Partial<TooltipOptions> = {},\n): ReturnType<TooltipPlugin> {\n    const tooltip = new YagrTooltip(yagr, options);\n\n    const getUplotPlugin = () => ({\n        hooks: {\n            destroy: () => {\n                tooltip.dispose();\n            },\n            init: (u: uPlot) => {\n                tooltip.initWithUplot(u);\n            },\n            setSize: () => {\n                tooltip.setSize();\n            },\n\n            setCursor: (u: uPlot) => {\n                tooltip.render(u.cursor as Parameters<typeof tooltip.render>[0]);\n            },\n        },\n    });\n\n    const uPlotPlugin = getUplotPlugin();\n\n    function reInit(u: uPlot) {\n        const uPlugin = getUplotPlugin();\n\n        tooltip.reset();\n\n        u.hooks.init!.push(uPlugin.hooks.init);\n        u.hooks.destroy!.push(uPlugin.hooks.destroy);\n        u.hooks.setSize!.push(uPlugin.hooks.setSize);\n        u.hooks.setCursor!.push(uPlugin.hooks.setCursor);\n    }\n\n    return {\n        state: tooltip.state,\n        pin: tooltip.pin,\n        show: tooltip.show,\n        hide: tooltip.hide,\n        uplot: uPlotPlugin,\n        display: tooltip.render,\n        updateOptions: tooltip.updateOptions,\n        on: tooltip.on,\n        off: tooltip.off,\n        tooltip,\n        dispose: tooltip.dispose,\n        reInit,\n        reset: tooltip.reset,\n    };\n}\n\nexport default YagrTooltipPlugin;\n", "import type Yagr from '../../index';\nimport UPlot, {Plugin, Series} from 'uplot';\n\nimport {DEFAULT_X_SCALE, DEFAULT_Y_SCALE, DEFAULT_POINT_SIZE} from '../../defaults';\nimport {DotsSeriesOptions, YagrConfig} from '../../types';\nimport {isNil} from '../..//utils/common';\n\nexport const renderCircle = (\n    u: UPlot,\n    x: number,\n    y: number,\n    r: number,\n    s: number,\n    color: string,\n    strokeColor: string,\n    yScale?: string,\n) => {\n    const {ctx} = u;\n    const cx = Math.round(u.valToPos(x, DEFAULT_X_SCALE, true));\n    const cy = Math.round(u.valToPos(y, yScale || DEFAULT_Y_SCALE, true));\n\n    ctx.beginPath();\n    ctx.arc(cx, cy, r * 2, 0, 2 * Math.PI);\n\n    ctx.fillStyle = color;\n\n    if (s) {\n        const lineWidth = ctx.lineWidth;\n        const strokeStyle = ctx.strokeStyle;\n        ctx.lineWidth = s;\n        ctx.strokeStyle = strokeColor;\n        ctx.stroke();\n        ctx.lineWidth = lineWidth;\n        ctx.strokeStyle = strokeStyle;\n    }\n\n    ctx.fill();\n    ctx.closePath();\n};\n\n// Same as uPlot with clipping line content\nconst drawWithinPlot = (u: UPlot, draw: () => void) => {\n    const {ctx, bbox} = u;\n\n    ctx.save();\n    ctx.beginPath();\n    ctx.rect(bbox.left, bbox.top, bbox.width, bbox.height);\n    // here we're clipping all dots outside the rect\n    ctx.clip();\n\n    try {\n        draw();\n    } finally {\n        ctx.restore();\n    }\n};\n\nexport function drawMarkersIfRequired(u: UPlot, i: number, i0: number, i1: number) {\n    const {color, scale, spanGaps, count, pointsSize} = u.series[i];\n\n    if (spanGaps && count > 1) {\n        return false;\n    }\n\n    let j = i0;\n    let prev: number | null | undefined;\n\n    drawWithinPlot(u, () => {\n        while (j <= i1) {\n            const val = u.data[i][j];\n\n            if (val === null) {\n                prev = val;\n                j++;\n                continue;\n            }\n\n            const nextIdx = j + 1;\n            const next = u.data[i][nextIdx];\n\n            if (isNil(prev) && isNil(next)) {\n                renderCircle(\n                    u,\n                    u.data[0][j] as number,\n                    val as number,\n                    pointsSize ?? DEFAULT_POINT_SIZE / 2,\n                    0,\n                    color,\n                    color,\n                    scale || DEFAULT_Y_SCALE,\n                );\n            }\n            prev = val;\n            j++;\n        }\n    });\n\n    return undefined;\n}\n\n/*\n * This plugin configures points markers\n */\nexport default function YagrMarkersPlugin(yagr: Yagr, config: YagrConfig): Plugin {\n    const {\n        size = DEFAULT_POINT_SIZE,\n        strokeWidth = 2,\n        strokeColor = '#ffffff',\n        show,\n    } = config.markers;\n\n    const chartSeriesOptions = config.chart?.series as DotsSeriesOptions;\n    const defaultDotsSize = chartSeriesOptions?.pointsSize || DEFAULT_POINT_SIZE;\n\n    function drawCircles(u: UPlot, i: number, i0: number, i1: number) {\n        const {scale, _focus, color, getFocusedColor, type} = u.series[i];\n\n        let j = i0;\n\n        // eslint-disable-next-line no-nested-ternary\n        const pointSize = type === 'dots' ? (show ? size : defaultDotsSize) : size;\n\n        drawWithinPlot(u, () => {\n            while (j <= i1) {\n                const val = u.data[i][j];\n                if (val !== null) {\n                    renderCircle(\n                        u,\n                        u.data[0][j] as number,\n                        val as number,\n                        pointSize,\n                        strokeWidth,\n                        (_focus || _focus === null ? color : getFocusedColor(yagr, i)) || color,\n                        strokeColor,\n                        scale || DEFAULT_Y_SCALE,\n                    );\n                }\n                j++;\n            }\n        });\n\n        return undefined;\n    }\n\n    const markSeries = (idx: number | null, s: Series) => {\n        if (idx === 0 || idx === null) {\n            return;\n        }\n\n        if (s.type === 'dots' || config.markers.show) {\n            s.points = s.points || {};\n            s.points.show = drawCircles;\n        }\n    };\n\n    return {\n        opts: (_, opts) => {\n            if (!(config.markers.show || opts.series.some((s) => s.type === 'dots'))) {\n                return;\n            }\n            opts.series.forEach((s, i) => markSeries(i, s));\n        },\n\n        hooks: {\n            addSeries: (uplot, seriesIdx) => {\n                const series = uplot.series[seriesIdx];\n                markSeries(seriesIdx, series);\n            },\n            setSeries: (_, idx, series) => {\n                markSeries(idx, series);\n            },\n        },\n    };\n}\n", "import UPlot from 'uplot';\nimport * as defaults from '../defaults';\n\n/*\n * Configures and return apropriate path renderer\n * by given serieIndex and two points\n */\nexport function pathsRenderer(u: UPlot, seriesIdx: number, idx0: number, idx1: number) {\n    const serie = u.series[seriesIdx];\n    const {type, interpolation} = serie;\n\n    let drawer;\n\n    switch (type) {\n        case 'column': {\n            drawer =\n                UPlot.paths.bars &&\n                UPlot.paths.bars({\n                    size: [defaults.BARS_DRAW_FACTOR, defaults.BARS_DRAW_MAX],\n                    ...(u.series[seriesIdx].renderOptions || {}),\n                });\n            break;\n        }\n        case 'dots': {\n            drawer = () => null;\n            break;\n        }\n        case 'line':\n        case 'area':\n        default: {\n            switch (interpolation) {\n                case 'smooth':\n                    drawer = UPlot.paths.spline && UPlot.paths.spline();\n                    break;\n                case 'left':\n                    drawer = UPlot.paths.stepped && UPlot.paths.stepped({align: 1});\n                    break;\n                case 'right': {\n                    drawer = UPlot.paths.stepped && UPlot.paths.stepped({align: -1});\n                    break;\n                }\n                case 'linear':\n                default:\n                    drawer = UPlot.paths.linear && UPlot.paths.linear();\n                    break;\n            }\n        }\n    }\n\n    return drawer ? drawer(u, seriesIdx, idx0, idx1) : null;\n}\n", "import {Series} from 'uplot';\n\nimport * as defaults from '../defaults';\nimport type Yagr from '..';\n\nimport {\n    AreaSeriesOptions,\n    ColumnSeriesOptions,\n    DotsSeriesOptions,\n    LineSeriesOptions,\n    RawSerieData,\n    SeriesOptions,\n} from '../types';\nimport {genId} from './common';\nimport {getFocusedColor, getSerieFocusColors} from './colors';\nimport {drawMarkersIfRequired} from '../plugins/markers';\nimport {pathsRenderer} from './paths';\n\nfunction getCommonProperty<T extends SeriesOptions, K extends keyof T>(\n    series: RawSerieData | Series,\n    yagr: Yagr,\n    key: K,\n    defaultValue?: T[K],\n): T[K] | undefined {\n    if (series[key as keyof typeof series] !== undefined) {\n        return series[key as keyof typeof series] as T[K];\n    }\n\n    const seriesOptions = yagr.config.chart.series;\n    if (seriesOptions && key in seriesOptions) {\n        return seriesOptions[key as keyof SeriesOptions] as T[K];\n    }\n\n    return defaultValue;\n}\n\n// eslint-disable-next-line complexity\nexport function configureSeries(yagr: Yagr, rawSeries: RawSerieData, idx: number): Series {\n    const type = getCommonProperty(rawSeries, yagr, 'type', 'line');\n\n    const serie: Series = {\n        ...rawSeries,\n        type,\n        show: rawSeries.show ?? true,\n        showInGraph: rawSeries.showInGraph ?? true,\n        name: rawSeries.name || `${yagr.utils.i18n('series')} ${idx + 1}`,\n        color: rawSeries.color\n            ? yagr.utils.colors.parse(rawSeries.color)\n            : yagr.utils.theme.DEFAULT_LINE_COLOR,\n        id: (rawSeries.id === undefined ? rawSeries.name : String(rawSeries.id)) || genId(),\n        $c: rawSeries.data,\n        scale: rawSeries.scale || defaults.DEFAULT_Y_SCALE,\n        count: 0,\n        sum: 0,\n        avg: 0,\n        getFocusedColor,\n    };\n\n    serie.points = serie.points || {};\n\n    const colorFn = getSerieFocusColors(yagr, 'color');\n\n    if (serie.type === 'area') {\n        serie.lineColor = yagr.utils.colors.parse(\n            getCommonProperty<AreaSeriesOptions, 'lineColor'>(\n                rawSeries,\n                yagr,\n                'lineColor',\n                defaults.SERIE_AREA_BORDER_COLOR,\n            ),\n        );\n        serie.lineWidth = getCommonProperty<AreaSeriesOptions, 'lineWidth'>(\n            rawSeries,\n            yagr,\n            'lineWidth',\n            defaults.SERIE_AREA_BORDER_WIDTH,\n        );\n\n        serie.fill = colorFn;\n        serie.stroke = getSerieFocusColors(yagr, 'lineColor');\n        serie.width = serie.lineWidth;\n        serie.points.show = drawMarkersIfRequired;\n        serie.interpolation = getCommonProperty<AreaSeriesOptions, 'interpolation'>(\n            rawSeries,\n            yagr,\n            'interpolation',\n            'linear',\n        );\n        serie.spanGaps = getCommonProperty<AreaSeriesOptions, 'spanGaps'>(\n            rawSeries,\n            yagr,\n            'spanGaps',\n            false,\n        );\n    }\n\n    if (serie.type === 'line') {\n        serie.width = getCommonProperty<LineSeriesOptions, 'width'>(\n            rawSeries,\n            yagr,\n            'width',\n            defaults.SERIE_LINE_WIDTH,\n        );\n        serie.width = serie.width || defaults.SERIE_LINE_WIDTH;\n        serie.stroke = colorFn;\n        serie.points.show = drawMarkersIfRequired;\n        serie.interpolation = getCommonProperty<LineSeriesOptions, 'interpolation'>(\n            rawSeries,\n            yagr,\n            'interpolation',\n            'linear',\n        );\n        serie.spanGaps = getCommonProperty<LineSeriesOptions, 'spanGaps'>(\n            rawSeries,\n            yagr,\n            'spanGaps',\n            false,\n        );\n    }\n\n    if (serie.type === 'column') {\n        serie.stroke = colorFn;\n        serie.fill = colorFn;\n        serie.points.show = false;\n        serie.width = serie.width ?? 0;\n        serie.renderOptions = getCommonProperty<ColumnSeriesOptions, 'renderOptions'>(\n            serie,\n            yagr,\n            'renderOptions',\n        );\n    }\n\n    if (serie.type === 'dots') {\n        serie.stroke = () => serie.color;\n        serie.fill = colorFn;\n        serie.width = 2;\n        serie.pointsSize = getCommonProperty<DotsSeriesOptions, 'pointsSize'>(\n            serie,\n            yagr,\n            'pointsSize',\n            defaults.DEFAULT_POINT_SIZE,\n        );\n    }\n\n    serie.paths = pathsRenderer;\n\n    return serie;\n}\n\nexport const overrideSeriesInUpdate = (dest: Series, source: Series) => {\n    dest.$c = source.$c ?? dest.$c;\n    dest.show = source.show ?? dest.show;\n    dest.showInGraph = source.showInGraph ?? dest.showInGraph;\n    dest.data = source.data ?? dest.data;\n    dest.width = source.width ?? dest.width;\n    dest.pointsSize = source.pointsSize ?? dest.pointsSize;\n    dest.color = source.color ?? dest.color;\n    dest.lineColor = source.lineColor ?? dest.lineColor;\n    dest.lineWidth = source.lineWidth ?? dest.lineWidth;\n    dest.stroke = source.stroke ?? dest.stroke;\n    dest.getFocusedColor = source.getFocusedColor ?? dest.getFocusedColor;\n    dest.formatter = source.formatter ?? dest.formatter;\n    dest.paths = source.paths ?? dest.paths;\n};\n", "import {Options, Padding} from 'uplot';\nimport * as defaults from '../defaults';\n\nexport function getPaddingByAxes(options: Options): Padding {\n    let hasLeftAxis = false;\n    let hasRightAxis = false;\n\n    if (options.axes) {\n        options.axes.forEach((axis) => {\n            if (axis.scale === defaults.DEFAULT_X_SCALE) {\n                return;\n            }\n\n            if (axis.side === undefined || axis.side === 3) {\n                hasLeftAxis = true;\n            }\n            if (axis.side === 1) {\n                hasRightAxis = true;\n            }\n        });\n    } else {\n        hasLeftAxis = true;\n    }\n\n    if (hasLeftAxis && !hasRightAxis) {\n        return defaults.PADDING_LEFT;\n    } else if (hasRightAxis && !hasLeftAxis) {\n        return defaults.PADDING_RIGHT;\n    } else {\n        return defaults.PADDING_BOTH;\n    }\n}\n", "import {DEFAULT_X_SCALE} from '../../../defaults';\nimport UPlot from 'uplot';\n\nexport function getPosition(val: number, scale: string, width: number, height: number): number {\n    if (val > 0 && scale === DEFAULT_X_SCALE) {\n        return width;\n    }\n    if (val > 0 && scale !== DEFAULT_X_SCALE) {\n        return 0;\n    }\n    if (val <= 0 && scale === DEFAULT_X_SCALE) {\n        return 0;\n    }\n\n    return height;\n}\n\nexport function calculateFromTo(\n    value: number[],\n    scale: string,\n    timeline: number[] | UPlot.TypedArray,\n    u: UPlot,\n): number[] {\n    return value\n        .map((val) => {\n            if (Math.abs(val) !== Infinity) {\n                if (scale === DEFAULT_X_SCALE) {\n                    return Math.min(Math.max(val, timeline[0]), timeline[timeline.length - 1]);\n                } else {\n                    const scaleCfg = u.scales[scale];\n                    return Math.min(Math.max(val, scaleCfg.min ?? val), scaleCfg.max ?? val);\n                }\n            }\n\n            const pos = getPosition(val, scale, u.width, u.height);\n\n            return u.posToVal(pos, scale);\n        })\n        .map((val) => u.valToPos(val, scale, true));\n}\n", "import type Yagr from '../../';\nimport UPlot, {Plugin} from 'uplot';\nimport {DEFAULT_X_SCALE, DEFAULT_CANVAS_PIXEL_RATIO} from '../../defaults';\nimport {PBandConfig, PLineConfig, PlotLineConfig, YagrPlugin} from '../../types';\nimport {DrawOrderKey} from '../../utils/types';\nimport {deepIsEqual, genId} from '../../utils/common';\nimport {calculateFromTo} from './utils';\n\nconst MAX_X_SCALE_LINE_OFFSET = 0;\nconst DRAW_MAP = {\n    [DrawOrderKey.Series]: 0,\n    [DrawOrderKey.Axes]: 1,\n    plotLines: 2,\n};\n\nconst HOOKS_MAP: Record<string, 'draw' | 'drawClear' | 'drawAxes' | 'drawSeries'> = {\n    '012': 'draw',\n    '102': 'draw',\n    '201': 'drawClear',\n    '210': 'drawClear',\n    '120': 'drawAxes',\n    '021': 'drawSeries',\n};\n\nexport type PlotLinesPlugin = YagrPlugin<{\n    update: (additionalPlotLines?: PlotLineConfig[], scale?: string) => void;\n    add: (additionalPlotLines: PlotLineConfig[], scale?: string) => void;\n    clear: (scale?: string) => void;\n    get: () => PlotLineConfig[];\n    remove: (plotLinesToRemove: PlotLineConfig[], scale?: string) => void;\n}>;\n\nexport interface PlotLineOptions {\n    render: (uPlot: uPlot, p: PlotLineConfig) => void;\n}\n\n/*\n * Plugin renders custom lines and bands on chart based on axis config.\n * Axis should be bound to scale.\n */\nexport default function plotLinesPlugin(options: PlotLineOptions): PlotLinesPlugin {\n    let plotLines = new Map<string, PlotLineConfig>();\n\n    return function (yagr: Yagr) {\n        const drawOrder = yagr.config.chart.appearance?.drawOrder;\n\n        const drawIndicies = (drawOrder ? drawOrder.map((key) => DRAW_MAP[key]) : [0, 1, 2]).join(\n            '',\n        );\n\n        const hook = HOOKS_MAP[drawIndicies] || 'drawClear';\n\n        function getLineId(line: PlotLineConfig): string {\n            if (line.id) {\n                return line.id;\n            }\n            const lineWithoutId = Array.from(plotLines.entries()).find(([_, l]) =>\n                deepIsEqual(l, line),\n            )?.[0];\n            return lineWithoutId || genId();\n        }\n\n        function renderPlotLines(u: UPlot) {\n            const {ctx} = u;\n            const {height, top, width, left} = u.bbox;\n            const timeline = u.data[0];\n\n            for (const plotLineConfig of plotLines.values()) {\n                if (!plotLineConfig.scale) {\n                    continue;\n                }\n\n                if (options.render) {\n                    options.render(u, plotLineConfig);\n                    continue;\n                }\n\n                ctx.save();\n                ctx.fillStyle = yagr.utils.colors.parse(plotLineConfig.color);\n\n                const {scale, value} = plotLineConfig;\n\n                const isBand = Array.isArray(value);\n                const [from, to] = isBand\n                    ? calculateFromTo(value, scale, timeline, u)\n                    : [u.valToPos(value, scale, true), 0];\n\n                if (isBand) {\n                    const accent = (plotLineConfig as PBandConfig).accent;\n                    if (scale === DEFAULT_X_SCALE) {\n                        ctx.fillRect(from, top, to - from, height);\n                        if (accent) {\n                            ctx.fillStyle = accent.color;\n                            ctx.fillRect(from, top - accent.space, to - from, accent.space);\n                        }\n                    } else {\n                        ctx.fillRect(left, from, width, to - from);\n                        if (accent) {\n                            ctx.fillStyle = accent.color;\n                            ctx.fillRect(width + left, from, accent.space, to - from);\n                        }\n                    }\n                } else {\n                    const pConf = plotLineConfig as PLineConfig;\n\n                    ctx.beginPath();\n\n                    if (scale === DEFAULT_X_SCALE) {\n                        /** Workaround to ensure that plot line will not be drawn over axes */\n                        const last = u.data[0][u.data[0].length - 1] as number;\n                        const lastValue = u.valToPos(last, scale, true);\n                        if (from - lastValue > MAX_X_SCALE_LINE_OFFSET) {\n                            continue;\n                        }\n\n                        ctx.moveTo(from, top);\n                        ctx.lineTo(from, height + top);\n                    } else {\n                        ctx.moveTo(left, from);\n                        ctx.lineTo(width + left, from);\n                    }\n\n                    ctx.lineWidth = pConf.width || DEFAULT_CANVAS_PIXEL_RATIO;\n                    ctx.strokeStyle = pConf.color || '#000';\n                    if (pConf.dash) {\n                        ctx.setLineDash(pConf.dash);\n                    }\n\n                    if (pConf.lineCap) {\n                        ctx.lineCap = pConf.lineCap;\n                    }\n                    ctx.stroke();\n                }\n\n                ctx.restore();\n            }\n        }\n\n        const handler =\n            hook === 'drawSeries'\n                ? (u: UPlot, sIdx: number) => {\n                      if (sIdx === u.series.length - 1) {\n                          renderPlotLines(u);\n                      }\n                  }\n                : renderPlotLines;\n\n        function addPlotLines(additionalPlotLines: PlotLineConfig[]) {\n            for (const line of additionalPlotLines) {\n                const lineId = getLineId(line);\n                plotLines.set(lineId, line);\n            }\n        }\n\n        function removePlotLines(plotLinesToRemove: PlotLineConfig[]) {\n            for (const lineToRemove of plotLinesToRemove) {\n                const lineId = getLineId(lineToRemove);\n                plotLines.delete(lineId);\n            }\n        }\n        function getPlotLines(): PlotLineConfig[] {\n            return Array.from(plotLines.values());\n        }\n\n        function updatePlotLines(newPlotLines?: PlotLineConfig[], scale?: string) {\n            if (!newPlotLines || newPlotLines.length === 0) {\n                clearPlotLines(scale);\n                return;\n            }\n\n            const existingKeys = new Set<string>();\n\n            for (const newLine of newPlotLines) {\n                const lineId = getLineId(newLine);\n                plotLines.set(lineId, newLine);\n                existingKeys.add(lineId);\n            }\n\n            // Delete not actual lines from map\n            for (const [key, line] of plotLines.entries()) {\n                if ((!scale || line.scale === scale) && !existingKeys.has(key)) {\n                    plotLines.delete(key);\n                }\n            }\n        }\n\n        function clearPlotLines(scale?: string) {\n            if (scale) {\n                plotLines.forEach((line, key) => {\n                    if (line.scale === scale) {\n                        plotLines.delete(key);\n                    }\n                });\n            } else {\n                plotLines.clear();\n            }\n        }\n\n        const plugin = {\n            get: getPlotLines,\n            clear: clearPlotLines,\n            remove: removePlotLines,\n            add: addPlotLines,\n            update: updatePlotLines,\n            uplot: {\n                opts: () => {\n                    const config = yagr.config;\n                    plotLines = new Map();\n\n                    for (const scale in config.axes) {\n                        if (config.axes.hasOwnProperty(scale)) {\n                            const axisConfig = config.axes[scale];\n                            if (axisConfig.plotLines) {\n                                for (const plotLine of axisConfig.plotLines) {\n                                    plotLines.set(plotLine.id || genId(), {\n                                        ...plotLine,\n                                        scale,\n                                    });\n                                }\n                            }\n                        }\n                    }\n                },\n                hooks: {\n                    // @TODO Add feature to draw plot lines over series\n                    [hook]: handler,\n                },\n            } as Plugin,\n        };\n\n        return plugin;\n    };\n}\n", "/* eslint-disable complexity */\n\nimport uPlot, {Series, Plugin, Options as UPlotOptions, DrawOrderKey as uDrawOrderKey} from 'uplot';\n\nimport type {MinimalValidConfig} from '../types';\nimport Yagr, {YagrMeta} from '..';\n\nimport tooltipPlugin from '../plugins/tooltip/tooltip';\nimport CursorPlugin from '../plugins/cursor/cursor';\nimport {\n    DEFAULT_CANVAS_PIXEL_RATIO,\n    DEFAULT_FOCUS_ALPHA,\n    DEFAULT_X_SCALE,\n    DEFAULT_X_SERIE_NAME,\n    MIN_SELECTION_WIDTH,\n    TIME_MULTIPLIER,\n} from '../defaults';\nimport {configureSeries} from '../utils/series';\nimport markersPlugin from '../plugins/markers';\nimport {configureScales} from '../utils/scales';\nimport {configureAxes} from '../utils/axes';\nimport {getPaddingByAxes} from '../utils/chart';\nimport {DrawOrderKey} from '../utils/types';\nimport plotLinesPlugin from '../plugins/plotLines/plotLines';\n\nfunction setIfNotSet(hooks: uPlot.Hooks.Arrays[keyof uPlot.Hooks.Arrays], fn: (u: uPlot) => void) {\n    for (const hook of hooks || []) {\n        if (hook === fn) {\n            return;\n        }\n    }\n    hooks?.push(fn);\n}\n\nexport class CreateUplotOptionsMixin<T extends MinimalValidConfig> {\n    initMixin(this: Yagr) {\n        this._uHooks.onDraw = () => {\n            if (this.state.stage === 'listen') {\n                return;\n            }\n            this.state.stage = 'listen';\n            this.execHooks('stage', {chart: this, stage: this.state.stage});\n            const renderTime = performance.now() - this._startTime;\n            this._meta.renderTime = renderTime;\n            this.execHooks('load', {\n                chart: this,\n                meta: this._meta as YagrMeta,\n            });\n        };\n\n        this._uHooks.ready = () => {\n            const initTime = performance.now() - this._startTime;\n            this._meta.initTime = initTime;\n            this.execHooks('inited', {\n                chart: this,\n                meta: {\n                    initTime,\n                },\n            });\n        };\n        this._uHooks.drawClear = (u: uPlot) => {\n            const {ctx} = u;\n            ctx.save();\n            ctx.fillStyle = this.utils.theme.BACKGROUND;\n            ctx.fillRect(\n                DEFAULT_CANVAS_PIXEL_RATIO,\n                DEFAULT_CANVAS_PIXEL_RATIO,\n                u.width * DEFAULT_CANVAS_PIXEL_RATIO - 2 * DEFAULT_CANVAS_PIXEL_RATIO,\n                u.height * DEFAULT_CANVAS_PIXEL_RATIO - 2 * DEFAULT_CANVAS_PIXEL_RATIO,\n            );\n            ctx.restore();\n        };\n        this._uHooks.setSelect = (u: uPlot) => {\n            const {left, width} = u.select;\n            const [_from, _to] = [\n                u.posToVal(left, DEFAULT_X_SCALE),\n                u.posToVal(left + width, DEFAULT_X_SCALE),\n            ];\n            const {timeMultiplier = TIME_MULTIPLIER} = this.config.chart || {};\n\n            this.execHooks('onSelect', {\n                from: Math.ceil(_from / timeMultiplier),\n                to: Math.ceil(_to / timeMultiplier),\n                chart: this,\n            });\n            u.setSelect({width: 0, height: 0, top: 0, left: 0}, false);\n        };\n        this._uHooks.setScale = (_u: uPlot) => {\n            const scales = this.getScales();\n            this.execHooks('scaleUpdate', {\n                scales,\n                chart: this,\n            });\n        };\n    }\n\n    /**\n     * @internal\n     * @param reOpt If in reOpt cycle (e.g. batch update), then won't reinit hooks.\n     * @description Creates uPlot options from Yagr config, sets up plugins. Non idempotent.\n     * @returns uPlot options\n     */\n    protected createUplotOptions(this: Yagr<T>, reOpt = false) {\n        const {config} = this;\n        const plugins: Plugin[] = [];\n\n        let tooltipInstance = this.plugins?.tooltip;\n\n        /** Setting up TooltipPugin */\n        if (config.tooltip && config.tooltip.show !== false) {\n            if (tooltipInstance) {\n                tooltipInstance.updateOptions(config.tooltip);\n            } else {\n                tooltipInstance = tooltipPlugin(this, config.tooltip);\n            }\n            plugins.push(tooltipInstance.uplot);\n            this.plugins.tooltip = tooltipInstance;\n        }\n\n        if (reOpt) {\n            this.plugins.plotLines && plugins.push(this.plugins.plotLines.uplot);\n        } else {\n            const plotLinesPluginInstance = plotLinesPlugin(this.config.plotLines || {})(this);\n            this.plugins.plotLines = plotLinesPluginInstance;\n            plugins.push(plotLinesPluginInstance.uplot);\n        }\n\n        Object.entries(config.plugins).forEach(([name, plugin]) => {\n            const pluginInstance = plugin(this);\n            plugins.push(pluginInstance.uplot);\n            Object.assign(this.plugins, {[name]: pluginInstance});\n        });\n\n        const chart = config.chart;\n\n        const options: UPlotOptions = {\n            width: this.root.clientWidth,\n            height: this.clientHeight,\n            title: config.title?.text,\n            plugins: plugins,\n            focus: {alpha: DEFAULT_FOCUS_ALPHA},\n            series: [\n                {\n                    id: DEFAULT_X_SERIE_NAME,\n                    $c: config.timeline,\n                    scale: DEFAULT_X_SCALE,\n                    count: config.timeline.length,\n                } as Series,\n            ],\n            ms: chart.timeMultiplier || TIME_MULTIPLIER,\n            hooks: config.hooks || {},\n        };\n\n        this.state.isEmptyDataSet =\n            config.timeline.length === 0 ||\n            config.series.length === 0 ||\n            config.series.every(({data}) => data.length === 0);\n\n        /**\n         * Setting up cursor - points on cursor, drag behavior, crosshairs\n         */\n        options.cursor = options.cursor || {};\n        options.cursor.points = options.cursor.points || {};\n        options.cursor.drag = options.cursor.drag || {\n            dist: chart.select?.minWidth || MIN_SELECTION_WIDTH,\n            x: options.cursor.y ?? true,\n            y: options.cursor.y ?? false,\n            setScale: chart.select?.zoom ?? true,\n        };\n\n        if (this.utils.sync) {\n            options.cursor.sync = options.cursor.sync || {\n                key: this.utils.sync.key,\n            };\n        }\n\n        if (config.cursor) {\n            const cPlugin = CursorPlugin(this, config.cursor);\n            this.plugins.cursor = cPlugin;\n            plugins.push(cPlugin.uplot);\n        }\n\n        const seriesOptions = config.series || [];\n        const resultingSeriesOptions: Series[] = options.series;\n\n        /**\n         * Prepare series options\n         */\n        for (let i = seriesOptions.length - 1; i >= 0; i--) {\n            const serie = configureSeries(this, seriesOptions[i] || {}, i);\n\n            /**\n             * Series with showInGraph: false must not contribute to scale\n             * auto-range calculation. uPlot computes dataMin/dataMax from\n             * series that have show !== false before any draw hook fires,\n             * so the only way to exclude these series from the scale is to\n             * give uPlot show: false from the very beginning. We preserve\n             * the user-facing visibility through _tempHidden, which the\n             * tooltip and other internals already respect.\n             */\n            if (serie.showInGraph === false && serie.show !== false) {\n                serie._tempHidden = true;\n                serie.show = false;\n            }\n\n            const uIdx = resultingSeriesOptions.push(serie);\n            this.state.y2uIdx[serie.id || i] = uIdx - 1;\n        }\n\n        /** Setting up markers plugin after default points renderers to be settled */\n        const markersPluginInstance = markersPlugin(this, config);\n        plugins.push(markersPluginInstance);\n\n        options.series = resultingSeriesOptions;\n\n        if (!config.scales || Object.keys(config.scales).length === 0) {\n            config.scales = {\n                x: {},\n                y: {},\n            };\n        }\n\n        /** Setting up scales */\n        options.scales = options.scales || {};\n        options.scales = configureScales(this, options.scales, config);\n\n        /** Setting up minimal axes */\n        options.axes = options.axes || [];\n        const axes = options.axes;\n\n        axes.push(...configureAxes(this, config));\n\n        /** Setting up hooks */\n        options.hooks = config.hooks || {};\n        options.hooks.draw = options.hooks.draw || [];\n        options.hooks.ready = options.hooks.ready || [];\n        options.hooks.drawClear = options.hooks.drawClear || [];\n        options.hooks.setSelect = options.hooks.setSelect || [];\n        options.hooks.setScale = options.hooks.setScale || [];\n\n        setIfNotSet(options.hooks.draw, this._uHooks.onDraw);\n        setIfNotSet(options.hooks.ready, this._uHooks.ready);\n        setIfNotSet(options.hooks.drawClear, this._uHooks.drawClear);\n        setIfNotSet(options.hooks.setSelect, this._uHooks.setSelect);\n        setIfNotSet(options.hooks.setScale, this._uHooks.setScale);\n\n        options.drawOrder = chart.appearance?.drawOrder\n            ? (chart.appearance?.drawOrder.filter(\n                  (key) => key === DrawOrderKey.Series || key === DrawOrderKey.Axes,\n              ) as uDrawOrderKey[])\n            : [DrawOrderKey.Series, DrawOrderKey.Axes];\n\n        /** Disabling uPlot legend. */\n        options.legend = {show: false};\n        options.padding = config.chart.size?.padding || getPaddingByAxes(options);\n\n        /**\n         * Pre-initialization  of legend allows to calculate\n         * legend's height before actual uPlot instance\n         * will be rendered, to avoid blinking height changes\n         */\n        this.plugins.legend?.preInit(this, this.config.legend, options);\n        options.height = this.clientHeight;\n        options.bands = config.bands;\n\n        this.options = options;\n\n        return options;\n    }\n}\n", "/* eslint-disable complexity */\n\nimport type {AlignedData} from 'uplot';\nimport type {DataSeries, MinimalValidConfig} from '../types';\nimport type Yagr from '..';\n\nimport {DEFAULT_Y_SCALE} from '../defaults';\nimport {getSumByIdx, preprocess} from '../utils/common';\n\nexport class TransformSeriesMixin<T extends MinimalValidConfig> {\n    /**\n     * @internal\n     * @param this Yagr instance\n     * @description Transforms series data according to config\n     * @returns uPlot series data\n     */\n    protected transformSeries(this: Yagr<T>) {\n        const processingStartTime = performance.now();\n\n        const result = [];\n        const config = this.config;\n        const timeline = config.timeline;\n        let processing = config.processing || false;\n\n        let series: DataSeries[] = this.config.series.map(({data}) => data) as DataSeries[];\n\n        if (processing && processing.interpolation) {\n            series = preprocess(series, timeline, processing);\n            processing = false;\n        }\n\n        const shouldMapNullValues = Boolean(processing && processing.nullValues);\n        const nullValues = (processing && processing.nullValues) || {};\n\n        /**\n         * Stacks are represented as:\n         * {\n         *    [scale]: {\n         *        [],  // stacking group idx 0 (default for all on scale),\n         *        [],  // stacking group idx 1\n         *    ]\n         * }\n         *\n         * All stacked points are accumulating inside of series' scale group\n         */\n        const stacks: Record<string, number[][]> = {};\n\n        for (let sIdx = 0; sIdx < series.length; sIdx++) {\n            let dataLine: (number | null)[] = [];\n            const realSerieIdx = sIdx + 1;\n            const serie = series[sIdx];\n\n            const serieConfigIndex = this.options.series.length - realSerieIdx;\n            const serieOptions = this.options.series[serieConfigIndex];\n            const scale = serieOptions.scale || DEFAULT_Y_SCALE;\n            const scaleConfig = this.config.scales[scale] || {};\n            const isStacking = scaleConfig.stacking;\n            const sGroup = serieOptions.stackGroup || 0;\n\n            let empty = true;\n\n            if (isStacking && !stacks[scale]) {\n                this.options.focus = this.options.focus || {alpha: 1.1};\n                this.options.focus.alpha = 1.1;\n                stacks[scale] = [];\n            }\n\n            if (isStacking && !stacks[scale][sGroup]) {\n                stacks[scale][sGroup] = new Array(timeline.length).fill(0);\n            }\n\n            serieOptions.count = 0;\n\n            for (let idx = 0; idx < serie.length; idx++) {\n                let value = serie[idx];\n\n                if (shouldMapNullValues && nullValues[String(value)]) {\n                    value = null;\n                }\n\n                if (serieOptions.transform) {\n                    serieOptions._transformed = true;\n                    value = serieOptions.transform(value, series, idx);\n                }\n\n                if (scaleConfig.transform) {\n                    serieOptions._transformed = true;\n                    value = scaleConfig.transform(value, series, idx);\n                }\n\n                if (value === null) {\n                    if (serieOptions.type === 'line' || serieOptions.type === 'dots') {\n                        dataLine.push(null);\n                        continue;\n                    } else {\n                        value = isStacking ? 0 : null;\n                    }\n                }\n\n                empty = false;\n\n                if (scaleConfig.normalize) {\n                    const sum = getSumByIdx(this.options.series, idx, scale);\n                    value = sum && ((value ?? 0) / sum) * (scaleConfig.normalizeBase || 100);\n\n                    serieOptions.normalizedData = serieOptions.normalizedData || [];\n                    serieOptions.normalizedData[idx] = value;\n                }\n\n                if (scaleConfig.stacking) {\n                    if (serieOptions.show === false || serieOptions.showInGraph === false) {\n                        value = 0;\n                    }\n\n                    value = stacks[scale][sGroup][idx] += (value ?? 0);\n                }\n\n                if (scaleConfig.type === 'logarithmic' && value === 0) {\n                    value = 1;\n                }\n\n                serieOptions.sum = (serieOptions.sum || 0) + (value || 0);\n\n                const originalValue = serieOptions.$c[idx];\n                if (typeof originalValue === 'number') {\n                    serieOptions.count += 1;\n                }\n                dataLine.push(value);\n            }\n\n            serieOptions.avg = (serieOptions.sum || 0) / serieOptions.count;\n            serieOptions.empty = empty;\n\n            if (serieOptions.postProcess) {\n                dataLine = serieOptions.postProcess(dataLine, sIdx, this);\n            }\n            result.unshift(dataLine);\n        }\n\n        result.unshift(this.config.timeline);\n\n        this.series = result as AlignedData;\n\n        this.execHooks('processed', {\n            chart: this,\n            meta: {\n                processTime: performance.now() - processingStartTime,\n            },\n        });\n\n        return this.series;\n    }\n}\n", "/* eslint-disable complexity */\n\nimport type {\n    MinimalValidConfig,\n    RawSerieData,\n    Scale,\n    SupportedLocales,\n    YagrConfig,\n    YagrTheme,\n} from '../types';\nimport Yagr from '..';\n\nimport i18n from '../locale';\nimport {DEFAULT_X_SCALE, DEFAULT_Y_SCALE} from '../defaults';\nimport {overrideSeriesInUpdate, configureSeries} from '../utils/series';\nimport {getRedrawOptionsForAxesUpdate, updateAxis} from '../utils/axes';\nimport {Paths, deepIsEqual, get} from '../utils/common';\nimport {Batch} from './batch-updates';\n\ninterface UpdateOptions {\n    incremental?: boolean;\n    splice?: boolean;\n}\n\nfunction setLocaleImpl(\n    yagr: Yagr,\n    batch: Batch,\n    locale: SupportedLocales | Record<string, string>,\n) {\n    yagr.utils.i18n = i18n(locale);\n    batch.redrawLegend = true;\n}\n\nfunction setThemeImpl(yagr: Yagr, themeValue: YagrTheme, batch: Batch) {\n    yagr.utils.theme.setTheme(themeValue);\n    const availableThemes: YagrTheme[] = ['light', 'light-hc', 'dark', 'dark-hc'];\n    const classesToRemove = availableThemes.map((theme) => `yagr_theme_${theme}`);\n    yagr.root.classList.remove(...classesToRemove);\n    yagr.root.classList.add('yagr_theme_' + themeValue);\n    batch.redraw = [false, true];\n}\n\nfunction setAxesImpl(yagr: Yagr, batch: Batch, axes: YagrConfig['axes']) {\n    const {x, ...rest} = axes;\n\n    if (x) {\n        const xAxis = yagr.uplot.axes.find(({scale}) => scale === DEFAULT_X_SCALE);\n\n        if (xAxis) {\n            updateAxis(yagr, xAxis, {scale: DEFAULT_X_SCALE, ...x});\n        }\n    }\n\n    Object.entries(rest).forEach(([scaleName, scaleConfig]) => {\n        const axis = yagr.uplot.axes.find(({scale}) => scale === scaleName);\n\n        if (axis) {\n            updateAxis(yagr, axis, {scale: scaleName, ...scaleConfig});\n        }\n    });\n\n    batch.redraw = getRedrawOptionsForAxesUpdate(axes);\n}\n\nfunction setFocusImpl(yagr: Yagr, lineId: string | null, focus: boolean) {\n    const seriesIdx = lineId === null ? null : yagr.state.y2uIdx[lineId];\n    yagr.plugins.cursor?.focus(seriesIdx, focus);\n    yagr.uplot.setSeries(seriesIdx, {focus});\n}\n\nfunction setVisibleImpl(\n    yagr: Yagr,\n    lineId: string | null,\n    show: boolean,\n    updateLegend: boolean,\n    batch: Batch,\n) {\n    const seriesIdx = lineId === null ? null : yagr.state.y2uIdx[lineId];\n    const seriesCfg =\n        lineId === null ? yagr.config.series : [yagr.config.series.find(({id}) => id === lineId)];\n\n    seriesCfg.forEach((serie) => {\n        if (serie) {\n            serie.show = show;\n        }\n    });\n\n    batch.fns.push(() => {\n        yagr.uplot.setSeries(seriesIdx, {\n            show,\n        });\n    });\n\n    yagr.options.series = yagr.uplot.series;\n\n    let shouldRebuildStacks = false;\n\n    if (seriesIdx) {\n        const series = yagr.uplot.series[seriesIdx];\n        series.show = show;\n        const scaleName = series.scale || DEFAULT_Y_SCALE;\n        const scale = yagr.config.scales[scaleName];\n        shouldRebuildStacks = Boolean(scale && scale.stacking);\n    } else {\n        shouldRebuildStacks = yagr.options.series.reduce((acc, serie) => {\n            const {scale} = serie;\n            serie.show = show;\n            return Boolean((scale && yagr.config.scales[scale]?.stacking) || acc);\n        }, false as boolean);\n    }\n\n    if (shouldRebuildStacks) {\n        // batch.reopt = true;\n        batch.recalc = true;\n        batch.fns.push(() => {\n            yagr.uplot.setData(yagr.series, true);\n            updateLegend && yagr.plugins.legend?.update();\n        });\n    }\n}\n\nfunction setScalesImpl(yagr: Yagr, scales: YagrConfig['scales'], batch: Batch) {\n    let stackingIsChanged = false;\n    let normalizationIsChanged = false;\n\n    Object.entries(scales).forEach(([scaleName, scaleConfig]) => {\n        const scale = yagr.config.scales[scaleName];\n\n        if (scale) {\n            const {stacking} = scale;\n            const {stacking: newStacking} = scaleConfig;\n\n            if (stacking !== newStacking) {\n                stackingIsChanged = true;\n            }\n\n            if (\n                scaleConfig.normalize !== scale.normalize ||\n                scaleConfig.normalizeBase !== scale.normalizeBase\n            ) {\n                normalizationIsChanged = true;\n            }\n        }\n    });\n\n    const isChangingOnlyMinMax = Object.entries(scales).every(\n        ([key, scaleConfig]: [string, Scale]) => {\n            const cfg = yagr.config.scales[key];\n\n            const {min: pMin, max: pMax, ...pRest} = cfg;\n            const {min: nMin, max: nMax, ...nRest} = scaleConfig;\n            const isChangedSomething = deepIsEqual(nRest, pRest) === false;\n\n            return !isChangedSomething && (pMin !== nMin || pMax !== nMax);\n        },\n    );\n\n    const isChangingXAxis = Object.keys(scales).includes(DEFAULT_X_SCALE);\n\n    /**\n     * In case if we change only min/max on data-scales, then we can just use uplot.setScale,\n     * otherwise we need to rebuild all series and stacks in order to apply new scales;\n     */\n    if (isChangingOnlyMinMax && !isChangingXAxis) {\n        return Object.entries(scales).forEach(([scaleName, scaleConfig]) => {\n            batch.fns.push(() => {\n                yagr.uplot.setScale(scaleName, {\n                    min: scaleConfig.min!,\n                    max: scaleConfig.max!,\n                });\n            });\n        });\n    }\n\n    if (stackingIsChanged || normalizationIsChanged) {\n        batch.reinit = true;\n    }\n\n    yagr.config.scales = scales;\n    batch.reinit = true;\n}\n\nfunction isChanged(oldConfig: YagrConfig, newConfig: Partial<YagrConfig>) {\n    return function isChangedPath(\n        path: Paths<YagrConfig>,\n        predicate?: (oldValue: unknown, newValue: unknown) => boolean,\n    ) {\n        const oldValue = get(oldConfig, path);\n        const newValue = get(newConfig, path);\n\n        return predicate ? !predicate(oldValue, newValue) : oldValue !== newValue;\n    };\n}\n\nfunction areSeriesChanged(a: YagrConfig['series'], b?: YagrConfig['series']) {\n    if (a.length !== b?.length) {\n        return true;\n    }\n\n    const mapA = new Map<string, YagrConfig['series'][0]>();\n    const mapB = new Map<string, YagrConfig['series'][0]>();\n\n    a.forEach((serie) => {\n        mapA.set(serie.id!, serie);\n    });\n\n    b.forEach((serie) => {\n        mapB.set(serie.id!, serie);\n    });\n\n    if (b.some(({id}) => !mapA.has(id!)) || a.some(({id}) => !mapB.has(id!))) {\n        return true;\n    }\n\n    return false;\n}\n\nfunction setConfigImpl(\n    yagr: Yagr,\n    batch: Batch,\n    newConfig: Partial<YagrConfig>,\n    fullUpdate = false,\n) {\n    if (fullUpdate) {\n        yagr.config = {...yagr.config, ...newConfig};\n        batch.reinit = true;\n        return;\n    }\n\n    const isChangedKey = isChanged(yagr.config, newConfig);\n\n    if (newConfig.title && isChangedKey('title')) {\n        yagr.setTitle(newConfig.title);\n    }\n\n    if (newConfig.chart?.appearance?.theme && isChangedKey('chart.appearance.theme')) {\n        yagr.setTheme(newConfig.chart?.appearance?.theme);\n    }\n\n    if (newConfig.chart?.appearance?.locale && isChangedKey('chart.appearance.locale')) {\n        yagr.setLocale(newConfig.chart?.appearance?.locale);\n    }\n\n    if (newConfig.axes && isChangedKey('axes', deepIsEqual)) {\n        yagr.setAxes(newConfig.axes);\n    }\n\n    if (newConfig.scales && isChangedKey('scales', deepIsEqual)) {\n        yagr.setScales(newConfig.scales);\n    }\n\n    const isChangedSeries =\n        Boolean(newConfig.series) && areSeriesChanged(yagr.config.series, newConfig.series);\n\n    if (isChangedSeries) {\n        batch.redrawLegend = true;\n    }\n\n    if (newConfig.series || newConfig.timeline) {\n        yagr.setSeries(\n            newConfig.timeline ?? yagr.config.timeline,\n            newConfig.series ?? yagr.config.series,\n            {\n                incremental: false,\n            },\n        );\n    }\n\n    if (newConfig.tooltip && isChangedKey('tooltip')) {\n        yagr.plugins.tooltip?.updateOptions(newConfig.tooltip);\n    }\n\n    if (newConfig.legend && isChangedKey('legend')) {\n        batch.reinit = true;\n    }\n\n    yagr.plugins.tooltip?.reset();\n\n    batch.reopt = true;\n    yagr.config = {...yagr.config, ...newConfig};\n}\n\nfunction setSeriesImpl(\n    this: Yagr,\n    batch: Batch,\n    timelineOrSeriesOrId: Partial<RawSerieData>[] | number[] | number | string,\n    maybeSeries?: Partial<RawSerieData>[] | Partial<RawSerieData>,\n    options: UpdateOptions = {\n        incremental: true,\n        splice: false,\n    },\n) {\n    let timeline: number[] = [],\n        series: RawSerieData[] = [],\n        updateId: null | string | number = null,\n        useIncremental = false,\n        shouldRecalcData = false,\n        useFullyRedraw;\n\n    if (['number', 'string'].includes(typeof timelineOrSeriesOrId)) {\n        useIncremental = false;\n        useFullyRedraw = false;\n        series = [maybeSeries] as RawSerieData[];\n        updateId = timelineOrSeriesOrId as number | string;\n    } else if (typeof (timelineOrSeriesOrId as Array<number | RawSerieData>)[0] === 'number') {\n        timeline = timelineOrSeriesOrId as number[];\n        series = maybeSeries as RawSerieData[];\n        useIncremental = Boolean(options.incremental);\n        useFullyRedraw = !options.incremental;\n    } else {\n        series = timelineOrSeriesOrId as RawSerieData[];\n        useFullyRedraw = true;\n    }\n\n    if (this.isEmpty && series.some(({data}) => data?.length)) {\n        batch.reinit = true;\n        return;\n    }\n\n    if (useFullyRedraw === false) {\n        let shouldUpdateCursror = false;\n\n        useIncremental && this.config.timeline.push(...timeline);\n        series.forEach((serie) => {\n            let matched =\n                typeof updateId === 'number'\n                    ? this.config.series[0]\n                    : this.config.series.find(({id}) => id === serie.id || id === updateId);\n\n            let id: number | string | undefined = matched?.id;\n\n            if (typeof updateId === 'number' && this.state.y2uIdx[updateId]) {\n                matched = this.config.series[updateId];\n                id = updateId;\n            }\n\n            if (matched && id) {\n                const {data, ...rest} = serie;\n                const seriesIdx = this.state.y2uIdx[id];\n\n                /** @TODO fixme (see Annotations.1) */\n                if (\n                    matched.type === 'dots' ||\n                    serie.type === 'dots' ||\n                    this.config.chart.series?.type === 'dots'\n                ) {\n                    batch.reinit = true;\n                }\n\n                if (useIncremental) {\n                    matched.data = data ? matched.data.concat(data) : matched.data;\n                } else if (data?.length) {\n                    matched.data = data;\n                    /**\n                     * We're reprocessing data on every series' data change,\n                     * cause we don't know is it required to process current line or not\n                     * Possible non clear pattern:\n                     *  - series may contain string values to process out with `interpolate` option\n                     *  - series may be in stack group\n                     * @TODO fixme when you got a good idea\n                     */\n                    shouldRecalcData = true;\n                }\n\n                const newSeries = configureSeries(this, Object.assign(matched, rest), seriesIdx);\n                const opts = this.options.series[seriesIdx];\n                const uOpts = this.uplot.series[seriesIdx];\n\n                if (uOpts._focus === null ? true : uOpts._focus !== newSeries.focus) {\n                    batch.fns.push(() => {\n                        this.uplot.setSeries(seriesIdx, {focus: newSeries.focus});\n                    });\n                }\n\n                if (uOpts.color !== newSeries.color) {\n                    shouldUpdateCursror = true;\n                }\n\n                if (newSeries.scale && this.config.scales[newSeries.scale]?.stacking) {\n                    shouldRecalcData = true;\n                }\n\n                overrideSeriesInUpdate(opts, newSeries);\n                overrideSeriesInUpdate(uOpts, newSeries);\n\n                /**\n                 * Handle showInGraph transitions. uPlot uses `series.show` to\n                 * determine which series contribute to scale auto-range; there\n                 * is no pre-scale hook, so the only correct way to exclude a\n                 * series is to keep it `show: false` in uPlot while marking it\n                 * as `_tempHidden` so that Yagr-side consumers (tooltip etc.)\n                 * still treat it as visible.\n                 *\n                 * Snapshot the previous uPlot `show` value BEFORE\n                 * `overrideSeriesInUpdate` mutates it below, then derive the\n                 * target uPlot `show` value and the expected `_tempHidden`\n                 * state. After the override we restore the correct uPlot-side\n                 * `show` and only queue a `setSeries` call if uPlot actually\n                 * needs to react (otherwise we'd just thrash the batch).\n                 */\n                const prevUplotShow = uOpts.show;\n                const userShow = newSeries.show !== false;\n                const hideForGraph = newSeries.showInGraph === false && userShow;\n                const targetUplotShow = hideForGraph ? false : userShow;\n                const targetTempHidden = hideForGraph;\n\n                /**\n                 * `overrideSeriesInUpdate` just synchronously copied\n                 * `newSeries.show` (the user-facing value) into `uOpts.show`.\n                 * For showInGraph handling we instead want uPlot to see\n                 * `targetUplotShow`. Apply our chosen state on top of the\n                 * override, and queue an actual `setSeries` call only when\n                 * the value visible to uPlot really changed \u2014 this is what\n                 * forces uPlot to recompute the scale, and it avoids\n                 * re-entrant setSeries storms that could freeze the UI.\n                 */\n                uOpts.show = targetUplotShow;\n                uOpts._tempHidden = targetTempHidden;\n                opts._tempHidden = targetTempHidden;\n\n                if (prevUplotShow !== targetUplotShow) {\n                    batch.fns.push(() => {\n                        this.uplot.setSeries(seriesIdx, {show: targetUplotShow});\n                    });\n                }\n            } else {\n                batch.fns.push(() => {\n                    const newSeries = configureSeries(this, serie, this.config.series.length);\n                    this.state.y2uIdx[newSeries.id] = this.uplot.series.length;\n                    this.uplot.addSeries(newSeries, this.config.series.length);\n                });\n                this.config.series.push(serie);\n            }\n        });\n\n        if (shouldUpdateCursror) {\n            batch.fns.push(() => {\n                this.plugins.cursor?.updatePoints();\n            });\n        }\n\n        if (options.splice) {\n            const sliceLength = series[0].data.length;\n            this.config.series.forEach((s) => {\n                s.data.splice(0, sliceLength);\n            });\n            this.config.timeline.splice(0, timeline.length);\n        }\n    } else {\n        this.config.timeline = timeline;\n        this.config.series = series;\n        batch.reinit = true;\n    }\n\n    if (!batch.reinit) {\n        this._batch.fns.push(() => this.plugins?.tooltip?.reset());\n\n        if (shouldRecalcData || timeline.length) {\n            batch.recalc = true;\n            batch.fns.push(() => {\n                this.uplot.setData(this.series);\n            });\n        }\n    }\n}\n\nexport class DynamicUpdatesMixin<T extends MinimalValidConfig> {\n    /**\n     * @public\n     * @param locale string | Record<string, string>\n     * @description Set's locale of chart and redraws all locale-dependent elements.\n     */\n    setLocale(this: Yagr<T>, locale: SupportedLocales | Record<string, string>) {\n        this.batch((batch) => setLocaleImpl(this, batch, locale));\n    }\n\n    /**\n     * @public\n     * @param title YagrTitleConfig\n     * @description Set's title of chart and redraws all title-dependent elements.\n     */\n    setTitle(this: Yagr<T>, title: YagrConfig['title']) {\n        this.batch((batch) => {\n            this.config.title = title;\n            this.initTitle();\n            batch.redraw = [true, true];\n        });\n    }\n\n    /**\n     * @public\n     * @param themeValue YagrTheme\n     * @description Set's theme of chart and redraws all theme-dependent elements.\n     */\n    setTheme(this: Yagr<T>, themeValue: YagrTheme) {\n        this.batch((batch) => setThemeImpl(this, themeValue, batch));\n    }\n\n    /**\n     * @public\n     * @param axes axes config\n     * @description Sets new axes config and redraws all axes.\n     */\n    setAxes(this: Yagr<T>, axes: YagrConfig['axes']) {\n        this.batch((batch) => setAxesImpl(this, batch, axes));\n    }\n\n    /**\n     * @public\n     * @param seriesId string\n     * @param series Partial<RawSerieData>\n     * @description Sets new series by series id and redraws series.\n     */\n    setSeries(this: Yagr<T>, seriesId: string, series: Partial<RawSerieData>): void;\n    /**\n     * @public\n     * @param seriesIdx number\n     * @param series Partial<RawSerieData>\n     * @description Sets new series by series index and redraws series.\n     */\n    setSeries(this: Yagr<T>, seriesIdx: number, series: Partial<RawSerieData>): void;\n    /**\n     * @public\n     * @param series Partial<RawSerieData>\n     * @description Sets new series dataset (matching to current timeline) and redraws.\n     */\n    setSeries(this: Yagr<T>, series: Partial<RawSerieData>[]): void;\n    /**\n     * @public\n     * @param timeline number[]\n     * @param series Partial<RawSerieData>\n     * @param options UpdateOptions\n     * @description Sets new series dataset with different timeline and redraws.\n     */\n    setSeries(\n        this: Yagr<T>,\n        timeline: number[],\n        series: Partial<RawSerieData>[],\n        options: UpdateOptions,\n    ): void;\n    setSeries(\n        this: Yagr<T>,\n        timelineOrSeriesOrId: Partial<RawSerieData>[] | number[] | number | string,\n        maybeSeries?: Partial<RawSerieData>[] | Partial<RawSerieData>,\n        options: UpdateOptions = {\n            incremental: true,\n            splice: false,\n        },\n    ) {\n        this.batch((batch) =>\n            setSeriesImpl.call(this, batch, timelineOrSeriesOrId, maybeSeries, options),\n        );\n    }\n\n    /**\n     * @public\n     * @param lineId string | null\n     * @param focus boolean\n     * @description Sets focus on line with given id. If id is null, removes focus from all lines.\n     * @returns void\n     */\n    setFocus(this: Yagr<T>, lineId: string | null, focus: boolean) {\n        this.batch(() => setFocusImpl(this, lineId, focus));\n    }\n\n    /**\n     * @public\n     * @param lineId string | null\n     * @param show boolean\n     * @description Sets visibility of line with given id. If id is null, sets visibility of all lines.\n     */\n    setVisible(this: Yagr<T>, lineId: string | null, show: boolean, updateLegend = true) {\n        this.batch((batch) => setVisibleImpl(this, lineId, show, updateLegend, batch));\n    }\n\n    /**\n     * @public\n     * @param scales Record<string, Partial<ScaleConfi>>\n     * @description Sets new scales config and redraws.\n     */\n    setScales(this: Yagr<T>, scales: Record<string, Partial<YagrConfig['scales'][string]>>) {\n        this.batch((batch) => setScalesImpl(this, scales, batch));\n    }\n\n    /**\n     * @public\n     * @experimental\n     * @param newConfig Partial<YagrConfig>\n     * @descriptino Sets new config and redraws.\n     */\n    setConfig(this: Yagr<T>, newConfig: Partial<YagrConfig>, fullUpdate = false) {\n        this.batch((batch) => setConfigImpl(this, batch, newConfig, fullUpdate));\n    }\n}\n\n/**\n * Annotations:\n * 1. If we're operating with dots type then uPlot will be reinitialized\n *    cause it's not possible to re-render dot's markers without reinit\n *\n */\n", "import Yagr from '..';\n\ntype YagrConstructor = new (...args: any[]) => Yagr;\nexport type YMixin<T extends unknown = unknown> = new () => T;\n\nexport function applyMixins(derivedCtor: YagrConstructor, constructors: YMixin[]) {\n    const inits: (() => void)[] = [];\n\n    constructors.forEach((baseCtor) => {\n        Object.getOwnPropertyNames(baseCtor.prototype).forEach((name) => {\n            Object.defineProperty(\n                derivedCtor.prototype,\n                name,\n                Object.getOwnPropertyDescriptor(baseCtor.prototype, name) || Object.create(null),\n            );\n        });\n\n        if (baseCtor.prototype.initMixin) {\n            inits.push(baseCtor.prototype.initMixin);\n        }\n    });\n\n    derivedCtor.prototype.initMixins = function () {\n        inits.forEach((init) => init.call(this));\n    };\n}\n", "import type {MinimalValidConfig} from '../types';\nimport type Yagr from '..';\nimport UPlot from 'uplot';\nimport LegendPlugin from '../plugins/legend/legend';\n\nexport interface Batch {\n    active: boolean;\n    fns: ((s: Batch) => void)[];\n    /** If true then uPlot options will be re-configured  */\n    reopt?: boolean;\n    /** If true then data will be recalculated (use for stacks/normalization/other calculations) */\n    recalc?: boolean;\n    /** False or redraw uPlot redraw arguments */\n    redraw?: false | [series: boolean, axes: boolean];\n    /** If batch will end with full re-instantiation of uPlot */\n    reinit?: boolean;\n    /** If true, legend will be fully redrawn instead of re-initialization  */\n    redrawLegend?: boolean;\n}\n\nexport class BatchMixin<T extends MinimalValidConfig> {\n    protected _batch!: Batch;\n\n    initMixin() {\n        this._batch = {\n            active: false,\n            fns: [],\n        };\n    }\n\n    /**\n     * @public\n     * @param fn batch funcion.\n     * @experimental\n     * @descriptoin Batch wrapper. Batch function accepts batch state, it can be modified to change batch execution behaviour.\n     * @example\n     * ```typescript\n     * yagr.batch((s) => {\n     *    s.reopt = true; // reinit uPlot options\n     *    s.recalc = true; // recalculate series\n     *    s.redraw = [true, true]; // redraw chart\n     *    s.reinit = true; // reinit uPlot chart\n     * });\n     * ```\n     */\n    batch(this: Yagr<T>, fn: (s: Batch) => void) {\n        if (this._batch.active) {\n            return fn(this._batch);\n        }\n\n        this._batch.active = true;\n        fn(this._batch);\n\n        if (this._batch.reinit) {\n            return this.fullUpdate();\n        }\n\n        if (this._batch.redrawLegend) {\n            this.plugins.legend?.redraw();\n        }\n\n        if (this._batch.reopt) {\n            this.createUplotOptions(true);\n        }\n\n        if (this._batch.recalc) {\n            this.inStage('processing', () => {\n                this.transformSeries();\n            }).inStage('listen');\n        }\n\n        this._batch.fns.length && this.uplot.batch(() => this._batch.fns.forEach((fn) => fn(this._batch)));\n\n        if (this._batch.redraw && this.uplot) {\n            this.redraw(...this._batch.redraw);\n        }\n\n        this._batch = {active: false, fns: []};\n    }\n\n    /**\n     *\n     * @internal\n     * @description Full update of chart. Used when config is changed totally.\n     */\n    protected fullUpdate(this: Yagr<T>) {\n        let left: number | undefined;\n        let top: number | undefined;\n\n        this.inStage('dispose', () => {\n            if (this.uplot) {\n                const cursor = this.uplot.cursor;\n                left = cursor.left;\n                top = cursor.top;\n                // uplot may be undefined if chart is not rendered yet, but got update\n                this.uplot.destroy();\n            }\n            this.plugins.legend?.destroy();\n        })\n            .inStage('config', () => {\n                this.plugins.legend = new LegendPlugin();\n                this._batch = {active: false, fns: []};\n                this.createUplotOptions(true);\n                this.options = this.config.editUplotOptions ? this.config.editUplotOptions(this.options) : this.options;\n            })\n            .inStage('processing', () => {\n                this.transformSeries();\n            })\n            .inStage('uplot', () => {\n                this.uplot = new UPlot(this.options, this.series, this.initRender);\n                if (left && top && left > 0 && top > 0) {\n                    this.uplot.setCursor({left, top});\n                }\n\n                // by default uPlot subsribes self to cursor, if we don't need it, we should unsubscribe manually\n                if (!this.state.subscribed) {\n                    this.unsubscribe();\n                }\n            })\n            .inStage('listen');\n    }\n}\n", "import UPlot, {Options as UPlotOptions, AlignedData, Series, SyncPubSub} from 'uplot';\n\nimport LegendPlugin from './plugins/legend/legend';\nimport {TooltipPlugin} from './plugins/tooltip/tooltip';\nimport cursorPlugin from './plugins/cursor/cursor';\nimport {PlotLinesPlugin} from './plugins/plotLines/plotLines';\n\nimport {YagrConfig, MinimalValidConfig, InternalYargHooks} from './types';\n\nimport {debounce, genId, px} from './utils/common';\nimport ColorParser from './utils/colors';\n\nimport ThemedDefaults, {DEFAULT_SYNC_KEY, DEFAULT_TITLE_FONT_SIZE} from './defaults';\nimport i18n from './locale';\n\nimport {CreateUplotOptionsMixin} from './mixins/create-options';\nimport {TransformSeriesMixin} from './mixins/transform-series';\nimport {DynamicUpdatesMixin} from './mixins/dynamic-updates';\n\nimport {applyMixins} from './utils/mixins';\nimport {BatchMixin} from './mixins/batch-updates';\n\nexport interface YagrEvent {\n    chart: Yagr;\n    meta: YagrMeta;\n}\n\nexport type YagrMeta = {\n    renderTime: number;\n    processTime: number;\n    initTime: number;\n};\n\ntype CachedProps = {\n    width: number;\n    height: number;\n};\n\nexport interface YagrState {\n    isEmptyDataSet: boolean;\n    isMouseOver: boolean;\n    stage: 'config' | 'processing' | 'uplot' | 'render' | 'listen' | 'dispose';\n    inBatch?: boolean;\n    y2uIdx: Record<string, number>;\n    subscribed: boolean;\n}\n\n/*\n * Main core-module of Yagr.\n * Implements data processing and autoconfigurable wrapper\n * for uPlot chart.\n * Entrypoint of every Yagr chart.\n */\nclass Yagr<TConfig extends MinimalValidConfig = MinimalValidConfig> {\n    id!: string;\n    options!: UPlotOptions;\n    uplot!: UPlot;\n    root!: HTMLElement;\n    series!: AlignedData;\n    config!: YagrConfig;\n    resizeOb?: ResizeObserver;\n    canvas!: HTMLCanvasElement;\n    plugins: {\n        tooltip?: ReturnType<TooltipPlugin>;\n        plotLines?: ReturnType<PlotLinesPlugin>;\n        cursor?: ReturnType<typeof cursorPlugin>;\n        legend?: LegendPlugin;\n    } & Partial<\n        TConfig['plugins'] extends YagrConfig['plugins']\n            ? {[key in keyof TConfig['plugins']]: ReturnType<TConfig['plugins'][key]>}\n            : {}\n    > = {};\n    state!: YagrState;\n    utils!: {\n        colors: ColorParser;\n        sync?: SyncPubSub;\n        theme: ThemedDefaults;\n        i18n: ReturnType<typeof i18n>;\n    };\n\n    get isEmpty() {\n        return this.state.isEmptyDataSet;\n    }\n\n    protected _startTime!: number;\n    protected _meta: Partial<YagrMeta> = {};\n\n    /** Create uPlot options methods */\n    protected createUplotOptions!: CreateUplotOptionsMixin<TConfig>['createUplotOptions'];\n    protected transformSeries!: TransformSeriesMixin<TConfig>['transformSeries'];\n    protected _uHooks: Record<string, (u: uPlot) => void> = {};\n\n    /** Dynamic update methods */\n    setTheme!: DynamicUpdatesMixin<TConfig>['setTheme'];\n    setLocale!: DynamicUpdatesMixin<TConfig>['setLocale'];\n    setAxes!: DynamicUpdatesMixin<TConfig>['setAxes'];\n    setSeries!: DynamicUpdatesMixin<TConfig>['setSeries'];\n    setVisible!: DynamicUpdatesMixin<TConfig>['setVisible'];\n    setFocus!: DynamicUpdatesMixin<TConfig>['setFocus'];\n    setScales!: DynamicUpdatesMixin<TConfig>['setScales'];\n    setTitle!: DynamicUpdatesMixin<TConfig>['setTitle'];\n    setConfig!: DynamicUpdatesMixin<TConfig>['setConfig'];\n\n    /** Batch update methods */\n    batch!: BatchMixin<TConfig>['batch'];\n    protected fullUpdate!: BatchMixin<TConfig>['fullUpdate'];\n    protected _batch!: BatchMixin<TConfig>['_batch'];\n\n    protected _cache!: CachedProps;\n\n    /** Mixin methods */\n    private initMixins!: () => void;\n\n    constructor(root: HTMLElement, pConfig: TConfig) {\n        this.initMixins();\n\n        this._startTime = performance.now();\n        this.state = {\n            isEmptyDataSet: false,\n            isMouseOver: false,\n            stage: 'config',\n            y2uIdx: {},\n            subscribed: false,\n        };\n\n        const config: YagrConfig = Object.assign(\n            {\n                title: {},\n                data: [],\n                axes: {},\n                series: [],\n                scales: {},\n                hooks: {},\n                settings: {},\n                chart: {},\n                cursor: {},\n                plugins: {},\n                legend: {\n                    show: false,\n                },\n                tooltip: {\n                    show: true,\n                },\n                grid: null,\n                markers: {},\n            },\n            pConfig,\n        );\n\n        this.config = config;\n\n        this.inStage('config', () => {\n            this.id = root.id || genId();\n            this.root = root;\n            this.root.classList.add('yagr');\n\n            if (!this.root.id) {\n                this.root.id = this.id;\n            }\n\n            const colorParser = new ColorParser();\n            const sync = this.config.cursor.sync;\n\n            const chart = this.config.chart;\n\n            chart.series ||= {type: 'line'};\n            chart.size ||= {adaptive: true};\n            chart.appearance ||= {locale: 'en'};\n            chart.select ||= {};\n\n            this.utils = {\n                colors: colorParser,\n                i18n: i18n(config.chart.appearance?.locale || 'en'),\n                theme: new ThemedDefaults(colorParser),\n            };\n\n            colorParser.setContext(root);\n\n            if (sync) {\n                this.utils.sync = UPlot.sync(typeof sync === 'string' ? sync : DEFAULT_SYNC_KEY);\n            }\n\n            if (!chart.size.adaptive && chart.size.width && chart.size.height) {\n                root.style.width = px(chart.size.width);\n                root.style.height = px(chart.size.height);\n            }\n\n            this.plugins.legend = new LegendPlugin();\n            this.setTheme(chart.appearance.theme || 'light');\n            this.createUplotOptions();\n            this._cache = {\n                height: this.options.height,\n                width: this.options.width,\n            };\n            if (config.editUplotOptions) {\n                this.options = config.editUplotOptions(this.options);\n            }\n        })\n            .inStage('processing', () => {\n                this.transformSeries();\n            })\n            .inStage('uplot', () => {\n                this.uplot = new UPlot(this.options, this.series, this.initRender);\n                this.canvas = root.querySelector('canvas') as HTMLCanvasElement;\n\n                this.init();\n\n                const processTime = performance.now() - this._startTime;\n                this._meta.processTime = processTime;\n            })\n            .inStage('render');\n    }\n\n    /**\n     * Redraws Yagr instance by given options.\n     */\n    redraw(series = true, axes = true) {\n        this.uplot.redraw(series, axes);\n    }\n\n    /**\n     * Get current scale ranges (min/max values)\n     * @param scaleName - Optional scale name. If not provided, returns all scales\n     * @returns Object with min/max values for each scale\n     */\n    getScales(scaleName?: string): Record<string, {min: number; max: number}> {\n        if (!this.uplot || !this.uplot.scales) {\n            return {};\n        }\n\n        const scales = this.uplot.scales;\n        const result: Record<string, {min: number; max: number}> = {};\n\n        if (scaleName) {\n            const scale = scales[scaleName];\n            if (scale && scale.min !== undefined && scale.max !== undefined) {\n                result[scaleName] = {\n                    min: scale.min,\n                    max: scale.max,\n                };\n            }\n        } else {\n            Object.keys(scales).forEach((key) => {\n                const scale = scales[key];\n                if (scale && scale.min !== undefined && scale.max !== undefined) {\n                    result[key] = {\n                        min: scale.min,\n                        max: scale.max,\n                    };\n                }\n            });\n        }\n\n        return result;\n    }\n\n    /**\n     *  Get uPlot's Series from series id\n     */\n    getSeriesById(id: string): Series {\n        return this.uplot.series[this.state.y2uIdx[id]];\n    }\n\n    getSerieLegendColor(serie: Series) {\n        const {legendColorKey, color, lineColor} = serie;\n\n        let serieColor = color;\n\n        switch (legendColorKey) {\n            case 'lineColor': {\n                if (lineColor) {\n                    serieColor = lineColor;\n                }\n                break;\n            }\n            case 'color': {\n                serieColor = color;\n            }\n        }\n\n        return serieColor;\n    }\n\n    dispose() {\n        this.resizeOb && this.resizeOb.unobserve(this.root);\n        this.unsubscribe();\n        this.plugins?.tooltip?.dispose();\n        this.plugins?.legend?.destroy();\n        this.uplot.destroy();\n        this._uHooks = {};\n        this.execHooks('dispose', {chart: this});\n    }\n\n    toDataUrl() {\n        return this.canvas.toDataURL('img/png');\n    }\n\n    subscribe() {\n        if (this.state.subscribed) {\n            return;\n        }\n\n        this.utils.sync?.sub(this.uplot);\n        this.state.subscribed = true;\n    }\n\n    unsubscribe() {\n        this.utils.sync?.unsub(this.uplot);\n        this.state.subscribed = false;\n    }\n\n    protected init = () => {\n        if (this.config.chart.size?.adaptive && !this.resizeOb) {\n            this.resizeOb = new ResizeObserver(\n                debounce(this.onResize, this.config.chart.size.resizeDebounceMs || 100),\n            );\n            this.resizeOb.observe(this.root);\n        }\n\n        if (!this.config.hooks.dispose) {\n            this.config.hooks.dispose = [];\n        }\n\n        /** Unsubscribe in init required to avoid chars been synced without action from developer */\n        this.unsubscribe();\n        this.config.hooks.dispose.push(this.trackMouse());\n    };\n\n    protected execHooks = <T extends keyof InternalYargHooks>(\n        hookName: T,\n        ...args: Parameters<Required<InternalYargHooks>[T][0]>\n    ) => {\n        const hooks = this.config.hooks[hookName];\n        if (Array.isArray(hooks)) {\n            for (const hook of hooks) {\n                if (!hook) {\n                    continue;\n                }\n\n                typeof hook === 'function' && hook(...args);\n            }\n        }\n    };\n\n    protected inStage(stage: YagrState['stage'], fn?: () => void) {\n        this.state.stage === stage;\n        this.execHooks('stage', {chart: this, stage});\n        try {\n            fn && fn();\n        } catch (error) {\n            console.error(error);\n            this.onError(error as Error);\n        }\n        return this;\n    }\n\n    protected initRender = (u: uPlot, done: Function) => {\n        /**\n         * Reimplementing appending u.root to root\n         * and ensure that uPlot instance will be placed\n         * correctly relative to legend\n         */\n        const position = this.config.legend?.position;\n        if (this.root.firstChild) {\n            !position || position === 'bottom'\n                ? this.root.insertBefore(u.root, this.root.firstChild)\n                : this.root.appendChild(u.root);\n        } else {\n            !position || position === 'bottom'\n                ? this.root.appendChild(u.root)\n                : this.root.insertBefore(u.root, this.root.firstChild);\n        }\n\n        if (this.config.legend?.show) {\n            this.plugins.legend?.init(u);\n            this.reflow(false);\n        }\n\n        this.initTitle();\n\n        done();\n    };\n\n    protected initTitle() {\n        /** Setup font size for title if required */\n        if (this.config.title && this.config.title.fontSize) {\n            const size = this.config.title.fontSize;\n            const t = this.root.querySelector('.u-title') as HTMLElement;\n            t.setAttribute('style', `font-size:${size}px;line-height:${size}px;`);\n            t.innerHTML = this.config.title.text;\n        }\n    }\n\n    private onError(error: Error) {\n        this.execHooks('error', {\n            stage: this.state.stage,\n            error,\n            chart: this,\n        });\n        return error;\n    }\n\n    private trackMouse() {\n        const mouseOver = () => {\n            this.state.isMouseOver = true;\n        };\n        const mouseLeave = () => {\n            this.state.isMouseOver = false;\n        };\n        this.root.addEventListener('mouseover', mouseOver);\n        this.root.addEventListener('mouseleave', mouseLeave);\n\n        return () => {\n            this.root.removeEventListener('mouseover', mouseOver);\n            this.root.removeEventListener('mouseleave', mouseLeave);\n        };\n    }\n\n    /*\n     * Resize handler. Should cache height and width to avoid unneccesary resize handling,\n     * when actial width and height of contentRect doesn't changed\n     */\n    private onResize = (args: ResizeObserverEntry[]) => {\n        const [resize] = args;\n\n        if (\n            this._cache.height === resize.contentRect.height &&\n            this._cache.width === resize.contentRect.width\n        ) {\n            return;\n        }\n\n        this.plugins.tooltip?.reset();\n\n        this.reflow();\n        this.execHooks('resize', {entries: args, chart: this});\n    };\n\n    get clientHeight() {\n        const MARGIN = 8;\n        const offset = this.config.title.text\n            ? (this.config.title.fontSize || DEFAULT_TITLE_FONT_SIZE) + MARGIN\n            : 0;\n        // https://developer.mozilla.org/en-US/docs/Web/API/CSS_Object_Model/Determining_the_dimensions_of_elements#how_much_room_does_it_use_up\n        // getBoundingClientRect() provides more precise decimal point values.\n        // To prevent extra scroll we need round to floor\n        return (\n            Math.floor(this.root.getBoundingClientRect().height) -\n            offset -\n            (this.plugins.legend?.state.totalSpace || 0)\n        );\n    }\n\n    reflow(redraw = true) {\n        const width = this.root.clientWidth;\n        const height = this.clientHeight;\n\n        this._cache.width = width;\n        this.options.width = width;\n        this._cache.height = height;\n        this.options.height = height;\n        redraw &&\n            this.uplot.setSize({\n                width: this.options.width,\n                height: this.options.height,\n            });\n        redraw && this.uplot.redraw();\n    }\n}\n\napplyMixins(Yagr, [CreateUplotOptionsMixin, TransformSeriesMixin, DynamicUpdatesMixin, BatchMixin]);\n\nexport default Yagr;\n"],
  "mappings": "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",
  "names": ["min", "max", "min", "max", "html", "max", "min", "key", "rect", "points", "_a", "_", "_b", "series", "nextPage", "prevPage", "html", "min", "max", "_", "tzDate", "fmtDate", "s", "gaps", "rect", "w", "points", "u", "seriesIdx", "size", "font", "off", "key", "sc", "self", "i", "_a", "opts", "sidesWithAxes", "join", "facet", "data", "xScaleKey", "idxs", "strokePath", "strokeStyle", "fillPath", "fillStyle", "shiftAmt", "ticks", "border", "grid", "can", "seriesIdxMatcher", "abs", "pow", "numFormatter", "_", "ticks", "pxRatioFont", "font", "_", "min", "max", "round", "rect", "getFocusedColor", "_", "_a", "_", "id", "fn", "resize"]
}
