@windborne/grapher 1.0.11 → 1.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bundle.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"bundle.js","mappings":"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","sources":["webpack://Grapher/webpack/universalModuleDefinition","webpack://Grapher/webpack/runtime/load script","webpack://Grapher/webpack/runtime/wasm chunk loading","webpack://Grapher/./src/state/data_types.js","webpack://Grapher/./src/helpers/custom_prop_types.js","webpack://Grapher/./src/renderer/size_canvas.js","webpack://Grapher/./src/helpers/colors.js","webpack://Grapher/./src/helpers/color_to_vector.js","webpack://Grapher/./src/renderer/paths_from.js","webpack://Grapher/./src/renderer/extract_vertices.js","webpack://Grapher/./src/renderer/create_gl_program.js","webpack://Grapher/./src/renderer/line_program.js","webpack://Grapher/./src/eventable.js","webpack://Grapher/./src/renderer/background_program.js","webpack://Grapher/./src/renderer/draw_zero_line.js","webpack://Grapher/./src/renderer/draw_bars.js","webpack://Grapher/./src/state/infer_type.js","webpack://Grapher/./src/renderer/graph_body_renderer.js","webpack://Grapher/./src/renderer/draw_area.js","webpack://Grapher/./src/renderer/draw_line.js","webpack://Grapher/./src/renderer/draw_background.js","webpack://Grapher/./src/helpers/format.js","webpack://Grapher/./src/helpers/axis_sizes.js","webpack://Grapher/./src/components/tooltip.js","webpack://Grapher/./src/components/context_menu.js","webpack://Grapher/./src/state/space_conversions/simple_series_to_data_space.js","webpack://Grapher/./src/state/calculate_data_bounds.js","webpack://Grapher/./src/state/merge_bounds.js","webpack://Grapher/./src/state/expand_bounds.js","webpack://Grapher/./src/helpers/binary_search.js","webpack://Grapher/./src/state/space_conversions/data_space_to_selected_space.js","webpack://Grapher/./src/renderer/scale_bounds.js","webpack://Grapher/./src/state/space_conversions/selected_space_to_render_space.js","webpack://Grapher/./src/helpers/flatten_simple_data.js","webpack://Grapher/./src/state/calculate_tooltip_state.js","webpack://Grapher/./src/state/bound_calculators.js","webpack://Grapher/./src/state/space_conversions/condense_data_space.js","webpack://Grapher/./src/helpers/name_for_series.js","webpack://Grapher/./src/state/space_conversions/selected_space_to_background_space.js","webpack://Grapher/./src/state/state_controller.js","webpack://Grapher/./src/state/get_default_bounds_calculator.js","webpack://Grapher/./src/helpers/generator_params_equal.js","webpack://Grapher/./src/state/calculate_annotations_state.js","webpack://Grapher/./src/state/selection_from_global_bounds.js","webpack://Grapher/./src/state/find_matching_axis.js","webpack://Grapher/./src/state/average_loop_times.js","webpack://Grapher/./src/state/bound_calculator_from_selection.js","webpack://Grapher/./src/state/hooks.js","webpack://Grapher/./src/components/annotations.js","webpack://Grapher/./src/components/draggable_points.js","webpack://Grapher/./src/components/vertical_lines.js","webpack://Grapher/./src/components/graph_body.js","webpack://Grapher/./src/grapher.scss?e17f","webpack://Grapher/./src/helpers/place_grid.js","webpack://Grapher/./src/components/x_axis.js","webpack://Grapher/./src/components/y_axis.js","webpack://Grapher/./src/components/range_selection_button_base.js","webpack://Grapher/./src/components/range_selection_button.js","webpack://Grapher/./src/components/percentile_button.js","webpack://Grapher/./src/components/options.js","webpack://Grapher/./src/components/range_selection.js","webpack://Grapher/./src/components/range_graph.js","webpack://Grapher/./src/components/series_key_item.js","webpack://Grapher/./src/components/series_key_axis_container.js","webpack://Grapher/./src/components/series_key.js","webpack://Grapher/./src/components/graph_title.js","webpack://Grapher/./src/components/sidebar.js","webpack://Grapher/./src/grapher.js","webpack://Grapher/./src/state/sync_pool.js","webpack://Grapher/./src/grapher.scss","webpack://Grapher/./node_modules/css-loader/dist/runtime/api.js","webpack://Grapher/./node_modules/css-loader/dist/runtime/sourceMaps.js","webpack://Grapher/./node_modules/prop-types/factoryWithThrowingShims.js","webpack://Grapher/./node_modules/prop-types/index.js","webpack://Grapher/./node_modules/prop-types/lib/ReactPropTypesSecret.js","webpack://Grapher/./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js","webpack://Grapher/./node_modules/style-loader/dist/runtime/insertBySelector.js","webpack://Grapher/./node_modules/style-loader/dist/runtime/insertStyleElement.js","webpack://Grapher/./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js","webpack://Grapher/./node_modules/style-loader/dist/runtime/styleDomAPI.js","webpack://Grapher/./node_modules/style-loader/dist/runtime/styleTagTransform.js","webpack://Grapher/./src/renderer/background.frag","webpack://Grapher/./src/renderer/background.vert","webpack://Grapher/./src/renderer/circle.frag","webpack://Grapher/./src/renderer/circle.vert","webpack://Grapher/./src/renderer/line.frag","webpack://Grapher/./src/renderer/line.vert","webpack://Grapher/external umd \"react\"","webpack://Grapher/webpack/bootstrap","webpack://Grapher/webpack/runtime/compat get default export","webpack://Grapher/webpack/runtime/define property getters","webpack://Grapher/webpack/runtime/ensure chunk","webpack://Grapher/webpack/runtime/get javascript chunk filename","webpack://Grapher/webpack/runtime/global","webpack://Grapher/webpack/runtime/hasOwnProperty shorthand","webpack://Grapher/webpack/runtime/make namespace object","webpack://Grapher/webpack/runtime/publicPath","webpack://Grapher/webpack/runtime/jsonp chunk loading","webpack://Grapher/webpack/runtime/nonce","webpack://Grapher/webpack/startup"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"react\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"react\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Grapher\"] = factory(require(\"react\"));\n\telse\n\t\troot[\"Grapher\"] = factory(root[\"react\"]);\n})(globalThis, (__WEBPACK_EXTERNAL_MODULE__9155__) => {\nreturn ","var inProgress = {};\nvar dataWebpackPrefix = \"Grapher:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// object to store loaded and loading wasm modules\nvar installedWasmModules = {};\n\nfunction promiseResolve() { return Promise.resolve(); }\n\nvar wasmImportedFuncCache0;\nvar wasmImportedFuncCache1;\nvar wasmImportedFuncCache2;\nvar wasmImportedFuncCache3;\nvar wasmImportedFuncCache4;\nvar wasmImportedFuncCache5;\nvar wasmImportedFuncCache6;\nvar wasmImportedFuncCache7;\nvar wasmImportedFuncCache8;\nvar wasmImportedFuncCache9;\nvar wasmImportObjects = {\n\t8841: function() {\n\t\treturn {\n\t\t\t\"./index.js\": {\n\t\t\t\t\"__wbg_minx_3675eb59ca2b1c04\": function(p0i32) {\n\t\t\t\t\tif(wasmImportedFuncCache0 === undefined) wasmImportedFuncCache0 = __webpack_require__.c[1599].exports;\n\t\t\t\t\treturn wasmImportedFuncCache0[\"__wbg_minx_3675eb59ca2b1c04\"](p0i32);\n\t\t\t\t},\n\t\t\t\t\"__wbg_maxx_add7a3e35c2f52a9\": function(p0i32) {\n\t\t\t\t\tif(wasmImportedFuncCache1 === undefined) wasmImportedFuncCache1 = __webpack_require__.c[1599].exports;\n\t\t\t\t\treturn wasmImportedFuncCache1[\"__wbg_maxx_add7a3e35c2f52a9\"](p0i32);\n\t\t\t\t},\n\t\t\t\t\"__wbg_miny_9972d9159e80fde8\": function(p0i32) {\n\t\t\t\t\tif(wasmImportedFuncCache2 === undefined) wasmImportedFuncCache2 = __webpack_require__.c[1599].exports;\n\t\t\t\t\treturn wasmImportedFuncCache2[\"__wbg_miny_9972d9159e80fde8\"](p0i32);\n\t\t\t\t},\n\t\t\t\t\"__wbg_maxy_1c5b27cf1988c667\": function(p0i32) {\n\t\t\t\t\tif(wasmImportedFuncCache3 === undefined) wasmImportedFuncCache3 = __webpack_require__.c[1599].exports;\n\t\t\t\t\treturn wasmImportedFuncCache3[\"__wbg_maxy_1c5b27cf1988c667\"](p0i32);\n\t\t\t\t},\n\t\t\t\t\"__wbg_renderwidth_a0b0f18a85207529\": function(p0i32) {\n\t\t\t\t\tif(wasmImportedFuncCache4 === undefined) wasmImportedFuncCache4 = __webpack_require__.c[1599].exports;\n\t\t\t\t\treturn wasmImportedFuncCache4[\"__wbg_renderwidth_a0b0f18a85207529\"](p0i32);\n\t\t\t\t},\n\t\t\t\t\"__wbg_renderheight_36b17e8bfc037fc9\": function(p0i32) {\n\t\t\t\t\tif(wasmImportedFuncCache5 === undefined) wasmImportedFuncCache5 = __webpack_require__.c[1599].exports;\n\t\t\t\t\treturn wasmImportedFuncCache5[\"__wbg_renderheight_36b17e8bfc037fc9\"](p0i32);\n\t\t\t\t},\n\t\t\t\t\"__wbg_scale_5e6438f0fcc08bc0\": function(p0i32) {\n\t\t\t\t\tif(wasmImportedFuncCache6 === undefined) wasmImportedFuncCache6 = __webpack_require__.c[1599].exports;\n\t\t\t\t\treturn wasmImportedFuncCache6[\"__wbg_scale_5e6438f0fcc08bc0\"](p0i32);\n\t\t\t\t},\n\t\t\t\t\"__wbindgen_string_get\": function(p0i32,p1i32) {\n\t\t\t\t\tif(wasmImportedFuncCache7 === undefined) wasmImportedFuncCache7 = __webpack_require__.c[1599].exports;\n\t\t\t\t\treturn wasmImportedFuncCache7[\"__wbindgen_string_get\"](p0i32,p1i32);\n\t\t\t\t},\n\t\t\t\t\"__wbindgen_object_drop_ref\": function(p0i32) {\n\t\t\t\t\tif(wasmImportedFuncCache8 === undefined) wasmImportedFuncCache8 = __webpack_require__.c[1599].exports;\n\t\t\t\t\treturn wasmImportedFuncCache8[\"__wbindgen_object_drop_ref\"](p0i32);\n\t\t\t\t},\n\t\t\t\t\"__wbindgen_throw\": function(p0i32,p1i32) {\n\t\t\t\t\tif(wasmImportedFuncCache9 === undefined) wasmImportedFuncCache9 = __webpack_require__.c[1599].exports;\n\t\t\t\t\treturn wasmImportedFuncCache9[\"__wbindgen_throw\"](p0i32,p1i32);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t},\n};\n\nvar wasmModuleMap = {\n\t\"831\": [\n\t\t8841\n\t]\n};\n\n// object with all WebAssembly.instance exports\n__webpack_require__.w = {};\n\n// Fetch + compile chunk loading for webassembly\n__webpack_require__.f.wasm = function(chunkId, promises) {\n\n\tvar wasmModules = wasmModuleMap[chunkId] || [];\n\n\twasmModules.forEach(function(wasmModuleId, idx) {\n\t\tvar installedWasmModuleData = installedWasmModules[wasmModuleId];\n\n\t\t// a Promise means \"currently loading\" or \"already loaded\".\n\t\tif(installedWasmModuleData)\n\t\t\tpromises.push(installedWasmModuleData);\n\t\telse {\n\t\t\tvar importObject = wasmImportObjects[wasmModuleId]();\n\t\t\tvar req = fetch(__webpack_require__.p + \"\" + {\"831\":{\"8841\":\"1767282193a714f63082\"}}[chunkId][wasmModuleId] + \".module.wasm\");\n\t\t\tvar promise;\n\t\t\tif(importObject && typeof importObject.then === 'function' && typeof WebAssembly.compileStreaming === 'function') {\n\t\t\t\tpromise = Promise.all([WebAssembly.compileStreaming(req), importObject]).then(function(items) {\n\t\t\t\t\treturn WebAssembly.instantiate(items[0], items[1]);\n\t\t\t\t});\n\t\t\t} else if(typeof WebAssembly.instantiateStreaming === 'function') {\n\t\t\t\tpromise = WebAssembly.instantiateStreaming(req, importObject);\n\t\t\t} else {\n\t\t\t\tvar bytesPromise = req.then(function(x) { return x.arrayBuffer(); });\n\t\t\t\tpromise = bytesPromise.then(function(bytes) {\n\t\t\t\t\treturn WebAssembly.instantiate(bytes, importObject);\n\t\t\t\t});\n\t\t\t}\n\t\t\tpromises.push(installedWasmModules[wasmModuleId] = promise.then(function(res) {\n\t\t\t\treturn __webpack_require__.w[wasmModuleId] = (res.instance || res).exports;\n\t\t\t}));\n\t\t}\n\t});\n};","export const SIMPLE_DATA_TYPES = [\n 'values',\n 'tuples',\n 'objects'\n];\n\nexport const COMPLEX_DATA_TYPES = [\n 'tuple_observable',\n 'object_observable',\n 'generator'\n];\n\nexport const DATA_TYPES = [...SIMPLE_DATA_TYPES, ...COMPLEX_DATA_TYPES];\n","import PropTypes from 'prop-types';\nimport {DATA_TYPES} from '../state/data_types';\n\n// checking the shape of data is slow if there's a lot of it\n// it can be convenient in development, but should not be done when testing high cardinality data\nconst ENABLE_DATA_CHECK = false;\n\nconst PointY = function (props, propName) {\n if (typeof props[propName] !== 'number' && props[propName] !== null) {\n return new Error(`${propName} needs to be a number or null`);\n }\n\n return null;\n};\n\nconst PointTuple = function (props, propName) {\n if (!Array.isArray(props) || props.length !== 2) { // eslint-disable-line react/prop-types\n return new Error(`${propName} needs to be an array of length two`);\n }\n\n const [x, y] = props;\n if (typeof x !== 'number' && !(x instanceof Date)) {\n return new Error(`${propName}.x needs to be a number or date`);\n }\n\n if (typeof y !== 'number' && y !== null) {\n return new Error(`${propName}.y needs to be a number or null`);\n }\n\n return null;\n};\n\nconst Data = ENABLE_DATA_CHECK ? PropTypes.oneOfType([\n PropTypes.arrayOf(PointY), // values\n PropTypes.arrayOf(PropTypes.arrayOf(PointTuple)), // tuples\n PropTypes.arrayOf(PropTypes.object), // objects\n PropTypes.shape({ observe: PropTypes.func.isRequired }), // observable\n PropTypes.func // generator function\n]) : PropTypes.any;\n\nconst SingleSeries = PropTypes.shape({\n data: Data.isRequired,\n type: PropTypes.oneOf([\n ...DATA_TYPES,\n 'infer'\n ]),\n xKey: PropTypes.string,\n yKey: PropTypes.string,\n xUnixDates: PropTypes.bool,\n color: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n name: PropTypes.string,\n xLabel: PropTypes.string,\n yLabel: PropTypes.string,\n ignoreDiscontinuities: PropTypes.bool,\n dashed: PropTypes.bool,\n dashPattern: PropTypes.arrayOf(PropTypes.number),\n width: PropTypes.number,\n rangeSelectorWidth: PropTypes.number,\n axis: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),\n expandYWith: PropTypes.arrayOf(PropTypes.number),\n defaultAlwaysTooltipped: PropTypes.bool,\n square: PropTypes.bool,\n shiftXBy: PropTypes.number,\n graph: PropTypes.number, // affects multigrapher only\n background: PropTypes.object,\n hideFromKey: PropTypes.bool,\n showIndividualPoints: PropTypes.bool,\n rendering: PropTypes.oneOf(['line', 'bar', 'area']), // defaults to line\n negativeColor: PropTypes.string, // only applies to bar\n gradient: PropTypes.array, // only applies to area\n zeroLineWidth: PropTypes.number, // only applies to bar and area\n zeroLineColor: PropTypes.string, // only applies to bar and area\n pointRadius: PropTypes.number, // only applies to area\n tooltipWidth: PropTypes.number,\n hasAreaBottom: PropTypes.bool,\n shadowColor: PropTypes.string,\n rangeKey: PropTypes.string\n});\n\nconst Series = PropTypes.arrayOf(SingleSeries);\n\nconst Axis = PropTypes.shape({\n axisIndex: PropTypes.number.isRequired,\n series: PropTypes.array.isRequired,\n side: PropTypes.oneOf(['left', 'right']).isRequired,\n scale: PropTypes.oneOf(['linear', 'log']).isRequired,\n label: PropTypes.string\n});\n\nconst Axes = PropTypes.arrayOf(Axis);\n\nconst CustomBoundsSelector = PropTypes.shape({\n label: PropTypes.string.isRequired,\n calculator: PropTypes.func.isRequired,\n datesOnly: PropTypes.bool\n});\n\nconst CustomBoundsSelectors = PropTypes.arrayOf(CustomBoundsSelector);\n\nconst TooltipOptionsRaw = {\n includeSeriesLabel: PropTypes.bool,\n includeXLabel: PropTypes.bool,\n includeYLabel: PropTypes.bool,\n includeXValue: PropTypes.bool,\n includeYValue: PropTypes.bool,\n floating: PropTypes.bool,\n alwaysFixedPosition: PropTypes.bool,\n floatPosition: PropTypes.oneOf(['top', 'bottom']),\n floatDelta: PropTypes.number,\n savingDisabled: PropTypes.bool,\n customTooltip: PropTypes.func,\n combineTooltips: PropTypes.oneOfType([PropTypes.bool, PropTypes.number])\n};\n\nconst TooltipOptions = PropTypes.shape(TooltipOptionsRaw);\n\nconst Annotation = PropTypes.shape({\n x: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.instanceOf(Date)]).isRequired,\n xEnd: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.instanceOf(Date)]),\n series: PropTypes.arrayOf(PropTypes.string),\n content: PropTypes.string.isRequired\n});\nconst Annotations = PropTypes.arrayOf(Annotation);\n\nconst DraggablePoint = PropTypes.shape({\n x: PropTypes.number.isRequired,\n y: PropTypes.number.isRequired,\n radius: PropTypes.number,\n fillColor: PropTypes.string,\n strokeColor: PropTypes.string,\n strokeWidth: PropTypes.number,\n onClick: PropTypes.func,\n onDoubleClick: PropTypes.func\n});\nconst DraggablePoints = PropTypes.arrayOf(DraggablePoint);\n\nconst VerticalLine = PropTypes.shape({\n x: PropTypes.number.isRequired,\n color: PropTypes.string,\n lineTop: PropTypes.number,\n width: PropTypes.number,\n markTop: PropTypes.bool,\n style: PropTypes.object,\n markerStyle: PropTypes.object,\n text: PropTypes.string,\n textTop: PropTypes.number,\n textStyle: PropTypes.object,\n minPixelX: PropTypes.number,\n maxPixelX: PropTypes.number,\n onRangeGraph: PropTypes.oneOfType([\n PropTypes.bool,\n PropTypes.object // anything that can be passed into the overall vertical line\n ]),\n onRangeGraphOnly: PropTypes.bool\n});\nconst VerticalLines = PropTypes.arrayOf(VerticalLine);\n\nconst CustomPropTypes = {\n Data,\n SingleSeries,\n Series,\n Axis,\n Axes,\n CustomBoundsSelector,\n CustomBoundsSelectors,\n TooltipOptions,\n TooltipOptionsRaw,\n Annotations,\n DraggablePoint,\n DraggablePoints,\n VerticalLine,\n VerticalLines\n};\n\n\nexport default CustomPropTypes;\n","export const DPI_INCREASE = 2;\n\n/**\n * Sizes the canvas such that rendering is pixel perfect\n * Returns the sizing information\n *\n * @param {HTMLCanvasElement} canvas\n * @param {CanvasRenderingContext2D} context\n * @param {Boolean} reset - if true, will reset the canvas size before checking sizing\n * @return {Promise<{boundingRect: DOMRect, pixelRatio: number, elementHeight: number, renderWidth: number, renderHeight: number, elementWidth: number}>}\n */\nexport default async function sizeCanvas(canvas, context, {reset=true}={}) {\n if (reset) {\n canvas.width = '';\n canvas.height = '';\n canvas.style.width = '0';\n canvas.style.height = '';\n\n await new Promise((resolve) => requestAnimationFrame(resolve));\n }\n\n let boundingRect = canvas.parentNode.getBoundingClientRect();\n\n while (boundingRect.width === 0) {\n await new Promise((resolve) => requestAnimationFrame(resolve));\n boundingRect = canvas.getBoundingClientRect();\n }\n\n const dpr = window.devicePixelRatio || 1;\n const bsr = context.webkitBackingStorePixelRatio ||\n context.mozBackingStorePixelRatio ||\n context.msBackingStorePixelRatio ||\n context.oBackingStorePixelRatio ||\n context.backingStorePixelRatio || 1;\n\n const pixelRatio = DPI_INCREASE*dpr / bsr;\n\n const elementWidth = boundingRect.width;\n const elementHeight = boundingRect.height;\n const renderWidth = elementWidth * pixelRatio;\n const renderHeight = elementHeight * pixelRatio;\n\n canvas.width = renderWidth;\n canvas.height = renderHeight;\n canvas.style.width = `${elementWidth}px`;\n canvas.style.height = `${elementHeight}px`;\n\n // We could us this to make coordinates behave as if they weren't transformed if we wanted\n // context.setTransform(this.pixelRatio, 0, 0, this.pixelRatio, 0, 0)\n\n return {\n pixelRatio,\n elementWidth,\n elementHeight,\n renderWidth,\n renderHeight,\n boundingRect\n };\n}\n","export const LINE_COLORS = [\n '#F1C232',\n '#1259f8',\n '#cb4b4b',\n '#4da74d',\n '#9440ed',\n '#61e0ed',\n '#ed6d2c',\n '#ed13c6',\n '#bbed59'\n];\n\nexport default function getColor(seriesColor, i, multigrapherSeriesIndex) {\n if (typeof seriesColor === 'string') {\n return seriesColor;\n }\n\n if (typeof seriesColor === 'number') {\n return LINE_COLORS[seriesColor % LINE_COLORS.length];\n }\n\n if (multigrapherSeriesIndex !== undefined) {\n return LINE_COLORS[multigrapherSeriesIndex % LINE_COLORS.length];\n }\n\n return LINE_COLORS[i % LINE_COLORS.length];\n}\n","/**\n * Returns the color as a [r, g, b, a] array with domain 0 to 1 for use in webgl\n *\n * @param color\n * @return {[number, number, number, number]|[number, number, number, number]}\n */\nexport default function colorToVector(color) {\n if (color === 'black') {\n color = '#000000';\n } else if (color === 'white') {\n color = '#FFFFFF';\n } else if (color === 'transparent') {\n return [0, 0, 0, 0];\n }\n\n if (color.startsWith('rgb')) {\n const parts = color.split(',').map((part) => parseFloat(part.match(/\\d+(\\.\\d+)?/)[0]));\n return [\n parts[0]/255,\n parts[1]/255,\n parts[2]/255,\n parts.length >= 4 ? parts[3] : 1\n ];\n }\n\n if (typeof color !== 'string' || !/^#[\\dA-F]{6}$/i.test(color)) {\n throw new Error(`Color must be a hex string: ${color}`);\n }\n\n const r = parseInt(color.substr(1, 2), 16)/255;\n const g = parseInt(color.substr(3, 2), 16)/255;\n const b = parseInt(color.substr(5, 2), 16)/255;\n const a = 1.0;\n return [r, g, b, a];\n}\n","import {DPI_INCREASE} from './size_canvas';\n\n/**\n * Returns an array of contiguous paths from data in render space\n *\n * @param {{nullMask: Uint8Array, maxYValues: Float64Array, minYValues: Float64Array, yValues: Float64Array}} dataInRenderSpace\n * @param {Object} options\n * @param {Number} options.splitAtY - split the path whenever it's suddenly less or greater than this value\n * @return {[[Number]]}\n */\nexport default function pathsFrom(dataInRenderSpace, {splitAtY}={}) {\n const paths = [];\n let currentPath = [];\n let previouslyDiscontinuous = true;\n\n const { nullMask, maxYValues, minYValues, yValues } = dataInRenderSpace;\n\n for (let i = 0; i < yValues.length; i++) {\n const x = i*DPI_INCREASE;\n const y = yValues[i];\n\n if (nullMask[i] & 0b001) { // y null\n if (!previouslyDiscontinuous) {\n paths.push(currentPath);\n currentPath = [];\n }\n\n previouslyDiscontinuous = true;\n continue;\n }\n\n currentPath.push([x, y]);\n\n const minY = minYValues[i];\n const maxY = maxYValues[i];\n\n if (minY !== maxY) {\n if (!(nullMask[i] & 0b010)) {\n currentPath.push([x, minY]);\n }\n\n if (!(nullMask[i] & 0b100)) {\n currentPath.push([x, maxY]);\n }\n currentPath.push([x, y]);\n }\n\n previouslyDiscontinuous = false;\n\n if (typeof splitAtY === 'number' && i > 0) {\n const prevY = yValues[i-1];\n const signFlipped = !(nullMask[i-1] & 0b001) && (prevY < splitAtY && y >= splitAtY) || (prevY > splitAtY && y <= splitAtY) || (prevY === splitAtY && y !== splitAtY);\n\n if (signFlipped) {\n if (!previouslyDiscontinuous) {\n paths.push(currentPath);\n currentPath = [\n [x, y]\n ];\n }\n\n previouslyDiscontinuous = true;\n }\n }\n }\n\n if (!previouslyDiscontinuous) {\n paths.push(currentPath);\n }\n\n return paths;\n}\n","import pathsFrom from './paths_from';\nimport {DPI_INCREASE} from './size_canvas';\nlet RustAPI;\nimport('../rust/pkg/index.js').then((module) => {\n RustAPI = module;\n});\n\n/**\n *\n * @param {[[Number]]} paths\n * @param {Boolean} dashed\n * @param {Array} dashPattern\n * @return {{prevPositions: Float32Array, indices: Uint32Array, vertices: Float32Array, positions: Float32Array}}\n */\nexport function extractVerticesFromPaths(paths, { dashed, dashPattern }) {\n let pointNumber = 0;\n for (let path of paths) {\n if (dashed) {\n for (let i = 0; i < path.length; i++) {\n if (dashed && i % (dashPattern[0] + dashPattern[1]) >= dashPattern[0]) {\n continue;\n }\n pointNumber++;\n }\n } else {\n pointNumber += path.length;\n }\n }\n\n const positions = new Float32Array(pointNumber*8);\n const prevPositions = new Float32Array(pointNumber*8);\n const vertices = new Float32Array(pointNumber*4);\n const indices = new Uint32Array(pointNumber*6);\n\n if (pointNumber > 0) {\n const verticesPattern = new Float32Array([0, 1, 2, 3]);\n vertices.set(verticesPattern);\n let vertexPointer = verticesPattern.length;\n let sourceLength = verticesPattern.length;\n while (vertexPointer < vertices.length) {\n if (vertexPointer + sourceLength > vertices.length) {\n sourceLength = vertices.length - vertexPointer;\n }\n\n vertices.copyWithin(vertexPointer, 0, sourceLength);\n vertexPointer += sourceLength;\n sourceLength <<= 1;\n }\n }\n\n let pointI = 0;\n for (let path of paths) {\n for (let i = 0; i < path.length; i++) {\n if (dashed && i % (dashPattern[0] + dashPattern[1]) >= dashPattern[0]) {\n continue;\n }\n\n const [x, y] = path[i];\n\n let prevX, prevY;\n\n if (i === 0) {\n prevX = x - 1;\n prevY = y;\n } else {\n [prevX, prevY] = path[i - 1];\n }\n\n for (let j = 0; j < 4; j++) {\n positions[pointI * 8 + 2 * j] = x;\n positions[pointI * 8 + 2 * j + 1] = y;\n prevPositions[pointI * 8 + 2 * j] = prevX;\n prevPositions[pointI * 8 + 2 * j + 1] = prevY;\n }\n\n indices[pointI * 6] = pointI * 4;\n indices[pointI * 6 + 1] = pointI * 4 + 1;\n indices[pointI * 6 + 2] = pointI * 4 + 3;\n\n indices[pointI * 6 + 3] = pointI * 4;\n indices[pointI * 6 + 4] = pointI * 4 + 2;\n indices[pointI * 6 + 5] = pointI * 4 + 3;\n\n pointI++;\n }\n }\n\n return {\n positions,\n prevPositions,\n vertices,\n indices\n };\n}\n\n/**\n * Takes the paths and turns them into what's needed for the line webgl program\n *\n * @param {{nullMask: Uint8Array, maxYValues: Float64Array, minYValues: Float64Array, yValues: Float64Array, paths?: [[Number]]}} dataInRenderSpace\n * @param {Boolean} dashed\n * @param {Array} dashPattern\n * @return {{prevPositions: Float32Array, indices: Uint32Array, vertices: Float32Array, positions: Float32Array}}\n */\nexport default function extractVertices(dataInRenderSpace, { dashed, dashPattern }) {\n if (dataInRenderSpace.paths) {\n return extractVerticesFromPaths(dataInRenderSpace.paths, { dashed, dashPattern});\n }\n\n if (!RustAPI) {\n const paths = pathsFrom(dataInRenderSpace);\n return extractVerticesFromPaths(paths, { dashed, dashPattern});\n }\n\n const pointNumber = RustAPI.get_point_number(\n dataInRenderSpace.nullMask, dataInRenderSpace.yValues, dataInRenderSpace.minYValues, dataInRenderSpace.maxYValues,\n dashed, dashPattern[0], dashPattern[1]\n );\n\n let positions = new Float32Array(pointNumber*8);\n let prevPositions = new Float32Array(pointNumber*8);\n let vertices = new Float32Array(pointNumber*4);\n let indices = new Uint32Array(pointNumber*6);\n\n RustAPI.extract_vertices(\n DPI_INCREASE,\n dataInRenderSpace.nullMask, dataInRenderSpace.yValues, dataInRenderSpace.minYValues, dataInRenderSpace.maxYValues,\n positions, prevPositions, vertices, indices,\n dashed, dashPattern[0], dashPattern[1]\n );\n\n return {\n positions,\n prevPositions,\n vertices,\n indices\n };\n}\n","/**\n * Creates a webgl program, linking the shaders and checking for errors\n *\n * @param gl\n * @param vertShaderSource\n * @param fragShaderSource\n * @return {WebGLProgram}\n */\nexport default function createGLProgram(gl, vertShaderSource, fragShaderSource) {\n const vertexShader = gl.createShader(gl.VERTEX_SHADER);\n gl.shaderSource(vertexShader, vertShaderSource);\n gl.compileShader(vertexShader);\n if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {\n console.error(gl.getShaderInfoLog(vertexShader)); // eslint-disable-line no-console\n }\n\n const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n gl.shaderSource(fragmentShader, fragShaderSource);\n gl.compileShader(fragmentShader);\n if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {\n console.error(gl.getShaderInfoLog(fragmentShader)); // eslint-disable-line no-console\n }\n\n const program = gl.createProgram();\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n\n gl.linkProgram(program);\n gl.validateProgram(program);\n\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n console.error(gl.getProgramInfoLog(program)); // eslint-disable-line no-console\n }\n\n return program;\n}\n","import lineFrag from './line.frag';\nimport lineVert from './line.vert';\nimport circleFrag from './circle.frag';\nimport circleVert from './circle.vert';\nimport colorToVector from '../helpers/color_to_vector';\nimport extractVertices from './extract_vertices';\nimport createGLProgram from './create_gl_program';\nimport {DPI_INCREASE} from './size_canvas';\n\nexport default class LineProgram {\n\n constructor(gl) {\n this._gl = gl;\n\n this._program = createGLProgram(gl, lineVert, lineFrag);\n this._circleProgram = createGLProgram(gl, circleVert, circleFrag);\n\n this._positionBuffer = gl.createBuffer();\n this._prevPositionBuffer = gl.createBuffer();\n this._vertexBuffer = gl.createBuffer();\n this._indexBuffer = gl.createBuffer();\n this._individualPointBuffer = gl.createBuffer();\n\n if (!gl.getExtension('OES_element_index_uint')) {\n console.error('Your browser does not support OES_element_index_uint'); // eslint-disable-line no-console\n }\n }\n\n dispose() {\n\n }\n\n clear() {\n const gl = this._gl;\n const width = gl.drawingBufferWidth;\n const height = gl.drawingBufferHeight;\n\n gl.clearColor(0, 0, 0, 0);\n gl.clear(gl.DEPTH_BUFFER_BIT | gl.COLOR_BUFFER_BIT);\n gl.viewport(0, 0, width, height);\n }\n\n /**\n * Draws the data on the canvas\n * Assumes the data is in render space\n *\n * @param {{nullMask: Uint8Array, maxYValues: Float64Array, minYValues: Float64Array, yValues: Float64Array}} dataInRenderSpace - the data to render\n * @param {Object} parameters - set of options\n * @param {String} parameters.color - color of the line to draw\n * @param {Number} [parameters.width] - line width\n * @param {Number} [parameters.shadowBlur] - level to blur shadow to\n * @param {String} [parameters.shadowColor] - color of the shadow\n * @param {String} [parameters.dashed] - whether or not to make the line dashed\n * @param {Array<Number>} [parameters.dashPattern] - dash array for the canvas\n * @param {Boolean} [parameters.highlighted] - whether the line is highlighted or not\n * @param {Boolean} [parameters.showIndividualPoints] - draw circles at each point\n * @param {Function} [parameters.getIndividualPoints] - points to draw circles at. Only called when needed.\n * @private\n */\n draw(dataInRenderSpace, parameters) {\n const gl = this._gl;\n const width = gl.drawingBufferWidth;\n const height = gl.drawingBufferHeight;\n gl.useProgram(this._program);\n\n // gl.disable(gl.DEPTH_TEST);\n\n const thickness = DPI_INCREASE*((parameters.width || 1) + (parameters.highlighted ? 2 : 0));\n const shadowBlur = parameters.shadowBlur === undefined ? 2 : parameters.shadowBlur;\n const shadowColor = parameters.shadowColor || 'black';\n const dashed = parameters.dashed || false;\n const dashPattern = parameters.dashPattern || [5, 5];\n\n const {positions, prevPositions, vertices, indices} = extractVertices(dataInRenderSpace, { dashed, dashPattern });\n\n const positionIndex = gl.getAttribLocation(this._program, 'position');\n const prevPositionIndex = gl.getAttribLocation(this._program, 'prevPosition');\n const vertexIndex = gl.getAttribLocation(this._program, 'vertex');\n\n gl.enableVertexAttribArray(positionIndex);\n gl.bindBuffer(gl.ARRAY_BUFFER, this._positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, positions, gl.STATIC_DRAW);\n gl.vertexAttribPointer(positionIndex, 2, gl.FLOAT, false, 0, 0);\n\n gl.enableVertexAttribArray(prevPositionIndex);\n gl.bindBuffer(gl.ARRAY_BUFFER, this._prevPositionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, prevPositions, gl.STATIC_DRAW);\n gl.vertexAttribPointer(prevPositionIndex, 2, gl.FLOAT, false, 0, 0);\n\n gl.enableVertexAttribArray(vertexIndex);\n gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n gl.vertexAttribPointer(vertexIndex, 1, gl.FLOAT, false, 0, 0);\n\n gl.uniform1f(gl.getUniformLocation(this._program, 'width'), width);\n gl.uniform1f(gl.getUniformLocation(this._program, 'height'), height);\n gl.uniform1f(gl.getUniformLocation(this._program, 'thickness'), Math.max(thickness, 1)+shadowBlur);\n gl.uniform1f(gl.getUniformLocation(this._program, 'shadowBlur'), shadowBlur);\n gl.uniform4f(gl.getUniformLocation(this._program, 'color'), ...colorToVector(parameters.color));\n gl.uniform4f(gl.getUniformLocation(this._program, 'shadowColor'), ...colorToVector(shadowColor));\n\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n gl.drawElements(gl.TRIANGLES, indices.length, gl.UNSIGNED_INT, 0);\n\n if (parameters.showIndividualPoints) {\n gl.useProgram(this._circleProgram);\n\n gl.uniform1f(gl.getUniformLocation(this._circleProgram, 'width'), width);\n gl.uniform1f(gl.getUniformLocation(this._circleProgram, 'height'), height);\n gl.uniform1f(gl.getUniformLocation(this._circleProgram, 'pointSize'), 2*(thickness+6));\n gl.uniform4f(gl.getUniformLocation(this._circleProgram, 'color'), ...colorToVector(parameters.color));\n\n const individualPoints = parameters.getIndividualPoints();\n\n gl.enableVertexAttribArray(0);\n gl.bindBuffer(gl.ARRAY_BUFFER, this._individualPointBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(individualPoints.flat()), gl.STATIC_DRAW);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);\n\n gl.drawArrays(gl.POINTS, 0, individualPoints.length);\n }\n }\n\n}\n","export default class Eventable {\n\n constructor() {\n this._listeners = {};\n }\n\n /**\n * Clears all listeners\n * @protected\n */\n clearListeners() {\n this._listeners = {};\n }\n\n /**\n * Create a new listener for the event\n * When the event is emitted, it will call the provided function\n *\n * @param {String|symbol} eventName - the name of the event to start listening to\n * @param {Function} fn - the listener to add\n */\n on(eventName, fn) {\n this._listeners[eventName] = this._listeners[eventName] || new Set();\n this._listeners[eventName].add(fn);\n }\n\n /**\n * Removes an existing listener for the event\n *\n * @param {String|symbol} eventName - the name of the event to stop listening to\n * @param {Function} fn - the listener to remove\n */\n off(eventName, fn) {\n if (!this._listeners[eventName]) {\n return;\n }\n\n this._listeners[eventName].delete(fn);\n\n if (this._listeners[eventName].size === 0) {\n delete this._listeners[eventName];\n }\n }\n\n /**\n * Emits an event that will go out to all _listeners on eventName\n *\n * @param {String|symbol} eventName - the name of the event to emit\n */\n emit(eventName) {\n if (!this._listeners[eventName]) {\n return;\n }\n\n const args = [];\n for (let i = 1; i < arguments.length; i++) {\n args.push(arguments[i]);\n }\n\n this._listeners[eventName].forEach((fn) => {\n fn.apply(this, args);\n });\n }\n\n}\n","import backgroundFrag from './background.frag';\nimport backgroundVert from './background.vert';\nimport colorToVector from '../helpers/color_to_vector';\nimport createGLProgram from './create_gl_program';\n\nexport default class BackgroundProgram {\n\n constructor(gl) {\n this._gl = gl;\n\n this._program = createGLProgram(gl, backgroundVert, backgroundFrag);\n\n this._vertexBuffer = gl.createBuffer();\n this._indexBuffer = gl.createBuffer();\n\n if (!gl.getExtension('OES_element_index_uint')) {\n console.error('Your browser does not support OES_element_index_uint'); // eslint-disable-line no-console\n }\n }\n\n draw({ data }) {\n const gl = this._gl;\n gl.useProgram(this._program);\n\n // gl.disable(gl.DEPTH_TEST);\n\n for (let { minXt, maxXt, color } of data) {\n gl.uniform4f(gl.getUniformLocation(this._program, 'color'), ...colorToVector(color));\n\n const vertices = new Float32Array([\n minXt, 1, maxXt, 1, maxXt, -1,\n minXt, 1, maxXt, -1, minXt, -1\n ]);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);\n\n const positionLocation = gl.getAttribLocation(this._program, 'position');\n gl.enableVertexAttribArray(positionLocation);\n gl.vertexAttribPointer(positionLocation, 2, gl.FLOAT, false, 0, 0);\n\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n }\n }\n\n}\n","/**\n * Draws a horizontal line at the specified y-coordinate.\n *\n * @param {Number} y\n * @param {Object} options\n * @param {CanvasRenderingContext2D} options.context\n * @param {{renderWidth: Number, renderHeight: Number}} options.sizing\n * @param {String} options.color\n * @param {String} options.zeroColor\n * @param {Number} options.zeroWidth\n */\nexport function drawZeroLine(y, { context, sizing, color, zeroColor, zeroWidth}) {\n if (!zeroWidth) {\n return;\n }\n\n context.strokeStyle = zeroColor || color;\n context.lineWidth = zeroWidth;\n\n context.beginPath();\n context.moveTo(0, y);\n context.lineTo(sizing.renderWidth, y);\n context.stroke();\n}\n","import {drawZeroLine} from './draw_zero_line';\n\n/**\n * Draws the data on the canvas\n * Assumes the data is in individual point render space, ie x and y in pixels\n *\n * @param {Array<[number, number]>} individualPoints - data to draw\n * @param {Object} options - set of options\n * @param {Object} options.context - the context to draw on\n * @param {String} options.color - color of the bar to draw\n * @param {{renderWidth: Number, renderHeight: Number}} options.sizing - size of the canvas, in pixels\n * @param {Number} options.indexInAxis - index of the series in the axis\n * @param {Number} options.axisSeriesCount - number of series in the axis\n * @param {Number} options.zero - y coordinate that represents \"zero\"\n * @param {Boolean} options.hasNegatives - if any values are negative (in which case should render from zero)\n * @param {String} options.negativeColor - color of the bar to draw if negative\n * @param {String} options.zeroColor - color of the zero line\n * @param {Number} options.zeroWidth - width of the zero line\n * @param {Number} options.closestSpacing - closest x spacing between points, in data space\n * @param {{minX: Number, maxX: Number}} options.bounds - bounds of the data as rendered\n * @private\n */\nexport default function drawBars(individualPoints, {\n color, context, sizing, indexInAxis, axisSeriesCount, zero, hasNegatives, negativeColor, zeroColor, zeroWidth, closestSpacing, bounds\n}) {\n context.strokeStyle = color;\n context.fillStyle = color;\n\n const {barWidth, totalBarWidth} = getBarWidths({ closestSpacing, bounds, sizing, axisSeriesCount });\n const barBottom = hasNegatives ? zero : sizing.renderHeight;\n\n for (let i = 0; i < individualPoints.length; i++) {\n const [x, y] = individualPoints[i];\n\n if (hasNegatives) {\n if (y <= zero) {\n context.fillStyle = color;\n } else {\n context.fillStyle = negativeColor;\n }\n }\n\n context.fillRect(x - totalBarWidth / 2 + barWidth*indexInAxis, y, barWidth, barBottom-y);\n }\n\n if (zeroWidth) {\n drawZeroLine(barBottom, {\n context,\n sizing,\n color,\n zero,\n zeroColor,\n zeroWidth\n });\n }\n}\n\n/**\n * Calculates the widths of the bars\n *\n * @param {Number} closestSpacing - closest x spacing between points, in data space\n * @param {{minX: Number, maxX: Number}} bounds - bounds of the data as rendered\n * @param {{renderWidth: Number, renderHeight: Number}} sizing - size of the canvas, in pixels\n * @param {Number} axisSeriesCount - number of series in the axis\n * @return {{barWidth: Number, totalBarWidth: Number, barSpacing: Number}}\n */\nexport function getBarWidths({closestSpacing, bounds, sizing, axisSeriesCount}) {\n // width of bar plus spacing, which we define as the closest distance between points in pixel space\n const fullBarWidth = closestSpacing / (bounds.maxX - bounds.minX) * sizing.renderWidth;\n\n const totalBarWidth = fullBarWidth * 0.8;\n const barSpacing = fullBarWidth * 0.2;\n const barWidth = totalBarWidth / axisSeriesCount;\n\n return {\n barWidth,\n totalBarWidth,\n barSpacing\n };\n}\n","import {extractYValue} from '../helpers/flatten_simple_data.js';\n\n/**\n * Given a series object, figures out the form of the data\n * Note that this is not a validator, nor is it guaranteed to get it right 100% of the time!\n * If it is giving the wrong type, it is recommended to specify the type manually\n *\n * @param {*} series\n * @param {Boolean} options.useSimpleData\n * @param {Array} options.data\n * @return {String}\n */\nexport default function inferType(series, options={ useSimpleData: false }) {\n if (series.type && series.type !== 'infer') {\n return series.type;\n }\n\n const data = options.data || (options.useSimpleData ? (series.simpleData || series.data) : series.data);\n\n if (!data) {\n throw new Error('Data must be provided');\n }\n\n if (Array.isArray(data)) {\n if (data.length === 0) {\n return 'tuples';\n }\n\n if (Array.isArray(data[0])) {\n return 'tuples';\n }\n\n if (typeof data[0] === 'number' || !data[0]) {\n return 'values';\n }\n\n return 'objects';\n }\n\n if (data.observe) {\n if (series.xKey) {\n return 'object_observable';\n } else {\n return 'tuple_observable';\n }\n }\n\n if (typeof data === 'function') {\n return 'generator';\n }\n\n throw new Error('Could not infer type');\n}\n\n/**\n *\n * @param simpleData\n * @param singleSeries\n * @return {boolean}\n */\nexport function isEnumLike(simpleData, singleSeries) {\n for (let i = 0; i < simpleData.length; i++) {\n const y = extractYValue(simpleData[simpleData.length - 1], singleSeries);\n if (y === null || y === undefined) {\n continue;\n }\n\n if (typeof y === 'string') {\n return true;\n }\n }\n\n return false;\n}\n","import sizeCanvas from './size_canvas';\nimport getColor from '../helpers/colors';\nimport LineProgram from './line_program';\nimport drawLine from './draw_line';\nimport Eventable from '../eventable';\nimport drawBackground from './draw_background.js';\nimport BackgroundProgram from './background_program.js';\nimport drawBars from './draw_bars';\nimport drawArea from './draw_area';\nimport inferType from '../state/infer_type';\n\nexport default class GraphBodyRenderer extends Eventable {\n\n constructor({stateController, canvasElement, webgl=false, checkIntersection=true }) {\n super();\n\n this._stateController = stateController;\n\n this._checkIntersection = checkIntersection;\n this._canvas = canvasElement;\n this._webgl = webgl;\n if (webgl) {\n this._context = this._canvas.getContext('webgl');\n if (this._context) {\n this._lineProgram = new LineProgram(this._context);\n } else {\n alert('WebGL failed! Attempting fallback to CPU rendering');\n this._webgl = false;\n }\n }\n\n if (!this._webgl) {\n this._context = this._canvas.getContext( '2d');\n this._context2d = this._context;\n }\n\n this._initialized = this._initializeCanvas();\n\n this._boundResize = this.resize.bind(this);\n this._cachedAxisCount = null;\n this._onAxisChange = (axes) => {\n const count = axes.filter(({ series }) => series.length > 0).length;\n if (this._cachedAxisCount !== count) {\n this._cachedAxisCount = count;\n this.resize();\n }\n };\n\n stateController.on('axes_changed', this._onAxisChange);\n stateController.on('dragging_y_changed', this._boundResize);\n stateController.on('showing_sidebar_changed', this._boundResize);\n }\n\n /**\n * Cleans up after this renderer\n */\n dispose() {\n this.clearListeners();\n this._lineProgram && this._lineProgram.dispose();\n this._cachedAxisCount = null;\n this._stateController.off('axes_changed', this._onAxisChange);\n this._stateController.off('dragging_y_changed', this._boundResize);\n\n if (this._resizeObserver) {\n this._resizeObserver.disconnect();\n }\n\n if (this._intersectionObserver) {\n this._intersectionObserver.disconnect();\n }\n }\n\n clear() {\n if (this._webgl) {\n this._lineProgram.clear();\n } else {\n this._context.clearRect(0, 0, this._context.canvas.width, this._context.canvas.height);\n }\n }\n\n render(singleSeries, inRenderSpace, { highlighted, showIndividualPoints, shadowColor, shadowBlur, width, defaultLineWidth, bounds, globalBounds, inRenderSpaceAreaBottom }) {\n const getIndividualPoints = (useDataSpace) => {\n if (!bounds) {\n bounds = singleSeries.axis.currentBounds;\n }\n\n const individualPoints = [];\n let data = singleSeries.inSelectedSpace.data;\n if (useDataSpace) {\n data = singleSeries.inDataSpace;\n }\n\n for (let [x, y] of data) {\n if (y === null) {\n continue;\n }\n\n individualPoints.push([\n (x - bounds.minX) / (bounds.maxX - bounds.minX) * this._sizing.renderWidth,\n (1.0 - (y - bounds.minY) / (bounds.maxY - bounds.minY)) * this._sizing.renderHeight\n ]);\n }\n\n return individualPoints;\n };\n\n const getRanges = () => {\n if (!bounds) {\n bounds = singleSeries.axis.currentBounds;\n }\n\n if (!singleSeries.rangeKey) {\n return [];\n }\n\n const inferredType = inferType(singleSeries, { useSimpleData: true });\n if (inferredType !== 'objects') {\n return [];\n }\n\n return (singleSeries.simpleData || singleSeries.data).map((object) => {\n const range = object[singleSeries.rangeKey];\n\n if (!range) {\n return null;\n }\n\n const min = range.min;\n const max = range.max;\n const x = object[singleSeries.xKey];\n\n return {\n x,\n range,\n\n pixelX: (x - bounds.minX) / (bounds.maxX - bounds.minX) * this._sizing.renderWidth,\n pixelMinY: typeof min === 'number' ? (1.0 - (min - bounds.minY) / (bounds.maxY - bounds.minY)) * this._sizing.renderHeight : null,\n pixelMaxY: typeof max === 'number' ? (1.0 - (max - bounds.minY) / (bounds.maxY - bounds.minY)) * this._sizing.renderHeight : null\n };\n });\n };\n\n const cpuRendering = singleSeries.rendering === 'bar' || singleSeries.rendering === 'area';\n let commonCPUParams;\n\n if (cpuRendering) {\n // we can currently only render bars with the CPU\n this._context2d = this._context2d || this._canvas.getContext('2d');\n\n if (this._webgl) {\n // make sure we don't have any webgl stuff in the way before we get back to CPU rendering\n this._context.flush();\n }\n\n if (!bounds) {\n bounds = singleSeries.axis.currentBounds;\n }\n\n commonCPUParams = {\n context: this._context2d,\n color: getColor(singleSeries.color, singleSeries.index, singleSeries.multigrapherSeriesIndex),\n sizing: this._sizing,\n zero: (1.0 - (0 - bounds.minY) / (bounds.maxY - bounds.minY)) * this._sizing.renderHeight,\n hasNegatives: !!singleSeries.inDataSpace.find((tuple) => tuple[1] < 0),\n negativeColor: singleSeries.negativeColor,\n zeroWidth: singleSeries.zeroLineWidth,\n zeroColor: singleSeries.zeroLineColor\n };\n\n if (!commonCPUParams.hasNegatives && singleSeries.expandYWith) {\n commonCPUParams.hasNegatives = singleSeries.expandYWith.some((y) => y < 0);\n }\n }\n\n if (singleSeries.rendering === 'bar') {\n drawBars(getIndividualPoints(true), {\n ...commonCPUParams,\n indexInAxis: singleSeries.axis.series.indexOf(singleSeries),\n axisSeriesCount: singleSeries.axis.series.length,\n closestSpacing: globalBounds.closestSpacing,\n bounds\n });\n return;\n }\n\n if (singleSeries.rendering === 'area') {\n drawArea(getIndividualPoints(true), inRenderSpace, {\n ...commonCPUParams,\n showIndividualPoints: typeof singleSeries.showIndividualPoints === 'boolean' ? singleSeries.showIndividualPoints : showIndividualPoints,\n gradient: singleSeries.gradient,\n pointRadius: singleSeries.pointRadius,\n highlighted,\n width: width || singleSeries.width || defaultLineWidth,\n shadowColor,\n shadowBlur,\n inRenderSpaceAreaBottom\n });\n return;\n }\n\n const drawParams = {\n color: getColor(singleSeries.color, singleSeries.index, singleSeries.multigrapherSeriesIndex),\n context: this._context,\n width: width || singleSeries.width || defaultLineWidth,\n shadowColor,\n shadowBlur,\n dashed: singleSeries.dashed,\n dashPattern: singleSeries.dashPattern,\n highlighted,\n showIndividualPoints: typeof singleSeries.showIndividualPoints === 'boolean' ? singleSeries.showIndividualPoints : showIndividualPoints,\n getIndividualPoints,\n getRanges: singleSeries.rangeKey ? getRanges : null\n };\n\n if (this._webgl) {\n this._lineProgram.draw(inRenderSpace, drawParams);\n } else {\n drawLine(inRenderSpace, drawParams);\n }\n }\n\n renderBackground(inBackgroundSpace) {\n if (!inBackgroundSpace) {\n return;\n }\n\n if (this._webgl) {\n if (!this._backgroundProgram) {\n this._backgroundProgram = new BackgroundProgram(this._context);\n }\n \n this._backgroundProgram.draw(inBackgroundSpace);\n } else {\n drawBackground(inBackgroundSpace, {\n context: this._context\n });\n }\n }\n\n /**\n * Initializes canvas\n * Currently, just sets sizing\n */\n async _initializeCanvas() {\n this._sizing = await sizeCanvas(this._canvas, this._context);\n\n this.emit('size_changed', this._sizing);\n this._stateController.markSizeChanged();\n\n if (window.ResizeObserver) {\n let first = true;\n let disabled = false;\n\n this._resizeObserver = new window.ResizeObserver( () => {\n if (first) { // always fires once at the beginning\n first = false;\n return;\n }\n\n if (disabled) {\n return;\n }\n\n disabled = true;\n this.resize().then(() => {\n disabled = false;\n });\n });\n\n this._resizeObserver.observe(this._canvas.parentNode);\n }\n\n if (this._checkIntersection && window.IntersectionObserver) {\n this._intersectionObserver = new window.IntersectionObserver((entries) => {\n clearTimeout(this._intersectionTimeout);\n\n if (!entries[0].isIntersecting) {\n return;\n }\n\n this._intersectionTimeout = setTimeout(() => {\n this.resize();\n }, 50);\n }, {\n threshold: 0.1\n });\n\n this._intersectionObserver.observe(this._canvas.parentNode);\n }\n }\n\n async resize() {\n const sizingPromise = sizeCanvas(this._canvas, this._context, { reset: true });\n this._initialized = sizingPromise;\n\n this._sizing = await this._initialized;\n if (this._initialized !== sizingPromise) {\n return;\n }\n\n this.emit('size_changed', this._sizing);\n this._stateController.markSizeChanged(this);\n }\n\n resizeDebounced() {\n if (this._resizeTimeout) {\n clearTimeout(this._resizeTimeout);\n }\n\n this._resizeTimeout = setTimeout(() => {\n this.resize();\n this._resizeTimeout = null;\n }, 50);\n }\n\n recalculatePosition() {\n if (!this._sizing) {\n return;\n }\n\n this._sizing.boundingRect = this._canvas.getBoundingClientRect();\n }\n\n /**\n * Returns the bounding rect of the element\n *\n * @return {DOMRect}\n */\n get boundingRect() {\n return this._sizing.boundingRect;\n }\n\n get sizing() {\n return this._sizing;\n }\n\n}\n","import pathsFrom from './paths_from';\nimport {drawZeroLine} from './draw_zero_line';\nimport {DPI_INCREASE} from './size_canvas';\n\n/**\n * Draws the data on the canvas\n * Assumes the data is in individual point render space, ie x and y in pixels\n *\n * @param {Array<[number, number]>} individualPoints - data to draw\n * @param {Object} dataInRenderSpace\n * @param {Object} options - set of options\n * @param {Object} options.context - the context to draw on\n * @param {String} options.color - color of the bar to draw\n * @param {{renderWidth: Number, renderHeight: Number}} options.sizing - size of the canvas, in pixels\n * @param {Number} options.zero - y coordinate that represents \"zero\"\n * @param {Boolean} options.hasNegatives - if any values are negative (in which case should render from zero)\n * @param {Array<String>} [options.gradient] - an array of stops, from top to bottom of canvas, to draw with\n * @param {String} [options.zeroColor] - color of the zero line\n * @param {Number} [options.zeroWidth] - width of the zero line\n * @param {Boolean} [options.showIndividualPoints] - draw circles at each point\n * @param {String} [options.negativeColor] - color of the area below zero\n * @param {Number} [options.width] - line width\n * @param {Object} [options.inRenderSpaceAreaBottom] - if provided, will use this as the area bottom instead of zero/sizing.renderHeight\n * @private\n */\nexport default function drawArea(individualPoints, dataInRenderSpace, {\n color, context, sizing, zero, hasNegatives, gradient,\n zeroColor, zeroWidth, showIndividualPoints, negativeColor, pointRadius, width, highlighted,\n shadowColor='black', shadowBlur=5, inRenderSpaceAreaBottom\n}) {\n context.fillStyle = color;\n context.shadowColor = shadowColor;\n context.shadowBlur = shadowBlur;\n\n if (gradient && gradient.length > 2) {\n const globalGradient = context.createLinearGradient(0, 0, 0, sizing.renderHeight);\n\n for (let i = 0; i < gradient.length; i++) {\n const value = gradient[i];\n if (Array.isArray(value)) {\n globalGradient.addColorStop(value[0], value[1]);\n } else {\n globalGradient.addColorStop(i / (gradient.length - 1), value);\n }\n }\n\n context.fillStyle = globalGradient;\n\n if (color === 'gradient') {\n context.strokeStyle = globalGradient;\n }\n } else {\n context.fillStyle = color;\n }\n\n if (!individualPoints.length) {\n return;\n }\n\n // we want to draw a polygon with a flat line at areaBottom, and then follows the shape of the data\n const areaBottom = hasNegatives ? zero : sizing.renderHeight;\n\n const areaPaths = pathsFrom(dataInRenderSpace);\n const areaBottomPaths = inRenderSpaceAreaBottom && pathsFrom(inRenderSpaceAreaBottom);\n\n const linePaths = pathsFrom(dataInRenderSpace, {\n splitAtY: zero\n });\n\n for (let pathI = 0; pathI < areaPaths.length; pathI++) {\n const path = areaPaths[pathI];\n const areaBottomPath = areaBottomPaths && areaBottomPaths[pathI];\n context.beginPath();\n\n const [firstX, _startY] = path[0];\n const [lastX, _lastY] = path[path.length - 1];\n\n if (!areaBottomPaths) {\n context.moveTo(firstX, areaBottom);\n }\n\n for (let i = 0; i < path.length; i++) {\n const [x, y] = path[i];\n context.lineTo(x, y);\n }\n\n if (areaBottomPath && areaBottomPath.length) {\n for (let i = areaBottomPath.length - 1; i >= 0; i--) {\n const [x, y] = areaBottomPath[i];\n context.lineTo(x, y);\n }\n\n context.lineTo(...path[0]);\n } else {\n context.lineTo(lastX, areaBottom);\n }\n\n context.fill();\n }\n\n if (highlighted) {\n width += 2;\n }\n\n width *= DPI_INCREASE;\n context.strokeStyle = color;\n context.lineWidth = width;\n // context.shadowBlur = 1;\n\n for (let path of linePaths) {\n if (!path.length) {\n continue;\n }\n\n if (hasNegatives) {\n let positive = true;\n if (path.length >= 2) {\n positive = path[1][1] <= zero;\n } else {\n positive = path[0][1] <= zero;\n }\n\n if (positive) {\n context.strokeStyle = color;\n } else {\n context.strokeStyle = negativeColor;\n }\n }\n\n context.beginPath();\n\n for (let i = 0; i < path.length; i++) {\n const [x, y] = path[i];\n\n if (i === 0) {\n context.moveTo(x, y);\n } else {\n context.lineTo(x, y);\n }\n }\n\n context.stroke();\n }\n\n if (zeroWidth) {\n drawZeroLine(areaBottom, {\n context,\n sizing,\n color,\n zero,\n zeroColor,\n zeroWidth\n });\n }\n\n if (showIndividualPoints) {\n context.fillStyle = color;\n\n for (let [x, y] of individualPoints) {\n if (negativeColor && hasNegatives) {\n if (y === zero && zeroColor) {\n context.fillStyle = zeroColor;\n } else if (y < zero) {\n context.fillStyle = color;\n } else {\n context.fillStyle = negativeColor;\n }\n }\n\n context.beginPath();\n context.arc(x, y, pointRadius ||8, 0, 2 * Math.PI, false);\n context.fill();\n }\n }\n}\n","import {DPI_INCREASE} from './size_canvas';\nimport pathsFrom from './paths_from';\n\n/**\n * Draws the data on the canvas\n * Assumes the data is in render space\n *\n * @param {{nullMask: Uint8Array, maxYValues: Float64Array, minYValues: Float64Array, yValues: Float64Array}} dataInRenderSpace - the data to render\n * @param {Object} options - set of options\n * @param {Object} options.context - the context to draw on\n * @param {String} options.color - color of the line to draw\n * @param {Number} [options.width] - line width\n * @param {Number} [options.shadowBlur] - level to blur shadow to\n * @param {String} [options.shadowColor] - color of the shadow\n * @param {String} [options.dashed] - whether or not to make the line dashed\n * @param {Array<Number>} [options.dashPattern] - dash array for the canvas\n * @param {Boolean} [options.highlighted] - whether the line is highlighted or not\n * @param {Boolean} [options.showIndividualPoints] - draw circles at each point\n * @param {Function} [options.getIndividualPoints] - points to draw circles at. Only called when needed.\n * @param {Function} [options.getRanges] - ranges to draw. Only called when needed\n * @private\n */\nexport default function drawLine(dataInRenderSpace, {\n color, width=1, context, shadowColor='black', shadowBlur=5, dashed=false, dashPattern=null, highlighted=false, showIndividualPoints=false, getIndividualPoints, getRanges\n}) {\n if (highlighted) {\n width += 2;\n }\n width *= DPI_INCREASE;\n\n context.strokeStyle = color;\n context.lineWidth = width;\n context.shadowColor = shadowColor;\n context.shadowBlur = shadowBlur;\n\n if (dashed) {\n context.setLineDash(dashPattern || [5, 5]);\n } else {\n context.setLineDash([]);\n }\n\n const paths = pathsFrom(dataInRenderSpace);\n\n for (let path of paths) {\n context.beginPath();\n\n for (let i = 0; i < path.length; i++) {\n const [x, y] = path[i];\n\n if (i === 0) {\n context.moveTo(x, y);\n } else {\n context.lineTo(x, y);\n }\n }\n\n context.stroke();\n }\n\n if (getRanges) {\n const ranges = getRanges();\n\n context.lineWidth = width; // ensure the same width\n context.strokeStyle = color;\n context.setLineDash([]);\n const horizontalBarWidth = 8 * DPI_INCREASE;\n\n for (let range of ranges) {\n if (!range) {\n continue;\n }\n\n const { pixelX, pixelMinY, pixelMaxY } = range;\n\n // bar on bottom\n if (pixelMinY !== null) {\n context.beginPath();\n context.moveTo(pixelX - (horizontalBarWidth / 2), pixelMinY);\n context.lineTo(pixelX + (horizontalBarWidth / 2), pixelMinY);\n context.stroke();\n }\n\n // bar on top\n if (pixelMaxY !== null) {\n context.beginPath();\n context.moveTo(pixelX - (horizontalBarWidth / 2), pixelMaxY);\n context.lineTo(pixelX + (horizontalBarWidth / 2), pixelMaxY);\n context.stroke();\n }\n\n if (pixelMinY === null || pixelMaxY === null) {\n continue;\n }\n\n // draw a vertical line for the range\n context.beginPath();\n context.moveTo(pixelX, pixelMinY);\n context.lineTo(pixelX, pixelMaxY);\n context.stroke();\n }\n }\n\n if (showIndividualPoints) {\n context.fillStyle = color;\n const individualPoints = getIndividualPoints();\n\n for (let [x, y] of individualPoints) {\n context.beginPath();\n context.arc(x, y, width + 4, 0, 2 * Math.PI, false);\n context.fill();\n }\n }\n}\n","/**\n * Draws the background on a 2d canvas\n *\n * @param {Array<{ minXt: number, maxXt: number, color: string }>} data\n * @param {CanvasRenderingContext2D} context\n */\nexport default function drawBackground({ data }, { context }) {\n const width = context.canvas.width;\n const height = context.canvas.height;\n\n for (let { minXt, maxXt, color } of data) {\n context.fillStyle = color;\n context.fillRect(minXt*width, 0, (maxXt - minXt)*width, height);\n }\n}\n","export function calculatePrecision(value) {\n return Math.max(-Math.log10(Math.abs(value)) + 2, 0);\n}\n\nexport function calculateTimePrecision(minDate, maxDate) {\n minDate = new Date(minDate);\n maxDate = new Date(maxDate);\n\n const range = maxDate.valueOf() - minDate.valueOf();\n if (range < 3*1000) {\n return 'ms';\n } else if (range < 10*60*1000) {\n return 's';\n } else {\n return 'm';\n }\n}\n\nexport function roundToPrecision(value, precision=null) {\n if (precision === null) {\n precision = calculatePrecision(value);\n }\n\n if (isNaN(precision) || precision > 100) {\n return value.toString();\n }\n\n const rounded = value.toFixed(Math.ceil(precision));\n let stripped = rounded;\n if (rounded.includes('.')) {\n stripped = stripped.replace(/\\.?0+$/g, '');\n }\n\n if (stripped === '') {\n return '0';\n }\n\n return stripped;\n}\n\nconst DATE_TIME_FORMATTERS = {};\n\n/**\n * Given a timezone string, gets the offset relative to utc in milliseconds\n * For example, America/New_York in winter is GMT-05:00, so it evaluates to -5*60*60*1000\n *\n * @param {String} timeZone - the time zone string\n * @param {Date} sampleDate - a date to use in the conversions, since it can be time-of-year dependent with Daylight Savings Time\n * @return {number|null}\n */\nfunction timezoneToOffsetMS(timeZone, sampleDate) {\n try { // formats are finicky, so give up rather than abort rendering\n let datetimeFormatter = DATE_TIME_FORMATTERS[timeZone];\n if (!datetimeFormatter) {\n let properTimeZone = timeZone;\n if (!timeZone || timeZone === 'local') {\n properTimeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n }\n\n datetimeFormatter = new Intl.DateTimeFormat('en-US', {\n timeZone: properTimeZone,\n timeZoneName: 'longOffset'\n });\n DATE_TIME_FORMATTERS[timeZone] = datetimeFormatter;\n }\n\n const parts = datetimeFormatter.formatToParts(sampleDate);\n const offsetPart = parts.find(part => part.type === 'timeZoneName');\n\n if (!offsetPart) {\n return null;\n }\n\n if (offsetPart.value === 'GMT') {\n return 0;\n }\n\n if (!/^GMT[+-]\\d{2}:\\d{2}$/.test(offsetPart.value)) {\n return null;\n }\n\n const [hours, minutes] = offsetPart.value.slice(3).split(':');\n\n return parseInt(hours)*60*60*1000 + parseInt(minutes)*60*1000;\n } catch (e) {\n console.error(new Error(`Could not parse timezone offset for ${sampleDate} in ${timeZone}`)); // eslint-disable-line no-console\n console.error(e); // eslint-disable-line no-console\n return null;\n }\n}\n\n/**\n * Gets the Date object that represents the start of day in a given timezone\n * Note that this is still a native date object, so it will be in the local timezone\n * Its timestamp, however, will correspond to the start of the day in the given timezone\n *\n * @param date\n * @param timezone\n * @return {Date}\n */\nexport function startOfDayInTimezone(date, timezone) {\n if (!timezone) {\n const startOfDay = new Date(date);\n startOfDay.setHours(0, 0, 0, 0);\n return startOfDay;\n }\n\n const offset = timezoneToOffsetMS(timezone, date); // ms between timezone and utc\n let startOfDay = new Date(date);\n startOfDay.setUTCHours(0, 0, 0, 0);\n\n const difference = startOfDay.valueOf() - date.valueOf();\n\n // if we would have gone forward a day when offset is taken into account, we need to go back a day again\n if (difference > offset) {\n startOfDay = new Date(startOfDay.valueOf() - 24*60*60*1000);\n }\n\n return new Date(startOfDay.valueOf() - offset);\n}\n\nfunction formatTime(time, {precision, justTime, justDate, justMonthAndDay, unitOverride, clockStyle='24h', timeZone}) {\n const utc = timeZone && timeZone.toLowerCase() === 'utc';\n if (timeZone && !utc && timeZone !== 'local' && window.Intl && window.Intl.DateTimeFormat) {\n const offset = timezoneToOffsetMS(timeZone, time);\n const localOffset = timezoneToOffsetMS('local', time);\n\n if (typeof offset === 'number' && typeof localOffset === 'number') {\n time = new Date(time.valueOf() + offset - localOffset);\n }\n }\n\n const year = utc ? time.getUTCFullYear() : time.getFullYear();\n const month = (utc ? time.getUTCMonth() : time.getMonth()) + 1;\n const day = utc ? time.getUTCDate() : time.getDate();\n\n if (unitOverride === 'year') {\n return year.toString();\n }\n\n if (justDate) {\n return utc ? `${month}/${day}/${year}` : time.toLocaleDateString();\n }\n\n if (justMonthAndDay) {\n // eg Jan 19\n const monthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n return `${monthNames[month - 1]} ${day}`;\n }\n\n const hours = utc ? time.getUTCHours() : time.getHours();\n const minutes = utc ? time.getUTCMinutes() : time.getMinutes();\n const seconds = utc ? time.getUTCSeconds() : time.getSeconds();\n const milliseconds = utc ? time.getUTCMilliseconds() : time.getMilliseconds();\n\n let timeString;\n\n if (clockStyle === '12h') {\n timeString = `${((hours + 11) % 12 + 1).toString()}:${minutes.toString().padStart(2, '0')}`;\n } else {\n timeString = `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}`;\n }\n\n if (precision === 's' || precision === 'ms') {\n timeString += `:${seconds.toString().padStart(2, '0')}`;\n }\n\n if (precision === 'ms') {\n timeString += `.${milliseconds.toString().padStart(3, '0')}`;\n }\n\n if (clockStyle === '12h') {\n timeString += hours >= 12 ? 'pm' : 'am';\n }\n\n if (justTime) {\n return timeString;\n }\n\n if (utc) {\n timeString += ' UTC';\n }\n\n return (utc ? `${month}/${day}/${year}` : time.toLocaleDateString()) + ' ' + timeString;\n}\n\nexport function formatX(x, {dates=false, precision=null, justTime=false, justDate=false, justMonthAndDay=false, clockStyle='24h', unitOverride, timeZone, integersOnly=false, inverseEnumMap}={}) {\n if (dates && !(x instanceof Date)) {\n x = new Date(x);\n\n if (isNaN(x)) {\n return 'Invalid Date';\n }\n }\n\n if (x instanceof Date) {\n return formatTime(x, {precision, justTime, justDate, justMonthAndDay, unitOverride, clockStyle, timeZone});\n }\n\n if (isNaN(x)) {\n return 'NaN';\n }\n\n if (inverseEnumMap) {\n if (Math.abs(x - Math.round(x)) > 1e-10) {\n return '';\n }\n\n return inverseEnumMap[Math.round(x)];\n }\n\n if (integersOnly && Math.abs(x - Math.round(x)) > 1e-10) {\n return '';\n }\n\n return roundToPrecision(x, precision);\n}\n\nexport function formatY(y, {precision=null, log=false}={}) {\n if (y === null) {\n return 'null';\n }\n\n if (isNaN(y)) {\n return 'NaN';\n }\n\n if (log) {\n return `10^${roundToPrecision(Math.log10(y), precision)}`;\n }\n\n return roundToPrecision(y, precision);\n}\n","export const Y_AXIS_WIDTH = 32;\nexport const BIG_Y_AXIS_LABEL_OFFSET = 20;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport {formatX, formatY} from '../helpers/format';\nimport {Y_AXIS_WIDTH} from '../helpers/axis_sizes';\nimport CustomPropTypes from '../helpers/custom_prop_types';\n\nfunction getYLabelContent({ yLabel, y, fullYPrecision}) {\n if (fullYPrecision && !yLabel) {\n if (y === undefined) {\n return 'undefined';\n }\n\n if (y === null) {\n return 'null';\n }\n\n return y.toString();\n }\n\n if (typeof yLabel === 'number') {\n if (fullYPrecision) {\n return yLabel.toString();\n } else {\n return formatY(yLabel);\n }\n }\n\n if (typeof yLabel === 'object') {\n return formatY(y);\n }\n\n return yLabel || formatY(y);\n}\n\nfunction TooltipLabel({ axisLabel, x, y, xLabel, yLabel, textLeft, textTop, includeSeriesLabel, includeXValue, includeYValue, includeXLabel, includeYLabel, fullYPrecision, formatXOptions }) {\n let i = 0;\n\n return (\n <g>\n {\n includeSeriesLabel &&\n <text x={textLeft} y={textTop + (i++)*12}>\n {axisLabel}\n </text>\n }\n\n {\n includeXValue &&\n <text x={textLeft} y={textTop + (i++) * 12}>\n {includeXLabel && 'x: '}{xLabel || formatX(x, formatXOptions)}\n </text>\n }\n\n {\n includeYValue &&\n <text x={textLeft} y={textTop + (i++) * 12}>\n {includeYLabel && 'y: '}{getYLabelContent({ yLabel, y, fullYPrecision})}\n </text>\n }\n </g>\n );\n}\n\nTooltipLabel.propTypes = {\n axisLabel: PropTypes.string,\n x: PropTypes.oneOfType([PropTypes.number, PropTypes.instanceOf(Date)]),\n y: PropTypes.number,\n xLabel: PropTypes.string,\n yLabel: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n textLeft: PropTypes.number.isRequired,\n textTop: PropTypes.number.isRequired,\n fullYPrecision: PropTypes.bool,\n formatXOptions: PropTypes.object,\n ...CustomPropTypes.TooltipOptionsRaw\n};\n\nexport default class Tooltip extends React.PureComponent {\n\n render() {\n const textPadding = 3;\n let height = 12*3 + 2*textPadding;\n\n if (!this.props.includeSeriesLabel) {\n height -= 12;\n }\n\n if (!this.props.includeXValue) {\n height -= 12;\n }\n\n if (!this.props.includeYValue) {\n height -= 12;\n }\n\n const caretSize = 7;\n const halfHeight = height/2;\n const caretPadding = 4;\n\n const textTop = -halfHeight + textPadding;\n\n const formatXOptions = {\n clockStyle: this.props.clockStyle,\n timeZone: this.props.timeZone\n };\n\n const passThroughProps = {\n includeSeriesLabel: this.props.includeSeriesLabel,\n includeXLabel: this.props.includeXLabel,\n includeYLabel: this.props.includeYLabel,\n includeXValue: this.props.includeXValue,\n includeYValue: this.props.includeYValue,\n formatXOptions\n };\n\n const preparedTooltips = this.props.tooltips.map((tooltip) => {\n const { x, y, pixelY, pixelX, series, index, xLabel, yLabel, fullYPrecision } = tooltip;\n\n const axisLabel = (series.name || series.yKey || index).toString();\n let width = Math.max(axisLabel.length, (xLabel || formatX(x, formatXOptions)).length + 4, getYLabelContent({ yLabel, y, fullYPrecision}).length + 4) * 7.5;\n if (series.tooltipWidth) {\n width = series.tooltipWidth;\n }\n\n let fixedPosition = this.props.elementWidth < (width + 2*caretSize + 2*caretPadding);\n\n let multiplier = 1;\n if (pixelX >= this.props.elementWidth - (width + 2*caretSize + caretPadding)) {\n multiplier = -1;\n }\n\n if (pixelX < width + 2*caretSize + caretPadding && multiplier === -1) {\n fixedPosition = true;\n }\n\n if (y === null) {\n fixedPosition = true;\n }\n\n if (this.props.alwaysFixedPosition) {\n fixedPosition = true;\n }\n\n let textLeft = caretSize + caretPadding;\n if (multiplier < 0) {\n textLeft = -width - textLeft;\n } else {\n textLeft += 6;\n }\n\n if (!isFinite(pixelX)) {\n return null;\n }\n\n const transform = `translate(${pixelX},${pixelY})`;\n\n const commonLabelProps = {\n fullYPrecision: fullYPrecision || this.props.maxPrecision,\n x,\n y,\n axisLabel,\n xLabel,\n yLabel,\n ...passThroughProps\n };\n\n let yTranslation = 0;\n let baseLeft;\n\n if (fixedPosition) {\n textLeft = 6;\n\n baseLeft = this.props.elementWidth / 2 - width / 2;\n\n if (width > this.props.elementWidth && !this.props.floating) {\n baseLeft -= Y_AXIS_WIDTH * this.props.axisCount / 2;\n }\n\n yTranslation = 18;\n\n if (this.props.floating) {\n if (this.props.floatPosition === 'bottom') {\n yTranslation = this.props.elementHeight + halfHeight + 4;\n } else {\n yTranslation = -height;\n }\n\n if (this.props.floatDelta) {\n yTranslation += this.props.floatDelta;\n }\n }\n }\n\n return {\n ...tooltip,\n label: axisLabel,\n indexInAxis: series?.axis?.series?.indexOf(series),\n axisLabel,\n width,\n fixedPosition,\n multiplier,\n textLeft,\n transform,\n commonLabelProps,\n textTop,\n height,\n caretSize,\n halfHeight,\n caretPadding,\n yTranslation,\n baseLeft\n };\n });\n\n const CustomTooltipComponent = this.props.customTooltip;\n\n let groupedTooltips;\n if (this.props.combineTooltips) {\n let combinationThreshold = 50; // in px how close tooltips should be to combine\n if (typeof this.props.combineTooltips === 'number') {\n combinationThreshold = this.props.combineTooltips;\n }\n\n groupedTooltips = [];\n\n for (let tooltip of preparedTooltips) {\n let added = false;\n for (let group of groupedTooltips) {\n if (Math.abs(group.pixelX - tooltip.pixelX) <= combinationThreshold) {\n group.tooltips.push(tooltip);\n if (tooltip.pixelX > group.pixelX) {\n group.pixelX = tooltip.pixelX;\n group.multiplier = tooltip.multiplier;\n }\n\n if (tooltip.pixelY < group.pixelY) {\n group.pixelY = tooltip.pixelY;\n }\n\n added = true;\n break;\n }\n }\n\n if (!added) {\n groupedTooltips.push({\n pixelX: tooltip.pixelX,\n pixelY: tooltip.pixelY,\n multiplier: tooltip.multiplier,\n tooltips: [tooltip]\n });\n }\n }\n\n for (let group of groupedTooltips) {\n let totalHeight = 0;\n let maxWidth = 0;\n\n // sort by indexInAxis\n group.tooltips.sort((a, b) => a.indexInAxis - b.indexInAxis);\n\n for (let i = 0; i < group.tooltips.length; i++) {\n group.tooltips[i].textTop = totalHeight;\n totalHeight += group.tooltips[i].height;\n maxWidth = Math.max(maxWidth, group.tooltips[i].width);\n }\n\n for (let i = 0; i < group.tooltips.length; i++) {\n group.tooltips[i].textTop -= totalHeight/2;\n group.tooltips[i].textTop += textPadding;\n }\n\n group.height = totalHeight;\n group.halfHeight = totalHeight / 2;\n group.caretSize = caretSize;\n group.width = maxWidth;\n }\n }\n\n return (\n <div className=\"grapher-tooltip\">\n <svg>\n {\n preparedTooltips.map((tooltip, i) => {\n const { color, fixedPosition, width, transform, baseLeft, commonLabelProps, yTranslation, multiplier, textLeft, textTop } = tooltip;\n\n if (this.props.customTooltip || groupedTooltips) {\n return (\n <g key={i} transform={transform} className=\"tooltip-item\">\n <circle r={4} fill={color}/>\n </g>\n );\n }\n\n // display in a fixed position if not wide enough\n if (fixedPosition) {\n return (\n <g key={i} className=\"tooltip-item tooltip-item-fixed\">\n <circle r={4} fill={color} transform={transform} />\n\n <g transform={`translate(${baseLeft}, ${yTranslation})`}>\n <path stroke={color} d={`M0,0 V-${halfHeight} h${width} V${halfHeight} h${-width} V0`} />\n\n <TooltipLabel\n textLeft={textLeft} textTop={textTop}\n {...commonLabelProps}\n />\n </g>\n </g>\n );\n }\n\n return (\n <g key={i} transform={transform} className=\"tooltip-item\">\n <circle r={4} fill={color} />\n\n <path stroke={color} d={`M${multiplier*caretPadding},0 L${multiplier*caretSize*2},-${caretSize} V-${halfHeight} h${multiplier*width} V${halfHeight} h${multiplier*-width} V${caretSize} L${multiplier*caretPadding},0`} />\n\n <TooltipLabel\n textLeft={textLeft} textTop={textTop}\n {...commonLabelProps}\n />\n </g>\n );\n })\n }\n\n {\n !this.props.customTooltip && groupedTooltips &&\n groupedTooltips.map(({ tooltips, pixelX, pixelY, halfHeight, multiplier, color, width }, i) =>\n <g key={i} transform={`translate(${pixelX},${pixelY})`} className=\"tooltip-item\">\n <path stroke={color} d={`M${multiplier*caretPadding},0 L${multiplier*caretSize*2},-${caretSize} V-${halfHeight} h${multiplier*width} V${halfHeight} h${multiplier*-width} V${caretSize} L${multiplier*caretPadding},0`} />\n\n {\n tooltips.map((tooltip, j) =>\n <TooltipLabel\n key={j}\n textTop={tooltip.textTop}\n textLeft={tooltip.textLeft}\n {...tooltip.commonLabelProps}\n />\n )\n }\n </g>\n )\n }\n </svg>\n\n {\n this.props.customTooltip &&\n (groupedTooltips || preparedTooltips).map((tooltip, i) =>\n <div\n key={i}\n className=\"custom-tooltip-container\"\n style={{top: tooltip.pixelY, left: tooltip.pixelX}}\n >\n <CustomTooltipComponent {...tooltip} />\n </div>\n )\n }\n </div>\n );\n }\n\n}\n\nTooltip.defaultProps = {\n includeSeriesLabel: true,\n includeXLabel: true,\n includeYLabel: true,\n includeXValue: true,\n includeYValue: true\n};\n\nTooltip.propTypes = {\n mouseX: PropTypes.number.isRequired,\n mouseY: PropTypes.number.isRequired,\n elementHeight: PropTypes.number.isRequired,\n elementWidth: PropTypes.number.isRequired,\n tooltips: PropTypes.arrayOf(PropTypes.shape({\n x: PropTypes.oneOfType([PropTypes.number, PropTypes.instanceOf(Date)]),\n y: PropTypes.number,\n pixelY: PropTypes.number,\n color: PropTypes.string,\n xLabel: PropTypes.string,\n yLabel: PropTypes.any,\n fullYPrecision: PropTypes.bool\n })),\n axisCount: PropTypes.number.isRequired,\n maxPrecision: PropTypes.bool.isRequired,\n clockStyle: PropTypes.oneOf(['12h', '24h']),\n timeZone: PropTypes.string,\n ...CustomPropTypes.TooltipOptionsRaw\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nexport default class ContextMenu extends React.PureComponent {\n constructor(props) {\n super(props);\n this.setTextRef = this.setTextRef.bind(this);\n }\n \n setTextRef(ref) {\n this.textRef = ref;\n\n if (this.props.contextMenu.showing && this.textRef) {\n const range = document.createRange();\n const selection = window.getSelection();\n\n selection.removeAllRanges();\n\n range.selectNodeContents(this.textRef);\n selection.addRange(range);\n this.textRef.focus();\n }\n }\n \n formatDateTime(dateTimeStr) {\n const [datePart, timePart] = dateTimeStr.split(', ');\n\n const [month, day, year] = datePart.split('/');\n const formattedDate = `${month.padStart(2, '0')}/${day.padStart(2, '0')}/${year}`;\n\n const [time, period] = timePart.split(' ');\n const [hours, minutes] = time.split(':');\n const formattedHours = hours.padStart(2, '0');\n const formattedTime = `${formattedHours}:${minutes} ${period}`;\n\n return `${formattedDate} ${formattedTime}`;\n }\n \n render() {\n const { x, y, showing, value } = this.props.contextMenu;\n\n const style = { left: x, top: y, width: '150px'};\n \n if (!showing || !value || value.toLocaleString() === 'Invalid Date' || isNaN(x) || isNaN(y)) {\n return null;\n }\n\n const displayValue = value instanceof Date ? this.formatDateTime(value.toLocaleString()) : value;\n return (\n <div className=\"grapher-context-menu\" style={style}>\n <div className=\"menu-item\">\n <div className=\"menu-text\" autoFocus={true} ref={this.setTextRef}>\n {displayValue}\n </div>\n </div>\n </div>\n );\n }\n\n}\n\nContextMenu.propTypes = {\n contextMenu: PropTypes.shape({\n x: PropTypes.number,\n y: PropTypes.number,\n showing: PropTypes.bool,\n value: PropTypes.oneOfType([\n PropTypes.instanceOf(Date),\n PropTypes.number,\n PropTypes.object\n ])\n }).isRequired\n};\n","import inferType from '../infer_type';\nimport { SIMPLE_DATA_TYPES } from '../data_types';\n\n/**\n * Given a series of a simple type (ie, not a function or an observable), converts it into data space\n *\n * @param {*} singleSeries\n * @param {Object} options\n * @return {*}\n */\nexport default function simpleSeriesToDataSpace(singleSeries, options={}) {\n const type = inferType(singleSeries, { useSimpleData: true, data: options.data });\n if (!SIMPLE_DATA_TYPES.includes(type)) {\n throw new Error(`Cannot normalize ${type} (expected a simple type)`);\n }\n\n const inDataSpace = {\n tuples: tuplesToDataSpace,\n values: valuesToDataSpace,\n objects: objectsToDataSpace\n }[type](options.data || singleSeries.simpleData || singleSeries.data, singleSeries, options);\n\n if (singleSeries.square) {\n const square = [];\n let prevY = options.prevY;\n for (let tuple of inDataSpace) {\n if (prevY !== undefined) {\n square.push([tuple[0], prevY]);\n }\n square.push(tuple);\n prevY = tuple[1];\n }\n\n return square;\n }\n\n if (singleSeries.shiftXBy) {\n for (let tuple of inDataSpace) {\n if (typeof tuple[0] === 'string') {\n const originalXValue = tuple[0];\n tuple[0] = new Date(new Date(tuple[0]).valueOf() + singleSeries.shiftXBy);\n if (isNaN(tuple[0])) {\n tuple[0] = options.stateController.enumToNumber(originalXValue, singleSeries);\n }\n } else if (tuple[0] instanceof Date) {\n tuple[0] = new Date(tuple[0].valueOf() + singleSeries.shiftXBy);\n } else if (typeof tuple[0] === 'number') {\n tuple[0] += singleSeries.shiftXBy;\n }\n }\n }\n\n if (singleSeries.xUnixDates) {\n for (let tuple of inDataSpace) {\n if (typeof tuple[0] === 'number') {\n tuple[0] = new Date(tuple[0]*1000);\n }\n }\n }\n\n return inDataSpace;\n}\n\n/**\n * Converts a values array to data space\n *\n * @param {Array<Number|String>} data\n * @param {Object} singleSeries\n * @param {Object} options\n * @param {Number} [options.valueXStart]\n * @param {StateController} options.stateController\n * @return {Array<Array<Number|Date|null>>}\n */\nfunction valuesToDataSpace(data, singleSeries, options) {\n const inDataSpace = [];\n\n for (let i = 0; i < data.length; i++) {\n let yValue = data[i];\n\n if (typeof yValue === 'string') {\n yValue = options.stateController.enumToNumber(yValue, singleSeries);\n }\n\n if (typeof yValue === 'boolean') {\n yValue = +yValue;\n }\n\n inDataSpace.push([i + (options.valueXStart || 0), yValue]);\n }\n\n return inDataSpace;\n}\n\n/**\n * Converts a tuples array to data space\n *\n * @param {Array<Array<Number|Date|null>>} data\n * @param {Object} singleSeries\n * @param {Object} options\n * @param {StateController} options.stateController\n * @return {Array<Array<Number|Date|null>>}\n */\nfunction tuplesToDataSpace(data, singleSeries, options) {\n return [...data.map(([ xValue, yValue]) => {\n if (yValue === undefined) {\n yValue = null;\n }\n\n if (typeof xValue === 'string') {\n const originalXValue = xValue;\n xValue = new Date(xValue);\n\n if (isNaN(xValue)) {\n xValue = options.stateController.enumToNumber(originalXValue, singleSeries, true);\n }\n }\n\n if (typeof yValue === 'string') {\n yValue = options.stateController.enumToNumber(yValue, singleSeries);\n }\n\n if (typeof yValue === 'boolean') {\n yValue = +yValue;\n }\n\n return [xValue, yValue];\n })];\n}\n\nfunction readBinaryFormatValue(view, offset, index) {\n const localOffset = view.getUint32(offset + 2 + Uint32Array.BYTES_PER_ELEMENT*index, true);\n\n if (localOffset === 0) {\n return null;\n }\n\n const type = view.getUint8(localOffset);\n\n if (type === 0) {\n return view.getFloat64(offset + localOffset + 1, true);\n } else if (type === 1 || type === 6) {\n return null;\n } else if (type === 3) {\n return new Date(view.getFloat64(offset + localOffset + 1, true));\n } else {\n throw new Error(`Binary format type ${type} not supported`);\n }\n}\n\n/**\n * Converts an objects array to data space\n *\n * @param {Array<Object>} data\n * @param {Object} series\n * @param {Object} options\n * @param {StateController} options.stateController\n * @return {Array<Array<Number|Date|null>>}\n */\nfunction objectsToDataSpace(data, series, options) {\n if (!series.xKey || typeof series.xKey !== 'string') {\n throw new Error('xKey must be provided in the series');\n }\n\n if (!series.yKey || typeof series.yKey !== 'string') {\n throw new Error('yKey must be provided in the series');\n }\n\n const inDataSpace = [];\n\n for (let point of data) {\n if (point.buffer instanceof ArrayBuffer) {\n const view = new DataView(point.buffer);\n const xIndex = point.channels[series.xKey];\n const yIndex = point.channels[series.yKey];\n\n for (let offset of point.offsets) {\n inDataSpace.push([readBinaryFormatValue(view, offset, xIndex), readBinaryFormatValue(view, offset, yIndex)]);\n }\n } else if (Array.isArray(point[series.yKey])) {\n if (point[series.yKey].length && !Array.isArray(point[series.yKey][0]) && typeof point[series.yKey][0] === 'object') {\n for (let subpoint of point[series.yKey]) {\n let yValue = subpoint[series.yKey];\n if (yValue === undefined) {\n yValue = null;\n }\n\n if (typeof yValue === 'string') {\n yValue = options.stateController.enumToNumber(yValue, series);\n }\n\n if (typeof yValue === 'boolean') {\n yValue = +yValue;\n }\n\n let xValue = subpoint[series.xKey];\n if (typeof xValue === 'string') {\n xValue = new Date(xValue);\n }\n\n inDataSpace.push([xValue, yValue]);\n }\n } else {\n inDataSpace.push(...point[series.yKey]);\n }\n } else {\n let yValue = point[series.yKey];\n if (yValue === undefined) {\n yValue = null;\n }\n\n let xValue = point[series.xKey];\n if (typeof xValue === 'string') {\n xValue = new Date(xValue);\n }\n\n if (typeof yValue === 'string') {\n yValue = options.stateController.enumToNumber(yValue, series);\n }\n\n if (typeof yValue === 'boolean') {\n yValue = +yValue;\n }\n\n inDataSpace.push([xValue, yValue]);\n }\n }\n\n return inDataSpace;\n}\n","function finalizeBounds(bounds, { dates }) {\n const initial = (bounds.minX === null && bounds.maxX === null) || bounds.minY === null || bounds.maxY === null;\n\n for (let key of Object.keys(bounds)) {\n if (typeof bounds[key] !== 'number') {\n bounds[key] = 0;\n }\n }\n\n bounds.initial = initial;\n bounds.dates = dates;\n\n return bounds;\n}\n\nfunction percentileBounds(inDataSpace, bounds, {percentile=100, percentileAsymmetry=0}={}) {\n let dates = false;\n\n bounds.minX = inDataSpace[0][0];\n if (bounds.minX instanceof Date) {\n bounds.minX = bounds.minX.valueOf();\n dates = true;\n }\n\n bounds.maxX = inDataSpace[inDataSpace.length - 1][0];\n if (bounds.maxX instanceof Date) {\n bounds.maxX = bounds.maxX.valueOf();\n dates = true;\n }\n\n const sortedByY = inDataSpace\n .filter(([_x, y]) => typeof y === 'number')\n .sort(([_x1, y1], [_x2, y2]) => y1 - y2);\n\n if (!sortedByY.length) {\n return finalizeBounds(bounds, {dates});\n }\n\n const asymmetry = Math.min(Math.abs(percentileAsymmetry), (100-percentile)/2) * (percentileAsymmetry < 0 ? -1 : 1);\n const inBottomPercentile = (100-percentile)/2 + asymmetry;\n const inTopPercentile = (100-percentile)/2 - asymmetry;\n\n const startIndex = Math.floor((sortedByY.length-1)*inBottomPercentile/100);\n const endIndex = Math.floor((sortedByY.length-1)*(100-inTopPercentile)/100);\n\n bounds.minY = sortedByY[startIndex][1];\n bounds.maxY = sortedByY[endIndex][1];\n\n return finalizeBounds(bounds, {dates});\n}\n\nexport default function calculateDataBounds(inDataSpace, {percentile=100, percentileAsymmetry=0}={}) {\n let bounds = {\n minX: null,\n maxX: null,\n minY: null,\n maxY: null,\n closestSpacing: null\n };\n\n if (percentile !== 100 && inDataSpace.length) {\n return percentileBounds(inDataSpace, bounds, {percentile, percentileAsymmetry});\n }\n\n let dates = false;\n let prevX = null;\n\n for (let [x, y] of inDataSpace) {\n if (x instanceof Date) {\n x = x.valueOf();\n dates = true;\n }\n\n if (typeof bounds.minX !== 'number' || x < bounds.minX) {\n bounds.minX = x;\n }\n\n if (typeof bounds.maxX !== 'number' || x > bounds.maxX) {\n bounds.maxX = x;\n }\n\n if (typeof prevX === 'number' && typeof x === 'number') {\n const spacing = x - prevX;\n if (typeof bounds.closestSpacing !== 'number' || spacing < bounds.closestSpacing) {\n bounds.closestSpacing = spacing;\n }\n }\n prevX = x;\n\n if (typeof y !== 'number') {\n continue;\n }\n\n if (typeof bounds.minY !== 'number' || y < bounds.minY) {\n bounds.minY = y;\n }\n\n if (typeof bounds.maxY !== 'number' || y > bounds.maxY) {\n bounds.maxY = y;\n }\n }\n\n return finalizeBounds(bounds, {dates});\n}\n","export default function mergeBounds(boundsList) {\n const mergedBounds = {\n minX: null,\n maxX: null,\n minY: null,\n maxY: null,\n closestSpacing: null,\n dates: false,\n initial: true\n };\n\n for (let { minX, maxX, minY, maxY, dates, initial, closestSpacing } of boundsList) {\n if (dates) {\n mergedBounds.dates = true;\n }\n\n if (initial) {\n continue;\n }\n mergedBounds.initial = false;\n\n if (mergedBounds.minX === null || minX < mergedBounds.minX) {\n mergedBounds.minX = minX;\n }\n\n if (mergedBounds.maxX === null || maxX > mergedBounds.maxX) {\n mergedBounds.maxX = maxX;\n }\n\n if (mergedBounds.closestSpacing === null || closestSpacing < mergedBounds.closestSpacing) {\n mergedBounds.closestSpacing = closestSpacing;\n }\n\n if (mergedBounds.minY === null || minY < mergedBounds.minY) {\n mergedBounds.minY = minY;\n }\n\n if (mergedBounds.maxY === null || maxY > mergedBounds.maxY) {\n mergedBounds.maxY = maxY;\n }\n }\n\n if (mergedBounds.minX === null) {\n mergedBounds.minX = 0;\n }\n\n if (mergedBounds.maxX === null) {\n mergedBounds.maxX = 0;\n }\n\n if (mergedBounds.closestSpacing === null) {\n mergedBounds.closestSpacing = 1;\n }\n\n if (mergedBounds.minY === null) {\n mergedBounds.minY = 0;\n }\n\n if (mergedBounds.maxY === null) {\n mergedBounds.maxY = 0;\n }\n\n return mergedBounds;\n}\n","/**\n * Expands bounds to give a little y padding\n *\n * @param {Object} bounds\n * @param {?Number} bounds.minY\n * @param {?Number} bounds.maxY\n * @param {?Number} bounds.minX\n * @param {?Number} bounds.maxX\n * @param {Array<Number>} [expandYWith]\n * @param {Number} [extendXForNBars=0]\n * @return {Object}\n */\nexport default function expandBounds(bounds, {expandYWith = [], extendXForNBars=0}) {\n const expandedBounds = Object.assign({}, bounds);\n for (let y of expandYWith) {\n if (y === null || y === undefined) {\n continue;\n }\n\n if (typeof expandedBounds.minY !== 'number' || y < expandedBounds.minY) {\n expandedBounds.minY = y;\n }\n\n if (typeof expandedBounds.maxY !== 'number' || y > expandedBounds.maxY) {\n expandedBounds.maxY = y;\n }\n }\n\n expandedBounds.unscaledMinY = expandedBounds.minY;\n expandedBounds.unscaledMaxY = expandedBounds.maxY;\n\n const range = expandedBounds.maxY - expandedBounds.minY;\n const midpoint = expandedBounds.minY + range/2;\n expandedBounds.minY = midpoint - 1.05*range/2;\n expandedBounds.maxY = midpoint + 1.05*range/2;\n\n if (expandedBounds.minY === expandedBounds.maxY && expandedBounds.minY !== null) {\n if (expandedBounds.minY > 0) {\n expandedBounds.minY *= 0.95;\n expandedBounds.maxY *= 1.05;\n } else if (expandedBounds.minY < 0) {\n expandedBounds.minY *= 1.05;\n expandedBounds.maxY *= 0.95;\n } else {\n expandedBounds.minY -= 1;\n expandedBounds.maxY += 1;\n }\n }\n\n if (extendXForNBars && expandedBounds.minX !== expandedBounds.maxX && expandedBounds.minX !== null && expandedBounds.maxX !== null) {\n // Base expansion factor on expected bar count\n const barWidth = (expandedBounds.maxX - expandedBounds.minX) / extendXForNBars;\n expandedBounds.minX -= barWidth/2;\n expandedBounds.maxX += barWidth/2;\n }\n\n return expandedBounds;\n}\n","/**\n * Finds the closest point to the target\n *\n * @param {Array} data - the data, in data space\n * @param {Number} targetX - the x coordinate to get closest to\n * @param {Object} [searchParams]\n * @param {String} [searchParams.searchType] - whether to search for the closest, one before, or one after\n * @param {Boolean} [searchParams.returnIndex] - whether to return the index or the object itself\n * @param {Number} [startIndex] - where to start the search from\n * @param {Number} [endIndex] - where to end the search\n * @return {Array|Number}\n */\nexport default function binarySearch(data, targetX, searchParams={}, startIndex=0, endIndex=undefined) {\n if (endIndex === undefined) {\n endIndex = data.length - 1;\n }\n\n if (data.length === 0) {\n return searchParams.returnIndex ? -1 : [null, null];\n }\n\n const middleIndex = Math.floor((startIndex + endIndex)/2);\n\n if (targetX === data[middleIndex][0] || (data[middleIndex][0] instanceof Date && data[middleIndex][0].valueOf() === targetX)) {\n if (searchParams.returnIndex) {\n return middleIndex;\n } else {\n return data[middleIndex];\n }\n }\n\n if (startIndex === endIndex) {\n if (data[startIndex][0] < targetX && searchParams.searchType === 'before') {\n return searchParams.returnIndex ? startIndex : data[startIndex];\n } else if (data[startIndex][0] > targetX && searchParams.searchType === 'after') {\n return searchParams.returnIndex ? startIndex : data[startIndex];\n } else {\n return searchParams.returnIndex ? -1 : [null, null];\n }\n }\n\n if (endIndex - 1 === startIndex) {\n let index;\n\n if (searchParams.searchType === 'before') {\n index = startIndex;\n // index = (targetX <= data[startIndex][0]) ? startIndex : endIndex;\n } else if (searchParams.searchType === 'after') {\n index = endIndex;\n // index = (targetX >= data[endIndex][0]) ? endIndex : startIndex;\n } else {\n index = Math.abs(data[startIndex][0] - targetX) > Math.abs(data[endIndex][0] - targetX) ?\n endIndex :\n startIndex;\n }\n\n return searchParams.returnIndex ? index : data[index];\n }\n\n if (targetX > data[middleIndex][0]) {\n return binarySearch(data, targetX, searchParams, middleIndex, endIndex);\n }\n\n if (targetX < data[middleIndex][0]) {\n return binarySearch(data, targetX, searchParams, startIndex, middleIndex);\n }\n}\n","import binarySearch from '../../helpers/binary_search';\n\nfunction validateSelectedSpaceConversion({ data, inSelectedSpace, firstIndex, lastIndex, ignoreDiscontinuities }) { // eslint-disable-line no-unused-vars\n let correct = data.slice(firstIndex + 1, lastIndex);\n if (ignoreDiscontinuities) {\n correct = correct.filter(([_x, y]) => (y !== null && y !== undefined));\n }\n\n if (correct.length !== inSelectedSpace.length) {\n console.log({ // eslint-disable-line no-console\n data,\n attempt: inSelectedSpace.map(([x, y]) => [undateify(x), y]),\n correct: correct.map(([x, y]) => [undateify(x), y]),\n sdl: window.sdl\n });\n window.tacomaDataPaused = true;\n throw new Error('Failed to select via swap');\n }\n\n for (let i = 0; i < correct.length; i++) {\n if (undateify(correct[i][0]) !== undateify(inSelectedSpace[i][0]) || correct[i][1] !== inSelectedSpace[i][1]) {\n console.log({ // eslint-disable-line no-console\n i,\n attempt: inSelectedSpace.map(([x, y]) => [undateify(x), y]),\n correct: correct.map(([x, y]) => [undateify(x), y]),\n correctX: undateify(correct[i][0]),\n correctY: correct[i][1],\n attemptX: undateify(inSelectedSpace[i][0]),\n attemptY: inSelectedSpace[i][1]\n });\n window.tacomaDataPaused = true;\n throw new Error('Failed to select via swap');\n }\n }\n}\n\n/**\n * Converts from data space to selected space\n *\n * @param {Array<Array<Number>>} data\n * @param {{data: Array<Array<Number>>}|*} [swap]\n * @param {Number} minX\n * @param {Number} maxX\n * @param {Boolean} ignoreDiscontinuities\n * @param {Boolean} square\n * @return {{data: Array<Array<Number>>, lastAdded: boolean, firstAdded: boolean, afterIndex: Number, ignoreDiscontinuities: boolean, minX: Number, maxX: Number, beforeIndex: Number}}\n */\nexport default function dataSpaceToSelectedSpace({ data, swap, minX, maxX, ignoreDiscontinuities, square }) {\n if (!data.length || data.length && minX > data[data.length - 1][0] || data.length && maxX < data[0][0]) {\n //let previouslyEmpty = !data.length;\n return {\n data: [\n [minX, null],\n [maxX, null]\n ],\n firstAdded: true,\n lastAdded: true\n //previouslyEmpty\n };\n }\n\n let beforeIndex = binarySearch(data, minX, { searchType: 'before', returnIndex: true }) || 0;\n let afterIndex = binarySearch(data, maxX, { searchType: 'after', returnIndex: true }) || 0;\n if (afterIndex === -1) {\n afterIndex = 0;\n }\n\n while (beforeIndex >= 0 && data[beforeIndex][0] >= minX) {\n beforeIndex --;\n }\n\n while (afterIndex < data.length && data[afterIndex][0] <= maxX) {\n afterIndex ++;\n }\n\n let inSelectedSpace;\n let addToEndOnly = false;\n\n let firstAdded = false;\n let lastAdded = false;\n\n let beginningInterpolationIndex = beforeIndex;\n let endInterpolationIndex = afterIndex;\n if (ignoreDiscontinuities) {\n while (beginningInterpolationIndex >= 0 && data[beginningInterpolationIndex][1] === null) {\n beginningInterpolationIndex --;\n }\n while (endInterpolationIndex < data.length && data[endInterpolationIndex][1] === null) {\n endInterpolationIndex++;\n }\n }\n\n if (swap) {\n inSelectedSpace = swap.data;\n if (swap.lastAdded) {\n inSelectedSpace.pop();\n }\n if (minX === swap.minX) {\n addToEndOnly = true;\n }\n if (beforeIndex !== swap.beforeIndex) {\n addToEndOnly = false;\n if (swap.firstAdded) {\n inSelectedSpace.shift();\n }\n let index = swap.beforeIndex;\n while (index >= 0 && inSelectedSpace.length && inSelectedSpace[0][0] >= minX) {\n if (!ignoreDiscontinuities || data[index][1] || data[index][1] === 0) {\n inSelectedSpace.unshift(data[index]);\n }\n index --;\n }\n while (index < data.length && inSelectedSpace.length && inSelectedSpace[0][0] < minX) {\n inSelectedSpace.shift();\n index ++;\n }\n }\n\n if (ignoreDiscontinuities && !swap.ignoreDiscontinuities) {\n inSelectedSpace = inSelectedSpace.filter(([_x, y]) => (y !== null && y !== undefined));\n }\n\n if (beforeIndex === swap.beforeIndex && swap.firstAdded) {\n firstAdded = true;\n\n let interpolationIndex = beforeIndex + 1;\n if (ignoreDiscontinuities) {\n while (interpolationIndex < data.length && data[interpolationIndex][1] === null) {\n interpolationIndex ++;\n }\n }\n\n if (beginningInterpolationIndex === -1 && inSelectedSpace.length) {\n inSelectedSpace[0] = [minX, null];\n } else {\n if (square && inSelectedSpace.length) {\n inSelectedSpace[0] = [minX, data[beginningInterpolationIndex][1]];\n } else {\n if (inSelectedSpace.length) {\n inSelectedSpace[0] = [minX, interpolate(data, beginningInterpolationIndex, interpolationIndex, minX)];\n }\n }\n }\n if (data[beforeIndex + 1][0] === inSelectedSpace[0][0] && data[beforeIndex + 1][1] === inSelectedSpace[0][1]) {\n firstAdded = false;\n }\n }\n let lastIncluded = swap.afterIndex;\n if (swap.ignoreDiscontinuities && !ignoreDiscontinuities) {\n let nullIndex = beforeIndex + 1;\n let selectedIndex = 0;\n if (firstAdded) {\n selectedIndex ++;\n }\n while (selectedIndex <= inSelectedSpace.length && nullIndex < data.length && nullIndex < afterIndex) {\n if (data[nullIndex][0] <= maxX && data[nullIndex][1] === null && (!inSelectedSpace[selectedIndex] || inSelectedSpace[selectedIndex][0] !== data[nullIndex][0] || inSelectedSpace[selectedIndex][1] !== data[nullIndex][1])) {\n inSelectedSpace.splice(selectedIndex, 0, data[nullIndex]);\n if (nullIndex >= lastIncluded) {\n lastIncluded = nullIndex + 1;\n }\n }\n nullIndex ++;\n selectedIndex ++;\n }\n }\n\n let dataIndex = lastIncluded || 0;\n while (dataIndex < data.length && data[dataIndex][0] <= maxX) {\n if (data[dataIndex][0] >= minX) {\n if (!ignoreDiscontinuities || data[dataIndex][1] || data[dataIndex][1] === 0) {\n inSelectedSpace.push(data[dataIndex]);\n }\n }\n dataIndex ++;\n }\n while (inSelectedSpace.length && inSelectedSpace[inSelectedSpace.length - 1][0] > maxX) {\n inSelectedSpace.pop();\n }\n\n } else {\n inSelectedSpace = data.slice(beforeIndex + 1, afterIndex);\n if (ignoreDiscontinuities) {\n inSelectedSpace = inSelectedSpace.filter(([_x, y]) => (y !== null && y !== undefined));\n }\n }\n\n if (!inSelectedSpace.length) {\n if (square) {\n if (beginningInterpolationIndex < 0) {\n inSelectedSpace = [[minX, null], [maxX, null]];\n } else {\n inSelectedSpace = [[minX, data[beginningInterpolationIndex][1]], [maxX, data[beginningInterpolationIndex][1]]];\n }\n } else {\n inSelectedSpace = [[minX, interpolate(data, beginningInterpolationIndex, endInterpolationIndex, minX)], [maxX, interpolate(data, beginningInterpolationIndex, endInterpolationIndex, maxX)]];\n }\n firstAdded = true;\n lastAdded = true;\n }\n\n if (!addToEndOnly) {\n let interpolationIndex = beforeIndex + 1;\n if (ignoreDiscontinuities) {\n while (interpolationIndex < data.length && data[interpolationIndex][1] === null) {\n interpolationIndex ++;\n }\n }\n\n if (inSelectedSpace.length && inSelectedSpace[0][0] > minX) {\n firstAdded = true;\n if (beginningInterpolationIndex === -1) {\n inSelectedSpace.unshift([minX, null]);\n } else {\n if (square) {\n inSelectedSpace.unshift([minX, data[beginningInterpolationIndex][1]]);\n } else {\n inSelectedSpace.unshift([minX, interpolate(data, beginningInterpolationIndex, interpolationIndex, minX)]);\n }\n }\n }\n }\n\n if (inSelectedSpace.length && inSelectedSpace[inSelectedSpace.length - 1][0] < maxX) {\n lastAdded = true;\n\n let interpolationIndex = afterIndex - 1;\n if (ignoreDiscontinuities) {\n while (interpolationIndex >= 0 && data[interpolationIndex][1] === null) {\n interpolationIndex --;\n }\n }\n\n if (endInterpolationIndex === data.length) {\n inSelectedSpace.push([maxX, null]);\n } else {\n if (square) {\n inSelectedSpace.push([maxX, inSelectedSpace[inSelectedSpace.length - 1][1]]);\n } else {\n inSelectedSpace.push([maxX, interpolate(data, interpolationIndex, endInterpolationIndex, maxX)]);\n }\n }\n }\n\n if (inSelectedSpace.length === 1) {\n let begPoint;\n let endPoint;\n if (square) {\n if (beginningInterpolationIndex < 0) {\n begPoint = [minX, null];\n } else {\n begPoint = [minX, data[beginningInterpolationIndex][1]];\n }\n endPoint = [maxX, inSelectedSpace[0][1]];\n } else {\n begPoint = [minX, interpolate(data, beginningInterpolationIndex, beforeIndex + 1, minX)];\n endPoint = [maxX, interpolate(data, afterIndex - 1, endInterpolationIndex, maxX)];\n }\n inSelectedSpace.unshift(begPoint);\n inSelectedSpace.push(endPoint);\n firstAdded = true;\n lastAdded = true;\n }\n\n return {\n data: inSelectedSpace,\n minX,\n maxX,\n beforeIndex,\n afterIndex,\n firstAdded,\n lastAdded,\n ignoreDiscontinuities\n //previouslyEmpty: false\n };\n}\n\nfunction undateify(potentialDate) {\n if (potentialDate instanceof Date) {\n return potentialDate.valueOf();\n }\n\n return potentialDate;\n}\n\n/**\n * Finds the point at the boundary via interpolation\n *\n * @param {Array<Array<Number>>} data\n * @param {Number} firstIndex\n * @param {Number} secondIndex\n * @param {Number} boundary\n * @return {null|*}\n */\nfunction interpolate(data, firstIndex, secondIndex, boundary) {\n if (firstIndex < 0 || secondIndex < 0) {\n return null;\n }\n\n if (firstIndex >= data.length || secondIndex >= data.length) {\n return null;\n }\n\n if (firstIndex === secondIndex) {\n return data[firstIndex][1];\n }\n\n const [xBefore, yBefore] = data[firstIndex];\n const [xAfter, yAfter] = data[secondIndex];\n\n if (boundary === xBefore && yBefore !== null) {\n return yBefore;\n }\n\n if (boundary === xAfter && yAfter !== null) {\n return yAfter;\n }\n\n if (yBefore === null || yAfter === null) {\n return null;\n }\n\n const percent = (boundary - xBefore)/(xAfter - xBefore);\n if (percent < 0 || percent > 1) {\n return null;\n }\n\n return percent*(yAfter - yBefore) + yBefore;\n}\n","/**\n * Scales y min and max bounds according to linear or log\n *\n * @param {Number} minY\n * @param {Number} maxY\n * @param {'linear'|'log'} scale\n * @return {{minY: Number, maxY: Number}}\n */\nexport default function scaleBounds({ minY, maxY, scale }) {\n if (scale === 'log') {\n maxY = Math.log10(maxY);\n\n if (minY <= 0) {\n if (maxY > 0) {\n minY = -maxY;\n } else {\n minY = 2*maxY;\n }\n } else {\n minY = Math.log10(minY);\n }\n }\n\n return {\n minY,\n maxY\n };\n}\n","import scaleBounds from '../../renderer/scale_bounds';\nlet RustAPI;\nimport('../../rust/pkg/index.js').then((module) => {\n RustAPI = module;\n});\n\nfunction selectedSpaceToRenderSpaceInPlace({ data, renderWidth, renderHeight, minX, maxX, minY, maxY, scale }, { nullMask, yValues, minYValues, maxYValues }) {\n let i = 0;\n let prevI = i - 1;\n\n for (let pixelX = 0; pixelX < renderWidth; pixelX++) {\n // find the x value that corresponds to the x pixel\n const x = (pixelX/(renderWidth - 1))*(maxX - minX) + minX;\n\n // set i such that data[i][0] < x <= data[i+1][0]\n let minSeenY = null;\n let maxSeenY = null;\n\n if (i > 0 && i <= data.length && data[i - 1][1] === null) {\n i--;\n }\n\n if (i < data.length - 2 && data[i + 1][0] < x) {\n i++;\n }\n\n for (i; i < data.length - 2 && data[i + 1][0] < x; i++) {\n const curY = data[i][1];\n\n if (curY === null) {\n continue;\n }\n\n if (minSeenY === null || curY < minSeenY) {\n minSeenY = curY;\n }\n\n if (maxSeenY === null || curY > maxSeenY) {\n maxSeenY = curY;\n }\n }\n\n minYValues[pixelX] = minSeenY === null ? 0 : renderHeight*(1 - ((scale === 'log' ? Math.log10(minSeenY) : minSeenY) - minY)/(maxY - minY));\n maxYValues[pixelX] = maxSeenY === null ? 0 : renderHeight*(1 - ((scale === 'log' ? Math.log10(maxSeenY) : maxSeenY) - minY)/(maxY - minY));\n\n // pass any discontinuities along\n if (i >= data.length - 1 || data[i][1] === null || data[i + 1][1] === null) {\n const y = i >= data.length - 1 ? null : data[i][1];\n\n nullMask[pixelX] = ((y === null) << 0) | ((minSeenY === null) << 1) | ((maxSeenY === null) << 2);\n yValues[pixelX] = y === null ? 0 : renderHeight*(1 - ((scale === 'log' ? Math.log10(y) : y) - minY)/(maxY - minY));\n\n i++;\n\n continue;\n }\n\n // interpolate\n const [xBefore, yBefore] = data[i];\n const [xAfter, yAfter] = data[i + 1];\n\n const percent = (x - xBefore) / (xAfter - xBefore);\n let y = percent * (yAfter - yBefore) + yBefore;\n\n // we're at the first point after the direction changed. Don't interpolate\n if (prevI !== i) {\n y = yBefore;\n }\n\n // // two x's with the same value; common in area charts\n // // to avoid this from having gotten skipped over, save in either min or max as appropriate\n // if (i > 0 && data[i - 1][0] === data[i][0]) {\n // // 0: minY a\n // // 1: original a\n // // 2: minY b\n // // 3: original b\n //\n // const [xBeforeOffset, yBeforeOffset] = data[i - 1];\n // const [xAfter, yAfter] = data[i + 1];\n // }\n\n yValues[pixelX] = y === null ? 0 : renderHeight*(1 - ((scale === 'log' ? Math.log10(y) : y) - minY)/(maxY - minY));\n nullMask[pixelX] = ((y === null) << 0) | ((minSeenY === null) << 1) | ((maxSeenY === null) << 2);\n\n prevI = i;\n }\n}\n\n/**\n * Convert from selected space to value space\n *\n * @param data\n * @param {Object} [swap]\n * @param {Number} renderWidth - width, in pixels, of the area in which the graph is rendered\n * @param {Number} renderHeight - height, in pixels, of the area in which the graph is rendered\n * @param {Number} minX - the minimum x value that is rendered\n * @param {Number} maxX - the maximum x value that is rendered\n * @param {Number} minY - the minimum y value that is rendered\n * @param {Number} maxY - the maximum y value that is rendered\n * @param {'log'|'linear'} scale\n * @param {Boolean} [dataChanged] - if true, will not rely on the prior data state from swap being accurate\n * @return {{nullMask: Uint8Array, maxYValues: Float64Array, minYValues: Float64Array, yValues: Float64Array, dataF64: Float64Array, dataNullMask: Uint8Array}}\n */\nexport default function selectedSpaceToRenderSpace({ data, swap, renderWidth, renderHeight, minX, maxX, minY, maxY, scale, dataChanged }) {\n if (swap && swap.yValues.length !== renderWidth) {\n swap = null;\n }\n\n const nullMask = (swap && swap.nullMask) || new Uint8Array(renderWidth);\n nullMask.fill(0);\n const yValues = new Float64Array(renderWidth);\n const minYValues = new Float64Array(renderWidth);\n const maxYValues = new Float64Array(renderWidth);\n\n const scaledBounds = scaleBounds({ minY, maxY, scale});\n minY = scaledBounds.minY;\n maxY = scaledBounds.maxY;\n\n const inParams = { data, renderWidth, renderHeight, minX, maxX, minY, maxY, scale };\n\n let dataF64, dataNullMask;\n\n if (RustAPI) {\n let copyIndexStart = 0;\n\n const hasSwap = swap && swap.dataNullMask && swap.dataF64;\n const useSwap = !dataChanged && hasSwap && swap.minX === minX && swap.maxX <= maxX && swap.length <= data.length;\n\n if (!useSwap || swap.dataNullMask.length < data.length) {\n const extraSpaceFactor = 1.25;\n dataF64 = new Float64Array(Math.floor(data.length*2*extraSpaceFactor));\n dataNullMask = new Uint8Array(Math.floor(data.length*extraSpaceFactor));\n\n if (useSwap) {\n dataNullMask.set(swap.dataNullMask);\n dataF64.set(swap.dataF64);\n }\n } else {\n dataF64 = swap.dataF64;\n dataNullMask = swap.dataNullMask;\n }\n\n if (useSwap) {\n copyIndexStart = Math.max(swap.length - 1, 0);\n }\n\n for (let i = copyIndexStart; i < data.length; i++) {\n dataF64[2*i] = data[i][0];\n dataF64[2*i + 1] = data[i][1];\n\n if (data[i][1] === null) {\n dataNullMask[i] = 1;\n } else {\n dataNullMask[i] = 0;\n }\n }\n RustAPI.selected_space_to_render_space(data.length, dataF64, dataNullMask, inParams, nullMask, yValues, minYValues, maxYValues);\n } else {\n selectedSpaceToRenderSpaceInPlace(inParams, { nullMask, yValues, minYValues, maxYValues });\n }\n\n return {\n nullMask,\n yValues,\n minYValues,\n maxYValues,\n dataF64,\n dataNullMask,\n minX,\n maxX,\n length: data.length\n };\n}\n","/**\n * Flattens simple data\n * Returns an array of tuples (x value, simple point)\n *\n * @param simpleData\n * @param series\n * @param inDataSpace\n * @return {[]}\n */\nexport default function flattenSimpleData(simpleData, {series, inDataSpace }) {\n const flattened = [];\n let fI = 0;\n\n for (let point of simpleData) {\n const yValue = extractYValue(point, series);\n\n if (series.yKey && Array.isArray(yValue)) {\n for (let subpoint of point[series.yKey]) {\n if (series.ignoreDiscontinuities && typeof subpoint[series.yKey] !== 'number' && !Array.isArray(subpoint)) {\n continue;\n }\n\n const x = inDataSpace[fI++][0];\n\n if (series.square && flattened.length > 0) {\n flattened.push([x, flattened[flattened.length - 1][1]]);\n }\n\n flattened.push([x, subpoint]);\n }\n\n continue;\n }\n\n if (series.ignoreDiscontinuities && (yValue === undefined || yValue === null)) {\n continue;\n }\n\n const x = inDataSpace[fI++][0];\n\n if (series.square && flattened.length > 0) {\n flattened.push([x, flattened[flattened.length - 1][1]]);\n }\n\n flattened.push([x, point]);\n }\n\n if (flattened.length !== inDataSpace.length) {\n console.warn('Flattening didn\\'t give the same length as it has in data space'); // eslint-disable-line no-console\n }\n\n return flattened;\n}\n\nexport function extractYValue(point, series) {\n if (series.yKey) {\n return point[series.yKey];\n }\n\n if (Array.isArray(point)) {\n if (point.length === 1) {\n return point[0];\n } else {\n return point[1];\n }\n }\n\n return point;\n}\n\nexport function extractXValue(point, series) {\n if (series.xKey) {\n return point[series.xKey];\n }\n\n if (Array.isArray(point)) {\n return point[0];\n }\n\n return point;\n}\n","import binarySearch from '../helpers/binary_search';\nimport scaleBounds from '../renderer/scale_bounds';\nimport getColor from '../helpers/colors';\nimport flattenSimpleData, {extractXValue, extractYValue} from '../helpers/flatten_simple_data';\nimport {getBarWidths} from '../renderer/draw_bars';\n\nconst DISTANCE_THRESHOLD = 20;\n\n/**\n * Figures out the tooltip state\n *\n * @param {Boolean} mousePresent\n * @param {Number} mouseX\n * @param {Number} mouseY\n * @param {Object} sizing\n * @param {Array<Object>} series\n * @param {Set} alwaysTooltipped\n * @param {Array<Object>} savedTooltips\n * @param {Boolean} [allTooltipped]\n * @param {Number} closestSpacing\n * @return {{mouseX: *, mouseY: *, elementWidth: number, elementHeight: number, tooltips: any[]}}\n */\nexport default function calculateTooltipState({mousePresent, mouseX, mouseY, sizing, series, alwaysTooltipped, savedTooltips, allTooltipped, closestSpacing }) {\n // filter out saved tooltips for nonexistent series\n savedTooltips = savedTooltips.filter((tooltip) => tooltip.series.axis);\n\n for (let savedTooltip of savedTooltips) {\n moveTooltip({ mouseX, mouseY, sizing}, savedTooltip);\n }\n\n if (!mousePresent) {\n return {\n mouseX,\n mouseY,\n elementWidth: sizing.elementWidth,\n elementHeight: sizing.elementHeight,\n tooltips: [...savedTooltips]\n };\n }\n\n const tooltips = [];\n\n let minDistance = Infinity;\n\n for (let i = 0; i < series.length; i++) {\n const singleSeries = series[i];\n\n if (singleSeries.hidden) {\n continue;\n }\n\n const axis = singleSeries.axis;\n\n const scale = axis.scale;\n const bounds = axis.currentBounds;\n const { minY, maxY } = scaleBounds({...bounds, scale });\n\n const trueX = mouseX/sizing.elementWidth * (bounds.maxX - bounds.minX) + bounds.minX;\n\n let data = singleSeries.inDataSpace;\n if (singleSeries.ignoreDiscontinuities) {\n data = data.filter((tuple) => typeof tuple[1] === 'number');\n }\n\n const closestIndex = binarySearch(data, trueX, { returnIndex: true });\n const closestPoint = data[closestIndex];\n\n if (!closestPoint) {\n continue;\n }\n\n const [x, y] = closestPoint;\n\n if (x === null) {\n continue;\n }\n\n let pixelX = (x - bounds.minX)/(bounds.maxX - bounds.minX) * sizing.elementWidth;\n const pixelY = (1 - ((scale === 'log' ? Math.log10(y) : y) - minY)/(maxY - minY)) * sizing.elementHeight;\n\n if (pixelY > sizing.elementHeight || pixelY < 0) {\n continue;\n }\n\n const ignoreYDistance = alwaysTooltipped.has(singleSeries) || allTooltipped;\n let xDistanceThreshold = DISTANCE_THRESHOLD;\n let yDistanceThreshold = DISTANCE_THRESHOLD;\n let distanceThreshold = DISTANCE_THRESHOLD;\n\n if (singleSeries.rendering === 'bar') {\n const indexInAxis = singleSeries.axis.series.indexOf(singleSeries);\n const axisSeriesCount = singleSeries.axis.series.length;\n\n const { totalBarWidth, barWidth } = getBarWidths({\n closestSpacing,\n bounds,\n sizing,\n axisSeriesCount\n });\n\n // currently, pixelX is the center of all the bars\n // shift it to start at the far left, then shift it to the center of the individual bar\n pixelX -= totalBarWidth/2/sizing.pixelRatio;\n pixelX += (barWidth*(indexInAxis + 0.5))/sizing.pixelRatio;\n\n xDistanceThreshold = barWidth/2/sizing.pixelRatio;\n yDistanceThreshold = 100;\n distanceThreshold = xDistanceThreshold + yDistanceThreshold;\n }\n\n const xDistance = Math.abs(pixelX - mouseX);\n const yDistance = Math.abs(pixelY - mouseY);\n const distance = Math.sqrt((xDistance)**2 + (pixelY - mouseY)**2);\n\n if (xDistance > xDistanceThreshold || (!ignoreYDistance && yDistance > yDistanceThreshold) || (!ignoreYDistance && distance > distanceThreshold)) {\n continue;\n }\n\n let xLabel, yLabel;\n\n const simpleData = singleSeries.simpleData || singleSeries.data;\n\n const enumLike = simpleData.length && !!singleSeries.hasEnum;\n if (singleSeries.xLabel || singleSeries.yLabel || enumLike) {\n let simplePoint;\n\n if (simpleData.length === data.length) {\n simplePoint = simpleData[closestIndex];\n } else {\n const flattenedData = flattenSimpleData(simpleData, { series: singleSeries, inDataSpace: data });\n\n simplePoint = flattenedData[closestIndex][1];\n }\n\n if (singleSeries.xLabel) {\n xLabel = simplePoint[singleSeries.xLabel];\n } else if (singleSeries.hasXEnum) {\n xLabel = extractXValue(simplePoint, singleSeries);\n }\n\n if (singleSeries.yLabel) {\n yLabel = simplePoint[singleSeries.yLabel];\n } else if (enumLike) {\n yLabel = extractYValue(simplePoint, singleSeries);\n }\n }\n\n if (distance < minDistance) {\n minDistance = distance;\n }\n\n let color = getColor(singleSeries.color, i, singleSeries.multigrapherSeriesIndex);\n if (y < 0 && singleSeries.negativeColor) {\n color = singleSeries.negativeColor;\n } else if (y === 0 && singleSeries.zeroLineColor) {\n color = singleSeries.zeroLineColor;\n }\n\n tooltips.push({\n pixelWidth: sizing.elementWidth,\n pixelX: pixelX,\n pixelY: isNaN(pixelY) ? sizing.elementHeight/2 : pixelY,\n x,\n y,\n color,\n distance,\n xDistance,\n index: i,\n series: singleSeries,\n xLabel,\n yLabel,\n fullYPrecision: singleSeries.fullYPrecision,\n ignoreYDistance\n });\n }\n\n const unsavedTooltips = tooltips.filter(({ distance, ignoreYDistance }) => {\n return distance === minDistance || ignoreYDistance;\n }).sort((a, b) => b.distance - a.distance);\n\n return {\n mousePresent,\n mouseX,\n mouseY,\n elementWidth: sizing.elementWidth,\n elementHeight: sizing.elementHeight,\n unsavedTooltipsCount: unsavedTooltips.length,\n tooltips: [...savedTooltips, ...unsavedTooltips]\n };\n}\n\n/**\n * Recalculates the tooltip position, given the new sizing, bounds, etc.\n *\n * @param {Number} mouseX\n * @param {Number} mouseY\n * @param {Object} sizing\n * @param {Object} tooltip - The tooltip object to move\n */\nexport function moveTooltip({ mouseX, mouseY, sizing }, tooltip) {\n const { x, y } = tooltip;\n\n const scale = tooltip.series.axis.scale;\n const bounds = tooltip.series.axis.currentBounds;\n const { minY, maxY } = scaleBounds({...bounds, scale });\n\n const pixelX = (x - bounds.minX)/(bounds.maxX - bounds.minX) * sizing.elementWidth;\n const pixelY = (1 - ((scale === 'log' ? Math.log10(y) : y) - minY)/(maxY - minY)) * sizing.elementHeight;\n\n const distance = Math.sqrt((pixelX - mouseX)**2 + (pixelY - mouseY)**2);\n const xDistance = Math.abs(pixelX - mouseX);\n\n Object.assign(tooltip, {\n pixelWidth: sizing.elementWidth,\n pixelX: pixelX,\n pixelY: isNaN(pixelY) ? sizing.elementHeight/2 : pixelY,\n xDistance,\n distance\n });\n}\n\nexport function toggleTooltipSaved({ currentTooltips, savedTooltips }) {\n if (!currentTooltips.length) {\n return savedTooltips;\n }\n\n const lastTooltip = currentTooltips[currentTooltips.length - 1];\n if (lastTooltip.xDistance > DISTANCE_THRESHOLD || (!lastTooltip.ignoreYDistance && lastTooltip.distance > DISTANCE_THRESHOLD)) {\n return savedTooltips;\n }\n\n const currentTooltipIndex = savedTooltips.findIndex((tooltip) => {\n return tooltip.x === lastTooltip.x && tooltip.y === lastTooltip.y;\n });\n\n if (currentTooltipIndex === -1) {\n return [...savedTooltips, lastTooltip];\n } else {\n return savedTooltips.filter((_, index) => index !== currentTooltipIndex);\n }\n}\n","const BOUND_CALCULATORS = {\n all: () => {},\n lastMinute: (globalBounds) => {\n if (!globalBounds.dates) {\n return;\n }\n\n return {\n minX: Math.max(new Date(globalBounds.maxX).valueOf() - 60*1000, globalBounds.minX)\n };\n },\n last10Minutes: (globalBounds) => {\n if (!globalBounds.dates) {\n return;\n }\n\n return {\n minX: Math.max(new Date(globalBounds.maxX).valueOf() - 10*60*1000, globalBounds.minX)\n };\n },\n lastHour: (globalBounds) => {\n if (!globalBounds.dates) {\n return;\n }\n\n return {\n minX: Math.max(new Date(globalBounds.maxX).valueOf() - 60*60*1000, globalBounds.minX)\n };\n },\n lastDay: (globalBounds) => {\n if (!globalBounds.dates) {\n return;\n }\n\n return {\n minX: Math.max(new Date(globalBounds.maxX).valueOf() - 24*60*60*1000, globalBounds.minX)\n };\n }\n};\n\nexport default BOUND_CALCULATORS;\n","const BUCKETS_PER_PIXEL = 2;\nconst CONDENSE_THRESHOLD = 2;\n\n/**\n * Condenses the dataset down to a lower number of points to make subsequent operations more efficient\n * Will only condense when data length passes a given threshold\n * Note that this works best on datasets that are relatively evenly distributed across the x axis\n *\n * @param {Array<Array>} data\n * @param {{data: [], minX: Number, maxX: Number, length: Number}} swap\n * @param {Number} minX\n * @param maxX\n * @param renderWidth\n * @param dataChanged\n * @return {{data: [], minX: Number, maxX: Number, length: Number}}\n */\nexport default function condenseDataSpace({ data, swap, minX, maxX, renderWidth, dataChanged }) {\n const targetBucketCount = renderWidth*BUCKETS_PER_PIXEL;\n\n const useSwap = !dataChanged && swap && swap.minX === minX && swap.maxX <= maxX && swap.length <= data.length;\n\n let partiallyCondensedData;\n if (useSwap) {\n partiallyCondensedData = swap.data;\n\n if (data.length > swap.length) {\n // always overwrite the last in case it was mangled by the selected space interpolation\n if (data.length > 0 && partiallyCondensedData.length > 0) {\n partiallyCondensedData[partiallyCondensedData.length - 1] = data[swap.length - 1];\n }\n\n partiallyCondensedData = partiallyCondensedData.concat(data.slice(swap.length));\n }\n } else {\n partiallyCondensedData = [...data];\n }\n\n if (partiallyCondensedData.length / targetBucketCount < CONDENSE_THRESHOLD*2) { // * 2 because min and max\n return {\n data: partiallyCondensedData,\n minX,\n maxX,\n length: data.length\n };\n }\n\n const condensedData = [];\n const bucketSize = (maxX - minX)/targetBucketCount;\n let minInBucket = null;\n let maxInBucket = null;\n let currentBucketIndex = 0;\n\n // always add the first point so that x ranges are preserved\n if (data.length) {\n condensedData.push(data[0]);\n }\n\n for (let tuple of partiallyCondensedData) {\n const [x, y] = tuple;\n\n if (y === null) {\n continue;\n }\n\n const bucketIndex = Math.floor((x - minX)/bucketSize);\n\n if (bucketIndex !== currentBucketIndex) {\n if (minInBucket && maxInBucket) {\n if (minInBucket === maxInBucket) {\n if (condensedData[condensedData.length - 1] !== minInBucket) {\n condensedData.push(minInBucket);\n }\n } else if (minInBucket[0] < maxInBucket[0]) {\n condensedData.push(maxInBucket, minInBucket);\n } else {\n condensedData.push(minInBucket, maxInBucket);\n }\n }\n\n minInBucket = null;\n maxInBucket = null;\n currentBucketIndex = bucketIndex;\n }\n\n if (!minInBucket || y < minInBucket[1]) {\n minInBucket = tuple;\n }\n\n if (!maxInBucket || y > maxInBucket[1]) {\n maxInBucket = tuple;\n }\n }\n\n if (minInBucket && maxInBucket) {\n if (minInBucket === maxInBucket) {\n condensedData.push(minInBucket);\n } else if (minInBucket[0] < maxInBucket[0]) {\n condensedData.push(maxInBucket, minInBucket);\n } else {\n condensedData.push(minInBucket, maxInBucket);\n }\n }\n\n // always add the last point so that x ranges are preserved\n if (data.length >= 2 && data[data.length - 1] !== minInBucket && data[data.length - 1] !== maxInBucket) {\n condensedData.push(data[data.length - 1]);\n }\n\n return {\n data: condensedData,\n minX,\n maxX,\n length: data.length\n };\n}\n","/**\n * Gets the proper name for a series\n *\n * @param {Object} singleSeries\n * @param {Number} index\n * @return {string}\n */\nexport default function nameForSeries(singleSeries, index) {\n let name = singleSeries.name || singleSeries.yKey;\n\n if (!name) {\n name = index.toString();\n }\n\n return name;\n}\n","export function selectedSpaceToBackgroundSpace({ data, background, minX, maxX }) {\n if (!background) {\n return null;\n }\n\n const conditions = [];\n for (let [key, color] of Object.entries(background)) {\n if (typeof color === 'object') {\n if (typeof color.evaluator !== 'function') {\n throw new Error('Invalid background declaration: ' + key + ' (evaluator must be a function)');\n }\n\n conditions.push(Object.assign({\n key,\n comparator: 'custom',\n comparedAgainst: null\n }, color));\n continue;\n }\n\n if (key === 'null') {\n conditions.push({\n evaluator: (y) => y === null && color,\n color,\n key,\n comparator: '=',\n comparedAgainst: null\n });\n continue;\n }\n\n const [comparator, value] = key.split(' ');\n if (!comparator || !value || isNaN(parseFloat(value))) {\n throw new Error('Invalid background declaration: ' + key);\n }\n\n const parsedValue = parseFloat(value);\n\n let evaluator;\n if (comparator === '=') {\n evaluator = (y) => typeof y === 'number' && y === parsedValue && color;\n } else if (comparator === '<') {\n evaluator = (y) => typeof y === 'number' && y < parsedValue && color;\n } else if (comparator === '>') {\n evaluator = (y) => typeof y === 'number' && y > parsedValue && color;\n } else if (comparator === '<=') {\n evaluator = (y) => typeof y === 'number' && y <= parsedValue && color;\n } else if (comparator === '>=') {\n evaluator = (y) => typeof y === 'number' && y >= parsedValue && color;\n } else {\n throw new Error('Invalid background declaration: ' + key);\n }\n\n conditions.push({\n evaluator,\n color,\n key,\n comparator,\n comparedAgainst: parsedValue\n });\n }\n\n const inBackgroundSpace = [];\n let currentSection = null;\n\n for (let i = 0; i < data.length; i++) {\n let [x, y] = data[i];\n if (x instanceof Date) {\n x = x.valueOf();\n }\n\n for (let condition of currentSection ? [currentSection.condition, ...conditions] : conditions) {\n const color = condition.evaluator(y);\n\n if (currentSection) {\n if (currentSection.color === color) {\n break;\n }\n\n let interpolatedMaxX = x;\n if (i > 0) {\n let [prevX, prevY] = data[i - 1];\n if (prevX instanceof Date) {\n prevX = prevX.valueOf();\n }\n\n if (currentSection.condition.comparedAgainst === null) {\n interpolatedMaxX = x;\n } else if (y === null) {\n interpolatedMaxX = prevX;\n } else {\n interpolatedMaxX = prevX + (condition.comparedAgainst - prevY)/(y - prevY)*(x - prevX);\n }\n }\n\n inBackgroundSpace.push({\n ...currentSection,\n maxX: interpolatedMaxX,\n maxXt: (interpolatedMaxX - minX)/(maxX - minX)\n });\n currentSection = null;\n }\n\n if (color) {\n let interpolatedMinX = x;\n if (i > 0) {\n let [prevX, prevY] = data[i - 1];\n if (prevX instanceof Date) {\n prevX = prevX.valueOf();\n }\n\n if (condition.comparedAgainst === null) {\n interpolatedMinX = prevX;\n } else if (prevY === null) {\n interpolatedMinX = x;\n } else {\n interpolatedMinX = prevX + (condition.comparedAgainst - prevY)/(y - prevY)*(x - prevX);\n }\n }\n\n currentSection = {\n minX: interpolatedMinX,\n minXt: (interpolatedMinX - minX)/(maxX - minX),\n color,\n condition\n };\n\n break;\n }\n }\n }\n\n if (currentSection) {\n inBackgroundSpace.push({\n ...currentSection,\n maxX: data[data.length - 1][0],\n maxXt: (data[data.length - 1][0] - minX)/(maxX - minX)\n });\n }\n\n return {\n data: inBackgroundSpace\n };\n}\n","import simpleSeriesToDataSpace from './space_conversions/simple_series_to_data_space';\nimport calculateDataBounds from './calculate_data_bounds';\nimport mergeBounds from './merge_bounds';\nimport expandBounds from './expand_bounds';\nimport selectionFromGlobalBounds from './selection_from_global_bounds';\nimport dataSpaceToSelectedSpace from './space_conversions/data_space_to_selected_space';\nimport selectedSpaceToRenderSpace from './space_conversions/selected_space_to_render_space';\nimport Eventable from '../eventable';\nimport boundCalculatorFromSelection from './bound_calculator_from_selection';\nimport calculateTooltipState, {toggleTooltipSaved} from './calculate_tooltip_state';\nimport getDefaultBoundsCalculator from './get_default_bounds_calculator';\nimport inferType from './infer_type';\nimport {SIMPLE_DATA_TYPES} from './data_types';\nimport generatorParamsEqual from '../helpers/generator_params_equal';\nimport findMatchingAxis from './find_matching_axis';\nimport {DPI_INCREASE} from '../renderer/size_canvas';\nimport {averageLoopTimes} from './average_loop_times';\nimport condenseDataSpace from './space_conversions/condense_data_space.js';\nimport calculateAnnotationsState from './calculate_annotations_state.js';\nimport {selectedSpaceToBackgroundSpace} from './space_conversions/selected_space_to_background_space.js';\nlet RustAPI;\nconst RustAPIPromise = import('../rust/pkg/index.js').then((module) => {\n RustAPI = module;\n});\n\nexport default class StateController extends Eventable {\n\n constructor({ defaultBoundsCalculator, customBoundsSelectors, requireWASM, defaultShowIndividualPoints, defaultShowSidebar, defaultShowAnnotations, defaultShowOptions, syncPool, grapherID, sharedDataCache, sharedSubscriptions, fullscreen }) {\n super();\n\n this._requireWASM = requireWASM;\n if (requireWASM) {\n RustAPIPromise.then(() => {\n this._markDirty();\n });\n }\n\n this._series = [];\n this._seriesFromOriginalSeries = new Map();\n\n this._axes = [\n {\n series: [],\n scale: 'linear',\n side: 'left',\n axisIndex: 0\n }\n ];\n this._highlightedSeries = null;\n\n this._showIndividualPoints = defaultShowIndividualPoints || false;\n this._autoscaleY = true;\n this._percentile = 100;\n this._percentileAsymmetry = 0;\n this._showingOptions = defaultShowOptions;\n this._maxPrecision = false;\n this._showingSidebar = defaultShowSidebar || false;\n this._showingAnnotations = defaultShowAnnotations || false;\n this._grapherID = grapherID;\n this._fullscreen = fullscreen || false;\n\n this._alwaysTooltipped = new Set();\n this._tooltipState = {\n mousePresent: false,\n mouseX: 0,\n mouseY: 0,\n elementWidth: 0,\n elementHeight: 0,\n tooltips: []\n };\n this._contextMenuPosition = {\n x: 0,\n y: 0,\n showing: false,\n value: null\n };\n this._savedTooltips = [];\n this._draggingY = false;\n this._annotations = [];\n this._annotationsState = {\n elementWidth: 0,\n annotations: []\n };\n this._enumMap = {};\n this._hasXEnum = false;\n\n this._timingBuffer = [];\n this._timingIndex = 0;\n this._timingFrameCount = 0;\n\n this._modifiedSeries = new Set();\n this._deferredEmissions = {};\n this._deferredPriorityEmissions = {};\n this.primaryRenderer = null;\n this.rangeGraphRenderer = null;\n\n this._boundsCalculator = getDefaultBoundsCalculator(defaultBoundsCalculator, customBoundsSelectors);\n this._boundsHistory = [this._boundsCalculator];\n this._boundsIndex = 0;\n\n this._dataCache = sharedDataCache || new Map();\n this._subscriptions = sharedSubscriptions || new Map();\n this._subscriptionsShared = !!sharedSubscriptions;\n this._observablesToSeries = new Map();\n this._generators = new Set();\n this._generatorsToSeries = new Map();\n this._generatorCallArgs = new Map();\n this._seriesChangedFromPromises = new Set();\n\n this._syncPool = syncPool;\n if (this._syncPool) {\n this._syncPool.add(this);\n }\n\n this._onDataChange();\n }\n\n dispose() {\n this.emit('dispose', this);\n\n this.clearListeners();\n\n if (!this._subscriptionsShared) {\n for (let listener of this._subscriptions.values()) {\n listener.unsubscribe();\n }\n this._subscriptions.clear();\n }\n\n for (let singleSeries of this._series) {\n this._removeSeries(singleSeries);\n }\n\n if (this._syncPool) {\n this._syncPool.remove(this);\n }\n\n this.disposed = true;\n }\n\n setSeries(series) {\n const userSeries = this._series.filter((singleSeries) => singleSeries.userCreated);\n const propsSeries = this._series.filter((singleSeries) => !singleSeries.userCreated);\n\n if (series.length === propsSeries.length) {\n let anyDifferent = false;\n for (let i = 0; i < series.length; i++) {\n if (series[i] !== this._series[i].originalSeries) {\n anyDifferent = true;\n break;\n }\n }\n\n if (!anyDifferent) {\n return;\n }\n } else {\n this._mustResize = this._mustResize || this._fullscreen;\n }\n\n const newSeriesSet = new Set(series);\n for (let singleSeries of propsSeries) {\n if (!newSeriesSet.has(singleSeries.originalSeries)) {\n this._removeSeries(singleSeries);\n }\n }\n\n this._series.splice(0);\n for (let i = 0; i < series.length; i++) {\n const originalSeries = series[i];\n\n let singleSeries = this._seriesFromOriginalSeries.get(originalSeries);\n if (!singleSeries) {\n singleSeries = {\n ...originalSeries,\n originalSeries\n };\n this._seriesFromOriginalSeries.set(originalSeries, singleSeries);\n\n if (singleSeries.defaultAlwaysTooltipped) {\n this._alwaysTooltipped.add(singleSeries);\n this._tooltipsChanged = true;\n this.deferredEmit('always_tooltipped_changed', this._alwaysTooltipped);\n }\n }\n\n singleSeries.index = i;\n this._series.push(singleSeries);\n this._assignAxisTo(singleSeries);\n\n if (singleSeries.hidden) {\n this._hideSeries(singleSeries);\n }\n }\n\n for (let i = 0; i < userSeries.length; i++) {\n const singleSeries = userSeries[i];\n singleSeries.index = i + series.length;\n this._series.push(singleSeries);\n }\n\n this.deferredEmit('series_changed', this._series);\n\n this._dataChanged = true;\n this._markDirty();\n }\n\n _markDirty() {\n if (this._frameRequested) {\n return;\n }\n\n if (this._requireWASM && !RustAPI) {\n return;\n }\n\n const frameRequestStart = performance.now();\n this._frameRequested = true;\n requestAnimationFrame(() => {\n if (this.disposed) {\n return;\n }\n\n const frameExecutionStart = performance.now();\n\n const dataProcessingStart = performance.now();\n if (this._dataChanged) {\n this._onDataChange();\n this._mustRerender = true;\n this._tooltipsChanged = true;\n this._annotationsChanged = true;\n } else if (this._modifiedSeries.size) {\n this._onDataAdd(this._modifiedSeries);\n this._mustRerender = true;\n this._tooltipsChanged = true;\n this._annotationsChanged = true;\n } else {\n if (this._primarySizeChanged) {\n this._calculatePrimarySizeDependents();\n this._mustRerender = true;\n }\n if (this._rangeGraphSizeChanged) {\n this._calculateRangeGraphSizeDependents();\n this._mustRerender = true;\n }\n }\n const dataProcessingEnd = performance.now();\n\n const renderPipelineStart = performance.now();\n if (this._mustRerender) {\n this._render();\n }\n const renderPipelineEnd = performance.now();\n\n const generatorsStart = performance.now();\n if (this._mustCallGenerators) {\n this._callGenerators();\n }\n const generatorsEnd = performance.now();\n\n const tooltipStart = performance.now();\n if (this._tooltipsChanged) {\n this._recalculateTooltips();\n }\n const tooltipEnd = performance.now();\n\n const contextMenuStart = performance.now();\n if (this._contextMenuChanged) {\n this._recalculateContextMenu();\n }\n const contextMenuEnd = performance.now();\n\n const annotationStart = performance.now();\n if (this._annotationsChanged) {\n this._recalculateAnnotations();\n }\n const annotationEnd = performance.now();\n\n if (this._mustResize) {\n this.primaryRenderer.resizeDebounced();\n this.rangeGraphRenderer && this.rangeGraphRenderer.resizeDebounced();\n }\n\n this._frameRequested = false;\n this._mustRerender = false;\n this._dataChanged = false;\n this._primarySizeChanged = false;\n this._rangeGraphSizeChanged = false;\n this._modifiedSeries.clear();\n this._seriesChangedFromPromises.clear();\n this._tooltipsChanged = false;\n this._contextMenuChanged = false;\n this._annotationsChanged = false;\n this._mustCallGenerators = false;\n this._mustResize = false;\n\n const callbacksStart = performance.now();\n for (let emission of [...Object.values(this._deferredPriorityEmissions), ...Object.values(this._deferredEmissions)]) {\n this.emit(...emission);\n }\n const callbacksEnd = performance.now();\n this._deferredEmissions = {};\n this._deferredPriorityEmissions = {};\n\n const completionTime = performance.now();\n const loopTime = {\n frameExecution: completionTime - frameExecutionStart,\n frameRequestAndExecution: completionTime - frameRequestStart,\n generators: generatorsEnd - generatorsStart,\n dataProcessing: dataProcessingEnd - dataProcessingStart,\n renderPipeline: renderPipelineEnd - renderPipelineStart,\n tooltips: tooltipEnd - tooltipStart,\n contextMenu: contextMenuEnd - contextMenuStart,\n annotations: annotationEnd - annotationStart,\n callbacks: callbacksEnd - callbacksStart\n };\n this.lastLoopTime = loopTime;\n if (this._timingFrameCount) {\n if (this._timingBuffer.length < this._timingFrameCount) {\n this._timingBuffer.push(loopTime);\n } else {\n this._timingBuffer[this._timingIndex % this._timingFrameCount] = loopTime;\n }\n this._timingIndex++;\n }\n this.emit('render_time', completionTime - frameExecutionStart, loopTime);\n });\n }\n\n deferredEmit(...args) {\n this._deferredEmissions[args[0]] = args;\n }\n\n deferredPriorityEmit(...args) {\n this._deferredPriorityEmissions[args[0]] = args;\n }\n\n _seriesToSimpleData(singleSeries) {\n const type = inferType(singleSeries);\n if (SIMPLE_DATA_TYPES.includes(type)) {\n return singleSeries.data;\n }\n\n // get a reference to whatever you already have\n let currentData = this._dataCache.get(singleSeries.data);\n\n if (currentData && this._seriesChangedFromPromises.has(singleSeries.data)) {\n return currentData;\n }\n\n if (!currentData) {\n currentData = [];\n this._dataCache.set(singleSeries.data, currentData);\n singleSeries.simpleData = currentData;\n }\n\n if (type === 'object_observable' || type === 'tuple_observable') {\n let sameDataSet = this._observablesToSeries.get(singleSeries.data);\n if (sameDataSet) {\n const firstSameDataSeries = sameDataSet.values().next().value;\n currentData = firstSameDataSeries.simpleData;\n if (!currentData) {\n throw new Error(`Cannot find simpleData in ${firstSameDataSeries.name || firstSameDataSeries.yKey || firstSameDataSeries.data}`);\n }\n this._dataCache.set(singleSeries.data, currentData);\n singleSeries.simpleData = currentData;\n } else {\n sameDataSet = new Set();\n singleSeries.simpleData = currentData;\n this._observablesToSeries.set(singleSeries.data, sameDataSet);\n }\n\n sameDataSet.add(singleSeries);\n\n this._listenToObservableData({\n observable: singleSeries.data,\n currentData\n });\n }\n\n if (type === 'generator') {\n if (!this._generatorsToSeries.has(singleSeries.data)) {\n this._generatorsToSeries.set(singleSeries.data, new Set());\n }\n\n this._generatorsToSeries.get(singleSeries.data).add(singleSeries);\n\n if (!this._generators.has(singleSeries.data)) {\n this._generators.add(singleSeries.data);\n this._callGenerator(singleSeries.data);\n }\n }\n\n // return whatever you have; it'll fetch more in the background\n return currentData;\n }\n\n _listenToPromise(singleSeries, dataPromise) {\n dataPromise.then((resolved) => {\n this._dataCache.set(singleSeries.data, resolved);\n singleSeries.simpleData = resolved;\n this._seriesChangedFromPromises.add(singleSeries.data);\n this._dataChanged = true;\n this._markDirty();\n });\n }\n\n _listenToObservableData({ observable, currentData }) {\n if (this._subscriptions.has(observable)) { // someone else already listened to it\n return;\n }\n this._subscriptions.set(observable, true);\n\n // listen to the new data\n const listener = observable.observe((point) => {\n if (Array.isArray(point)) {\n for (let datum of point) {\n currentData.push(datum);\n }\n } else {\n currentData.push(point);\n }\n\n this.emit('observable_modified', observable);\n\n this.markObservableModified(observable);\n });\n this._subscriptions.set(observable, listener);\n }\n\n markObservableModified(observable) {\n if (!this._observablesToSeries.has(observable)) {\n return;\n }\n\n for (let singleSeries of this._observablesToSeries.get(observable)) {\n this._modifiedSeries.add(singleSeries);\n }\n this._markDirty();\n }\n\n _unsubscribeFromStaleSeries() {\n const currentSeries = new Set(this._series);\n for (let [observable, seriesSet] of this._observablesToSeries) {\n let stillHasListener = false;\n\n for (let singleSeries of seriesSet) {\n if (currentSeries.has(singleSeries)) {\n stillHasListener = true;\n break;\n }\n }\n\n if (!stillHasListener) {\n this._subscriptions.get(observable).unsubscribe();\n this._subscriptions.delete(observable);\n this._observablesToSeries.delete(observable);\n }\n }\n\n for (let [generator, seriesSet ] of this._generatorsToSeries) {\n let stillHasSeries = false;\n\n for (let singleSeries of seriesSet) {\n if (currentSeries.has(singleSeries)) {\n stillHasSeries = true;\n break;\n }\n }\n\n if (!stillHasSeries) {\n this._generatorsToSeries.delete(generator);\n this._generators.delete(generator);\n this._generatorCallArgs.delete(generator);\n }\n }\n }\n\n async _callGenerator(generator) {\n const parameters = {\n minX: this._selection.minX,\n maxX: this._selection.maxX,\n sizing: this.primaryRenderer.sizing\n };\n\n if (generatorParamsEqual(this._generatorCallArgs.get(generator), parameters)) {\n return;\n }\n this._generatorCallArgs.set(generator, parameters);\n\n // Note: potential race condition if generator is stupid. For now, we'll rely on generator being smart\n // Race condition: a new, faster one runs before completed\n const data = await Promise.resolve(generator(parameters));\n\n // do nothing if the generator returned nothing\n if (!data) {\n return;\n }\n\n // because calling the generator may have taken some time, check that there are still listeners for it\n if (!this._generatorsToSeries.has(generator)) {\n return;\n }\n\n this._dataChanged = true;\n this._markDirty();\n\n if (typeof data.observe === 'function') {\n const currentData = [];\n this._dataCache.set(generator, currentData);\n for (let singleSeries of this._generatorsToSeries.get(generator)) {\n singleSeries.simpleData = currentData;\n }\n\n for (let singleSeries of this._generatorsToSeries.get(generator)) {\n if (!this._observablesToSeries.has(data)) {\n this._observablesToSeries.set(data, new Set());\n }\n\n this._observablesToSeries.get(data).add(singleSeries);\n }\n\n this._listenToObservableData({\n observable: data,\n currentData\n });\n } else {\n this._dataCache.set(generator, data);\n for (let singleSeries of this._generatorsToSeries.get(generator)) {\n singleSeries.simpleData = data;\n }\n }\n }\n\n _callGenerators() {\n for (let generator of this._generators) {\n this._callGenerator(generator);\n }\n }\n\n _recalculateTooltips() {\n if (!this.primaryRenderer || !this.primaryRenderer.sizing) {\n return;\n }\n\n this._tooltipState = calculateTooltipState({\n mousePresent: this._tooltipState.mousePresent,\n mouseX: this._tooltipState.mouseX,\n mouseY: this._tooltipState.mouseY,\n sizing: this.primaryRenderer.sizing,\n series: this._series,\n alwaysTooltipped: this._alwaysTooltipped,\n savedTooltips: this._savedTooltips,\n allTooltipped: this._tooltipAllNext,\n closestSpacing: this._globalBounds.closestSpacing\n });\n this._tooltipAllNext = false;\n this.deferredEmit('tooltip_state_changed', this._tooltipState, this._tooltipStateArg);\n this._tooltipStateArg = null;\n }\n \n _recalculateContextMenu() {\n if (!this.primaryRenderer || !this.primaryRenderer.sizing) {\n return;\n }\n\n const boundingRect = this.primaryRenderer.boundingRect;\n const sizing = this.primaryRenderer.sizing;\n let value = null;\n let newX = null;\n \n for (let series of this._series) {\n const bounds = series.axis.currentBounds;\n \n newX = this._contextMenuPosition.x - boundingRect.left;\n \n // if it's on the right side, move it to the left one width\n if (this._contextMenuPosition.x > (boundingRect.right - sizing.elementWidth) * 2) newX -= 130;\n\n if (series.xKey === 'timestamp' || series.xKey === 'time' || series.xKey === 'date') {\n value = new Date((this._contextMenuPosition.x - boundingRect.left) / sizing.elementWidth * (bounds.maxX - bounds.minX) + bounds.minX);\n } else {\n value = (this._contextMenuPosition.x - boundingRect.left) / sizing.elementWidth * (bounds.maxX - bounds.minX) + bounds.minX;\n }\n }\n this._contextMenuPosition = {\n x: newX,\n y: this._contextMenuPosition.y - boundingRect.top,\n showing: this._contextMenuPosition.showing,\n value: value\n };\n this.deferredEmit('context_menu_position_changed', this._contextMenuPosition);\n }\n\n _recalculateAnnotations() {\n if (!this.primaryRenderer || !this.primaryRenderer.sizing) {\n return;\n }\n\n this._annotationsState = calculateAnnotationsState({\n annotations: this._annotations,\n series: this._series,\n sizing: this.primaryRenderer.sizing,\n selection: this._selection\n });\n this.deferredEmit('annotations_changed', this._annotationsState);\n }\n\n _onDataChange() {\n this._expandYWith = [];\n const dataBoundsList = [];\n\n for (let singleSeries of this._series) {\n if (singleSeries.hidden) {\n continue;\n }\n\n const simpleData = this._seriesToSimpleData(singleSeries);\n singleSeries.inDataSpace = simpleSeriesToDataSpace({\n ...singleSeries,\n data: simpleData\n }, {\n stateController: this\n });\n singleSeries.simpleDataSliceStart = simpleData.length;\n singleSeries.dataBounds = calculateDataBounds(singleSeries.inDataSpace);\n if (singleSeries.rendering === 'bar') {\n singleSeries.dataBounds = expandBounds(singleSeries.dataBounds, { extendXForNBars: singleSeries.inDataSpace.length });\n }\n\n dataBoundsList.push(singleSeries.dataBounds);\n\n if (singleSeries.expandYWith) {\n this._expandYWith.push(singleSeries.expandYWith);\n }\n }\n\n this._unsubscribeFromStaleSeries();\n\n this._dataBounds = mergeBounds(dataBoundsList);\n\n this._recalculateSelection({ disableSwap: true});\n\n for (let singleSeries of this._series) {\n if (singleSeries.hidden) {\n continue;\n }\n\n singleSeries.selectedBounds = calculateDataBounds(singleSeries.inSelectedSpace.data, { percentile: this._percentile, percentileAsymmetry: this._percentileAsymmetry });\n if (singleSeries.hasAreaBottom) {\n singleSeries.selectedBoundsAreaTop = singleSeries.selectedBounds;\n singleSeries.selectedBoundsAreaBottom = calculateDataBounds(singleSeries.inSelectedSpaceAreaBottom.data, { percentile: this._percentile, percentileAsymmetry: this._percentileAsymmetry });\n\n singleSeries.selectedBounds = mergeBounds([\n singleSeries.selectedBoundsAreaTop,\n singleSeries.selectedBoundsAreaBottom\n ]);\n }\n }\n\n this._recalculateAxisBounds();\n\n for (let singleSeries of this._series) {\n if (singleSeries.hidden) {\n continue;\n }\n\n this._calculatePrimarySizeDependents(singleSeries, { dataChanged: true });\n this._calculateRangeGraphSizeDependents(singleSeries, { dataChanged: true });\n }\n }\n\n _onDataAdd(modifiedSeries) {\n const newData = new Map();\n const modifiedAxes = new Set();\n\n const modifiedSeriesAndDependents = new Set();\n for (let singleSeries of modifiedSeries) {\n modifiedSeriesAndDependents.add(singleSeries);\n }\n\n for (let singleSeries of modifiedSeries) {\n modifiedAxes.add(singleSeries.axis);\n\n if (!singleSeries.inDataSpace) {\n throw new Error('inDataSpace must be present for onDataAdd to be called');\n }\n\n const simpleData = this._seriesToSimpleData(singleSeries);\n\n let prevY;\n if (singleSeries.inDataSpace.length) {\n prevY = singleSeries.inDataSpace[singleSeries.inDataSpace.length - 1][1];\n }\n\n const newDataInDataSpace = simpleSeriesToDataSpace(singleSeries, {\n data: simpleData.slice(singleSeries.simpleDataSliceStart || 0),\n valueXStart: singleSeries.inDataSpace.length,\n prevY,\n stateController: this\n });\n newData.set(singleSeries, newDataInDataSpace);\n singleSeries.simpleDataSliceStart = simpleData.length;\n\n if (newDataInDataSpace.length < 32) {\n singleSeries.inDataSpace.push(...newDataInDataSpace);\n } else {\n for (let point of newDataInDataSpace) {\n singleSeries.inDataSpace.push(point);\n }\n }\n\n let newDataBounds = calculateDataBounds(newDataInDataSpace);\n if (singleSeries.rendering === 'bar') {\n newDataBounds = expandBounds(newDataBounds, { extendXForNBars: singleSeries.inDataSpace.length });\n }\n\n singleSeries.dataBounds = mergeBounds([singleSeries.dataBounds, newDataBounds]);\n this._dataBounds = mergeBounds([this._dataBounds, newDataBounds]);\n\n // save these off for debugging only\n singleSeries.newPointCount = newDataInDataSpace.length;\n singleSeries.newDataBounds = newDataBounds;\n }\n\n const previousSelection = this._selection;\n this._recalculateSelection();\n\n for (let singleSeries of modifiedSeries) {\n if (!singleSeries.inSelectedSpace.data.length) { // empty, trivially fast\n singleSeries.selectedBounds = calculateDataBounds(singleSeries.inSelectedSpace.data);\n continue;\n }\n\n const firstX = singleSeries.inSelectedSpace.data[0][0];\n const lastX = singleSeries.inSelectedSpace.data[singleSeries.inSelectedSpace.data.length - 1][0];\n\n const oldBoundSubsetOfNewBounds = previousSelection.minX >= firstX && previousSelection.maxX <= lastX;\n\n if (!oldBoundSubsetOfNewBounds || this._percentile !== 100) {\n // this is significantly slower, but it's too complex to diff the old bounds and new bounds or diff percentiles\n // besides, it not being a subset hopefully means its a lower volume of data\n singleSeries.selectedBounds = calculateDataBounds(singleSeries.inSelectedSpace.data, { percentile: this._percentile, percentileAsymmetry: this._percentileAsymmetry});\n if (singleSeries.hasAreaBottom) {\n singleSeries.selectedBoundsAreaTop = singleSeries.selectedBounds;\n singleSeries.selectedBoundsAreaBottom = calculateDataBounds(singleSeries.inSelectedSpaceAreaBottom.data, { percentile: this._percentile, percentileAsymmetry: this._percentileAsymmetry });\n\n singleSeries.selectedBounds = mergeBounds([\n singleSeries.selectedBoundsAreaTop,\n singleSeries.selectedBoundsAreaBottom\n ]);\n }\n continue;\n }\n\n // note: we could do a binary search here, but there are typically only a few points added each frame, so it isn't worth it\n const newSelectedData = newData.get(singleSeries)\n .filter((tuple) => tuple[0] >= this._selection.minX && tuple[0] <= this._selection.maxX);\n\n singleSeries.newSelectedData = newSelectedData;\n singleSeries.selectedBounds = mergeBounds([singleSeries.selectedBounds, calculateDataBounds(newSelectedData)]);\n }\n\n this._recalculateAxisBounds();\n\n this.deferredPriorityEmit('axis_bounds_changed', this._axes.map(({ currentBounds }) => currentBounds));\n\n for (let axis of modifiedAxes) {\n for (let singleSeries of axis.series) {\n this._calculatePrimarySizeDependents(singleSeries);\n this._calculateRangeGraphSizeDependents(singleSeries);\n }\n }\n }\n\n _recalculateAxisBounds() {\n for (let axis of this._axes) {\n if (this._selection.fixedY || !this._autoscaleY) {\n axis.targetBounds = this._selection;\n if (axis.targetBounds.byAxis) {\n axis.targetBounds = axis.targetBounds.byAxis[axis.axisIndex];\n }\n\n axis.currentBounds = axis.targetBounds;\n continue;\n }\n\n const selectedBoundsList = [];\n const expandYWith = [];\n\n for (let singleSeries of axis.series) {\n selectedBoundsList.push(singleSeries.selectedBounds);\n\n if (singleSeries.expandYWith) {\n expandYWith.push(...singleSeries.expandYWith);\n }\n\n if (singleSeries.rendering === 'bar') {\n expandYWith.push(singleSeries.dataBounds.minY, singleSeries.dataBounds.maxY);\n }\n }\n\n axis.selectedDataBounds = mergeBounds(selectedBoundsList);\n axis.targetBounds = axis.currentBounds = expandBounds(axis.selectedDataBounds, {expandYWith});\n }\n this.deferredPriorityEmit('axis_bounds_changed', this._axes.map(({ currentBounds }) => currentBounds));\n }\n\n /**\n * Recalculates global bounds, selection, and data in selected space (for each series)\n * REQUIRES that this._dataBounds and this._expandYWith are set & up-to-date\n *\n * @private\n */\n _recalculateSelection({disableSwap = false}={}) {\n this._globalBounds = expandBounds(this._dataBounds, {expandYWith: this._expandYWith.flat()});\n this.deferredPriorityEmit('global_bounds_changed', this._globalBounds);\n this._selection = selectionFromGlobalBounds(this._globalBounds, this._boundsCalculator);\n this.deferredPriorityEmit('selection_changed', this._selection);\n\n for (let singleSeries of this._series) {\n if (singleSeries.hidden) {\n continue;\n }\n\n singleSeries.inSelectedSpace = dataSpaceToSelectedSpace({\n data: singleSeries.hasAreaBottom ? singleSeries.inDataSpace.filter((_, i) => i % 2 === 1) : singleSeries.inDataSpace,\n swap: disableSwap ? null : singleSeries.inSelectedSpace,\n minX: this._selection.minX,\n maxX: this._selection.maxX,\n ignoreDiscontinuities: singleSeries.ignoreDiscontinuities,\n square: singleSeries.square\n });\n\n if (singleSeries.hasAreaBottom) {\n singleSeries.inSelectedSpaceAreaBottom = dataSpaceToSelectedSpace({\n data:singleSeries.inDataSpace.filter((_, i) => i % 2 === 0),\n swap: disableSwap ? null : singleSeries.inSelectedSpaceAreaBottom,\n minX: this._selection.minX,\n maxX: this._selection.maxX,\n ignoreDiscontinuities: singleSeries.ignoreDiscontinuities,\n square: singleSeries.square\n });\n }\n }\n }\n\n _render() {\n if (!this.primaryRenderer || !this.primaryRenderer.sizing) {\n return;\n }\n\n this.primaryRenderer.clear();\n if (this.rangeGraphRenderer) {\n this.rangeGraphRenderer.clear();\n }\n\n for (let singleSeries of this._series) {\n if (singleSeries.hidden) {\n continue;\n }\n\n const shadowColor = singleSeries.shadowColor || {\n day: 'white',\n export: 'transparent',\n night: 'black'\n }[this._theme] || 'black';\n\n const shadowBlur = undefined;\n\n this.primaryRenderer.renderBackground(singleSeries.inBackgroundSpacePrimary);\n\n this.primaryRenderer.render(singleSeries, singleSeries.inRenderSpacePrimary, {\n highlighted: this._highlightedSeries === singleSeries.index,\n showIndividualPoints: this._showIndividualPoints,\n shadowColor,\n shadowBlur,\n defaultLineWidth: this._defaultLineWidth,\n globalBounds: this._globalBounds,\n inRenderSpaceAreaBottom: singleSeries.inRenderSpacePrimaryAreaBottom\n });\n\n if (this.rangeGraphRenderer && this.rangeGraphRenderer.sizing) {\n this.rangeGraphRenderer.render(singleSeries, singleSeries.inRenderSpaceRangeGraph, {\n shadowColor: 'transparent',\n shadowBlur: 0,\n width: 1,\n bounds: this._globalBounds,\n globalBounds: this._globalBounds,\n inRenderSpaceAreaBottom: singleSeries.inRenderSpaceRangeGraphAreaBottom\n });\n }\n }\n }\n\n _calculatePrimarySizeDependents(singleSeries, { dataChanged=false } = {}) {\n if (!this.primaryRenderer || !this.primaryRenderer.sizing) {\n return;\n }\n\n if (!singleSeries) {\n for (let s of this._series) {\n this._calculatePrimarySizeDependents(s);\n }\n return;\n }\n\n if (!this._series.includes(singleSeries)) {\n throw new Error('Series no longer exists');\n }\n\n if (singleSeries.hidden) {\n return;\n }\n\n const { currentBounds, scale } = singleSeries.axis;\n const renderWidth = Math.ceil(this.primaryRenderer.sizing.renderWidth/DPI_INCREASE);\n const renderHeight = Math.ceil(this.primaryRenderer.sizing.renderHeight);\n\n const toCondensedSelectedSpaceParams = {\n minX: currentBounds.minX,\n maxX: currentBounds.maxX,\n renderWidth,\n dataChanged\n };\n\n singleSeries.inCondensedSelectedSpacePrimary = condenseDataSpace({\n data: singleSeries.inSelectedSpace.data,\n swap: singleSeries.inCondensedSelectedSpacePrimary,\n ...toCondensedSelectedSpaceParams\n });\n\n const toRenderSpaceParams = {\n minX: currentBounds.minX,\n maxX: currentBounds.maxX,\n minY: currentBounds.minY,\n maxY: currentBounds.maxY,\n renderWidth,\n renderHeight,\n scale,\n dataChanged\n };\n\n singleSeries.inRenderSpacePrimary = selectedSpaceToRenderSpace({\n data: singleSeries.inCondensedSelectedSpacePrimary.data,\n swap: singleSeries.inRenderSpacePrimary,\n ...toRenderSpaceParams\n });\n\n singleSeries.inBackgroundSpacePrimary = selectedSpaceToBackgroundSpace({\n data: singleSeries.inCondensedSelectedSpacePrimary.data,\n background: singleSeries.background,\n swap: singleSeries.inBackgroundSpacePrimary,\n minX: currentBounds.minX,\n maxX: currentBounds.maxX\n });\n\n if (singleSeries.hasAreaBottom) {\n singleSeries.inCondensedSelectedSpacePrimaryAreaBottom = condenseDataSpace({\n data: singleSeries.inSelectedSpaceAreaBottom.data,\n swap: singleSeries.inCondensedSelectedSpacePrimaryAreaBottom,\n ...toCondensedSelectedSpaceParams\n });\n\n singleSeries.inRenderSpacePrimaryAreaBottom = selectedSpaceToRenderSpace({\n data: singleSeries.inCondensedSelectedSpacePrimaryAreaBottom.data,\n swap: singleSeries.inRenderSpacePrimaryAreaBottom,\n ...toRenderSpaceParams\n });\n\n singleSeries.inBackgroundSpacePrimaryAreaBottom = selectedSpaceToBackgroundSpace({\n data: singleSeries.inCondensedSelectedSpacePrimaryAreaBottom.data,\n background: singleSeries.background,\n swap: singleSeries.inBackgroundSpacePrimaryAreaBottom,\n minX: currentBounds.minX,\n maxX: currentBounds.maxX\n });\n }\n }\n\n _calculateRangeGraphSizeDependents(singleSeries, { dataChanged=false } = {}) {\n if (!this.rangeGraphRenderer || !this.rangeGraphRenderer.sizing) {\n return;\n }\n\n if (!singleSeries) {\n for (let s of this._series) {\n this._calculateRangeGraphSizeDependents(s);\n }\n return;\n }\n\n if (!this._series.includes(singleSeries)) {\n throw new Error('Series no longer exists');\n }\n\n if (singleSeries.hidden) {\n return;\n }\n\n const { scale } = singleSeries.axis;\n const globalBounds = this._globalBounds;\n const renderWidth = Math.ceil(this.rangeGraphRenderer.sizing.renderWidth/DPI_INCREASE);\n const renderHeight = Math.ceil(this.rangeGraphRenderer.sizing.renderHeight);\n\n const toSelectedSpaceParams = {\n minX: globalBounds.minX,\n maxX: globalBounds.maxX,\n ignoreDiscontinuities: singleSeries.ignoreDiscontinuities,\n square: singleSeries.square\n };\n\n singleSeries.inSelectedSpaceRangeGraph = dataSpaceToSelectedSpace({\n data: singleSeries.hasAreaBottom ? singleSeries.inDataSpace.filter((_, i) => i % 2 === 1) : singleSeries.inDataSpace,\n swap: singleSeries.inSelectedSpaceRangeGraph,\n ...toSelectedSpaceParams\n });\n\n const toCondensedSelectedSpaceParams = {\n minX: globalBounds.minX,\n maxX: globalBounds.maxX,\n renderWidth,\n dataChanged\n };\n\n singleSeries.inCondensedSelectedSpaceRangeGraph = condenseDataSpace({\n data: singleSeries.inSelectedSpaceRangeGraph.data,\n swap: singleSeries.inCondensedSelectedSpaceRangeGraph\n });\n\n const toRenderSpaceParams = {\n minX: globalBounds.minX,\n maxX: globalBounds.maxX,\n minY: globalBounds.minY,\n maxY: globalBounds.maxY,\n renderWidth,\n renderHeight,\n scale,\n dataChanged\n };\n\n singleSeries.inRenderSpaceRangeGraph = selectedSpaceToRenderSpace({\n data: singleSeries.inCondensedSelectedSpaceRangeGraph.data,\n swap: singleSeries.inRenderSpaceRangeGraph,\n ...toRenderSpaceParams\n });\n\n if (singleSeries.hasAreaBottom) {\n singleSeries.inSelectedSpaceRangeGraphAreaBottom = dataSpaceToSelectedSpace({\n data: singleSeries.inDataSpace.filter((_, i) => i % 2 === 0), // take the odd points for area bottom\n swap: singleSeries.inSelectedSpaceRangeGraphAreaBottom,\n ...toSelectedSpaceParams\n });\n\n singleSeries.inCondensedSelectedSpaceRangeGraphAreaBottom = condenseDataSpace({\n data: singleSeries.inSelectedSpaceRangeGraphAreaBottom.data,\n swap: singleSeries.inCondensedSelectedSpaceRangeGraphAreaBottom,\n ...toCondensedSelectedSpaceParams\n });\n\n singleSeries.inRenderSpaceRangeGraphAreaBottom = selectedSpaceToRenderSpace({\n data: singleSeries.inCondensedSelectedSpaceRangeGraphAreaBottom.data,\n swap: singleSeries.inRenderSpaceRangeGraphAreaBottom,\n ...toRenderSpaceParams\n });\n }\n }\n\n _createAxis({ side }) {\n const axis = {\n series: [],\n scale: 'linear',\n side,\n axisIndex: this._axes.length\n };\n this._axes.push(axis);\n return axis;\n }\n\n _moveAxis(singleSeries, axisIndex) {\n if (!this._series.includes(singleSeries)) {\n throw new Error('Series no longer exists');\n }\n\n let newAxis;\n if (axisIndex === 'new-left' || axisIndex === 'new-right') {\n newAxis = this._createAxis({ side: axisIndex.split('-')[1] });\n } else {\n newAxis = this._axes[parseInt(axisIndex)];\n }\n\n if (singleSeries.axis === newAxis) {\n return;\n }\n\n const oldAxis = singleSeries.axis;\n const oldIndex = oldAxis.series.indexOf(singleSeries);\n if (oldIndex === -1) {\n throw new Error('Series not present in axis');\n }\n oldAxis.series.splice(oldIndex, 1);\n\n newAxis.series.push(singleSeries);\n singleSeries.axis = newAxis;\n\n this._dataChanged = true;\n this.deferredEmit('axes_changed', this._axes);\n this.deferredEmit('left_axes_changed', this.leftAxes);\n this.deferredEmit('right_axes_changed', this.rightAxes);\n this.deferredEmit('exported_axes_changed', this.exportedAxes);\n this._markDirty();\n }\n\n _assignAxisTo(singleSeries) {\n if (singleSeries.axis && typeof singleSeries.axis === 'object') {\n return;\n }\n\n let axis;\n\n if (singleSeries.axisIndex) {\n const { axisIndex } = singleSeries;\n\n if (axisIndex === 'new-left' || axisIndex === 'new-right') {\n axis = this._createAxis({ side: axisIndex.split('-')[1] });\n } else {\n axis = this._axes[parseInt(axisIndex)];\n }\n } else if (singleSeries.axis) {\n singleSeries.originalAxis = singleSeries.axis;\n let [side, number] = singleSeries.axis.split('-');\n axis = findMatchingAxis({ axes: this._axes, side, number });\n\n if (!axis) {\n axis = this._createAxis({\n side\n });\n }\n } else {\n axis = this._axes[0];\n }\n\n axis.series.push(singleSeries);\n singleSeries.axis = axis;\n\n this.deferredEmit('axes_changed', this._axes);\n this.deferredEmit('exported_axes_changed', this.exportedAxes);\n\n if (singleSeries.axis.side === 'left') {\n this.deferredEmit('left_axes_changed', this.leftAxes);\n } else {\n this.deferredEmit('right_axes_changed', this.rightAxes);\n }\n }\n\n _removeSeries(singleSeries) {\n this._seriesFromOriginalSeries.delete(singleSeries.originalSeries);\n\n const { axis, data } = singleSeries;\n axis.series.splice(axis.series.indexOf(singleSeries), 1);\n const sameDataSet = this._observablesToSeries.get(data);\n if (sameDataSet) {\n sameDataSet.delete(singleSeries);\n if (sameDataSet.size === 0) {\n this._observablesToSeries.delete(data);\n }\n }\n\n if (this._generatorsToSeries.has(data)) {\n this._generatorsToSeries.get(data).delete(singleSeries);\n if (this._generatorsToSeries.get(data).size === 0) {\n this._generatorsToSeries.delete(data);\n this._generators.delete(data);\n }\n }\n\n this._alwaysTooltipped.delete(singleSeries);\n\n singleSeries.axis = singleSeries.originalAxis;\n delete singleSeries.originalAxis;\n delete singleSeries.inDataSpace;\n delete singleSeries.inSelectedSpace;\n delete singleSeries.inValueSpacePrimary;\n delete singleSeries.inValueSpaceRangeGraph;\n delete singleSeries.inRenderSpacePrimary;\n delete singleSeries.inRenderSpaceRangeGraph;\n delete singleSeries.newPointCount;\n delete singleSeries.newDataBounds;\n delete singleSeries.simpleDataSliceStart;\n\n this.deferredEmit('axes_changed', this._axes);\n this.deferredEmit('exported_axes_changed', this.exportedAxes);\n\n if (axis.side === 'left') {\n this.deferredEmit('left_axes_changed', this.leftAxes);\n } else {\n this.deferredEmit('right_axes_changed', this.rightAxes);\n }\n }\n\n _hideSeries(singleSeries) {\n const { axis } = singleSeries;\n const indexInAxis = axis.series.indexOf(singleSeries);\n singleSeries.indexInAxis = indexInAxis;\n axis.series.splice(indexInAxis, 1);\n\n this.deferredEmit('axes_changed', this._axes);\n\n if (axis.side === 'left') {\n this.deferredEmit('left_axes_changed', this.leftAxes);\n } else {\n this.deferredEmit('right_axes_changed', this.rightAxes);\n }\n }\n\n _showSeries(singleSeries) {\n const { axis } = singleSeries;\n axis.series.splice(singleSeries.indexInAxis, 0, singleSeries);\n\n this.deferredEmit('axes_changed', this._axes);\n\n if (axis.side === 'left') {\n this.deferredEmit('left_axes_changed', this.leftAxes);\n } else {\n this.deferredEmit('right_axes_changed', this.rightAxes);\n }\n }\n\n /*\n * Getters\n *******************\n */\n\n get boundCalculator() {\n return this._boundsCalculator;\n }\n\n get axes() {\n return this._axes;\n }\n\n get leftAxes() {\n const leftAxes = this._axes.filter(({ side, series }) => side === 'left' && series.length > 0).reverse();\n\n if (leftAxes.length === 0 && this.rightAxes.length === 0) {\n leftAxes.push(this._axes[0]);\n }\n\n return leftAxes;\n }\n\n get rightAxes() {\n return this._axes.filter(({ side, series }) => side === 'right' && series.length > 0 );\n }\n\n get bounds() {\n return this._axes.map(({ targetBounds }) => targetBounds);\n }\n\n get selection() {\n return this._selection;\n }\n\n get globalBounds() {\n return this._globalBounds;\n }\n\n get series() {\n return this._series;\n }\n\n get highlightedSeries() {\n return this._highlightedSeries;\n }\n\n get showIndividualPoints() {\n return this._showIndividualPoints;\n }\n\n get autoscaleY() {\n return this._autoscaleY;\n }\n\n get boundHistory() {\n return {\n hasNextBounds: this._boundsIndex < this._boundsHistory.length - 1,\n hasPreviousBounds: this._boundsIndex > 0\n };\n }\n\n get tooltipState() {\n return this._tooltipState;\n }\n \n get contextMenuState() {\n return this._contextMenuPosition;\n }\n\n get alwaysTooltipped() {\n return this._alwaysTooltipped;\n }\n\n get draggingY() {\n return this._draggingY;\n }\n\n get averageLoopTime() {\n return averageLoopTimes(this._timingBuffer);\n }\n\n get exportedAxes() {\n const axisToName = new Map();\n let leftCount = 0;\n let rightCount = 0;\n\n for (let axis of this._axes) {\n let name;\n if (axis.side === 'left') {\n name = `left-${leftCount}`;\n leftCount++;\n } else {\n name = `right-${rightCount}`;\n rightCount++;\n }\n\n for (let singleSeries of axis.series) {\n axisToName.set(singleSeries, name);\n }\n }\n\n return this.series.map((singleSeries) => {\n return {\n ...singleSeries.originalSeries,\n axis: axisToName.get(singleSeries)\n };\n });\n }\n\n get percentile() {\n return this._percentile;\n }\n\n get percentileAsymmetry() {\n return this._percentileAsymmetry;\n }\n\n get showingOptions() {\n return this._showingOptions;\n }\n\n get maxPrecision() {\n return this._maxPrecision;\n }\n\n get showingSidebar() {\n return this._showingSidebar;\n }\n\n get showingAnnotations() {\n return this._showingAnnotations;\n }\n\n get userCreatedSeries() {\n return this._series.filter((singleSeries) => singleSeries.userCreated);\n }\n\n get grapherID() {\n return this._grapherID;\n }\n\n get annotationState() {\n return this._annotationsState;\n }\n\n get sizing() {\n return this.primaryRenderer && this.primaryRenderer.sizing;\n }\n\n get theme() {\n return this._theme;\n }\n\n get exportMode() {\n return this._exportMode;\n }\n\n get enumMap() {\n return this._enumMap;\n }\n\n get hasXEnum() {\n return this._hasXEnum;\n }\n\n /*\n * Setters / ways to mutate the state that aren't the underlying data changing\n ***********************************************************************************\n */\n\n markSizeChanged(renderer) {\n if (renderer === this.primaryRenderer) {\n this.deferredEmit('primary_size_change', this.primaryRenderer.sizing);\n this.deferredEmit('primary_bounding_rect_change', this.primaryRenderer.boundingRect);\n this._primarySizeChanged = true;\n } else if (renderer === this.rangeGraphRenderer) {\n this.deferredEmit('range_graph_size_change', this.rangeGraphRenderer.sizing);\n this.deferredEmit('range_graph_bounding_rect_change', this.rangeGraphRenderer.boundingRect);\n this._rangeGraphSizeChanged = true;\n }\n\n this._mustRerender = true;\n this._tooltipsChanged = true;\n this._annotationsChanged = true;\n this._mustCallGenerators = true;\n this._markDirty();\n }\n\n set theme(value) {\n this._theme = value;\n this._mustRerender = true;\n this.deferredEmit('theme_change', this._theme);\n this._markDirty();\n }\n\n set exportMode(value) {\n this._exportMode = value;\n\n if (value) {\n this._nonExportTheme = this.theme;\n this.theme = 'export';\n } else {\n this.theme = this._nonExportTheme;\n }\n\n this.deferredEmit('export_mode_change', this._exportMode);\n this._markDirty();\n }\n\n set defaultLineWidth(value) {\n this._defaultLineWidth = value;\n this._mustRerender = true;\n this._markDirty();\n }\n\n set boundCalculator(boundingFunction) {\n if (!boundingFunction) {\n return;\n }\n\n if (boundingFunction === this._boundsCalculator) {\n return;\n }\n\n if (boundingFunction.debounceHistory) {\n clearTimeout(this._boundingCalculatorDebouncer);\n this._boundingCalculatorDebouncer = setTimeout(() => {\n this._addBoundCalculatorToHistory(boundingFunction);\n }, 250);\n } else {\n this._addBoundCalculatorToHistory(boundingFunction);\n }\n\n this._boundsCalculator = boundingFunction;\n this.deferredEmit('bound_calculator_changed', this._boundsCalculator);\n this._dataChanged = true;\n this._mustCallGenerators = true;\n this._markDirty();\n }\n\n set customBoundsSelectors(boundsSelectors) {\n this._customBoundsSelectors = this._customBoundsSelectors || {};\n\n const indexedCustomBoundSelectors = {};\n\n for (let { label, calculator } of boundsSelectors) {\n indexedCustomBoundSelectors[label] = calculator;\n\n if (this._boundsCalculator === this._customBoundsSelectors[label] && this._boundsCalculator !== calculator) {\n this.boundCalculator = calculator;\n }\n }\n\n this._customBoundsSelectors = indexedCustomBoundSelectors;\n }\n\n _addBoundCalculatorToHistory(boundingFunction) {\n this._boundsIndex++;\n this._boundsHistory = this._boundsHistory.slice(0, this._boundsIndex);\n this._boundsHistory.push(boundingFunction);\n this.emit('bound_history_changed', this.boundHistory);\n }\n\n registerSeriesClick(selectedSeriesIndex) {\n this.emit('series_click', this._series[selectedSeriesIndex], selectedSeriesIndex);\n }\n\n setHighlightedSeries(highlightedSeries) {\n this._highlightedSeries = highlightedSeries;\n this.deferredEmit('highlighted_series_changed', highlightedSeries);\n this._mustRerender = true;\n this._markDirty();\n }\n\n toggleIndividualPoints() {\n this._showIndividualPoints = !this._showIndividualPoints;\n this.deferredEmit('show_individual_points_changed', this._showIndividualPoints);\n this._mustRerender = true;\n this._markDirty();\n }\n\n toggleYAutoscaling() {\n this._autoscaleY = !this._autoscaleY;\n this.deferredEmit('autoscale_y_changed', this._autoscaleY);\n this._markDirty();\n }\n\n toggleExportMode() {\n this.exportMode = !this._exportMode;\n }\n\n setBoundsFromSelection(pixelSelection) {\n this.boundCalculator = boundCalculatorFromSelection(pixelSelection, {\n elementWidth: this.primaryRenderer.sizing.elementWidth,\n elementHeight: this.primaryRenderer.sizing.elementHeight,\n selection: this._selection,\n axes: this._axes\n });\n }\n\n nextBounds() {\n this._boundsIndex++;\n this._boundsCalculator = this._boundsHistory[this._boundsIndex];\n this.deferredEmit('bound_calculator_changed', this._boundsCalculator);\n this.deferredEmit('bound_history_changed', this.boundHistory);\n this._dataChanged = true;\n this._markDirty();\n }\n\n previousBounds() {\n this._boundsIndex--;\n this._boundsCalculator = this._boundsHistory[this._boundsIndex];\n this.deferredEmit('bound_calculator_changed', this._boundsCalculator);\n this.deferredEmit('bound_history_changed', this.boundHistory);\n this._dataChanged = true;\n this._markDirty();\n }\n\n setLabel({ axisIndex, label }) {\n this._axes[axisIndex].label = label;\n this.deferredEmit('axes_changed', [...this._axes]);\n this._markDirty();\n }\n\n toggleScale({ axisIndex }) {\n const oldScale = this._axes[axisIndex].scale;\n this._axes[axisIndex].scale = oldScale === 'log' ? 'linear' : 'log';\n\n this._dataChanged = true;\n this.deferredEmit('axes_changed', [...this._axes]);\n this._markDirty();\n }\n\n recalculateTooltips() {\n this.primaryRenderer.recalculatePosition();\n this.setTooltipMousePosition({\n clientX: this._tooltipClientX,\n clientY: this._tooltipClientY,\n shiftKey: this.shiftKeyPressedOnMove,\n tooltipAllNext: this._tooltipAllNext,\n tooltipStateArg: this._tooltipStateArg\n });\n }\n\n setTooltipMousePosition({ clientX, clientY, shiftKey, mouseX, mouseY, tooltipAllNext, tooltipStateArg }) {\n const sizing = this.primaryRenderer.sizing;\n if (!sizing) {\n return;\n }\n\n if (typeof clientX === 'number') {\n this._tooltipClientX = clientX;\n\n if (clientX < sizing.boundingRect.left || clientX > sizing.boundingRect.right) {\n this.showOnlySavedTooltips();\n return;\n }\n } else if (typeof mouseY !== 'number') {\n return;\n }\n\n if (typeof clientY === 'number') {\n this._tooltipClientY = clientY;\n\n if (clientY < sizing.boundingRect.top || clientY > sizing.boundingRect.bottom) {\n this.showOnlySavedTooltips();\n return;\n }\n } else if (typeof mouseY !== 'number') {\n return;\n }\n\n const newMouseX = mouseX || (clientX - sizing.boundingRect.left);\n const newMouseY = mouseY || (clientY - sizing.boundingRect.top);\n if (this._tooltipState.mousePresent && newMouseX === this._tooltipState.mouseX && newMouseY === this._tooltipState.mouseY) {\n return;\n }\n\n this._tooltipsChanged = true;\n this._tooltipState.mousePresent = true;\n this._tooltipState.mouseX = newMouseX;\n this._tooltipState.mouseY = newMouseY;\n this.shiftKeyPressedOnMove = shiftKey;\n this._tooltipAllNext = tooltipAllNext;\n this._tooltipStateArg = tooltipStateArg;\n this._markDirty();\n }\n \n setContextMenuMousePosition({ clientX, clientY }) {\n this._contextMenuPosition = { x: clientX, y: clientY, showing: !this._contextMenuPosition.showing };\n this._contextMenuChanged = true;\n this._markDirty();\n }\n\n toggleAlwaysTooltipped(singleSeries, shiftKey) {\n if (this._alwaysTooltipped.has(singleSeries)) {\n if (shiftKey) {\n this._alwaysTooltipped.clear();\n } else {\n this._alwaysTooltipped.delete(singleSeries);\n }\n } else {\n if (shiftKey) {\n for (let series of this._series) {\n this._alwaysTooltipped.add(series);\n }\n } else {\n this._alwaysTooltipped.add(singleSeries);\n }\n }\n\n this._tooltipsChanged = true;\n this.deferredEmit('always_tooltipped_changed', this._alwaysTooltipped);\n this._markDirty();\n }\n\n showOnlySavedTooltips(tooltipStateArg) {\n if (!this._tooltipState.mousePresent) {\n return;\n }\n\n this._tooltipsChanged = true;\n this._tooltipState.mousePresent = false;\n this._tooltipStateArg = tooltipStateArg;\n this._markDirty();\n }\n\n registerClick({ clientX }) {\n if (!this._listeners['series_click']) {\n return;\n }\n\n const boundingRect = this.primaryRenderer.boundingRect;\n const sizing = this.primaryRenderer.sizing;\n\n for (let series of this._series) {\n const bounds = series.axis.currentBounds;\n\n const x = (clientX - boundingRect.left) / sizing.elementWidth * (bounds.maxX - bounds.minX) + bounds.minX;\n this.emit('series_click', { x, series });\n }\n }\n\n toggleTooltipSaved() {\n const oldSavedTooltips = this._savedTooltips;\n this._savedTooltips = toggleTooltipSaved({\n currentTooltips: this._tooltipState.tooltips,\n savedTooltips: this._savedTooltips\n });\n this._tooltipsChanged = this._savedTooltips !== oldSavedTooltips;\n this._markDirty();\n }\n\n clearSavedTooltips() {\n if (this._savedTooltips.length === 0) {\n return;\n }\n\n this._savedTooltips = [];\n this._tooltipsChanged = true;\n this._markDirty();\n }\n\n markDragStart() {\n if (this._draggingY) {\n return;\n }\n\n this._draggingY = true;\n this.deferredEmit('dragging_y_changed', this._draggingY);\n this._markDirty();\n }\n\n finalizeDrag(draggedSeries, axisIndex, grapherID) {\n if (!this._draggingY) {\n return;\n }\n\n this._draggingY = false;\n this.deferredEmit('dragging_y_changed', this._draggingY);\n\n const hasAxis = axisIndex && axisIndex !== 0;\n const sameGrapherID = grapherID === this._grapherID;\n\n if (hasAxis && sameGrapherID) {\n this._moveAxis(draggedSeries, axisIndex);\n this.deferredEmit('dragging_y_finalized', { draggedSeries, axisIndex, grapherID });\n } else if (grapherID) {\n this.deferredEmit('dragging_y_finalized', { draggedSeries, axisIndex, grapherID });\n }\n\n this._markDirty();\n }\n\n set timingFrameCount(value) {\n if (typeof value !== 'number') {\n return;\n }\n\n this._timingBuffer = [];\n this._timingIndex = 0;\n this._timingFrameCount = value;\n }\n\n set percentile(value) {\n if (value === undefined) {\n return;\n }\n\n this.deferredEmit('percentile_changed', value);\n\n if (value === '') {\n value = 100;\n }\n\n value = parseFloat(value);\n if (!isNaN(value) && value <= 100 && value >= 0) {\n this._percentile = value;\n this._dataChanged = true;\n }\n\n this._markDirty();\n }\n\n set percentileAsymmetry(value) {\n if (value === undefined) {\n return;\n }\n\n this.deferredEmit('percentile_asymmetry_changed', value);\n\n if (value === '') {\n value = 0;\n }\n\n value = parseFloat(value);\n if (!isNaN(value) && value <= 50 && value >= -50) {\n this._percentileAsymmetry = value;\n this._dataChanged = true;\n }\n\n this._markDirty();\n }\n\n set showingOptions(value) {\n if (value === undefined) {\n return;\n }\n\n this._showingOptions = value;\n this.deferredEmit('showing_options_changed', value);\n this._markDirty();\n }\n\n toggleShowingOptions() {\n this.showingOptions = !this.showingOptions;\n }\n\n toggleMaxPrecision() {\n this._maxPrecision = !this._maxPrecision;\n this.deferredEmit('max_precision_changed', this._maxPrecision);\n this._markDirty();\n }\n\n toggleShowingAnnotations() {\n this._showingAnnotations = !this._showingAnnotations;\n this.deferredEmit('showing_annotations_changed', this._showingAnnotations);\n this._markDirty();\n }\n\n toggleShowingSidebar() {\n this._showingSidebar = !this._showingSidebar;\n this.deferredEmit('showing_sidebar_changed', this._showingSidebar);\n this._markDirty();\n }\n\n setShowing(singleSeries, showing) {\n singleSeries.hidden = !showing;\n this._series = [...this._series];\n\n if (singleSeries.hidden) {\n this._hideSeries(singleSeries);\n } else {\n this._showSeries(singleSeries);\n }\n\n this.deferredEmit('series_changed', this._series, { skipResize: true });\n this._dataChanged = true;\n this._markDirty();\n }\n\n set annotations(value) {\n this._annotations = value || [];\n this._annotationsChanged = true;\n this._markDirty();\n }\n\n /**\n * Converts an enum to a number, mutating saved state if necessary to track that\n *\n * @param {String} value\n * @param {Object} singleSeries\n * @param {Boolean} [isX]\n * @return {Number}\n */\n enumToNumber(value, singleSeries, isX) {\n const existingIndex = this._enumMap[value];\n if (typeof existingIndex === 'number') {\n return existingIndex;\n }\n\n const indexToSet = Object.keys(this._enumMap).length;\n this._enumMap[value] = indexToSet;\n\n // safely handle reference changes\n this._series[singleSeries.index].hasEnum = true;\n if (isX) {\n this._series[singleSeries.index].hasXEnum = true;\n this._hasXEnum = true;\n this.deferredEmit('has_x_enum_change', this._hasXEnum);\n this.deferredEmit('x_enum_map_change', this._enumMap);\n }\n\n this.deferredEmit('enum_map_change', this._enumMap);\n\n return indexToSet;\n }\n\n triggerResize() {\n this._mustResize = true;\n this._markDirty();\n }\n}\n","import BOUND_CALCULATORS from './bound_calculators';\n\nexport default function getDefaultBoundsCalculator(givenLabel, customCalculators) {\n if (BOUND_CALCULATORS[givenLabel]) {\n return BOUND_CALCULATORS[givenLabel];\n }\n\n for (let { label, calculator } of customCalculators) {\n if (givenLabel === label) {\n return calculator;\n }\n }\n\n return BOUND_CALCULATORS.all;\n}\n","export default function generatorParamsEqual(a, b) {\n if (a === undefined || b === undefined) {\n return a === b;\n }\n\n return (a.minX === b.minX) &&\n (a.maxX === b.maxX) &&\n (a.sizing.elementWidth === b.sizing.elementWidth) &&\n (a.sizing.renderWidth === b.sizing.renderWidth);\n}\n","import nameForSeries from '../helpers/name_for_series.js';\n\nexport default function calculateAnnotationsState({ annotations, series, sizing, selection }) {\n const shownSeries = new Set(series.map((singleSeries, i) => {\n return {\n name: nameForSeries(singleSeries, i),\n hidden: singleSeries.hidden\n };\n }).filter(({ hidden }) => !hidden).map(({ name }) => name));\n\n const { elementWidth } = sizing;\n const { minX, maxX } = selection;\n\n const renderableAnnotations = annotations.filter((annotation) => {\n if (!annotation.series) {\n return true;\n }\n\n for (let seriesName of annotation.series) {\n if (shownSeries.has(seriesName)) {\n return true;\n }\n }\n\n return false;\n }).map((annotation) => {\n let xAsNumber = annotation.x;\n if (typeof xAsNumber === 'string') {\n xAsNumber = new Date(xAsNumber).valueOf();\n } else if (xAsNumber instanceof Date) {\n xAsNumber = xAsNumber.valueOf();\n }\n\n let xEndAsNumber = annotation.xEnd || xAsNumber;\n if (typeof xEndAsNumber === 'string') {\n xEndAsNumber = new Date(xEndAsNumber).valueOf();\n } else if (xEndAsNumber instanceof Date) {\n xEndAsNumber = xEndAsNumber.valueOf();\n }\n\n const xStart = Math.min(xAsNumber, xEndAsNumber);\n const xEnd = Math.max(xAsNumber, xEndAsNumber);\n\n const pixelX = (xStart - minX)/(maxX - minX) * elementWidth;\n const pixelEnd = (xEnd - minX)/(maxX - minX) * elementWidth;\n const width = Math.max(pixelEnd - pixelX, 1);\n\n return {\n ...annotation,\n pixelX,\n width\n };\n });\n\n return {\n annotations: renderableAnnotations,\n elementWidth\n };\n}\n","export default function selectionFromGlobalBounds(globalBounds, boundsCalculator) {\n const targetBounds = Object.assign({}, globalBounds, boundsCalculator(globalBounds));\n\n if (targetBounds.maxX instanceof Date) {\n targetBounds.maxX = targetBounds.maxX.valueOf();\n }\n\n if (targetBounds.minX instanceof Date) {\n targetBounds.minX = targetBounds.minX.valueOf();\n }\n\n if (targetBounds.maxX < targetBounds.minX) {\n targetBounds.maxX = targetBounds.minX;\n }\n\n if (targetBounds.minX < globalBounds.minX) {\n targetBounds.minX = globalBounds.minX;\n }\n\n if (targetBounds.maxX > globalBounds.maxX) {\n targetBounds.maxX = globalBounds.maxX;\n }\n\n return targetBounds;\n}\n","/**\n *\n * @param {Array<Object>} axes\n * @param {'left'|'right'} [side]\n * @param {String|Number} [number]\n * @return {Object|undefined}\n */\nexport default function findMatchingAxis({ axes, side, number }) {\n if (number) {\n number = parseInt(number) || 0;\n } else {\n number = 0;\n }\n\n let axis;\n let seen = 0;\n for (let candidateAxis of axes) {\n if (candidateAxis.side !== side) {\n continue;\n }\n\n if (seen === number) {\n axis = candidateAxis;\n break;\n }\n\n seen++;\n }\n\n return axis;\n}\n","export function averageLoopTimes(loopTimes) {\n const result = {};\n\n for (let loopTime of loopTimes) {\n for (let [key, value] of Object.entries(loopTime)) {\n result[key] = (result[key] || 0) + value;\n }\n }\n\n for (let [key, value] of Object.entries(result)) {\n result[key] = value/loopTimes.length;\n }\n\n return result;\n}\n","import scaleBounds from '../renderer/scale_bounds';\n\nexport default function boundCalculatorFromSelection({ minPixelX, maxPixelX, minPixelY, maxPixelY}, { elementWidth, elementHeight, selection, axes }) {\n if (Math.abs(maxPixelX - minPixelX) < 1 || Math.abs(maxPixelY - minPixelY) < 1) {\n return;\n }\n\n const minX = (minPixelX/elementWidth)*(selection.maxX - selection.minX) + selection.minX;\n const maxX = (maxPixelX/elementWidth)*(selection.maxX - selection.minX) + selection.minX;\n\n const byAxis = [];\n for (let { currentBounds, scale } of axes) {\n const scaledBounds = scaleBounds({ ...currentBounds, scale });\n let maxY = (1 - minPixelY/elementHeight)*(scaledBounds.maxY - scaledBounds.minY) + scaledBounds.minY;\n let minY = (1 - maxPixelY/elementHeight)*(scaledBounds.maxY - scaledBounds.minY) + scaledBounds.minY;\n\n if (scale === 'log') {\n minY = Math.pow(10, minY);\n maxY = Math.pow(10, maxY);\n }\n byAxis.push({\n minX,\n maxX,\n minY,\n maxY\n });\n }\n\n return () => {\n return {\n minX,\n maxX,\n byAxis\n };\n };\n}\n","import { useState, useEffect } from 'react';\n\nexport function useEvent(eventSource, eventName, initialState=null, watch=[]) {\n if (typeof initialState === 'function') {\n const originalInitialState = initialState;\n initialState = () => originalInitialState;\n }\n\n const [value, setValue] = useState(initialState);\n\n useEffect(() => {\n const listener = (updatedValue) => {\n if (typeof updatedValue === 'function') {\n const originalUpdatedValue = updatedValue;\n updatedValue = () => originalUpdatedValue;\n }\n setValue(updatedValue);\n };\n\n eventSource.on(eventName, listener);\n return () => {\n eventSource.off(eventName, listener);\n };\n }, [...watch, setValue, eventSource]);\n\n return value;\n}\n\nexport function usePrimarySize(stateController) {\n return useEvent(stateController, 'primary_size_change', stateController.primaryRenderer ? stateController.primaryRenderer.sizing : {\n elementWidth: 0,\n elementHeight: 0,\n renderWidth: 0,\n renderHeight: 0\n });\n}\n\nexport function useAxes(stateController) {\n return useEvent(stateController, 'axes_changed', stateController.axes);\n}\n\nexport function useSeries(stateController) {\n return useEvent(stateController, 'series_changed', stateController.series);\n}\n\nexport function useHighlightedSeries(stateController) {\n return useEvent(stateController, 'highlighted_series_changed', stateController.highlightedSeries);\n}\n\nexport function useRightAxisCount(stateController) {\n return useRightAxes(stateController).length;\n}\n\nexport function useLeftAxisCount(stateController) {\n return useLeftAxes(stateController).length;\n}\n\nexport function useRightAxes(stateController) {\n return useEvent(stateController, 'right_axes_changed', stateController.rightAxes);\n}\n\nexport function useLeftAxes(stateController) {\n return useEvent(stateController, 'left_axes_changed', stateController.leftAxes);\n}\n\nexport function useSelection(stateController) {\n return useEvent(stateController, 'selection_changed', stateController.selection);\n}\n\nexport function useGlobalBounds(stateController) {\n return useEvent(stateController, 'global_bounds_changed', stateController.globalBounds);\n}\n\nexport function useAxisBounds(stateController) {\n return useEvent(stateController, 'axis_bounds_changed', stateController.axes.map(({ currentBounds }) => currentBounds));\n}\n\nexport function useBoundCalculator(stateController) {\n return useEvent(stateController, 'bound_calculator_changed', stateController.boundCalculator);\n}\n\nexport function useShowIndividualPoints(stateController) {\n return useEvent(stateController, 'show_individual_points_changed', stateController.showIndividualPoints);\n}\n\nexport function useAutoscaleY(stateController) {\n return useEvent(stateController, 'autoscale_y_changed', stateController.autoscaleY);\n}\n\nexport function useBoundHistory(stateController) {\n return useEvent(stateController, 'bound_history_changed', stateController.boundHistory);\n}\n\nexport function useAlwaysTooltipped(stateController) {\n return useEvent(stateController, 'always_tooltipped_changed', stateController.alwaysTooltipped);\n}\n\nexport function useTooltipState(stateController) {\n return useEvent(stateController, 'tooltip_state_changed', stateController.tooltipState);\n}\n\nexport function useContextMenu(stateController) {\n return useEvent(stateController, 'context_menu_position_changed', stateController.contextMenuState);\n}\n\nexport function useDraggingY(stateController) {\n return useEvent(stateController, 'dragging_y_changed', stateController.draggingY);\n}\n\nexport function usePercentile(stateController) {\n return useEvent(stateController, 'percentile_changed', stateController.percentile);\n}\n\nexport function useShowingOptions(stateController) {\n return useEvent(stateController, 'showing_options_changed', stateController.showingOptions);\n}\n\nexport function useMaxPrecision(stateController) {\n return useEvent(stateController, 'max_precision_changed', stateController.maxPrecision);\n}\n\nexport function usePercentileAsymmetry(stateController) {\n return useEvent(stateController, 'percentile_asymmetry_changed', stateController.percentileAsymmetry);\n}\n\nexport function useShowingSidebar(stateController) {\n return useEvent(stateController, 'showing_sidebar_changed', stateController.showingSidebar);\n}\n\nexport function useShowingAnnotations(stateController) {\n return useEvent(stateController, 'showing_annotations_changed', stateController.showingAnnotations);\n}\n\nexport function useMultiSeries(multigraphStateController) {\n return useEvent(multigraphStateController, 'multi_series_changed', multigraphStateController.multiSeries);\n}\n\nexport function useAnnotationState(stateController) {\n return useEvent(stateController, 'annotations_changed', stateController.annotationState);\n}\n\nexport function useSizing(stateController) {\n return useEvent(stateController, 'primary_size_change', stateController.sizing);\n}\n\nexport function useTheme(stateController) {\n return useEvent(stateController, 'theme_change', stateController.theme);\n}\n\nexport function useExportMode(stateController) {\n return useEvent(stateController, 'export_mode_change', stateController.exportMode);\n}\n\nexport function useHasXEnum(stateController) {\n return useEvent(stateController, 'has_x_enum_change', stateController.hasXEnum);\n}\n\nexport function useEnumMap(stateController) {\n return useEvent(stateController, 'enum_map_change', stateController.enumMap);\n}\n\nexport function useXEnumMap(stateController) {\n return useEvent(stateController, 'x_enum_map_change', stateController.enumMap);\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nexport default class Annotations extends React.PureComponent {\n\n render() {\n const { bodyHeight, annotationState } = this.props;\n const { annotations, elementWidth } = annotationState;\n\n return (\n <div className=\"grapher-annotations\">\n {\n annotations.map(({ pixelX, width, content, lineOnly }, i) => {\n if (lineOnly) {\n return (\n <div key={i} className=\"grapher-annotation\" style={{ left: pixelX }}>\n <div\n className=\"annotation-marker\"\n style={{ width: width, height: bodyHeight }}\n />\n </div>\n );\n }\n\n const textStyle = {\n top: 21*i\n };\n\n if (elementWidth - pixelX < content.length*5.5) {\n textStyle.left = pixelX - elementWidth;\n } else {\n textStyle.left = 0;\n }\n\n return (\n <div key={i} className=\"grapher-annotation\" style={{ left: pixelX }}>\n <div\n className=\"annotation-marker\"\n style={{ width: width, height: bodyHeight }}\n />\n\n <div className=\"annotation-text\" style={textStyle}>\n {content}\n </div>\n </div>\n );\n })\n }\n </div>\n );\n }\n\n}\n\nAnnotations.propTypes = {\n annotationState: PropTypes.shape({\n annotations: PropTypes.arrayOf(PropTypes.object).isRequired,\n elementWidth: PropTypes.number.isRequired\n }),\n bodyHeight: PropTypes.number,\n lineOnly: PropTypes.bool\n};\n","import React from 'react';\nimport CustomPropTypes from '../helpers/custom_prop_types.js';\nimport PropTypes from 'prop-types';\nimport StateController from '../state/state_controller.js';\nimport {LINE_COLORS} from '../helpers/colors.js';\nimport {useAxisBounds, useSizing} from '../state/hooks.js';\n\nexport default React.memo(DraggablePoints);\n\nfunction DraggablePoints({ stateController, draggablePoints, onPointDrag, onDraggablePointsDoubleClick }) {\n const bounds = useAxisBounds(stateController)[0];\n const sizing = useSizing(stateController);\n\n if (!sizing) {\n return null;\n }\n\n const onPointlessDoubleClick = onDraggablePointsDoubleClick && ((event) => {\n const newXT = (event.clientX - sizing.boundingRect.left)/sizing.elementWidth;\n const newYT = 1 - (event.clientY - sizing.boundingRect.top)/sizing.elementHeight;\n\n onDraggablePointsDoubleClick(event, {\n x: newXT*(bounds.maxX - bounds.minX) + bounds.minX,\n y: newYT*(bounds.maxY - bounds.minY) + bounds.minY\n });\n });\n\n return (\n <div className=\"grapher-draggable-points\" onDoubleClick={onPointlessDoubleClick}>\n <svg width={sizing.elementWidth} height={sizing.elementHeight}>\n {\n draggablePoints.map((point, index) => {\n const xT = (point.x - bounds.minX)/(bounds.maxX - bounds.minX);\n const yT = (1 - (point.y - bounds.minY)/(bounds.maxY - bounds.minY));\n\n if (xT < 0 || xT > 1 || yT < 0 || yT > 1) {\n return null;\n }\n\n const pixelX = xT * sizing.elementWidth;\n const pixelY = yT * sizing.elementHeight;\n\n const radius = point.radius || 5;\n const fillColor = point.fillColor || LINE_COLORS[0];\n const strokeColor = point.strokeColor || 'white';\n const strokeWidth = point.strokeWidth || 1;\n\n const onMouseDown = (event) => {\n event.stopPropagation();\n\n if (!onPointDrag) {\n return;\n }\n\n const xOffset = pixelX - event.clientX;\n const yOffset = pixelY - event.clientY;\n\n const onMouseMove = (moveEvent) => {\n const newXT = (moveEvent.clientX + xOffset)/sizing.elementWidth;\n const newYT = 1 - (moveEvent.clientY + yOffset)/sizing.elementHeight;\n\n onPointDrag({\n index,\n point,\n x: newXT*(bounds.maxX - bounds.minX) + bounds.minX,\n y: newYT*(bounds.maxY - bounds.minY) + bounds.minY\n }, moveEvent);\n };\n\n const onMouseUp = () => {\n window.removeEventListener('mousemove', onMouseMove);\n window.removeEventListener('mouseup', onMouseUp);\n };\n\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('mouseup', onMouseUp);\n };\n\n const onClick = point.onClick && ((event) => {\n point.onClick(event, point);\n });\n\n const onDoubleClick = point.onDoubleClick && ((event) => {\n event.stopPropagation();\n point.onDoubleClick(event, point);\n });\n\n return (\n <circle\n key={index}\n cx={pixelX}\n cy={pixelY}\n r={radius}\n fill={fillColor}\n stroke={strokeColor}\n strokeWidth={strokeWidth}\n onMouseDown={onMouseDown}\n onClick={onClick}\n onDoubleClick={onDoubleClick}\n />\n );\n })\n }\n </svg>\n </div>\n );\n}\n\nDraggablePoints.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n draggablePoints: CustomPropTypes.DraggablePoints.isRequired,\n onPointDrag: PropTypes.func,\n onDraggablePointsDoubleClick: PropTypes.func\n};\n","import React from 'react';\nimport CustomPropTypes from '../helpers/custom_prop_types.js';\nimport PropTypes from 'prop-types';\nimport StateController from '../state/state_controller.js';\nimport {useAxisBounds, useSizing} from '../state/hooks.js';\n\nexport default React.memo(VerticalLines);\n\nfunction VerticalLines({ stateController, verticalLines, isRangeGraph, bounds, elementWidth, elementHeight }) {\n bounds = bounds || useAxisBounds(stateController)[0];\n const sizing = useSizing(stateController);\n\n if (!sizing) {\n return null;\n }\n\n const relevantVerticalLines = verticalLines.filter(line => {\n if (isRangeGraph && !line.onRangeGraph) {\n return false;\n }\n\n if (line.onRangeGraphOnly && !isRangeGraph) {\n return false;\n }\n\n return true;\n });\n\n if (relevantVerticalLines.length === 0) {\n return null;\n }\n\n return (\n <div className=\"grapher-vertical-lines\">\n <svg width={elementWidth || sizing.elementWidth} height={elementHeight || sizing.elementHeight}>\n {\n relevantVerticalLines.map((line, index) => {\n if (isRangeGraph && typeof line.onRangeGraph === 'object') {\n line = {\n ...line,\n ...line.onRangeGraph\n };\n }\n\n const xT = (line.x - bounds.minX)/(bounds.maxX - bounds.minX);\n\n if (xT < 0 || xT > 1) {\n return null;\n }\n\n const pixelX = xT * (elementWidth || sizing.elementWidth);\n if (typeof line.minPixelX === 'number' && pixelX < line.minPixelX) {\n return null;\n }\n\n if (typeof line.maxPixelX === 'number' && pixelX > line.maxPixelX) {\n return null;\n }\n\n const lineStyle = {\n stroke: line.color,\n strokeWidth: line.width,\n ...(line.style || {})\n };\n\n const markerStyle = {\n fill: line.color,\n ...(line.markerStyle || {})\n };\n\n const textStyle = {\n ...{\n fontSize: '12px',\n fill: line.color,\n stroke: 'none',\n textAnchor: 'middle',\n dominantBaseline: 'hanging'\n },\n ...(line.textStyle || {})\n };\n\n let lineTop = 0;\n if (typeof line.lineTop === 'number') {\n lineTop = line.lineTop;\n } else if (line.text) {\n lineTop = 18;\n }\n\n let textTop = 5;\n if (typeof line.textTop === 'number') {\n textTop = line.textTop;\n }\n\n return (\n <React.Fragment key={index}>\n <line\n x1={pixelX}\n y1={lineTop}\n x2={pixelX}\n y2={(elementHeight || sizing.elementHeight)}\n style={lineStyle}\n />\n\n {\n line.markTop &&\n <polygon\n points={`${pixelX - 3},0 ${pixelX + 3},0 ${pixelX},3`}\n style={markerStyle}\n />\n }\n\n {\n line.text &&\n <text\n x={pixelX}\n y={textTop}\n style={textStyle}\n >\n {line.text}\n </text>\n }\n </React.Fragment>\n );\n })\n }\n </svg>\n </div>\n );\n}\n\nVerticalLines.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n verticalLines: CustomPropTypes.VerticalLines.isRequired,\n isRangeGraph: PropTypes.bool,\n bounds: PropTypes.object,\n elementWidth: PropTypes.number,\n elementHeight: PropTypes.number\n};\n","import React, { useCallback, useState, useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport CustomPropTypes from '../helpers/custom_prop_types';\nimport GraphBodyRenderer from '../renderer/graph_body_renderer';\nimport Tooltip from './tooltip';\nimport ContextMenu from './context_menu';\nimport StateController from '../state/state_controller';\nimport {\n useAnnotationState,\n useAutoscaleY,\n useAxes,\n useMaxPrecision,\n useShowingAnnotations,\n useTooltipState,\n useContextMenu\n} from '../state/hooks';\nimport Annotations from './annotations.js';\nimport DraggablePoints from './draggable_points.js';\nimport VerticalLines from './vertical_lines.js';\n\nexport default React.memo(GraphBody);\n\nfunction GraphBody({ stateController, webgl, bodyHeight, boundsSelectionEnabled, showTooltips, tooltipOptions, checkIntersection, draggablePoints, onPointDrag, onDraggablePointsDoubleClick, verticalLines, clockStyle, timeZone }) {\n const canvasEl = useCallback((el) => {\n if (stateController.primaryRenderer) {\n stateController.primaryRenderer.dispose();\n }\n\n if (!el) {\n return;\n }\n\n const renderer = new GraphBodyRenderer({\n stateController: stateController,\n canvasElement: el,\n webgl,\n checkIntersection\n });\n\n stateController.primaryRenderer = renderer;\n renderer.resize();\n }, [webgl, stateController]);\n\n\n const [boundsSelection, setBoundsSelection] = useState({\n showing: false,\n start: {},\n style: {}\n });\n\n const autoscaleY = useAutoscaleY(stateController);\n\n const axisCount = useAxes(stateController).length;\n\n const tooltip = useTooltipState(stateController);\n const maxPrecision = useMaxPrecision(stateController);\n const showAnnotations = useShowingAnnotations(stateController);\n const annotationState = useAnnotationState(stateController);\n const contextMenu = useContextMenu(stateController);\n\n const onMouseDown = (event) => {\n if (!boundsSelectionEnabled) {\n return;\n }\n\n let currentNode = event.target;\n for (let i = 0; i < 10 && currentNode; i++) {\n if (currentNode.classList.contains('grapher-tooltip')) {\n return;\n }\n currentNode = currentNode.parentNode;\n }\n\n const boundingRect = stateController.primaryRenderer.boundingRect;\n\n const start = {\n x: event.clientX - boundingRect.left,\n y: event.clientY - boundingRect.top\n };\n\n\n setBoundsSelection({\n showing: true,\n start,\n style: {\n left: start.x,\n top: start.y,\n width: 0,\n height: 0\n }\n });\n\n const onMouseUp = (event) => {\n window.removeEventListener('mouseup', onMouseUp);\n\n if (!boundsSelectionEnabled) {\n return;\n }\n\n const x = event.clientX - boundingRect.left;\n const y = event.clientY - boundingRect.top;\n\n stateController.setBoundsFromSelection({\n minPixelX: Math.min(x, start.x),\n maxPixelX: Math.max(x, start.x),\n minPixelY: Math.min(y, start.y),\n maxPixelY: Math.max(y, start.y)\n });\n\n setBoundsSelection({\n showing: false,\n style: {}\n });\n };\n\n window.addEventListener('mouseup', onMouseUp);\n };\n\n const onMouseMove = (event) => {\n if (boundsSelection.showing) {\n const boundingRect = stateController.primaryRenderer.boundingRect;\n const x = event.clientX - boundingRect.left;\n const y = event.clientY - boundingRect.top;\n\n setBoundsSelection(({ start }) => {\n return {\n showing: true,\n start,\n style: {\n left: Math.min(x, start.x),\n top: autoscaleY ? 0 : Math.min(y, start.y),\n width: Math.abs(x - start.x),\n height: autoscaleY ? boundingRect.height : Math.abs(y - start.y)\n }\n };\n });\n }\n };\n\n useEffect(() => {\n const onScroll = () => {\n if (!showTooltips) {\n return;\n }\n\n stateController.recalculateTooltips();\n };\n\n const onGlobalMouseMove = (event) => {\n if (!showTooltips) {\n return;\n }\n\n stateController.setTooltipMousePosition({\n clientX: event.clientX,\n clientY: event.clientY,\n shiftKey: event.shiftKey\n });\n };\n\n window.addEventListener('scroll', onScroll, { passive: true });\n window.addEventListener('mousemove', onGlobalMouseMove, { passive: true });\n\n return () => {\n window.removeEventListener('scroll', onScroll);\n window.removeEventListener('mousemove', onGlobalMouseMove);\n };\n }, []);\n\n const onMouseLeave = () => {\n stateController.setContextMenuMousePosition({\n showing: false\n });\n };\n\n const onClick = (event) => {\n stateController.registerClick({\n clientX: event.clientX,\n clientY: event.clientY\n });\n\n if (tooltipOptions && tooltipOptions.savingDisabled) {\n stateController.clearSavedTooltips();\n return;\n }\n\n // if it's NOT a child of 'grapher-context-menu', close the context menu\n if (!event.target.closest('.grapher-context-menu')) {\n stateController.setContextMenuMousePosition({\n showing: false\n });\n }\n\n if (!window.getSelection || window.getSelection().type !== 'Range') {\n stateController.toggleTooltipSaved();\n }\n };\n const onDoubleClick = () => {\n stateController.clearSavedTooltips();\n };\n \n const onContextMenu = (event) => {\n event.preventDefault();\n stateController.setContextMenuMousePosition({\n clientX: event.clientX,\n clientY: event.clientY,\n showing: true\n });\n };\n\n return (\n <div className=\"graph-body graph-body-primary\"\n onMouseMove={onMouseMove}\n onMouseLeave={onMouseLeave}\n onMouseDown={onMouseDown}\n onClick={onClick}\n onDoubleClick={onDoubleClick}\n onContextMenu={onContextMenu}\n style={typeof bodyHeight === 'number' ? { height: bodyHeight } : undefined}\n >\n <canvas ref={canvasEl} />\n\n {\n showTooltips &&\n <Tooltip\n axisCount={axisCount}\n maxPrecision={maxPrecision}\n clockStyle={clockStyle}\n timeZone={timeZone}\n {...(tooltipOptions || {})}\n {...tooltip}\n />\n }\n\n {\n contextMenu.showing &&\n <ContextMenu\n contextMenu={contextMenu}\n />\n }\n\n {\n showAnnotations &&\n <Annotations\n bodyHeight={bodyHeight}\n annotationState={annotationState}\n />\n }\n\n {\n verticalLines &&\n <VerticalLines\n stateController={stateController}\n verticalLines={verticalLines}\n />\n }\n\n {\n draggablePoints &&\n <DraggablePoints\n stateController={stateController}\n draggablePoints={draggablePoints}\n onPointDrag={onPointDrag}\n onDraggablePointsDoubleClick={onDraggablePointsDoubleClick}\n />\n }\n\n {\n boundsSelectionEnabled && boundsSelection.showing &&\n <div className=\"bounds-selection\"\n style={boundsSelection.style}\n />\n }\n </div>\n );\n}\n\nGraphBody.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n webgl: PropTypes.bool,\n checkIntersection: PropTypes.bool,\n bodyHeight: PropTypes.number,\n boundsSelectionEnabled: PropTypes.bool.isRequired,\n showTooltips: PropTypes.bool.isRequired,\n tooltipOptions: CustomPropTypes.TooltipOptions,\n verticalLines: CustomPropTypes.VerticalLines,\n draggablePoints: CustomPropTypes.DraggablePoints,\n onPointDrag: PropTypes.func,\n onDraggablePointsDoubleClick: PropTypes.func,\n clockStyle: PropTypes.oneOf(['12h', '24h']),\n timeZone: PropTypes.string\n};\n","\n import API from \"!../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../node_modules/css-loader/dist/cjs.js!../node_modules/sass-loader/dist/cjs.js!./grapher.scss\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../node_modules/css-loader/dist/cjs.js!../node_modules/sass-loader/dist/cjs.js!./grapher.scss\";\n export default content && content.locals ? content.locals : undefined;\n","import {startOfDayInTimezone} from './format';\n\nfunction placeTick(trueValue, {scale, min, max, inverted, totalSize, precision, formatter, dates, justTime, justDate, formatOptions={} }, opts={}) {\n let scaledValue = trueValue;\n\n if (scale === 'log') {\n scaledValue = 10**trueValue;\n }\n\n let percent = (trueValue - min)/(max - min);\n if (inverted) {\n percent = 1.0 - percent;\n }\n\n let pixelValue = percent * totalSize;\n if (isNaN(pixelValue)) {\n pixelValue = 0;\n }\n\n return {\n pixelValue,\n trueValue: scaledValue,\n label: formatter(scaledValue, { ...formatOptions, precision, log: scale === 'log', dates, justTime, justDate }),\n size: 'major',\n ...opts\n };\n}\n\nfunction placeTickByPixel(pixelValue, {scale, min, max, inverted, totalSize, precision, formatter, dates, justTime, justDate, formatOptions={} }, opts={}) {\n let percent = pixelValue/totalSize;\n if (inverted) {\n percent = 1.0 - percent;\n }\n\n let trueValue = percent * (max - min) + min;\n\n if (scale === 'log') {\n trueValue = Math.pow(10, trueValue);\n }\n\n return {\n pixelValue,\n trueValue,\n label: formatter(trueValue, { ...formatOptions, precision, log: scale === 'log', dates, justTime, justDate }),\n size: 'major',\n ...opts\n };\n}\n\nfunction roundToEvenNumber(value, tickSpacing) {\n return Math.round(value/tickSpacing)*tickSpacing;\n}\n\nfunction getEvenTickSpacing(span, desiredCount) {\n const subspan = span/desiredCount;\n\n const precision = -Math.log10(Math.abs(subspan)) + 1;\n const multiplier = (precision - Math.floor(precision)) > 0.5 ? 2 : 1;\n\n const roundTo = 10**Math.floor(precision) * multiplier;\n\n return Math.round(subspan * roundTo)/roundTo;\n}\n\nfunction roundToDivisor(value, divisor) {\n if (value <= 1) {\n return 1;\n }\n\n if (divisor === 1) {\n return Math.round(value);\n }\n\n if (value >= divisor) {\n return Math.round(value/divisor)*divisor;\n }\n\n let divisors;\n if (divisor === 24) {\n divisors = [1, 2, 6, 12, 24];\n } else if (divisor === 60) {\n divisors = [1, 2, 5, 10, 15, 30, 60];\n } else {\n throw new Error('Invalid divisor');\n }\n\n let bestDelta = Infinity;\n let bestDivisor = 1;\n for (let i = 0; i < divisors.length; i++) {\n const delta = Math.abs(divisors[i] - value);\n if (delta < bestDelta) {\n bestDivisor = divisors[i];\n bestDelta = delta;\n }\n }\n\n return bestDivisor;\n}\n\nfunction getEvenDateTickSpacing(span, desiredCount, unitOverride) {\n const subspan = span / desiredCount;\n\n if (subspan < 60*1000 && (!unitOverride || unitOverride === 'second')) {\n return {\n amount: roundToDivisor(subspan/1000, 60),\n unit: 's'\n };\n }\n\n if (subspan < 60*60*1000 && (!unitOverride || unitOverride === 'minute')) {\n return {\n amount: roundToDivisor(subspan/(60*1000), 60),\n unit: 'm'\n };\n }\n\n if (subspan < 24*60*60*1000 && (!unitOverride || unitOverride === 'hour')) {\n return {\n amount: roundToDivisor(subspan/(60*60*1000), 24),\n unit: 'h'\n };\n }\n\n if (unitOverride === 'day' || (subspan < 30*24*60*60*1000 && !unitOverride)) {\n return {\n amount: roundToDivisor(subspan/(24*60*60*1000), 1),\n unit: 'd'\n };\n }\n\n if (subspan > 30*24*60*60*1000 && (!unitOverride || unitOverride === 'month')) {\n return {\n amount: roundToDivisor(subspan/30*24*60*60*1000, 1),\n unit: 'month'\n };\n }\n\n if (unitOverride === 'year') {\n return {\n amount: roundToDivisor(subspan/365*24*60*60*1000, 1),\n unit: 'year'\n };\n }\n\n return {\n unit: 'm',\n amount: 60\n };\n}\n\nfunction placeNumbersGrid({ min, max, precision, expectedLabelSize, labelPadding, totalSize, scale='linear', formatter, inverted=false, formatOptions }) {\n const paddedLabelSize = expectedLabelSize + 2*labelPadding;\n\n const ticks = [];\n const placementParams = {scale, min, max, inverted, totalSize, precision, formatter, formatOptions, dates: false };\n\n const labelCount = Math.floor((totalSize - expectedLabelSize*2)/paddedLabelSize);\n const tickSpacing = getEvenTickSpacing(max - min, labelCount);\n if (tickSpacing > 0) {\n for (let value = roundToEvenNumber(min, tickSpacing); value < max; value += tickSpacing) {\n ticks.push(placeTick(value, placementParams));\n }\n }\n\n if (ticks.length) {\n if (inverted && ticks[ticks.length - 1].pixelValue > labelPadding) {\n ticks.push(placeTickByPixel(expectedLabelSize / 2, placementParams));\n }\n }\n\n return ticks.filter(({ pixelValue }) => pixelValue <= totalSize && pixelValue >= 0);\n}\n\nfunction placeDatesGrid({ min, max, precision, expectedLabelSize, labelPadding, totalSize, skipFirst=false, skipLast=false, scale='linear', formatter, inverted=false, formatOptions }) {\n const paddedLabelSize = expectedLabelSize + 2*labelPadding;\n\n const ticks = [];\n const placementParams = {scale, min, max, inverted, totalSize, precision, formatter, formatOptions, dates: true };\n\n const { amount, unit } = getEvenDateTickSpacing(max - min, totalSize/paddedLabelSize, formatOptions.unitOverride);\n\n const justDate = unit === 'month';\n\n if (!skipFirst) {\n ticks.push(placeTickByPixel(0, {...placementParams, justDate}, {position: 'first'}));\n }\n\n let currentDate = new Date(min);\n\n if (unit === 'h') {\n currentDate.setMinutes(0, 0, 0);\n } else if (unit === 'm') {\n currentDate.setSeconds(0, 0);\n } else if (unit === 's') {\n currentDate.setMilliseconds(0);\n } else if (unit === 'month') {\n currentDate = startOfDayInTimezone(currentDate, formatOptions.timeZone);\n currentDate.setDate(1);\n } else if (unit === 'd') {\n currentDate = startOfDayInTimezone(currentDate, formatOptions.timeZone);\n }\n\n let lastDateString = formatter(currentDate, {...formatOptions, ...placementParams, justDate: true });\n while (currentDate < max) {\n let delta = 24*60*60*1000;\n\n if (unit === 'h') {\n delta = (amount - currentDate.getHours() % amount)*60*60*1000;\n } else if (unit === 'm') {\n delta = (amount - currentDate.getMinutes() % amount)*60*1000;\n } else if (unit === 's') {\n delta = (amount - currentDate.getSeconds() % amount)*1000;\n } else if (unit === 'month') {\n delta = 0;\n if (currentDate.getMonth() === 11) {\n currentDate = new Date(currentDate.getFullYear() + 1, 0, 1);\n } else {\n currentDate = new Date(currentDate.getFullYear(), currentDate.getMonth() + 1, 1);\n }\n } else if (unit === 'year') {\n currentDate = new Date(currentDate.getFullYear() + 1, 0, 0);\n }\n\n currentDate = new Date(currentDate.valueOf() + delta);\n\n const justTime = formatter(currentDate, {...formatOptions, ...placementParams, justDate: true }) === lastDateString;\n\n const tick = placeTick(currentDate, {...placementParams, justTime, justDate});\n\n if (ticks.length && (tick.pixelValue - ticks[ticks.length - 1].pixelValue) < (expectedLabelSize + (labelPadding || 0))) {\n continue;\n }\n\n if (tick.pixelValue + expectedLabelSize/2 >= totalSize) {\n continue;\n }\n\n ticks.push(tick);\n lastDateString = formatter(currentDate, {...formatOptions, ...placementParams, justDate: true });\n }\n\n const justTime = lastDateString === formatter(max, {...formatOptions, ...placementParams, justDate: true });\n\n if (!skipLast && ticks[ticks.length - 1].pixelValue + expectedLabelSize < totalSize) {\n ticks.push(placeTickByPixel(totalSize, {...placementParams, justTime, justDate}, {position: 'last'}));\n }\n\n return ticks.filter(({ pixelValue }) => pixelValue <= totalSize && pixelValue >= 0);\n}\n\nexport default function placeGrid(opts) {\n if (opts.dates) {\n return placeDatesGrid(opts);\n } else {\n return placeNumbersGrid(opts);\n }\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport {calculatePrecision, calculateTimePrecision, formatX} from '../helpers/format';\nimport placeGrid from '../helpers/place_grid';\nimport {useEnumMap, useHasXEnum, usePrimarySize, useSelection} from '../state/hooks';\nimport StateController from '../state/state_controller';\n\nexport default React.memo(XAxis);\n\nfunction XAxis({ showAxes, showGrid, stateController, bigLabels, xTickUnit, clockStyle, timeZone, integersOnly, formatXAxisLabel }) {\n if (!showAxes && !showGrid) {\n return null;\n }\n\n const { elementWidth, elementHeight } = usePrimarySize(stateController);\n const {minX, maxX, dates} = useSelection(stateController);\n const hasXEnum = useHasXEnum(stateController);\n const enumMap = useEnumMap(stateController);\n\n let precision;\n if (dates) {\n precision = calculateTimePrecision(minX, maxX);\n } else {\n precision = calculatePrecision(maxX - minX);\n }\n\n let inverseEnumMap = null;\n if (hasXEnum) {\n inverseEnumMap = {};\n for (const [key, value] of Object.entries(enumMap)) {\n inverseEnumMap[value] = key;\n }\n }\n\n const formatOptions = {\n unitOverride: xTickUnit,\n clockStyle,\n timeZone,\n integersOnly,\n inverseEnumMap,\n formatter: formatXAxisLabel\n };\n\n const minLabel = formatX(minX, {...formatOptions, dates, precision }).toString();\n const maxLabel = formatX(maxX, {...formatOptions, dates, precision }).toString();\n\n let expectedLabelWidth = Math.max(minLabel.length, maxLabel.length) * 4;\n if (bigLabels) {\n expectedLabelWidth *= 2;\n }\n\n const labelPadding = 30; // space in between labels in the expected case\n\n const ticks = placeGrid({\n min: minX,\n max: maxX,\n totalSize: elementWidth,\n precision,\n dates,\n formatter: formatXAxisLabel || formatX,\n expectedLabelSize: expectedLabelWidth,\n labelPadding,\n formatOptions\n });\n\n const xAxisHeight = 20;\n\n return (\n <svg className=\"axis x-axis\" style={showAxes ? undefined : {marginBottom: -20}}>\n {\n showAxes &&\n <path d={`M-1,0 H${elementWidth}`} className=\"axis-line\" />\n }\n {\n showAxes &&\n <path d={`M-2,1 H${elementWidth + 1}`} className=\"axis-line-shadow\" />\n }\n\n {\n ticks.map(({ pixelValue, label, size, position, skipGrid }, i) => {\n if (isNaN(pixelValue)) {\n return null;\n }\n\n const classes = ['axis-item', `axis-item-${size}`, `axis-item-${position}`];\n if (bigLabels) {\n classes.push('axis-item-big-labels');\n }\n\n return (\n <g key={i} className={classes.join(' ')}>\n {\n showAxes &&\n <path d={`M${pixelValue},1 v6`} className=\"axis-tick\" />\n }\n\n {\n showGrid && !skipGrid &&\n <path d={`M${pixelValue},0 v-${elementHeight}`} />\n }\n\n {\n showAxes &&\n <text x={pixelValue} y={xAxisHeight - 5}>\n {label}\n </text>\n }\n </g>\n );\n })\n }\n </svg>\n );\n}\n\nXAxis.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n showAxes: PropTypes.bool.isRequired,\n showGrid: PropTypes.bool.isRequired,\n bigLabels: PropTypes.bool,\n xTickUnit: PropTypes.oneOf(['year']),\n clockStyle: PropTypes.oneOf(['12h', '24h']),\n timeZone: PropTypes.string,\n integersOnly: PropTypes.bool,\n formatXAxisLabel: PropTypes.func\n};\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport {calculatePrecision, formatY} from '../helpers/format';\nimport {Y_AXIS_WIDTH, BIG_Y_AXIS_LABEL_OFFSET} from '../helpers/axis_sizes';\nimport scaleBounds from '../renderer/scale_bounds';\nimport getColor from '../helpers/colors';\nimport placeGrid from '../helpers/place_grid';\nimport {useAxes, useAxisBounds, useHighlightedSeries, usePrimarySize} from '../state/hooks';\nimport StateController from '../state/state_controller';\nimport CustomPropTypes from '../helpers/custom_prop_types';\n\nexport default React.memo(YAxis);\n\nfunction YAxis({ stateController, showAxes, showGrid, showSeriesKey, axis, sideIndex, bodyHeight, theme, grapherID, dragPositionYOffset=0, bigLabels, showAxisColors }) {\n if (!showAxes && !showGrid) {\n return null;\n }\n\n const { side, scale, axisIndex, label } = useAxes(stateController)[axis.axisIndex];\n\n const { elementWidth, elementHeight } = usePrimarySize(stateController);\n let { minY, maxY } = useAxisBounds(stateController)[axisIndex];\n\n const scaledBounds = scaleBounds({ minY, maxY, scale});\n minY = scaledBounds.minY;\n maxY = scaledBounds.maxY;\n\n const ticks = placeGrid({\n min: minY,\n max: maxY,\n totalSize: elementHeight,\n scale,\n precision: calculatePrecision(maxY - minY),\n formatter: formatY,\n inverted: true,\n expectedLabelSize: bigLabels ? 20 : 10,\n labelPadding: 30\n });\n\n const colorBoxSize = 10;\n const colorBoxPadding = 4;\n\n let sidePadding = 5;\n\n if (scale === 'log') {\n sidePadding = 2;\n }\n\n const highlightedSeries = useHighlightedSeries(stateController);\n\n const [draggedSeries, setDraggedSeries] = useState(null);\n const [dragDelta, setDragDelta] = useState({ dx: 0, dy: 0 });\n\n const startDrag = (event, singleSeries) => {\n let startX = event.clientX;\n let startY = event.clientY;\n\n if (side === 'left') {\n startX += Y_AXIS_WIDTH;\n }\n\n if (side === 'right') {\n startX -= Y_AXIS_WIDTH;\n }\n\n setDragDelta({\n dx: 0,\n dy: 0\n });\n\n const onMouseMove = (moveEvent) => {\n setDragDelta({\n dx: moveEvent.clientX - startX,\n dy: moveEvent.clientY - startY\n });\n };\n\n const onMouseUp = (mouseUpEvent) => {\n window.removeEventListener('mousemove', onMouseMove);\n window.removeEventListener('mouseup', onMouseUp);\n\n let target = mouseUpEvent.target;\n while (target && !(target.dataset || {}).axisIndex) {\n target = target.parentNode;\n }\n\n setDraggedSeries(null);\n stateController.finalizeDrag(singleSeries, target && (target.dataset || {}).axisIndex, target && (target.dataset || {}).grapherId);\n };\n\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('mouseup', onMouseUp);\n\n setDraggedSeries(singleSeries);\n stateController.markDragStart();\n };\n\n const highlightedOpacity = theme === 'day' ? 1.0 : 0.5;\n const unhighlightedOpacity = theme === 'day' ? 0.8 : 0.3;\n\n return (\n <svg className={`axis y-axis y-axis-${side}`}\n data-axis-index={axisIndex}\n data-grapher-id={grapherID}\n style={{\n width: Y_AXIS_WIDTH,\n marginLeft: showAxes ? undefined : -Y_AXIS_WIDTH,\n height: typeof bodyHeight === 'number' ? bodyHeight : undefined\n }}\n >\n {\n showAxes &&\n showAxisColors &&\n axis.series.map((singleSeries, i) => {\n const height = elementHeight/axis.series.length;\n\n return (\n <rect\n x={side === 'left' ? 0 : 2}\n y={i*height}\n width={Y_AXIS_WIDTH - 2}\n height={height}\n key={singleSeries.index}\n fill={getColor(singleSeries.color, singleSeries.index, singleSeries.multigrapherSeriesIndex)}\n opacity={singleSeries.index === highlightedSeries ? highlightedOpacity : unhighlightedOpacity}\n data-element-height={elementHeight}\n data-series-length={axis.series.length}\n />\n );\n })\n }\n\n {\n showAxes &&\n <path d={`M${side === 'left' ? Y_AXIS_WIDTH-1 : 1},3 V${elementHeight}`} className=\"axis-line\" />\n }\n\n {\n showAxes &&\n <path d={`M${side === 'left' ? Y_AXIS_WIDTH-2 : 0},3 V${elementHeight + 1}`} className=\"axis-line-shadow\" />\n }\n\n {\n ticks.map(({ pixelValue, label, size, skipGrid }, i) => {\n const edge = side === 'left' ? (sideIndex + 1) * Y_AXIS_WIDTH : -sideIndex*Y_AXIS_WIDTH;\n const length = (side === 'left' ? 1 : - 1) * (elementWidth+1);\n\n const classes = ['axis-item', `axis-item-${size}`];\n if (bigLabels) {\n classes.push('axis-item-big-labels');\n }\n\n return (\n <g key={i} className={classes.join(' ')}>\n {\n showGrid &&\n !skipGrid &&\n <path d={`M${edge},${pixelValue} h${length}`} />\n }\n\n {\n showGrid &&\n !skipGrid &&\n sideIndex > 0 &&\n <path\n d={`M${side === 'left' ? Y_AXIS_WIDTH : 0},${pixelValue} h${(side === 'left' ? 1 : -1) * sideIndex * Y_AXIS_WIDTH}`}\n strokeDasharray={'2,2'}\n />\n }\n\n {\n showAxes &&\n <text x={side === 'left' ? Y_AXIS_WIDTH-sidePadding : sidePadding} y={pixelValue}>\n {label}\n </text>\n }\n </g>\n );\n })\n }\n\n {\n showSeriesKey && showAxes &&\n axis.series.map((singleSeries, i) => {\n\n let x = (Y_AXIS_WIDTH - colorBoxSize - colorBoxPadding) + (i % 2 - 1)*(colorBoxSize + colorBoxPadding);\n let y = -(colorBoxPadding + colorBoxSize) * Math.ceil(axis.series.length / 2) + (colorBoxSize + colorBoxPadding) * Math.floor(i / 2);\n\n if (singleSeries === draggedSeries) {\n x += dragDelta.dx;\n y += dragDelta.dy - dragPositionYOffset;\n }\n\n return (\n <rect\n className=\"series-color-box\"\n onMouseDown={(event) => startDrag(event, singleSeries)}\n x={x}\n y={y}\n width={colorBoxSize}\n height={colorBoxSize}\n key={singleSeries.index}\n fill={getColor(singleSeries.color, singleSeries.index, singleSeries.multigrapherSeriesIndex)}\n onMouseOver={() => stateController.setHighlightedSeries(singleSeries.index)}\n onMouseOut={() => stateController.setHighlightedSeries(null)}\n />\n );\n })\n }\n\n {\n showAxes && !!label &&\n <text\n className={`y-axis-label${bigLabels ? ' y-axis-big-label' : ''}`}\n x={side === 'left' ? 10 : Y_AXIS_WIDTH - 10}\n y={elementHeight/2 + (side === 'left' ? -1 : 1)*(axisIndex + 1)*(bigLabels ? BIG_Y_AXIS_LABEL_OFFSET : 0)}\n transform={`rotate(${side === 'left' ? -90 : 90}, ${side === 'left' ? 10 : Y_AXIS_WIDTH - 10}, ${elementHeight/2})`}\n >\n {label}\n </text>\n }\n </svg>\n );\n}\n\nYAxis.propTypes = {\n stateController: PropTypes.instanceOf(StateController),\n showAxes: PropTypes.bool.isRequired,\n showGrid: PropTypes.bool.isRequired,\n showAxisColors: PropTypes.bool.isRequired,\n showSeriesKey: PropTypes.bool.isRequired,\n axis: CustomPropTypes.Axis.isRequired,\n sideIndex: PropTypes.number.isRequired,\n bodyHeight: PropTypes.number,\n theme: PropTypes.string,\n grapherID: PropTypes.string,\n dragPositionYOffset: PropTypes.number,\n bigLabels: PropTypes.bool\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nexport default React.memo(RangeSelectionButtonBase);\n\nfunction RangeSelectionButtonBase({ selected, disabled, className, onClick, children, description }) {\n const classes = [\n 'range-button'\n ];\n\n if (selected) {\n classes.push('range-button-selected');\n }\n\n if (disabled) {\n classes.push('range-button-disabled');\n }\n\n if (className) {\n classes.push(className);\n }\n\n if (description) {\n classes.push('option-tooltip');\n }\n\n return (\n <div\n className={classes.join(' ')}\n onClick={onClick && ((event) => disabled || onClick(event))}\n >\n {children}\n\n {\n description &&\n <div className=\"option-tooltip-text\">\n {description}\n </div>\n }\n </div>\n );\n}\n\nRangeSelectionButtonBase.propTypes = {\n selected: PropTypes.bool.isRequired,\n onClick: PropTypes.func,\n children: PropTypes.node.isRequired,\n disabled: PropTypes.bool,\n className: PropTypes.string,\n description: PropTypes.string\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport RangeSelectionButtonBase from './range_selection_button_base';\nimport StateController from '../state/state_controller';\n\nexport default React.memo(RangeSelectionButton);\n\nfunction RangeSelectionButton({ stateController, currentBoundCalculator, boundCalculator, children, disabled }) {\n return (\n <RangeSelectionButtonBase\n selected={currentBoundCalculator === boundCalculator}\n onClick={() => stateController.boundCalculator = boundCalculator}\n disabled={disabled}\n >\n {children}\n </RangeSelectionButtonBase>\n );\n}\n\nRangeSelectionButton.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n boundCalculator: PropTypes.func.isRequired,\n currentBoundCalculator: PropTypes.func.isRequired,\n children: PropTypes.node.isRequired,\n disabled: PropTypes.bool\n};\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport RangeSelectionButtonBase from './range_selection_button_base';\nimport StateController from '../state/state_controller';\nimport {usePercentile, usePercentileAsymmetry} from '../state/hooks';\n\nexport default React.memo(PercentileButton);\n\nfunction PercentileButton({ stateController }) {\n const percentile = usePercentile(stateController);\n const percentileAsymmetry = usePercentileAsymmetry(stateController);\n const [showing, setShowing] = useState(false);\n\n return ([\n showing ? <RangeSelectionButtonBase\n key=\"asymmetry button\"\n className=\"percentile-button\"\n selected={true}\n description=\"Percentile asymmetry\"\n >\n <input\n onClick={(e) => e.stopPropagation()}\n value={percentileAsymmetry}\n onChange={(e) => stateController.percentileAsymmetry = e.target.value}\n onKeyUp={(e) => e.keyCode === 13 && setShowing(false)}\n type=\"number\"\n min={-50}\n max={50}\n />\n\n <div className=\"icon-container icon-container-square\">\n <svg focusable=\"false\" viewBox=\"0 0 512 512\">\n <path fill=\"currentColor\" d=\"M240 96h64a16 16 0 0 0 16-16V48a16 16 0 0 0-16-16h-64a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16zm0 128h128a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16H240a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16zm256 192H240a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h256a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm-256-64h192a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16H240a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16zM16 160h48v304a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16V160h48c14.21 0 21.39-17.24 11.31-27.31l-80-96a16 16 0 0 0-22.62 0l-80 96C-5.35 142.74 1.78 160 16 160z\" />\n </svg>\n </div>\n </RangeSelectionButtonBase>: null,\n\n <RangeSelectionButtonBase\n key=\"main-button\"\n className=\"percentile-button\"\n selected={showing || parseFloat(percentile) !== 100}\n onClick={() => setShowing(!showing)}\n description=\"Edit percentile\"\n >\n {\n showing &&\n <div>\n <input\n onClick={(e) => e.stopPropagation()}\n autoFocus={true}\n value={percentile}\n onChange={(e) => stateController.percentile = e.target.value}\n onKeyUp={(e) => e.keyCode === 13 && setShowing(false)}\n type=\"number\"\n min={0}\n max={100}\n />\n </div>\n }\n\n <div className=\"icon-container icon-container-narrow\">\n <svg focusable=\"false\" viewBox=\"0 0 448 512\">\n <path fill=\"currentColor\" d=\"M112 224c61.9 0 112-50.1 112-112S173.9 0 112 0 0 50.1 0 112s50.1 112 112 112zm0-160c26.5 0 48 21.5 48 48s-21.5 48-48 48-48-21.5-48-48 21.5-48 48-48zm224 224c-61.9 0-112 50.1-112 112s50.1 112 112 112 112-50.1 112-112-50.1-112-112-112zm0 160c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48zM392.3.2l31.6-.1c19.4-.1 30.9 21.8 19.7 37.8L77.4 501.6a23.95 23.95 0 0 1-19.6 10.2l-33.4.1c-19.5 0-30.9-21.9-19.7-37.8l368-463.7C377.2 4 384.5.2 392.3.2z\" />\n </svg>\n </div>\n </RangeSelectionButtonBase>\n ]);\n}\n\nPercentileButton.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired\n};\n","import React from 'react';\nimport PercentileButton from './percentile_button';\nimport RangeSelectionButtonBase from './range_selection_button_base';\nimport {\n useAutoscaleY,\n useMaxPrecision,\n useShowIndividualPoints, useShowingAnnotations,\n useShowingSidebar, useTheme\n} from '../state/hooks';\nimport PropTypes from 'prop-types';\nimport StateController from '../state/state_controller';\n\nexport default React.memo(Options);\n\nfunction Options({stateController, sidebarEnabled}) {\n\n const showIndividualPoints = useShowIndividualPoints(stateController);\n const autoscaleY = useAutoscaleY(stateController);\n const maxPrecision = useMaxPrecision(stateController);\n const showingSidebar = useShowingSidebar(stateController);\n const showingAnnotations = useShowingAnnotations(stateController);\n const theme = useTheme(stateController);\n\n return (\n <div className=\"options-bar\">\n {\n sidebarEnabled &&\n <RangeSelectionButtonBase\n selected={showingSidebar}\n onClick={() => stateController.toggleShowingSidebar()}\n description=\"Show sidebar\"\n >\n <div className=\"icon-container icon-container-square\">\n <svg focusable=\"false\" viewBox=\"0 0 512 512\">\n <path fill=\"currentColor\"\n d=\"M464 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V80c0-26.51-21.49-48-48-48zM224 416H64V160h160v256zm224 0H288V160h160v256z\"/>\n </svg>\n </div>\n </RangeSelectionButtonBase>\n }\n\n <RangeSelectionButtonBase\n selected={theme === 'export'}\n onClick={() => stateController.toggleExportMode()}\n description=\"Export mode\"\n >\n <div className=\"icon-container icon-container-square\">\n <svg focusable=\"false\" viewBox=\"0 0 512 512\">\n <path fill=\"currentColor\"\n d=\"M167.02 309.34c-40.12 2.58-76.53 17.86-97.19 72.3-2.35 6.21-8 9.98-14.59 9.98-11.11 0-45.46-27.67-55.25-34.35C0 439.62 37.93 512 128 512c75.86 0 128-43.77 128-120.19 0-3.11-.65-6.08-.97-9.13l-88.01-73.34zM457.89 0c-15.16 0-29.37 6.71-40.21 16.45C213.27 199.05 192 203.34 192 257.09c0 13.7 3.25 26.76 8.73 38.7l63.82 53.18c7.21 1.8 14.64 3.03 22.39 3.03 62.11 0 98.11-45.47 211.16-256.46 7.38-14.35 13.9-29.85 13.9-45.99C512 20.64 486 0 457.89 0z\" />\n </svg>\n </div>\n </RangeSelectionButtonBase>\n\n <RangeSelectionButtonBase\n selected={showingAnnotations}\n onClick={() => stateController.toggleShowingAnnotations()}\n description=\"Show annotations\"\n >\n <div className=\"icon-container icon-container-448\">\n <svg focusable=\"false\" viewBox=\"0 0 448 512\">\n <path fill=\"currentColor\" d=\"M432 416h-23.41L277.88 53.69A32 32 0 0 0 247.58 32h-47.16a32 32 0 0 0-30.3 21.69L39.41 416H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h128a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16h-19.58l23.3-64h152.56l23.3 64H304a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h128a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zM176.85 272L224 142.51 271.15 272z\" />\n </svg>\n </div>\n </RangeSelectionButtonBase>\n\n <PercentileButton stateController={stateController} />\n\n <RangeSelectionButtonBase\n selected={maxPrecision}\n onClick={() => stateController.toggleMaxPrecision()}\n description=\"Max precision\"\n >\n <div className=\"icon-container icon-container-square\">\n <svg focusable=\"false\" viewBox=\"0 0 512 512\">\n <path fill=\"currentColor\" d=\"M478.21 334.093L336 256l142.21-78.093c11.795-6.477 15.961-21.384 9.232-33.037l-19.48-33.741c-6.728-11.653-21.72-15.499-33.227-8.523L296 186.718l3.475-162.204C299.763 11.061 288.937 0 275.48 0h-38.96c-13.456 0-24.283 11.061-23.994 24.514L216 186.718 77.265 102.607c-11.506-6.976-26.499-3.13-33.227 8.523l-19.48 33.741c-6.728 11.653-2.562 26.56 9.233 33.037L176 256 33.79 334.093c-11.795 6.477-15.961 21.384-9.232 33.037l19.48 33.741c6.728 11.653 21.721 15.499 33.227 8.523L216 325.282l-3.475 162.204C212.237 500.939 223.064 512 236.52 512h38.961c13.456 0 24.283-11.061 23.995-24.514L296 325.282l138.735 84.111c11.506 6.976 26.499 3.13 33.227-8.523l19.48-33.741c6.728-11.653 2.563-26.559-9.232-33.036z\" />\n </svg>\n </div>\n </RangeSelectionButtonBase>\n\n <RangeSelectionButtonBase\n selected={autoscaleY}\n onClick={() => stateController.toggleYAutoscaling()}\n description=\"Autoscale y axis\"\n >\n <div className=\"icon-container\">\n <svg focusable=\"false\" viewBox=\"0 0 256 512\">\n <path fill=\"currentColor\" d=\"M168 416c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h88v-64h-88c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h88v-64h-88c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h88v-64h-88c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h88V32c0-17.67-14.33-32-32-32H32C14.33 0 0 14.33 0 32v448c0 17.67 14.33 32 32 32h192c17.67 0 32-14.33 32-32v-64h-88z\"/>\n </svg>\n </div>\n </RangeSelectionButtonBase>\n\n <RangeSelectionButtonBase\n selected={showIndividualPoints}\n onClick={() => stateController.toggleIndividualPoints()}\n description=\"Show individual points\"\n >\n <div className=\"icon-container icon-container-narrow\">\n <svg focusable=\"false\" viewBox=\"0 0 192 512\">\n <path fill=\"currentColor\" d=\"M96 184c39.8 0 72 32.2 72 72s-32.2 72-72 72-72-32.2-72-72 32.2-72 72-72zM24 80c0 39.8 32.2 72 72 72s72-32.2 72-72S135.8 8 96 8 24 40.2 24 80zm0 352c0 39.8 32.2 72 72 72s72-32.2 72-72-32.2-72-72-72-72 32.2-72 72z\" />\n </svg>\n </div>\n </RangeSelectionButtonBase>\n </div>\n );\n}\n\nOptions.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n sidebarEnabled: PropTypes.bool\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport RangeSelectionButton from './range_selection_button';\nimport RangeSelectionButtonBase from './range_selection_button_base';\nimport {Y_AXIS_WIDTH} from '../helpers/axis_sizes';\nimport CustomPropTypes from '../helpers/custom_prop_types';\nimport StateController from '../state/state_controller';\nimport {\n useBoundCalculator, useBoundHistory,\n useGlobalBounds,\n useLeftAxisCount,\n useRightAxisCount,\n useShowingOptions\n} from '../state/hooks';\nimport BOUND_CALCULATORS from '../state/bound_calculators';\nimport Options from './options';\n\nexport default React.memo(RangeSelection);\n\nfunction RangeSelection({stateController, customBoundsSelectors, customBoundsSelectorsOnly, sidebarEnabled}) {\n const rightAxisCount = useRightAxisCount(stateController);\n const leftAxisCount = useLeftAxisCount(stateController);\n const showingOptions = useShowingOptions(stateController);\n\n let marginRight = Y_AXIS_WIDTH*rightAxisCount;\n if (rightAxisCount > 0) {\n marginRight += 5;\n }\n\n let marginLeft = Y_AXIS_WIDTH*leftAxisCount;\n if (leftAxisCount > 0) {\n marginLeft += 5;\n }\n\n const { dates } = useGlobalBounds(stateController);\n\n const currentBoundCalculator = useBoundCalculator(stateController);\n const { hasPreviousBounds, hasNextBounds } = useBoundHistory(stateController);\n\n const customBoundSelectorNames = new Set(customBoundsSelectors.map(({ label }) => label));\n\n return (\n <div className={`range-selection${dates ? '' : ' range-not-dates'}`} style={{ marginRight, marginLeft }}>\n <div className=\"range-buttons\">\n {\n showingOptions &&\n <Options\n stateController={stateController}\n sidebarEnabled={sidebarEnabled}\n />\n }\n\n <RangeSelectionButtonBase\n className=\"showing-options-button\"\n selected={showingOptions}\n onClick={() => stateController.toggleShowingOptions()}\n description=\"Show additional options\"\n >\n <div className=\"icon-container icon-container-square\">\n <svg focusable=\"false\" viewBox=\"0 0 512 512\">\n <path fill=\"currentColor\" d=\"M487.4 315.7l-42.6-24.6c4.3-23.2 4.3-47 0-70.2l42.6-24.6c4.9-2.8 7.1-8.6 5.5-14-11.1-35.6-30-67.8-54.7-94.6-3.8-4.1-10-5.1-14.8-2.3L380.8 110c-17.9-15.4-38.5-27.3-60.8-35.1V25.8c0-5.6-3.9-10.5-9.4-11.7-36.7-8.2-74.3-7.8-109.2 0-5.5 1.2-9.4 6.1-9.4 11.7V75c-22.2 7.9-42.8 19.8-60.8 35.1L88.7 85.5c-4.9-2.8-11-1.9-14.8 2.3-24.7 26.7-43.6 58.9-54.7 94.6-1.7 5.4.6 11.2 5.5 14L67.3 221c-4.3 23.2-4.3 47 0 70.2l-42.6 24.6c-4.9 2.8-7.1 8.6-5.5 14 11.1 35.6 30 67.8 54.7 94.6 3.8 4.1 10 5.1 14.8 2.3l42.6-24.6c17.9 15.4 38.5 27.3 60.8 35.1v49.2c0 5.6 3.9 10.5 9.4 11.7 36.7 8.2 74.3 7.8 109.2 0 5.5-1.2 9.4-6.1 9.4-11.7v-49.2c22.2-7.9 42.8-19.8 60.8-35.1l42.6 24.6c4.9 2.8 11 1.9 14.8-2.3 24.7-26.7 43.6-58.9 54.7-94.6 1.5-5.5-.7-11.3-5.6-14.1zM256 336c-44.1 0-80-35.9-80-80s35.9-80 80-80 80 35.9 80 80-35.9 80-80 80z\" />\n </svg>\n </div>\n </RangeSelectionButtonBase>\n \n <RangeSelectionButtonBase\n className=\"range-selection-history\"\n selected={false}\n onClick={() => stateController.previousBounds()}\n disabled={!hasPreviousBounds}\n >\n <div className=\"icon-container\">\n <svg focusable=\"false\" viewBox=\"0 0 256 512\">\n <path fill=\"currentColor\" d=\"M31.7 239l136-136c9.4-9.4 24.6-9.4 33.9 0l22.6 22.6c9.4 9.4 9.4 24.6 0 33.9L127.9 256l96.4 96.4c9.4 9.4 9.4 24.6 0 33.9L201.7 409c-9.4 9.4-24.6 9.4-33.9 0l-136-136c-9.5-9.4-9.5-24.6-.1-34z\" />\n </svg>\n </div>\n </RangeSelectionButtonBase>\n \n <RangeSelectionButtonBase\n className=\"range-selection-history\"\n selected={false}\n onClick={() => stateController.nextBounds()}\n disabled={!hasNextBounds}\n >\n <div className=\"icon-container\">\n <svg focusable=\"false\" viewBox=\"0 0 256 512\">\n <path fill=\"currentColor\" d=\"M224.3 273l-136 136c-9.4 9.4-24.6 9.4-33.9 0l-22.6-22.6c-9.4-9.4-9.4-24.6 0-33.9l96.4-96.4-96.4-96.4c-9.4-9.4-9.4-24.6 0-33.9L54.3 103c9.4-9.4 24.6-9.4 33.9 0l136 136c9.5 9.4 9.5 24.6.1 34z\"/>\n </svg>\n </div>\n </RangeSelectionButtonBase>\n\n {\n customBoundsSelectors.map(({label, calculator, datesOnly}, i) => {\n return (\n <RangeSelectionButton\n key={i}\n stateController={stateController}\n currentBoundCalculator={currentBoundCalculator}\n boundCalculator={calculator}\n disabled={datesOnly && !dates}\n >\n {label}\n </RangeSelectionButton>\n );\n })\n }\n\n {\n !customBoundSelectorNames.has('1m') && !customBoundsSelectorsOnly &&\n <RangeSelectionButton\n stateController={stateController}\n currentBoundCalculator={currentBoundCalculator}\n boundCalculator={BOUND_CALCULATORS.lastMinute}\n disabled={!dates}\n >\n 1m\n </RangeSelectionButton>\n }\n\n {\n !customBoundSelectorNames.has('10m') && !customBoundsSelectorsOnly &&\n <RangeSelectionButton\n stateController={stateController}\n currentBoundCalculator={currentBoundCalculator}\n boundCalculator={BOUND_CALCULATORS.last10Minutes}\n disabled={!dates}\n >\n 10m\n </RangeSelectionButton>\n }\n\n {\n !customBoundSelectorNames.has('1h') && !customBoundsSelectorsOnly &&\n <RangeSelectionButton\n stateController={stateController}\n currentBoundCalculator={currentBoundCalculator}\n boundCalculator={BOUND_CALCULATORS.lastHour}\n disabled={!dates}\n >\n 1h\n </RangeSelectionButton>\n }\n\n {\n !customBoundSelectorNames.has('1d') && !customBoundsSelectorsOnly &&\n <RangeSelectionButton\n stateController={stateController}\n currentBoundCalculator={currentBoundCalculator}\n boundCalculator={BOUND_CALCULATORS.lastDay}\n disabled={!dates}\n >\n 1d\n </RangeSelectionButton>\n }\n\n <RangeSelectionButton\n stateController={stateController}\n currentBoundCalculator={currentBoundCalculator}\n boundCalculator={BOUND_CALCULATORS.all}\n disabled={false}\n >\n All\n </RangeSelectionButton>\n </div>\n </div>\n );\n\n}\n\nRangeSelection.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n customBoundsSelectors: CustomPropTypes.CustomBoundsSelectors.isRequired,\n customBoundsSelectorsOnly: PropTypes.bool,\n sidebarEnabled: PropTypes.bool\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport GraphBodyRenderer from '../renderer/graph_body_renderer';\nimport StateController from '../state/state_controller';\nimport placeGrid from '../helpers/place_grid';\nimport {formatX} from '../helpers/format';\nimport VerticalLines from './vertical_lines';\nimport CustomPropTypes from '../helpers/custom_prop_types';\n\nexport default class RangeGraph extends React.PureComponent {\n\n constructor(props) {\n super(props);\n\n this.state = {\n elementWidth: 0,\n elementHeight: 0,\n selectionBounds: {\n minX: 0,\n maxX: 0\n },\n globalBounds: {\n minX: 0,\n maxX: 0\n }\n };\n\n this.onMouseMove = this.onMouseMove.bind(this);\n this.stopDragging = this.stopDragging.bind(this);\n this.startScroll = this.startScroll.bind(this);\n this.startLeftDrag = this.startLeftDrag.bind(this);\n this.startRightDrag = this.startRightDrag.bind(this);\n }\n\n componentDidMount() {\n this._renderer = new GraphBodyRenderer({\n stateController: this.props.stateController,\n canvasElement: this.el,\n webgl: this.props.webgl,\n checkIntersection: this.props.checkIntersection\n });\n this.props.stateController.rangeGraphRenderer = this._renderer;\n\n this._renderer.on('size_changed', (sizing) => {\n this.setState(sizing);\n });\n\n this.setState({\n selectionBounds: this.props.stateController._selection,\n globalBounds: this.props.stateController._globalBounds\n });\n\n this.props.stateController.on('selection_changed', (selectionBounds) =>{\n this.setState({ selectionBounds });\n });\n\n this.props.stateController.on('global_bounds_changed', (globalBounds) =>{\n this.setState({ globalBounds: globalBounds });\n });\n }\n\n componentDidUpdate(prevProps) {\n if (prevProps.draggingY !== this.props.draggingY) {\n this._renderer.resize();\n }\n }\n\n componentWillUnmount() {\n this._renderer.dispose();\n this._renderer = null;\n }\n\n onMouseMove(event) {\n if (!this._dragType) {\n return;\n }\n\n let boundCalculator;\n const leftX = this.el.getBoundingClientRect().left;\n\n this.setState(({selectionBounds, globalBounds, elementWidth}) => {\n const pixelX = event.clientX - leftX;\n let percentage = pixelX/elementWidth;\n\n percentage = Math.max(percentage, 0);\n percentage = Math.min(percentage, 1);\n\n let trueX = percentage * (globalBounds.maxX - globalBounds.minX) + globalBounds.minX;\n\n if (this._dragType === 'scroll') {\n const range = selectionBounds.maxX - selectionBounds.minX;\n let minX = trueX - range*this._scrollAnchorPercentage;\n let maxX = trueX + range*(1-this._scrollAnchorPercentage);\n\n if (minX < globalBounds.minX) {\n minX = globalBounds.minX;\n maxX = minX + range;\n }\n\n if (maxX > globalBounds.maxX) {\n maxX = globalBounds.maxX;\n minX = maxX - range;\n }\n\n boundCalculator = () => {\n return {minX, maxX};\n };\n\n return {\n selectionBounds: Object.assign({}, selectionBounds, {\n minX, maxX\n })\n };\n } else if (this._dragType === 'left') {\n if (trueX > selectionBounds.maxX) {\n trueX = selectionBounds.maxX;\n }\n\n const boundToRight = globalBounds.maxX === selectionBounds.maxX;\n\n boundCalculator = () => {\n if (boundToRight) {\n return {\n minX: trueX\n };\n } else {\n return {\n minX: trueX,\n maxX: selectionBounds.maxX\n };\n }\n };\n\n return {\n selectionBounds: Object.assign({}, selectionBounds, {\n minX: trueX\n })\n };\n } else if (this._dragType === 'right') {\n if (trueX < selectionBounds.minX) {\n trueX = selectionBounds.minX;\n }\n\n const boundToLeft = globalBounds.minX === selectionBounds.minX;\n\n boundCalculator = () => {\n if (boundToLeft) {\n return {\n maxX: trueX\n };\n } else {\n return {\n minX: selectionBounds.minX,\n maxX: trueX\n };\n }\n };\n\n return {\n selectionBounds: Object.assign({}, selectionBounds, {\n maxX: trueX\n })\n };\n }\n }, () => {\n if (!boundCalculator) {\n return;\n }\n\n boundCalculator.debounceHistory = true;\n this.props.stateController.boundCalculator = boundCalculator;\n });\n }\n\n addListeners() {\n window.addEventListener('mousemove', this.onMouseMove);\n window.addEventListener('mouseup', this.stopDragging);\n }\n\n stopDragging() {\n this._dragType = null;\n window.removeEventListener('mousemove', this.onMouseMove);\n window.removeEventListener('mouseup', this.stopDragging);\n }\n\n startScroll(event) {\n this._dragType = 'scroll';\n\n const {selectionBounds, globalBounds, elementWidth} = this.state;\n const leftX = this.el.getBoundingClientRect().left;\n\n const pixelStartX = event.clientX - leftX;\n const pixelMinX = (selectionBounds.minX - globalBounds.minX)/(globalBounds.maxX - globalBounds.minX) * elementWidth || 0;\n const pixelMaxX = (selectionBounds.maxX - globalBounds.minX)/(globalBounds.maxX - globalBounds.minX) * elementWidth || 0;\n\n this._scrollAnchorPercentage = (pixelStartX-pixelMinX)/(pixelMaxX - pixelMinX);\n this.addListeners();\n }\n\n startLeftDrag() {\n this._dragType = 'left';\n this.addListeners();\n }\n\n startRightDrag() {\n this._dragType = 'right';\n this.addListeners();\n }\n\n render() {\n const { globalBounds, selectionBounds, elementWidth, elementHeight } = this.state;\n\n let pixelMinX = Math.min(Math.max((selectionBounds.minX - globalBounds.minX)/(globalBounds.maxX - globalBounds.minX), 0), 1) * elementWidth || 0;\n let pixelMaxX = Math.min(Math.max((selectionBounds.maxX - globalBounds.minX)/(globalBounds.maxX - globalBounds.minX), 0), 1) * elementWidth || 0;\n\n if (isNaN(pixelMinX) || !isFinite(pixelMinX) || selectionBounds.maxX < selectionBounds.minX) {\n pixelMinX = 0;\n }\n\n if (isNaN(pixelMaxX) || !isFinite(pixelMaxX) || selectionBounds.maxX < selectionBounds.minX) {\n pixelMaxX = 0;\n }\n\n const barSize = 14;\n let ticks;\n\n if (selectionBounds.dates && this.props.markDates) {\n ticks = placeGrid({\n min: globalBounds.minX,\n max: globalBounds.maxX,\n totalSize: elementWidth,\n precision: 'day',\n dates: selectionBounds.dates,\n formatter: formatX,\n expectedLabelSize: 30,\n labelPadding: 5,\n formatOptions: {\n justMonthAndDay: true,\n unitOverride: 'day',\n timeZone: this.props.timeZone\n },\n skipFirst: true,\n skipLast: true\n });\n }\n\n return (\n <div className=\"range-selection-graph\">\n <div className=\"graph-body graph-body-secondary\">\n <canvas ref={(el) => this.el = el} />\n\n <svg>\n <g>\n <rect\n x={0}\n y={elementHeight}\n width={elementWidth}\n height={barSize}\n className=\"selection-bar-track\"\n />\n\n {\n ticks && ticks.map(({ pixelValue, label, size, position }, i) => {\n if (isNaN(pixelValue)) {\n return null;\n }\n\n const classes = ['axis-item', `axis-item-${size}`, `axis-item-${position}`];\n\n return (\n <g key={i} className={classes.join(' ')}>\n <path d={`M${pixelValue},0 v${elementHeight}`} />\n\n <text x={pixelValue + 3} y={elementHeight}>\n {label}\n </text>\n </g>\n );\n })\n }\n\n <rect\n x={pixelMinX}\n y={elementHeight}\n width={pixelMaxX - pixelMinX}\n height={barSize}\n className=\"selection-bar\"\n onMouseDown={this.startScroll}\n />\n\n <path\n d=\"M -3 3.5 L -3 9.333333333333334 M 0 3.5 L 0 9.333333333333334 M 3 3.5 L 3 9.333333333333334\"\n className=\"selection-bar-rifles\"\n transform={`translate(${pixelMinX + (pixelMaxX - pixelMinX)/2},${elementHeight})`}\n onMouseDown={this.startScroll}\n />\n </g>\n\n <g>\n <rect\n x={pixelMinX}\n y={0}\n width={pixelMaxX - pixelMinX}\n height={elementHeight}\n className=\"target-selection\"\n onMouseDown={this.startScroll}\n />\n\n <rect\n x={pixelMinX}\n y={0}\n width={pixelMaxX - pixelMinX}\n height={elementHeight + barSize}\n className=\"target-selection-outline\"\n />\n </g>\n\n <g>\n <path\n d=\"M -4.5 0.5 L 3.5 0.5 L 3.5 15.5 L -4.5 15.5 L -4.5 0.5 M -1.5 4 L -1.5 12 M 0.5 4 L 0.5 12\"\n className=\"selection-bar-handle\"\n transform={`translate(${pixelMinX},${(elementHeight - 15)/2})`}\n onMouseDown={this.startLeftDrag}\n />\n </g>\n\n <g>\n <path\n d=\"M -4.5 0.5 L 3.5 0.5 L 3.5 15.5 L -4.5 15.5 L -4.5 0.5 M -1.5 4 L -1.5 12 M 0.5 4 L 0.5 12\"\n className=\"selection-bar-handle\"\n transform={`translate(${pixelMaxX},${(elementHeight - 15)/2})`}\n onMouseDown={this.startRightDrag}\n />\n </g>\n </svg>\n\n {\n this.props.verticalLines &&\n <VerticalLines\n stateController={this.props.stateController}\n verticalLines={this.props.verticalLines}\n isRangeGraph={true}\n bounds={globalBounds}\n elementHeight={elementHeight}\n elementWidth={elementWidth}\n />\n }\n </div>\n </div>\n );\n }\n\n}\n\nRangeGraph.defaultProps = {\n width: 3,\n shadowColor: 'transparent'\n};\n\nRangeGraph.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n webgl: PropTypes.bool,\n draggingY: PropTypes.bool,\n checkIntersection: PropTypes.bool,\n markDates: PropTypes.bool,\n timeZone: PropTypes.string,\n verticalLines: CustomPropTypes.VerticalLines\n};\n","import React from 'react';\nimport getColor from '../helpers/colors';\nimport CustomPropTypes from '../helpers/custom_prop_types';\nimport PropTypes from 'prop-types';\nimport StateController from '../state/state_controller';\nimport nameForSeries from '../helpers/name_for_series.js';\n\nexport default React.memo(SeriesKeyItem);\n\nfunction SeriesKeyItem({ series, i, style, onMouseDown, theme, stateController, highlighted }) {\n const color = getColor(series.color, i, series.multigrapherSeriesIndex);\n\n if (theme === 'day') {\n style = Object.assign({}, style, {\n backgroundColor: color\n });\n } else {\n style = Object.assign({}, style, {\n color\n });\n }\n\n const classes = ['series-key-item'];\n if (highlighted) {\n classes.push('series-key-item-highlighted');\n }\n\n const name = nameForSeries(series, i);\n\n return (\n <div\n className={classes.join(' ')}\n style={style}\n onMouseDown={onMouseDown}\n onMouseOver={() => stateController.setHighlightedSeries(i)}\n onMouseOut={() => stateController.setHighlightedSeries(null)}\n onClick={() => stateController.registerSeriesClick(i)}\n >\n {name}\n </div>\n );\n}\n\nSeriesKeyItem.propTypes = {\n series: CustomPropTypes.SingleSeries.isRequired,\n stateController: PropTypes.instanceOf(StateController),\n i: PropTypes.number.isRequired,\n style: PropTypes.object,\n onMouseDown: PropTypes.func,\n theme: PropTypes.string.isRequired,\n highlighted: PropTypes.bool\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport StateController from '../state/state_controller';\n\nexport default class SeriesKeyAxisContainer extends React.PureComponent {\n\n constructor(props) {\n super(props);\n\n this.state = {\n showingLabelInput: false\n };\n\n this.toggleLabelInputShowing = this.toggleLabelInputShowing.bind(this);\n }\n\n toggleLabelInputShowing() {\n this.setState(({ showingLabelInput }) => {\n return {\n showingLabelInput: !showingLabelInput\n };\n });\n }\n\n render() {\n const {children, stateController, axisIndex, scale, label, grapherID} = this.props;\n\n const { showingLabelInput } = this.state;\n\n return (\n <div\n className={`series-key-axis-container${showingLabelInput ? ' series-key-axis-container-showing-label' : ''}`}\n data-axis-index={axisIndex}\n data-grapher-id={grapherID}\n >\n <div className=\"scale-label\" onClick={() => stateController.toggleScale({axisIndex})}>\n {scale.slice(0, showingLabelInput ? 6 : 3)}\n </div>\n\n <div className=\"series-key-axis-container-body\">\n <div>\n {children}\n\n <svg className=\"label-input-toggler\" viewBox=\"0 0 512 512\" onClick={this.toggleLabelInputShowing}>\n <path\n d=\"M0 252.118V48C0 21.49 21.49 0 48 0h204.118a48 48 0 0 1 33.941 14.059l211.882 211.882c18.745 18.745 18.745 49.137 0 67.882L293.823 497.941c-18.745 18.745-49.137 18.745-67.882 0L14.059 286.059A48 48 0 0 1 0 252.118zM112 64c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48-21.49-48-48-48z\"/>\n </svg>\n </div>\n\n <div className=\"series-key-axis-label-container\">\n <input\n onChange={(event) => stateController.setLabel({axisIndex, label: event.target.value})}\n placeholder=\"Enter label\"\n value={label || ''}\n />\n </div>\n </div>\n </div>\n );\n }\n}\n\nSeriesKeyAxisContainer.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n children: PropTypes.node.isRequired,\n axisIndex: PropTypes.number.isRequired,\n scale: PropTypes.string.isRequired,\n label: PropTypes.string,\n grapherID: PropTypes.string\n};\n","import React, { useState, useEffect, useRef } from 'react';\nimport PropTypes from 'prop-types';\nimport {Y_AXIS_WIDTH} from '../helpers/axis_sizes';\nimport StateController from '../state/state_controller';\nimport {\n useAlwaysTooltipped,\n useAxes,\n useHighlightedSeries,\n useLeftAxisCount,\n usePrimarySize,\n useRightAxisCount,\n useSeries, useShowingOptions\n} from '../state/hooks';\nimport SeriesKeyItem from './series_key_item';\nimport SeriesKeyAxisContainer from './series_key_axis_container';\n\nfunction calculateStyles({stateController, keyWidth}) {\n const rightAxisCount = useRightAxisCount(stateController);\n const leftAxisCount = useLeftAxisCount(stateController);\n const showingOptions = useShowingOptions(stateController);\n\n let marginRight = Y_AXIS_WIDTH*rightAxisCount;\n if (rightAxisCount > 0) {\n marginRight += 5;\n }\n\n marginRight += 250;\n\n if (showingOptions) {\n marginRight += 70;\n }\n\n let marginLeft = Y_AXIS_WIDTH*leftAxisCount;\n\n if (leftAxisCount > 0) {\n marginLeft += 5;\n }\n\n marginLeft = Math.max(marginRight, marginLeft);\n marginRight = Math.max(marginRight, marginLeft);\n\n let marginBottom;\n\n const { elementWidth } = usePrimarySize(stateController);\n\n const shouldBreak = elementWidth - marginLeft - marginRight < keyWidth;\n\n if (shouldBreak) {\n marginLeft = 0;\n marginRight = 0;\n marginBottom = 10;\n }\n\n return { marginRight, marginLeft, marginBottom };\n}\n\nexport default React.memo(SeriesKey);\n\nfunction SeriesKey({ stateController, theme, draggingY, grapherID, dragPositionYOffset=0 }) {\n const series = useSeries(stateController);\n const [draggedSeries, setDraggedSeries] = useState(null);\n const [dragPosition, setDragPosition] = useState({\n x: 0,\n y: 0\n });\n\n const highlightedSeries = useHighlightedSeries(stateController);\n\n const keyRef = useRef(null);\n const [keyWidth, setKeyWidth] = useState(series.map(({ name, yKey }, i) => (name || yKey || i).toString().length).reduce((a, b) => a + b, 0) * 5);\n\n let sizeCalculationHandle;\n useEffect(() => {\n if (keyRef.current) {\n cancelAnimationFrame(sizeCalculationHandle);\n\n sizeCalculationHandle = requestAnimationFrame(() => {\n if (!keyRef.current) { // has become invalid in the last frame\n return;\n }\n\n const width = [...keyRef.current.querySelectorAll('.series-key-axis-container')]\n .map((el) => el.clientWidth)\n .reduce((a, b) => a + b, 0);\n setKeyWidth(width);\n });\n }\n }, [series, keyRef.current]);\n\n const style = calculateStyles({ stateController, keyWidth });\n\n const axes = useAxes(stateController);\n const alwaysTooltipped = useAlwaysTooltipped(stateController);\n\n const startDragging = (event, singleSeries) => {\n let seriesKeyEl = event.target;\n while (seriesKeyEl && seriesKeyEl.className !== 'series-key') {\n seriesKeyEl = seriesKeyEl.parentNode;\n }\n const targetLeft = event.target.getBoundingClientRect().left;\n let seriesKeyLeft = seriesKeyEl.getBoundingClientRect().left;\n let seriesKeyMarginLeft = seriesKeyEl.style.marginLeft;\n\n const startX = event.clientX;\n const startY = event.clientY;\n const clientStartX = event.clientX;\n const clientStartY = event.clientY;\n\n setDraggedSeries(singleSeries);\n setDragPosition({\n x: event.clientX - startX + (targetLeft - seriesKeyLeft) - 2,\n y: event.clientY - startY + 1\n });\n\n const onMouseMove = (moveEvent) => {\n if (seriesKeyEl.style.marginLeft !== seriesKeyMarginLeft) {\n seriesKeyLeft = seriesKeyEl.getBoundingClientRect().left;\n seriesKeyMarginLeft = seriesKeyEl.style.marginLeft;\n }\n\n setDragPosition({\n x: moveEvent.clientX - startX + (targetLeft - seriesKeyLeft) - 2,\n y: moveEvent.clientY - startY + 1\n });\n };\n\n const onMouseUp = (mouseUpEvent) => {\n window.removeEventListener('mousemove', onMouseMove);\n window.removeEventListener('mouseup', onMouseUp);\n\n let target = mouseUpEvent.target;\n while (target && !(target.dataset || {}).axisIndex && !(target.dataset || {}).grapherId) {\n target = target.parentNode;\n }\n\n setDraggedSeries(null);\n stateController.finalizeDrag(singleSeries, target && (target.dataset || {}).axisIndex, target && (target.dataset || {}).grapherId);\n\n if (mouseUpEvent.clientX === clientStartX && mouseUpEvent.clientY === clientStartY) {\n stateController.toggleAlwaysTooltipped(singleSeries, mouseUpEvent.shiftKey);\n }\n };\n\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('mouseup', onMouseUp);\n\n stateController.markDragStart();\n };\n\n return (\n <div className=\"series-key\" style={style} ref={keyRef}>\n {\n draggingY &&\n <div\n className=\"series-key-axis-container\"\n data-axis-index=\"new-left\"\n data-grapher-id={grapherID}\n />\n }\n\n {\n axes.map((axis, i) => {\n if (!axis.series.length && axes.length > 1) {\n return null;\n }\n\n return (\n <SeriesKeyAxisContainer\n key={i}\n label={axis.label}\n axisIndex={axis.axisIndex}\n scale={axis.scale}\n stateController={stateController}\n grapherID={grapherID}\n >\n {\n axis.series.map((singleSeries) => {\n if (singleSeries.hideFromKey) {\n return null;\n }\n\n return (\n <SeriesKeyItem\n key={singleSeries.index}\n series={singleSeries}\n i={singleSeries.index}\n onMouseDown={(event, toggleTooltipped) => startDragging(event, singleSeries, toggleTooltipped)}\n theme={theme}\n stateController={stateController}\n highlighted={highlightedSeries === singleSeries.index || alwaysTooltipped.has(singleSeries)}\n />\n );\n })\n }\n </SeriesKeyAxisContainer>\n );\n })\n }\n\n {\n draggingY &&\n <div\n className=\"series-key-axis-container\"\n data-axis-index=\"new-right\"\n data-grapher-id={grapherID}\n />\n }\n\n {\n draggedSeries &&\n <SeriesKeyItem\n style={{\n left: dragPosition.x,\n top: dragPosition.y - dragPositionYOffset,\n position: 'absolute',\n pointerEvents: 'none',\n zIndex: 1\n }}\n series={draggedSeries}\n i={draggedSeries.index}\n theme={theme}\n stateController={stateController}\n />\n }\n </div>\n );\n}\n\nSeriesKey.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n theme: PropTypes.string.isRequired,\n draggingY: PropTypes.bool.isRequired,\n grapherID: PropTypes.string,\n dragPositionYOffset: PropTypes.number\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nexport default React.memo(GraphTitle);\n\nfunction GraphTitle({ title }) {\n return (\n <div className=\"grapher-title\">\n {title}\n </div>\n );\n}\n\nGraphTitle.propTypes = {\n title: PropTypes.string.isRequired\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport StateController from '../state/state_controller';\nimport {useSeries} from '../state/hooks';\nimport CustomPropTypes from '../helpers/custom_prop_types';\nimport getColor from '../helpers/colors';\n\nclass SeriesToggle extends React.PureComponent {\n\n constructor(props) {\n super(props);\n\n this.onChange = this.onChange.bind(this);\n }\n\n // NOTE: event listeners here do not follow React best practices, because when handled through React\n // there were ~500ms of latency when toggling the checkbox. It's unclear why\n onChange(event) {\n setTimeout(() => {\n this.props.stateController.setShowing(this.props.singleSeries, event.target.checked);\n });\n }\n\n render() {\n const { singleSeries } = this.props;\n const color = getColor(singleSeries.color, singleSeries.index, singleSeries.multigrapherSeriesIndex);\n\n let name = singleSeries.name || singleSeries.yKey;\n\n if (!name) {\n name = singleSeries.index;\n }\n\n return (\n <div className=\"series-toggle\">\n <label>\n <input\n type=\"checkbox\"\n defaultChecked={!singleSeries.hidden}\n ref={(el) => el && el.addEventListener('change', this.onChange)}\n />\n <span className=\"checkmark\" style={{ background: color, borderColor: color }} />\n\n {name}\n </label>\n </div>\n );\n }\n}\n\nSeriesToggle.propTypes = {\n singleSeries: CustomPropTypes.SingleSeries.isRequired,\n stateController: PropTypes.instanceOf(StateController).isRequired\n};\n\nexport default function Sidebar({ stateController }) {\n const series = useSeries(stateController);\n\n return (\n <div className=\"grapher-sidebar\">\n {\n series.map((singleSeries, i) =>\n <SeriesToggle\n key={i}\n singleSeries={singleSeries}\n stateController={stateController}\n />\n )\n }\n </div>\n );\n}\n\nSidebar.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired\n};\n","import React, { useEffect, useMemo } from 'react';\nimport PropTypes from 'prop-types';\nimport CustomPropTypes from './helpers/custom_prop_types';\nimport GraphBody from './components/graph_body';\nimport './grapher.scss';\nimport XAxis from './components/x_axis';\nimport YAxis from './components/y_axis';\nimport RangeSelection from './components/range_selection';\nimport RangeGraph from './components/range_graph';\nimport SeriesKey from './components/series_key';\nimport {Y_AXIS_WIDTH} from './helpers/axis_sizes';\nimport GraphTitle from './components/graph_title';\nimport {LINE_COLORS} from './helpers/colors';\nimport StateController from './state/state_controller';\nimport {useDraggingY, useLeftAxes, useRightAxes, useShowingSidebar, useTheme} from './state/hooks';\nimport Sidebar from './components/sidebar';\nimport SyncPool from './state/sync_pool.js';\nimport BOUND_CALCULATORS from './state/bound_calculators.js';\n\nfunction calculateClassNamesAndStyles(props, { draggingY, theme }) {\n const { fullscreen, height, width } = props;\n\n const classNames = [\n 'grapher',\n `grapher-${theme}`\n ];\n\n const styles = {};\n\n if (draggingY) {\n classNames.push('grapher-dragging-y');\n }\n\n if (fullscreen) {\n classNames.push('grapher-fullscreen');\n classNames.push('grapher-fixed-height');\n } else if (height) {\n classNames.push('grapher-fixed-height');\n if (typeof height === 'number') {\n styles.height = height - 20;\n } else {\n styles.height = `calc(${height} - 20px)`;\n }\n }\n\n if (width) {\n styles.width = width;\n }\n\n return {\n styles,\n classNames\n };\n}\n\nexport default React.memo(Grapher);\n\nconst grapherDefaultProps = {\n theme: 'night',\n showAxes: true,\n showRangeGraph: true,\n showRangeSelectors: true,\n showSeriesKey: true,\n showTooltips: true,\n boundsSelectionEnabled: true,\n customBoundsSelectors: [],\n sidebarEnabled: false,\n defaultShowAnnotations: true,\n defaultShowOptions: true\n};\n\nfunction Grapher(props) {\n props = {...grapherDefaultProps, ...props};\n\n const stateController = useMemo(() => new StateController({\n grapherID: props.id,\n ...props,\n ...props.stateControllerInitialization\n }), []);\n\n useEffect(() => {\n if (process.env.NODE_ENV === 'development') {\n window.stateController = stateController;\n }\n\n return () => {\n stateController.dispose();\n };\n }, [stateController]);\n\n useEffect(() => {\n props.exportStateController && props.exportStateController(stateController);\n }, [stateController, props.exportStateController]);\n\n useEffect(() => {\n stateController.timingFrameCount = props.timingFrameCount;\n }, [stateController, props.timingFrameCount]);\n\n useEffect(() => {\n props.onRenderTime && stateController.on('render_time', props.onRenderTime);\n\n return () => {\n props.onRenderTime && stateController.off('render_time', props.onRenderTime);\n };\n }, [stateController, props.onRenderTime]);\n\n useEffect(() => {\n stateController.setSeries(props.series);\n }, [stateController, props.series]);\n\n useEffect(() => {\n stateController.theme = props.theme;\n }, [stateController, props.theme]);\n\n const theme = useTheme(stateController);\n const bigLabels = props.bigLabels || theme === 'export';\n\n const defaultLineWidth = props.defaultLineWidth || (theme === 'export' ? 3 : undefined);\n useEffect(() => {\n stateController.defaultLineWidth = defaultLineWidth;\n }, [stateController, defaultLineWidth]);\n\n useEffect(() => {\n stateController.percentile = props.percentile;\n }, [stateController, props.percentile]);\n\n useEffect(() => {\n stateController.customBoundsSelectors = props.customBoundsSelectors;\n }, [stateController, props.customBoundsSelectors]);\n\n useEffect(() => {\n stateController.annotations = props.annotations;\n }, [stateController, props.annotations]);\n\n useEffect(() => {\n if (!props.onAxisChange) {\n return () => {};\n }\n\n stateController.on('exported_axes_changed', props.onAxisChange);\n return () => {\n stateController.off('exported_axes_changed', props.onAxisChange);\n };\n }, [stateController, props.onAxisChange]);\n\n useEffect(() => {\n stateController.primaryRenderer.resize();\n }, [props.height]);\n\n const draggingY = useDraggingY(stateController);\n\n const {styles, classNames} = calculateClassNamesAndStyles(props, { draggingY, theme });\n\n const rightAxes = useRightAxes(stateController);\n const leftAxes = useLeftAxes(stateController);\n const showingSidebar = useShowingSidebar(stateController);\n\n const showAxisColors = typeof props.showAxisColors === 'boolean' ? props.showAxisColors : (theme !== 'export');\n const showGrid = typeof props.showGrid === 'boolean' ? props.showGrid : (theme !== 'export');\n\n const commonYAxisProps = {\n stateController,\n showAxes: props.showAxes,\n showGrid,\n showSeriesKey: props.showSeriesKey,\n bodyHeight: props.bodyHeight,\n theme,\n grapherID: props.id,\n dragPositionYOffset: props.dragPositionYOffset,\n showAxisColors,\n bigLabels\n };\n\n return (\n <div className={classNames.join(' ')} style={styles} data-grapher-id={props.id}>\n {\n props.title &&\n <GraphTitle title={props.title} />\n }\n\n <div className=\"grapher-primary-container-outer\">\n {\n showingSidebar &&\n <Sidebar stateController={stateController} />\n }\n\n <div className=\"grapher-primary-container-body\">\n {\n props.showSeriesKey &&\n <SeriesKey\n stateController={stateController}\n draggingY={draggingY}\n theme={props.theme}\n grapherID={props.id}\n dragPositionYOffset={props.dragPositionYOffset}\n />\n }\n\n {\n props.showRangeSelectors &&\n <RangeSelection\n stateController={stateController}\n customBoundsSelectors={props.customBoundsSelectors}\n customBoundsSelectorsOnly={props.customBoundsSelectorsOnly}\n sidebarEnabled={props.sidebarEnabled}\n />\n }\n\n <div className=\"grapher-main-row\">\n {\n draggingY &&\n <div\n className=\"axis y-axis\"\n data-axis-index=\"new-left\"\n data-grapher-id={props.id}\n style={{\n width: Y_AXIS_WIDTH,\n height: typeof props.bodyHeight === 'number' ? props.bodyHeight : undefined\n }}\n />\n }\n\n {\n leftAxes.map((axis, i) => {\n return <YAxis\n key={i}\n axis={axis}\n sideIndex={leftAxes.length - i - 1}\n {...commonYAxisProps}\n />;\n })\n }\n\n <div className=\"central-container\">\n <GraphBody\n stateController={stateController}\n webgl={props.webgl}\n bodyHeight={props.bodyHeight}\n boundsSelectionEnabled={props.boundsSelectionEnabled}\n showTooltips={props.showTooltips}\n tooltipOptions={props.tooltipOptions}\n checkIntersection={props.checkIntersection}\n draggablePoints={props.draggablePoints}\n onPointDrag={props.onPointDrag}\n onDraggablePointsDoubleClick={props.onDraggablePointsDoubleClick}\n verticalLines={props.verticalLines}\n clockStyle={props.clockStyle}\n timeZone={props.timeZone}\n />\n\n <XAxis\n showGrid={showGrid}\n showAxes={props.showAxes}\n stateController={stateController}\n bigLabels={bigLabels}\n xTickUnit={props.xTickUnit}\n clockStyle={props.clockStyle}\n timeZone={props.timeZone}\n integersOnly={props.xAxisIntegersOnly}\n formatXAxisLabel={props.formatXAxisLabel}\n />\n\n {\n props.showRangeGraph &&\n <div className=\"range-graph-container\">\n <RangeGraph\n stateController={stateController}\n webgl={props.webgl}\n checkIntersection={props.checkIntersection}\n markDates={props.markRangeGraphDates}\n timeZone={props.timeZone}\n verticalLines={props.verticalLines}\n />\n </div>\n }\n </div>\n\n {\n rightAxes.map((axis, i) => {\n return <YAxis\n key={i}\n axis={axis}\n sideIndex={i}\n {...commonYAxisProps}\n />;\n })\n }\n\n {\n draggingY &&\n <div\n className=\"axis y-axis\"\n data-axis-index=\"new-right\"\n data-grapher-id={props.id}\n style={{\n width: Y_AXIS_WIDTH,\n height: typeof props.bodyHeight === 'number' ? props.bodyHeight : undefined\n }}\n />\n }\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nGrapher.propTypes = {\n series: CustomPropTypes.Series.isRequired,\n webgl: PropTypes.bool,\n requireWASM: PropTypes.bool,\n checkIntersection: PropTypes.bool,\n\n onAxisChange: PropTypes.func,\n onRenderTime: PropTypes.func,\n exportStateController: PropTypes.func,\n timingFrameCount: PropTypes.number,\n\n stateControllerInitialization: PropTypes.object,\n syncPool: PropTypes.instanceOf(SyncPool),\n id: PropTypes.string,\n dragPositionYOffset: PropTypes.number,\n\n theme: PropTypes.oneOf(['day', 'night', 'export']),\n title: PropTypes.string,\n fullscreen: PropTypes.bool,\n bodyHeight: PropTypes.number,\n height: PropTypes.number,\n width: PropTypes.number,\n\n showAxes: PropTypes.bool,\n showRangeGraph: PropTypes.bool,\n showRangeSelectors: PropTypes.bool,\n showSeriesKey: PropTypes.bool,\n showTooltips: PropTypes.bool,\n showGrid: PropTypes.bool,\n showAxisColors: PropTypes.bool,\n bigLabels: PropTypes.bool,\n xTickUnit: PropTypes.oneOf(['year']),\n formatXAxisLabel: PropTypes.func,\n xAxisIntegersOnly: PropTypes.bool,\n clockStyle: PropTypes.oneOf(['12h', '24h']),\n timeZone: PropTypes.string, // local, utc, or a full timezone string\n markRangeGraphDates: PropTypes.bool,\n\n boundsSelectionEnabled: PropTypes.bool,\n sidebarEnabled: PropTypes.bool,\n\n percentile: PropTypes.number,\n defaultShowOptions: PropTypes.bool,\n defaultShowIndividualPoints: PropTypes.bool,\n defaultShowSidebar: PropTypes.bool,\n defaultShowAnnotations: PropTypes.bool,\n defaultLineWidth: PropTypes.number,\n\n tooltipOptions: CustomPropTypes.TooltipOptions,\n\n customBoundsSelectors: CustomPropTypes.CustomBoundsSelectors,\n customBoundsSelectorsOnly: PropTypes.bool,\n defaultBoundsCalculator: PropTypes.string,\n\n annotations: CustomPropTypes.Annotations,\n draggablePoints: CustomPropTypes.DraggablePoints,\n onPointDrag: PropTypes.func,\n onDraggablePointsDoubleClick: PropTypes.func,\n verticalLines: CustomPropTypes.VerticalLines\n};\n\nexport const AVAILABLE_COLORS = LINE_COLORS;\nexport const BUILT_IN_BOUND_CALCULATORS = BOUND_CALCULATORS;\n","export default class SyncPool {\n\n /**\n *\n * @param {Boolean} syncBounds\n * @param {Boolean|'onShift'} syncTooltips\n * @param {Boolean} syncDragState\n */\n constructor({ syncBounds=true, syncTooltips=true, syncDragState=false } = {}) {\n this._stateControllers = new Set();\n this._syncBounds = syncBounds;\n this._syncTooltips = syncTooltips;\n this._syncDragState = syncDragState;\n }\n\n add(stateController) {\n this._stateControllers.add(stateController);\n\n if (this._syncBounds) {\n this.syncBounds(stateController);\n }\n\n if (this._syncTooltips) {\n this.syncTooltips(stateController);\n }\n\n if (this._syncDragState) {\n this.syncDragState(stateController);\n }\n }\n\n remove(stateController) {\n this._stateControllers.delete(stateController);\n\n // TODO: remove listeners\n // (though since this is currently only called by stateController dispose, it probably doesn't matter)\n }\n\n syncDragState(stateController) {\n stateController.on('dragging_y_changed', (draggingY) => {\n for (let otherStateController of this._stateControllers) {\n if (stateController === otherStateController) {\n continue;\n }\n\n if (draggingY) {\n otherStateController.markDragStart();\n } else {\n otherStateController.finalizeDrag(null, null);\n }\n }\n });\n }\n\n syncBounds(stateController) {\n stateController.on('bound_calculator_changed', (boundCalculator) => {\n for (let otherStateController of this._stateControllers) {\n if (stateController === otherStateController) {\n continue;\n }\n\n otherStateController.boundCalculator = boundCalculator;\n }\n });\n }\n\n syncTooltips(stateController) {\n stateController.on('tooltip_state_changed', (tooltipState, stateArg) => {\n if (this._tooltipIgnoreState === stateArg) { // avoid cascading changes\n return;\n }\n\n const shouldHideTooltips = tooltipState.unsavedTooltipsCount === 0 ||\n !tooltipState.mousePresent ||\n (this._syncTooltips === 'onShift' && !stateController.shiftKeyPressedOnMove);\n\n if (shouldHideTooltips) {\n this._tooltipIgnoreState = Math.random();\n }\n\n for (let otherStateController of this._stateControllers) {\n if (stateController === otherStateController) {\n continue;\n }\n\n if (shouldHideTooltips) {\n otherStateController.showOnlySavedTooltips(this._tooltipIgnoreState);\n continue;\n }\n\n otherStateController.setTooltipMousePosition({\n mouseX: tooltipState.mouseX,\n mouseY: tooltipState.mouseY,\n tooltipAllNext: true,\n tooltipStateArg: this._tooltipIgnoreState\n });\n }\n });\n }\n\n}\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.grapher-night{position:relative;background:linear-gradient(to bottom right, #2a2a2b, #3e3e40);padding:10px;font-family:sans-serif;font-size:12px;line-height:normal}.grapher-night *,.grapher-night :after,.grapher-night :before{box-sizing:content-box}.grapher-night .grapher-title{text-align:center;color:#fff;font-size:18px;margin-bottom:8px}.grapher-night .grapher-primary-container-outer{display:flex}.grapher-night .grapher-primary-container-outer .grapher-sidebar{background:linear-gradient(#111, transparent 75%, transparent 100%);color:#eee;padding:50px 6px 5px 10px;margin-left:-10px;margin-top:-10px;margin-bottom:-10px;overflow-y:auto;flex-shrink:0}.grapher-night .grapher-primary-container-outer .grapher-sidebar .series-toggle{white-space:nowrap}.grapher-night .grapher-primary-container-outer .grapher-sidebar .series-toggle+.series-toggle{margin-top:3px}.grapher-night .grapher-primary-container-outer .grapher-sidebar .series-toggle label{display:inline-block;position:relative;user-select:none}.grapher-night .grapher-primary-container-outer .grapher-sidebar .series-toggle input[type=checkbox]{opacity:0;cursor:pointer;height:0;width:0;margin-right:11px}.grapher-night .grapher-primary-container-outer .grapher-sidebar .series-toggle input:not(:checked)~.checkmark{background-color:rgba(0,0,0,0) !important}.grapher-night .grapher-primary-container-outer .grapher-sidebar .series-toggle input:checked~.checkmark:after{display:block}.grapher-night .grapher-primary-container-outer .grapher-sidebar .series-toggle .checkmark{position:absolute;top:1px;left:0;height:7px;width:7px;background-color:#eee;border:2px solid;border-radius:1px}.grapher-night .grapher-primary-container-outer .grapher-sidebar .series-toggle .checkmark:after{content:\"\";position:absolute;display:none;left:.5px;top:-1.5px;width:3px;height:6px;border:solid #fff;border-width:0 2px 2px 0;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.grapher-night .grapher-primary-container-outer .grapher-primary-container-body{width:100%;padding-left:2px}.grapher-night .series-key{text-align:center;margin-bottom:-14px;position:relative}.grapher-night .series-key .scale-label{display:inline-block;background:#111;color:silver;transform:rotate(-90deg);width:24px;margin-left:-5px;vertical-align:top;margin-top:4px;padding-bottom:2px;cursor:pointer;user-select:none}.grapher-night .series-key .series-key-axis-container{display:inline-block;border:1px solid #111;min-width:18px;min-height:24px;vertical-align:top;white-space:nowrap}.grapher-night .series-key .series-key-axis-container+.series-key-axis-container{margin-left:4px}.grapher-night .series-key .series-key-axis-container.series-key-axis-container-showing-label .scale-label{width:46px;margin-top:15px;margin-left:-15px;margin-right:-12px}.grapher-night .series-key .series-key-axis-container.series-key-axis-container-showing-label .series-key-axis-label-container{display:block}.grapher-night .series-key .series-key-axis-container.series-key-axis-container-showing-label .label-input-toggler path{fill:#e0e0e3}.grapher-night .series-key .series-key-axis-container .series-key-axis-container-body{display:inline-block}.grapher-night .series-key .series-key-axis-container .series-key-axis-container-body>div{white-space:initial}.grapher-night .series-key .series-key-axis-container .series-key-axis-label-container{display:none}.grapher-night .series-key .series-key-axis-container .label-input-toggler{width:16px;cursor:pointer;display:inline-block;vertical-align:top;margin:4px 2px}.grapher-night .series-key .series-key-axis-container .label-input-toggler path{fill:#111}.grapher-night .series-key .series-key-axis-container .label-input-toggler:hover path{fill:#e0e0e3}.grapher-night .series-key .series-key-item{border:1px solid currentColor;padding:2px;margin:2px;display:inline-block;cursor:pointer;user-select:none;background:rgba(0,0,0,0)}.grapher-night .series-key .series-key-item+.series-key-item{margin-left:4px}.grapher-night .series-key .series-key-item.series-key-item-highlighted{box-shadow:0 0 4px silver}.grapher-night .range-selection{color:silver;user-select:none}.grapher-night .range-selection.range-not-dates{color:#aaa}.grapher-night .range-selection .range-buttons{text-align:right}.grapher-night .range-selection .range-buttons .options-bar{display:inline-block}.grapher-night .range-selection .range-buttons .option-tooltip{position:relative;display:inline-block;border-bottom:1px dotted #000}.grapher-night .range-selection .range-buttons .option-tooltip .option-tooltip-text{visibility:hidden;color:silver;background:#000;text-align:center;padding:5px 5px;border-radius:6px;position:absolute;z-index:1;border:1px solid #000;width:120px;margin-left:-65px;top:calc(100% + 7px);left:50%}.grapher-night .range-selection .range-buttons .option-tooltip:hover .option-tooltip-text{visibility:visible}.grapher-night .range-selection .range-buttons .option-tooltip .option-tooltip-text::after{content:\" \";position:absolute;bottom:100%;left:50%;margin-left:-5px;border-width:5px;border-style:solid;border-color:rgba(0,0,0,0) rgba(0,0,0,0) #000 rgba(0,0,0,0)}.grapher-night .range-selection .range-buttons .range-button{display:inline-block;cursor:pointer;padding:4px 8px;margin-left:6px;border-radius:2px;background:#505053}.grapher-night .range-selection .range-buttons .range-button.range-button-selected{color:silver;background:#000}.grapher-night .range-selection .range-buttons .range-button.range-button-disabled,.grapher-night .range-selection .range-buttons .range-button.range-button-selected.range-button-disabled{cursor:not-allowed;color:#aaa;background:#7a7a7a}.grapher-night .range-selection .range-buttons .range-button .icon-container{position:relative;width:0}.grapher-night .range-selection .range-buttons .range-button .icon-container.icon-container-narrow svg{left:-3px}.grapher-night .range-selection .range-buttons .range-button .icon-container.icon-container-square{width:5px}.grapher-night .range-selection .range-buttons .range-button .icon-container.icon-container-square svg{left:-5px}.grapher-night .range-selection .range-buttons .range-button .icon-container.icon-container-448{width:3px}.grapher-night .range-selection .range-buttons .range-button .icon-container.icon-container-448 svg{left:-5px}.grapher-night .range-selection .range-buttons .range-button .icon-container:before{content:\"A\";opacity:0}.grapher-night .range-selection .range-buttons .range-button .icon-container svg{height:15px;position:absolute;top:-1px;left:-4px}.grapher-night .range-selection .range-buttons .range-selection-history+.range-selection-history{margin-right:8px;margin-left:4px}.grapher-night .range-selection .range-buttons .percentile-button>div{display:inline-block}.grapher-night .range-selection .range-buttons .percentile-button input{background:rgba(0,0,0,0);border:1px solid #505053;margin:2px 8px 2px 0;color:#e0e0e3;padding:1px 2px;width:20px;font-size:11px;-moz-appearance:textfield}.grapher-night .range-selection .range-buttons .percentile-button input:focus{outline:none;border-color:#e0e0e3}.grapher-night .range-selection .range-buttons .percentile-button input::-webkit-outer-spin-button,.grapher-night .range-selection .range-buttons .percentile-button input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.grapher-night .range-selection .range-buttons .percentile-button .icon-container.icon-container-narrow svg{height:12px;top:1px;left:-5px}.grapher-night .range-selection .range-buttons .showing-options-button{margin-right:8px}.grapher-night .grapher-main-row{display:flex}.grapher-night .grapher-main-row .central-container{width:100%}.grapher-night .range-graph-container{display:flex}.grapher-night .graph-body{width:100%;height:400px;position:relative}.grapher-night .graph-body canvas{width:100%;height:100%}.grapher-night .graph-body .grapher-tooltip,.grapher-night .graph-body .grapher-draggable-points,.grapher-night .graph-body .grapher-vertical-lines{position:absolute;top:0;left:0;right:0}.grapher-night .graph-body .grapher-tooltip>svg,.grapher-night .graph-body .grapher-draggable-points>svg,.grapher-night .graph-body .grapher-vertical-lines>svg{position:absolute;overflow:visible;left:0}.grapher-night .graph-body .grapher-vertical-lines{pointer-events:none;user-select:none}.grapher-night .graph-body .grapher-tooltip .tooltip-item path{fill:rgba(0,0,0,.6)}.grapher-night .graph-body .grapher-tooltip .tooltip-item text{fill:#f0f0f0;dominant-baseline:hanging;text-anchor:start}.grapher-night .graph-body .grapher-tooltip .tooltip-item.tooltip-item-fixed path{fill:#000}.grapher-night .graph-body .grapher-tooltip .line{position:absolute;height:400px;border-left:1px solid #ccc}.grapher-night .graph-body .grapher-tooltip .custom-tooltip-container{position:absolute}.grapher-night .graph-body .grapher-context-menu{position:absolute;top:0;left:0}.grapher-night .graph-body .grapher-context-menu .menu-item .menu-text{user-select:all;position:absolute;top:0;background:rgba(0,0,0,.6);border:1px solid rgba(255,255,255,.3);color:#f0f0f0;padding:2px 4px;max-width:max-content;width:200px}.grapher-night .graph-body .grapher-draggable-points circle{cursor:pointer}.grapher-night .graph-body .grapher-vertical-lines line{stroke:#ccc}.grapher-night .graph-body .grapher-vertical-lines polygon{fill:#ccc}.grapher-night .graph-body .grapher-annotations{position:absolute;top:0;pointer-events:none;user-select:none}.grapher-night .graph-body .grapher-annotations .grapher-annotation{position:absolute}.grapher-night .graph-body .grapher-annotations .grapher-annotation .annotation-marker{display:inline-block;height:400px;background:rgba(255,255,255,.3)}.grapher-night .graph-body .grapher-annotations .grapher-annotation .annotation-text{position:absolute;top:0;background:rgba(0,0,0,.6);border:1px solid rgba(255,255,255,.3);color:#f0f0f0;padding:2px 4px;max-width:max-content;width:200px}.grapher-night .graph-body .bounds-selection{position:absolute;background:rgba(255,255,255,.1)}.grapher-night .axis{overflow:visible;user-select:none}.grapher-night .axis.x-axis{width:1px;height:20px;display:block}.grapher-night .axis.x-axis .axis-item text{text-anchor:middle}.grapher-night .axis.x-axis .axis-item.axis-item-first text{text-anchor:start}.grapher-night .axis.x-axis .axis-item.axis-item-last text{text-anchor:end}.grapher-night .axis.y-axis{height:400px}.grapher-night .axis.y-axis .axis-item text{text-anchor:end;alignment-baseline:middle}.grapher-night .axis.y-axis .y-axis-label{text-anchor:middle;fill:#e0e0e3}.grapher-night .axis.y-axis .y-axis-label.y-axis-big-label{font-size:18px}.grapher-night .axis.y-axis .series-color-box{cursor:pointer}.grapher-night .axis.y-axis.y-axis-right .axis-item text{text-anchor:start}.grapher-night .axis .axis-line{stroke:silver;stroke-width:2px}.grapher-night .axis .axis-line-shadow{stroke:#505053;stroke-width:1px}.grapher-night .axis .axis-item path{stroke:#505053;stroke-width:1px}.grapher-night .axis .axis-item text{fill:#e0e0e3;font-size:8px}.grapher-night .axis .axis-item.axis-item-major .axis-tick{stroke-width:2px}.grapher-night .axis .axis-item.axis-item-big-labels text{font-size:16px}.grapher-night .range-selection-graph{width:100%;padding-bottom:14px}.grapher-night .range-selection-graph .graph-body-secondary{height:50px}.grapher-night .range-selection-graph .graph-body-secondary svg{position:absolute;left:0;height:50px;width:100%;overflow:visible}.grapher-night .range-selection-graph .graph-body-secondary svg .target-selection{fill:rgba(255,255,255,.1);cursor:ew-resize}.grapher-night .range-selection-graph .graph-body-secondary svg .selection-bar{fill:#808083;cursor:ew-resize}.grapher-night .range-selection-graph .graph-body-secondary svg .selection-bar-track{fill:#303033}.grapher-night .range-selection-graph .graph-body-secondary svg .selection-bar-rifles{fill:none;stroke-width:1;stroke:#fff}.grapher-night .range-selection-graph .graph-body-secondary svg .selection-bar-handle{stroke:#aaa;stroke-width:1;fill:#666;cursor:ew-resize}.grapher-night .range-selection-graph .graph-body-secondary svg .target-selection-outline{stroke:#aaa;fill:none}.grapher-night .range-selection-graph .graph-body-secondary svg .axis-item text{fill:#9f9f9f;text-anchor:start;font-size:8px;user-select:none;dominant-baseline:text-after-edge}.grapher-night .range-selection-graph .graph-body-secondary svg .axis-item path{stroke:#505053;stroke-width:1px}.grapher-night input,.grapher-night textarea{background:rgba(0,0,0,0);border:1px solid #505053;margin:2px 0;color:#e0e0e3;padding:1px 2px;text-align:center}.grapher-night input:focus,.grapher-night textarea:focus{outline:none;border-color:#e0e0e3}.grapher-night.grapher-dragging-y .y-axis{border:2px dashed silver;margin:-2px;flex-shrink:0}.grapher-night.grapher-dragging-y .y-axis+.y-axis{border-left:none}.grapher-night.grapher-fullscreen{height:calc(100vh - 2*10px)}.grapher-night.grapher-fixed-height .grapher-primary-container-outer{height:100%}.grapher-night.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body{height:100%;display:flex;flex-direction:column}.grapher-night.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row{flex-grow:1}.grapher-night.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row .central-container{display:flex;flex-direction:column;height:100%}.grapher-night.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row .central-container>.graph-body{flex-grow:1;height:unset}.grapher-night.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row .axis.y-axis{height:calc(100% - 40px)}.grapher-night.new-grapher{height:auto;border:2px dashed silver;text-align:center;color:#ddd}.grapher-day{position:relative;background:linear-gradient(to bottom right, #FFF, #FFF);padding:10px;font-family:sans-serif;font-size:12px;line-height:normal}.grapher-day *,.grapher-day :after,.grapher-day :before{box-sizing:content-box}.grapher-day .grapher-title{text-align:center;color:#000;font-size:18px;margin-bottom:8px}.grapher-day .grapher-primary-container-outer{display:flex}.grapher-day .grapher-primary-container-outer .grapher-sidebar{background:linear-gradient(#EEE, transparent 75%, transparent 100%);color:#111;padding:50px 6px 5px 10px;margin-left:-10px;margin-top:-10px;margin-bottom:-10px;overflow-y:auto;flex-shrink:0}.grapher-day .grapher-primary-container-outer .grapher-sidebar .series-toggle{white-space:nowrap}.grapher-day .grapher-primary-container-outer .grapher-sidebar .series-toggle+.series-toggle{margin-top:3px}.grapher-day .grapher-primary-container-outer .grapher-sidebar .series-toggle label{display:inline-block;position:relative;user-select:none}.grapher-day .grapher-primary-container-outer .grapher-sidebar .series-toggle input[type=checkbox]{opacity:0;cursor:pointer;height:0;width:0;margin-right:11px}.grapher-day .grapher-primary-container-outer .grapher-sidebar .series-toggle input:not(:checked)~.checkmark{background-color:rgba(0,0,0,0) !important}.grapher-day .grapher-primary-container-outer .grapher-sidebar .series-toggle input:checked~.checkmark:after{display:block}.grapher-day .grapher-primary-container-outer .grapher-sidebar .series-toggle .checkmark{position:absolute;top:1px;left:0;height:7px;width:7px;background-color:#eee;border:2px solid;border-radius:1px}.grapher-day .grapher-primary-container-outer .grapher-sidebar .series-toggle .checkmark:after{content:\"\";position:absolute;display:none;left:.5px;top:-1.5px;width:3px;height:6px;border:solid #fff;border-width:0 2px 2px 0;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.grapher-day .grapher-primary-container-outer .grapher-primary-container-body{width:100%;padding-left:2px}.grapher-day .series-key{text-align:center;margin-bottom:-14px;position:relative}.grapher-day .series-key .scale-label{display:inline-block;background:#b0b0b7;color:#000;transform:rotate(-90deg);width:24px;margin-left:-5px;vertical-align:top;margin-top:4px;padding-bottom:2px;cursor:pointer;user-select:none}.grapher-day .series-key .series-key-axis-container{display:inline-block;border:1px solid #b0b0b7;min-width:18px;min-height:24px;vertical-align:top;white-space:nowrap}.grapher-day .series-key .series-key-axis-container+.series-key-axis-container{margin-left:4px}.grapher-day .series-key .series-key-axis-container.series-key-axis-container-showing-label .scale-label{width:46px;margin-top:15px;margin-left:-15px;margin-right:-12px}.grapher-day .series-key .series-key-axis-container.series-key-axis-container-showing-label .series-key-axis-label-container{display:block}.grapher-day .series-key .series-key-axis-container.series-key-axis-container-showing-label .label-input-toggler path{fill:#505053}.grapher-day .series-key .series-key-axis-container .series-key-axis-container-body{display:inline-block}.grapher-day .series-key .series-key-axis-container .series-key-axis-container-body>div{white-space:initial}.grapher-day .series-key .series-key-axis-container .series-key-axis-label-container{display:none}.grapher-day .series-key .series-key-axis-container .label-input-toggler{width:16px;cursor:pointer;display:inline-block;vertical-align:top;margin:4px 2px}.grapher-day .series-key .series-key-axis-container .label-input-toggler path{fill:#b0b0b7}.grapher-day .series-key .series-key-axis-container .label-input-toggler:hover path{fill:#505053}.grapher-day .series-key .series-key-item{border:1px solid currentColor;padding:2px;margin:2px;display:inline-block;cursor:pointer;user-select:none}.grapher-day .series-key .series-key-item+.series-key-item{margin-left:4px}.grapher-day .series-key .series-key-item.series-key-item-highlighted{box-shadow:0 0 4px #000}.grapher-day .range-selection{color:#444;user-select:none}.grapher-day .range-selection.range-not-dates{color:#888}.grapher-day .range-selection .range-buttons{text-align:right}.grapher-day .range-selection .range-buttons .options-bar{display:inline-block}.grapher-day .range-selection .range-buttons .option-tooltip{position:relative;display:inline-block;border-bottom:1px dotted #000}.grapher-day .range-selection .range-buttons .option-tooltip .option-tooltip-text{visibility:hidden;color:#000;background:#fff;text-align:center;padding:5px 5px;border-radius:6px;position:absolute;z-index:1;border:1px solid #000;width:120px;margin-left:-65px;top:calc(100% + 7px);left:50%}.grapher-day .range-selection .range-buttons .option-tooltip:hover .option-tooltip-text{visibility:visible}.grapher-day .range-selection .range-buttons .option-tooltip .option-tooltip-text::after{content:\" \";position:absolute;bottom:100%;left:50%;margin-left:-5px;border-width:5px;border-style:solid;border-color:rgba(0,0,0,0) rgba(0,0,0,0) #000 rgba(0,0,0,0)}.grapher-day .range-selection .range-buttons .range-button{display:inline-block;cursor:pointer;padding:4px 8px;margin-left:4px;border-radius:2px;background:#fff;border:1px dotted silver}.grapher-day .range-selection .range-buttons .range-button.range-button-selected{color:#000;background:#fff;border:1px solid #000}.grapher-day .range-selection .range-buttons .range-button.range-button-disabled,.grapher-day .range-selection .range-buttons .range-button.range-button-selected.range-button-disabled{cursor:not-allowed;color:#888;background:#eee}.grapher-day .range-selection .range-buttons .range-button .icon-container{position:relative;width:0}.grapher-day .range-selection .range-buttons .range-button .icon-container.icon-container-narrow svg{left:-3px}.grapher-day .range-selection .range-buttons .range-button .icon-container.icon-container-square{width:5px}.grapher-day .range-selection .range-buttons .range-button .icon-container.icon-container-square svg{left:-5px}.grapher-day .range-selection .range-buttons .range-button .icon-container.icon-container-448{width:3px}.grapher-day .range-selection .range-buttons .range-button .icon-container.icon-container-448 svg{left:-5px}.grapher-day .range-selection .range-buttons .range-button .icon-container:before{content:\"A\";opacity:0}.grapher-day .range-selection .range-buttons .range-button .icon-container svg{height:15px;position:absolute;top:-1px;left:-4px}.grapher-day .range-selection .range-buttons .range-selection-history+.range-selection-history{margin-right:8px;margin-left:4px}.grapher-day .range-selection .range-buttons .percentile-button>div{display:inline-block}.grapher-day .range-selection .range-buttons .percentile-button input{background:rgba(0,0,0,0);border:1px solid #e0e0e3;margin:2px 8px 2px 0;color:#222;padding:1px 2px;width:20px;font-size:11px;-moz-appearance:textfield}.grapher-day .range-selection .range-buttons .percentile-button input:focus{outline:none;border-color:#505053}.grapher-day .range-selection .range-buttons .percentile-button input::-webkit-outer-spin-button,.grapher-day .range-selection .range-buttons .percentile-button input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.grapher-day .range-selection .range-buttons .percentile-button .icon-container.icon-container-narrow svg{height:12px;top:1px;left:-5px}.grapher-day .range-selection .range-buttons .showing-options-button{margin-right:8px}.grapher-day .grapher-main-row{display:flex}.grapher-day .grapher-main-row .central-container{width:100%}.grapher-day .range-graph-container{display:flex}.grapher-day .graph-body{width:100%;height:400px;position:relative}.grapher-day .graph-body canvas{width:100%;height:100%}.grapher-day .graph-body .grapher-tooltip,.grapher-day .graph-body .grapher-draggable-points,.grapher-day .graph-body .grapher-vertical-lines{position:absolute;top:0;left:0;right:0}.grapher-day .graph-body .grapher-tooltip>svg,.grapher-day .graph-body .grapher-draggable-points>svg,.grapher-day .graph-body .grapher-vertical-lines>svg{position:absolute;overflow:visible;left:0}.grapher-day .graph-body .grapher-vertical-lines{pointer-events:none;user-select:none}.grapher-day .graph-body .grapher-tooltip .tooltip-item path{fill:rgba(255,255,255,.6)}.grapher-day .graph-body .grapher-tooltip .tooltip-item text{fill:#0f0f0f;dominant-baseline:hanging;text-anchor:start}.grapher-day .graph-body .grapher-tooltip .tooltip-item.tooltip-item-fixed path{fill:#fff}.grapher-day .graph-body .grapher-tooltip .line{position:absolute;height:400px;border-left:1px solid #333}.grapher-day .graph-body .grapher-tooltip .custom-tooltip-container{position:absolute}.grapher-day .graph-body .grapher-context-menu{position:absolute;top:0;left:0}.grapher-day .graph-body .grapher-context-menu .menu-item .menu-text{user-select:all;position:absolute;top:0;background:rgba(255,255,255,.6);border:1px solid rgba(0,0,0,.3);color:#0f0f0f;padding:2px 4px;max-width:max-content;width:200px}.grapher-day .graph-body .grapher-draggable-points circle{cursor:pointer}.grapher-day .graph-body .grapher-vertical-lines line{stroke:#333}.grapher-day .graph-body .grapher-vertical-lines polygon{fill:#333}.grapher-day .graph-body .grapher-annotations{position:absolute;top:0;pointer-events:none;user-select:none}.grapher-day .graph-body .grapher-annotations .grapher-annotation{position:absolute}.grapher-day .graph-body .grapher-annotations .grapher-annotation .annotation-marker{display:inline-block;height:400px;background:rgba(0,0,0,.3)}.grapher-day .graph-body .grapher-annotations .grapher-annotation .annotation-text{position:absolute;top:0;background:rgba(255,255,255,.6);border:1px solid rgba(0,0,0,.3);color:#0f0f0f;padding:2px 4px;max-width:max-content;width:200px}.grapher-day .graph-body .bounds-selection{position:absolute;background:rgba(0,0,0,.02)}.grapher-day .axis{overflow:visible;user-select:none}.grapher-day .axis.x-axis{width:1px;height:20px;display:block}.grapher-day .axis.x-axis .axis-item text{text-anchor:middle}.grapher-day .axis.x-axis .axis-item.axis-item-first text{text-anchor:start}.grapher-day .axis.x-axis .axis-item.axis-item-last text{text-anchor:end}.grapher-day .axis.y-axis{height:400px}.grapher-day .axis.y-axis .axis-item text{text-anchor:end;alignment-baseline:middle}.grapher-day .axis.y-axis .y-axis-label{text-anchor:middle;fill:#1f1f1c}.grapher-day .axis.y-axis .y-axis-label.y-axis-big-label{font-size:18px}.grapher-day .axis.y-axis .series-color-box{cursor:pointer}.grapher-day .axis.y-axis.y-axis-right .axis-item text{text-anchor:start}.grapher-day .axis .axis-line{stroke:#656565;stroke-width:2px}.grapher-day .axis .axis-line-shadow{stroke:#bfbfbf;stroke-width:1px}.grapher-day .axis .axis-item path{stroke:#bfbfbf;stroke-width:1px}.grapher-day .axis .axis-item text{fill:#1f1f1c;font-size:8px}.grapher-day .axis .axis-item.axis-item-major .axis-tick{stroke-width:2px}.grapher-day .axis .axis-item.axis-item-big-labels text{font-size:16px}.grapher-day .range-selection-graph{width:100%;padding-bottom:14px}.grapher-day .range-selection-graph .graph-body-secondary{height:50px}.grapher-day .range-selection-graph .graph-body-secondary svg{position:absolute;left:0;height:50px;width:100%;overflow:visible}.grapher-day .range-selection-graph .graph-body-secondary svg .target-selection{fill:rgba(0,0,0,.02);cursor:ew-resize}.grapher-day .range-selection-graph .graph-body-secondary svg .selection-bar{fill:#b0b0b7;cursor:ew-resize}.grapher-day .range-selection-graph .graph-body-secondary svg .selection-bar-track{fill:#eee}.grapher-day .range-selection-graph .graph-body-secondary svg .selection-bar-rifles{fill:none;stroke-width:1;stroke:#333}.grapher-day .range-selection-graph .graph-body-secondary svg .selection-bar-handle{stroke:#333;stroke-width:1;fill:#b0b0b7;cursor:ew-resize}.grapher-day .range-selection-graph .graph-body-secondary svg .target-selection-outline{stroke:#333;fill:none}.grapher-day .range-selection-graph .graph-body-secondary svg .axis-item text{fill:#9f9f9f;text-anchor:start;font-size:8px;user-select:none;dominant-baseline:text-after-edge}.grapher-day .range-selection-graph .graph-body-secondary svg .axis-item path{stroke:#bfbfbf;stroke-width:1px}.grapher-day input,.grapher-day textarea{background:rgba(0,0,0,0);border:1px solid #e0e0e3;margin:2px 0;color:#222;padding:1px 2px;text-align:center}.grapher-day input:focus,.grapher-day textarea:focus{outline:none;border-color:#505053}.grapher-day.grapher-dragging-y .y-axis{border:2px dashed silver;margin:-2px;flex-shrink:0}.grapher-day.grapher-dragging-y .y-axis+.y-axis{border-left:none}.grapher-day.grapher-fullscreen{height:calc(100vh - 2*10px)}.grapher-day.grapher-fixed-height .grapher-primary-container-outer{height:100%}.grapher-day.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body{height:100%;display:flex;flex-direction:column}.grapher-day.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row{flex-grow:1}.grapher-day.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row .central-container{display:flex;flex-direction:column;height:100%}.grapher-day.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row .central-container>.graph-body{flex-grow:1;height:unset}.grapher-day.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row .axis.y-axis{height:calc(100% - 40px)}.grapher-day.new-grapher{height:auto;border:2px dashed silver;text-align:center;color:#222}.grapher-export{position:relative;background:linear-gradient(to bottom right, #FFF, #FFF);padding:10px;font-family:sans-serif;font-size:12px;line-height:normal}.grapher-export *,.grapher-export :after,.grapher-export :before{box-sizing:content-box}.grapher-export .grapher-title{text-align:center;color:#000;font-size:18px;margin-bottom:8px}.grapher-export .grapher-primary-container-outer{display:flex}.grapher-export .grapher-primary-container-outer .grapher-sidebar{background:linear-gradient(#EEE, transparent 75%, transparent 100%);color:#111;padding:50px 6px 5px 10px;margin-left:-10px;margin-top:-10px;margin-bottom:-10px;overflow-y:auto;flex-shrink:0}.grapher-export .grapher-primary-container-outer .grapher-sidebar .series-toggle{white-space:nowrap}.grapher-export .grapher-primary-container-outer .grapher-sidebar .series-toggle+.series-toggle{margin-top:3px}.grapher-export .grapher-primary-container-outer .grapher-sidebar .series-toggle label{display:inline-block;position:relative;user-select:none}.grapher-export .grapher-primary-container-outer .grapher-sidebar .series-toggle input[type=checkbox]{opacity:0;cursor:pointer;height:0;width:0;margin-right:11px}.grapher-export .grapher-primary-container-outer .grapher-sidebar .series-toggle input:not(:checked)~.checkmark{background-color:rgba(0,0,0,0) !important}.grapher-export .grapher-primary-container-outer .grapher-sidebar .series-toggle input:checked~.checkmark:after{display:block}.grapher-export .grapher-primary-container-outer .grapher-sidebar .series-toggle .checkmark{position:absolute;top:1px;left:0;height:7px;width:7px;background-color:#eee;border:2px solid;border-radius:1px}.grapher-export .grapher-primary-container-outer .grapher-sidebar .series-toggle .checkmark:after{content:\"\";position:absolute;display:none;left:.5px;top:-1.5px;width:3px;height:6px;border:solid #fff;border-width:0 2px 2px 0;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.grapher-export .grapher-primary-container-outer .grapher-primary-container-body{width:100%;padding-left:2px}.grapher-export .series-key{text-align:center;margin-bottom:-14px;position:relative}.grapher-export .series-key .scale-label{display:inline-block;background:#b0b0b7;color:#000;transform:rotate(-90deg);width:24px;margin-left:-5px;vertical-align:top;margin-top:4px;padding-bottom:2px;cursor:pointer;user-select:none}.grapher-export .series-key .series-key-axis-container{display:inline-block;border:1px solid #b0b0b7;min-width:18px;min-height:24px;vertical-align:top;white-space:nowrap}.grapher-export .series-key .series-key-axis-container+.series-key-axis-container{margin-left:4px}.grapher-export .series-key .series-key-axis-container.series-key-axis-container-showing-label .scale-label{width:46px;margin-top:15px;margin-left:-15px;margin-right:-12px}.grapher-export .series-key .series-key-axis-container.series-key-axis-container-showing-label .series-key-axis-label-container{display:block}.grapher-export .series-key .series-key-axis-container.series-key-axis-container-showing-label .label-input-toggler path{fill:#505053}.grapher-export .series-key .series-key-axis-container .series-key-axis-container-body{display:inline-block}.grapher-export .series-key .series-key-axis-container .series-key-axis-container-body>div{white-space:initial}.grapher-export .series-key .series-key-axis-container .series-key-axis-label-container{display:none}.grapher-export .series-key .series-key-axis-container .label-input-toggler{width:16px;cursor:pointer;display:inline-block;vertical-align:top;margin:4px 2px}.grapher-export .series-key .series-key-axis-container .label-input-toggler path{fill:#b0b0b7}.grapher-export .series-key .series-key-axis-container .label-input-toggler:hover path{fill:#505053}.grapher-export .series-key .series-key-item{border:1px solid currentColor;padding:2px;margin:2px;display:inline-block;cursor:pointer;user-select:none}.grapher-export .series-key .series-key-item+.series-key-item{margin-left:4px}.grapher-export .series-key .series-key-item.series-key-item-highlighted{box-shadow:0 0 4px #000}.grapher-export .range-selection{color:#444;user-select:none}.grapher-export .range-selection.range-not-dates{color:#888}.grapher-export .range-selection .range-buttons{text-align:right}.grapher-export .range-selection .range-buttons .options-bar{display:inline-block}.grapher-export .range-selection .range-buttons .option-tooltip{position:relative;display:inline-block;border-bottom:1px dotted #000}.grapher-export .range-selection .range-buttons .option-tooltip .option-tooltip-text{visibility:hidden;color:#000;background:#fff;text-align:center;padding:5px 5px;border-radius:6px;position:absolute;z-index:1;border:1px solid #000;width:120px;margin-left:-65px;top:calc(100% + 7px);left:50%}.grapher-export .range-selection .range-buttons .option-tooltip:hover .option-tooltip-text{visibility:visible}.grapher-export .range-selection .range-buttons .option-tooltip .option-tooltip-text::after{content:\" \";position:absolute;bottom:100%;left:50%;margin-left:-5px;border-width:5px;border-style:solid;border-color:rgba(0,0,0,0) rgba(0,0,0,0) #000 rgba(0,0,0,0)}.grapher-export .range-selection .range-buttons .range-button{display:inline-block;cursor:pointer;padding:4px 8px;margin-left:4px;border-radius:2px;background:#fff;border:1px dotted silver}.grapher-export .range-selection .range-buttons .range-button.range-button-selected{color:#000;background:#fff;border:1px solid #000}.grapher-export .range-selection .range-buttons .range-button.range-button-disabled,.grapher-export .range-selection .range-buttons .range-button.range-button-selected.range-button-disabled{cursor:not-allowed;color:#888;background:#eee}.grapher-export .range-selection .range-buttons .range-button .icon-container{position:relative;width:0}.grapher-export .range-selection .range-buttons .range-button .icon-container.icon-container-narrow svg{left:-3px}.grapher-export .range-selection .range-buttons .range-button .icon-container.icon-container-square{width:5px}.grapher-export .range-selection .range-buttons .range-button .icon-container.icon-container-square svg{left:-5px}.grapher-export .range-selection .range-buttons .range-button .icon-container.icon-container-448{width:3px}.grapher-export .range-selection .range-buttons .range-button .icon-container.icon-container-448 svg{left:-5px}.grapher-export .range-selection .range-buttons .range-button .icon-container:before{content:\"A\";opacity:0}.grapher-export .range-selection .range-buttons .range-button .icon-container svg{height:15px;position:absolute;top:-1px;left:-4px}.grapher-export .range-selection .range-buttons .range-selection-history+.range-selection-history{margin-right:8px;margin-left:4px}.grapher-export .range-selection .range-buttons .percentile-button>div{display:inline-block}.grapher-export .range-selection .range-buttons .percentile-button input{background:rgba(0,0,0,0);border:1px solid #e0e0e3;margin:2px 8px 2px 0;color:#222;padding:1px 2px;width:20px;font-size:11px;-moz-appearance:textfield}.grapher-export .range-selection .range-buttons .percentile-button input:focus{outline:none;border-color:#505053}.grapher-export .range-selection .range-buttons .percentile-button input::-webkit-outer-spin-button,.grapher-export .range-selection .range-buttons .percentile-button input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.grapher-export .range-selection .range-buttons .percentile-button .icon-container.icon-container-narrow svg{height:12px;top:1px;left:-5px}.grapher-export .range-selection .range-buttons .showing-options-button{margin-right:8px}.grapher-export .grapher-main-row{display:flex}.grapher-export .grapher-main-row .central-container{width:100%}.grapher-export .range-graph-container{display:flex}.grapher-export .graph-body{width:100%;height:400px;position:relative}.grapher-export .graph-body canvas{width:100%;height:100%}.grapher-export .graph-body .grapher-tooltip,.grapher-export .graph-body .grapher-draggable-points,.grapher-export .graph-body .grapher-vertical-lines{position:absolute;top:0;left:0;right:0}.grapher-export .graph-body .grapher-tooltip>svg,.grapher-export .graph-body .grapher-draggable-points>svg,.grapher-export .graph-body .grapher-vertical-lines>svg{position:absolute;overflow:visible;left:0}.grapher-export .graph-body .grapher-vertical-lines{pointer-events:none;user-select:none}.grapher-export .graph-body .grapher-tooltip .tooltip-item path{fill:rgba(255,255,255,.6)}.grapher-export .graph-body .grapher-tooltip .tooltip-item text{fill:#0f0f0f;dominant-baseline:hanging;text-anchor:start}.grapher-export .graph-body .grapher-tooltip .tooltip-item.tooltip-item-fixed path{fill:#fff}.grapher-export .graph-body .grapher-tooltip .line{position:absolute;height:400px;border-left:1px solid #333}.grapher-export .graph-body .grapher-tooltip .custom-tooltip-container{position:absolute}.grapher-export .graph-body .grapher-context-menu{position:absolute;top:0;left:0}.grapher-export .graph-body .grapher-context-menu .menu-item .menu-text{user-select:all;position:absolute;top:0;background:rgba(255,255,255,.6);border:1px solid rgba(0,0,0,.3);color:#0f0f0f;padding:2px 4px;max-width:max-content;width:200px}.grapher-export .graph-body .grapher-draggable-points circle{cursor:pointer}.grapher-export .graph-body .grapher-vertical-lines line{stroke:#333}.grapher-export .graph-body .grapher-vertical-lines polygon{fill:#333}.grapher-export .graph-body .grapher-annotations{position:absolute;top:0;pointer-events:none;user-select:none}.grapher-export .graph-body .grapher-annotations .grapher-annotation{position:absolute}.grapher-export .graph-body .grapher-annotations .grapher-annotation .annotation-marker{display:inline-block;height:400px;background:rgba(0,0,0,.3)}.grapher-export .graph-body .grapher-annotations .grapher-annotation .annotation-text{position:absolute;top:0;background:rgba(255,255,255,.6);border:1px solid rgba(0,0,0,.3);color:#0f0f0f;padding:2px 4px;max-width:max-content;width:200px}.grapher-export .graph-body .bounds-selection{position:absolute;background:rgba(0,0,0,.02)}.grapher-export .axis{overflow:visible;user-select:none}.grapher-export .axis.x-axis{width:1px;height:20px;display:block}.grapher-export .axis.x-axis .axis-item text{text-anchor:middle}.grapher-export .axis.x-axis .axis-item.axis-item-first text{text-anchor:start}.grapher-export .axis.x-axis .axis-item.axis-item-last text{text-anchor:end}.grapher-export .axis.y-axis{height:400px}.grapher-export .axis.y-axis .axis-item text{text-anchor:end;alignment-baseline:middle}.grapher-export .axis.y-axis .y-axis-label{text-anchor:middle;fill:#000}.grapher-export .axis.y-axis .y-axis-label.y-axis-big-label{font-size:18px}.grapher-export .axis.y-axis .series-color-box{cursor:pointer}.grapher-export .axis.y-axis.y-axis-right .axis-item text{text-anchor:start}.grapher-export .axis .axis-line{stroke:#000;stroke-width:1px}.grapher-export .axis .axis-line-shadow{stroke:#bfbfbf;stroke-width:1px}.grapher-export .axis .axis-item path{stroke:#bfbfbf;stroke-width:1px}.grapher-export .axis .axis-item text{fill:#000;font-size:8px}.grapher-export .axis .axis-item.axis-item-major .axis-tick{stroke-width:2px}.grapher-export .axis .axis-item.axis-item-big-labels text{font-size:16px}.grapher-export .range-selection-graph{width:100%;padding-bottom:14px}.grapher-export .range-selection-graph .graph-body-secondary{height:50px}.grapher-export .range-selection-graph .graph-body-secondary svg{position:absolute;left:0;height:50px;width:100%;overflow:visible}.grapher-export .range-selection-graph .graph-body-secondary svg .target-selection{fill:rgba(0,0,0,.02);cursor:ew-resize}.grapher-export .range-selection-graph .graph-body-secondary svg .selection-bar{fill:#b0b0b7;cursor:ew-resize}.grapher-export .range-selection-graph .graph-body-secondary svg .selection-bar-track{fill:#eee}.grapher-export .range-selection-graph .graph-body-secondary svg .selection-bar-rifles{fill:none;stroke-width:1;stroke:#333}.grapher-export .range-selection-graph .graph-body-secondary svg .selection-bar-handle{stroke:#333;stroke-width:1;fill:#b0b0b7;cursor:ew-resize}.grapher-export .range-selection-graph .graph-body-secondary svg .target-selection-outline{stroke:#333;fill:none}.grapher-export .range-selection-graph .graph-body-secondary svg .axis-item text{fill:#9f9f9f;text-anchor:start;font-size:8px;user-select:none;dominant-baseline:text-after-edge}.grapher-export .range-selection-graph .graph-body-secondary svg .axis-item path{stroke:#bfbfbf;stroke-width:1px}.grapher-export input,.grapher-export textarea{background:rgba(0,0,0,0);border:1px solid #e0e0e3;margin:2px 0;color:#222;padding:1px 2px;text-align:center}.grapher-export input:focus,.grapher-export textarea:focus{outline:none;border-color:#505053}.grapher-export.grapher-dragging-y .y-axis{border:2px dashed silver;margin:-2px;flex-shrink:0}.grapher-export.grapher-dragging-y .y-axis+.y-axis{border-left:none}.grapher-export.grapher-fullscreen{height:calc(100vh - 2*10px)}.grapher-export.grapher-fixed-height .grapher-primary-container-outer{height:100%}.grapher-export.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body{height:100%;display:flex;flex-direction:column}.grapher-export.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row{flex-grow:1}.grapher-export.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row .central-container{display:flex;flex-direction:column;height:100%}.grapher-export.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row .central-container>.graph-body{flex-grow:1;height:unset}.grapher-export.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row .axis.y-axis{height:calc(100% - 40px)}.grapher-export.new-grapher{height:auto;border:2px dashed silver;text-align:center;color:#222}`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/grapher.scss\"],\"names\":[],\"mappings\":\"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\",\"sourcesContent\":[\"@mixin grapher(\\n $primary-graph-body-height: 400px,\\n $secondary-graph-body-height: 50px,\\n\\n $background-color-1: #2a2a2b,\\n $background-color-2: #3e3e40,\\n\\n $tooltip-line-color: #CCC,\\n $tooltip-background-color: rgba(0, 0, 0, 0.6),\\n $tooltip-text-color: #F0F0F0,\\n $vertical-line-color: #CCC,\\n\\n $axis-line-color: silver,\\n $axis-line-width: 2px,\\n $axis-tick-color: #505053,\\n $axis-text-color: #E0E0E3,\\n\\n $range-selection-text-color: silver,\\n $range-selection-button-color: #505053,\\n $range-selection-button-selected-color: black,\\n $range-selection-text-selected-color: silver,\\n $range-selection-text-color-faded: #AAA,\\n $range-selection-button-color-faded: #7A7A7A,\\n $range-selection-button-border: null,\\n $range-selection-selected-button-border: null,\\n\\n $range-graph-selection-bar-size: 14px,\\n $range-graph-selection-range-color: rgba(255, 255, 255, 0.1),\\n $range-graph-selection-outline-color: #AAA,\\n $range-graph-selection-bar-color: #808083,\\n $range-graph-selection-bar-track-color: #303033,\\n $range-graph-selection-bar-rifles-color: #FFF,\\n $range-graph-handle-color: #AAA,\\n $range-graph-handle-fill-color: #666,\\n $range-graph-axis-text-color: #9f9f9f,\\n\\n $annotation-background-color: rgba(255, 255, 255, 0.3),\\n\\n $series-key-axis-container-color: #111,\\n $series-key-input-border-color: #505053,\\n $series-key-input-selected-border-color: #E0E0E3,\\n $series-key-input-text-color: #E0E0E3,\\n $series-key-background: transparent,\\n $scale-label-color: silver,\\n $series-key-shadow-color: silver,\\n\\n $title-color: white,\\n\\n $sidebar-background-color: #111,\\n $sidebar-text-color: #EEE,\\n\\n $new-grapher-color: #DDD\\n) {\\n $x-axis-height: 20px;\\n $padding: 10px;\\n\\n $axis-z-index: 0;\\n $graph-body-z-index: 1;\\n\\n position: relative;\\n background: linear-gradient(to bottom right, $background-color-1, $background-color-2);\\n padding: $padding;\\n\\n font-family: sans-serif;\\n font-size: 12px;\\n line-height: normal;\\n\\n *, :after, :before {\\n box-sizing: content-box;\\n }\\n\\n .grapher-title {\\n text-align: center;\\n color: $title-color;\\n font-size: 18px;\\n margin-bottom: 8px;\\n }\\n\\n .grapher-primary-container-outer {\\n display: flex;\\n\\n .grapher-sidebar {\\n background: linear-gradient($sidebar-background-color, transparent 75%, transparent 100%);\\n color: $sidebar-text-color;\\n padding: 50px 6px 5px 10px;\\n margin-left: -$padding;\\n margin-top: -$padding;\\n margin-bottom: -$padding;\\n overflow-y: auto;\\n flex-shrink: 0;\\n\\n .series-toggle {\\n white-space: nowrap;\\n\\n & + .series-toggle {\\n margin-top: 3px;\\n }\\n\\n label {\\n display: inline-block;\\n position: relative;\\n user-select: none;\\n }\\n\\n input[type='checkbox'] {\\n opacity: 0;\\n cursor: pointer;\\n height: 0;\\n width: 0;\\n margin-right: 11px;\\n }\\n\\n input:not(:checked) ~ .checkmark {\\n background-color: transparent !important;\\n }\\n\\n input:checked ~ .checkmark:after {\\n display: block;\\n }\\n\\n .checkmark {\\n position: absolute;\\n top: 1px;\\n left: 0;\\n height: 7px;\\n width: 7px;\\n background-color: #eee;\\n border: 2px solid;\\n border-radius: 1px;\\n }\\n\\n .checkmark:after {\\n content: \\\"\\\";\\n position: absolute;\\n display: none;\\n\\n left: 0.5px;\\n top: -1.5px;\\n width: 3px;\\n height: 6px;\\n border: solid white;\\n border-width: 0 2px 2px 0;\\n -webkit-transform: rotate(45deg);\\n -ms-transform: rotate(45deg);\\n transform: rotate(45deg);\\n }\\n }\\n }\\n\\n .grapher-primary-container-body {\\n width: 100%;\\n padding-left: 2px;\\n }\\n }\\n\\n .series-key {\\n text-align: center;\\n margin-bottom: -14px;\\n position: relative;\\n\\n .scale-label {\\n display: inline-block;\\n background: $series-key-axis-container-color;\\n color: $scale-label-color;\\n transform: rotate(-90deg);\\n width: 24px;\\n margin-left: -5px;\\n vertical-align: top;\\n margin-top: 4px;\\n padding-bottom: 2px;\\n cursor: pointer;\\n user-select: none;\\n }\\n\\n .series-key-axis-container {\\n display: inline-block;\\n border: 1px solid $series-key-axis-container-color;\\n\\n min-width: 18px;\\n min-height: 24px;\\n vertical-align: top;\\n\\n white-space: nowrap;\\n\\n & + .series-key-axis-container {\\n margin-left: 4px;\\n }\\n\\n &.series-key-axis-container-showing-label {\\n .scale-label {\\n width: 46px;\\n margin-top: 15px;\\n margin-left: -15px;\\n margin-right: -12px;\\n }\\n\\n .series-key-axis-label-container {\\n display: block;\\n }\\n\\n .label-input-toggler {\\n path {\\n fill: $series-key-input-selected-border-color;\\n }\\n }\\n }\\n\\n .series-key-axis-container-body {\\n display: inline-block;\\n\\n & > div {\\n white-space: initial;\\n }\\n }\\n\\n .series-key-axis-label-container {\\n display: none;\\n }\\n\\n .label-input-toggler {\\n width: 16px;\\n cursor: pointer;\\n display: inline-block;\\n vertical-align: top;\\n margin: 4px 2px;\\n\\n path {\\n fill: $series-key-axis-container-color;\\n }\\n\\n &:hover {\\n path {\\n fill: $series-key-input-selected-border-color;\\n }\\n }\\n }\\n }\\n\\n .series-key-item {\\n border: 1px solid currentColor;\\n padding: 2px;\\n margin: 2px;\\n display: inline-block;\\n cursor: pointer;\\n user-select: none;\\n background: $series-key-background;\\n\\n & + .series-key-item {\\n margin-left: 4px;\\n }\\n\\n &.series-key-item-highlighted {\\n box-shadow: 0 0 4px $series-key-shadow-color;\\n }\\n }\\n }\\n\\n .range-selection {\\n color: $range-selection-text-color;\\n user-select: none;\\n\\n &.range-not-dates {\\n color: $range-selection-text-color-faded;\\n }\\n\\n .range-buttons {\\n text-align: right;\\n\\n .options-bar {\\n display: inline-block;\\n }\\n\\n .option-tooltip {\\n position: relative;\\n display: inline-block;\\n border-bottom: 1px dotted black;\\n\\n .option-tooltip-text {\\n visibility: hidden;\\n color: $range-selection-text-selected-color;\\n background: $range-selection-button-selected-color;\\n text-align: center;\\n padding: 5px 5px;\\n border-radius: 6px;\\n position: absolute;\\n z-index: 1;\\n border: 1px solid black;\\n\\n width: 120px;\\n margin-left: -65px;\\n top: calc(100% + 7px);\\n left: 50%;\\n }\\n\\n &:hover .option-tooltip-text {\\n visibility: visible;\\n }\\n\\n .option-tooltip-text::after {\\n content: \\\" \\\";\\n position: absolute;\\n bottom: 100%;\\n left: 50%;\\n margin-left: -5px;\\n border-width: 5px;\\n border-style: solid;\\n border-color: transparent transparent black transparent;\\n }\\n }\\n\\n .range-button {\\n display: inline-block;\\n cursor: pointer;\\n padding: 4px 8px;\\n @if ($range-selection-button-border == null) {\\n margin-left: 6px;\\n } @else {\\n margin-left: 4px;\\n }\\n\\n border-radius: 2px;\\n background: $range-selection-button-color;\\n border: $range-selection-button-border;\\n\\n &.range-button-selected {\\n color: $range-selection-text-selected-color;\\n background: $range-selection-button-selected-color;\\n border: $range-selection-selected-button-border;\\n }\\n\\n &.range-button-disabled, &.range-button-selected.range-button-disabled {\\n cursor: not-allowed;\\n color: $range-selection-text-color-faded;\\n background: $range-selection-button-color-faded;\\n }\\n\\n .icon-container {\\n position: relative;\\n width: 0;\\n\\n &.icon-container-narrow {\\n svg {\\n left: -3px;\\n }\\n }\\n\\n &.icon-container-square {\\n width: 5px;\\n\\n svg {\\n left: -5px;\\n }\\n }\\n\\n &.icon-container-448 {\\n width: 3px;\\n\\n svg {\\n left: -5px;\\n }\\n }\\n\\n &:before {\\n content: 'A';\\n opacity: 0;\\n }\\n\\n svg {\\n height: 15px;\\n position: absolute;\\n top: -1px;\\n left: -4px;\\n }\\n }\\n }\\n\\n .range-selection-history + .range-selection-history {\\n margin-right: 8px;\\n margin-left: 4px;\\n }\\n\\n .percentile-button {\\n & > div {\\n display: inline-block;\\n }\\n\\n input {\\n background: transparent;\\n border: 1px solid $series-key-input-border-color;\\n margin: 2px 8px 2px 0;\\n color: $series-key-input-text-color;\\n padding: 1px 2px;\\n width: 20px;\\n font-size: 11px;\\n -moz-appearance: textfield;\\n\\n &:focus {\\n outline: none;\\n border-color: $series-key-input-selected-border-color;\\n }\\n\\n &::-webkit-outer-spin-button,\\n &::-webkit-inner-spin-button {\\n -webkit-appearance: none;\\n margin: 0;\\n }\\n }\\n\\n .icon-container.icon-container-narrow {\\n svg {\\n height: 12px;\\n top: 1px;\\n left: -5px;\\n }\\n }\\n }\\n\\n .showing-options-button {\\n margin-right: 8px;\\n }\\n }\\n }\\n\\n .grapher-main-row {\\n display: flex;\\n\\n .central-container {\\n width: 100%;\\n }\\n }\\n\\n .range-graph-container {\\n display: flex;\\n }\\n\\n .graph-body {\\n width: 100%;\\n height: $primary-graph-body-height;\\n position: relative;\\n\\n canvas {\\n width: 100%;\\n height: 100%;\\n }\\n\\n .grapher-tooltip, .grapher-draggable-points, .grapher-vertical-lines {\\n position: absolute;\\n top: 0;\\n left: 0;\\n right: 0;\\n\\n > svg {\\n position: absolute;\\n overflow: visible;\\n left: 0;\\n }\\n }\\n\\n .grapher-vertical-lines {\\n pointer-events: none;\\n user-select: none;\\n }\\n\\n .grapher-tooltip {\\n .tooltip-item {\\n path {\\n fill: $tooltip-background-color;\\n }\\n\\n text {\\n fill: $tooltip-text-color;\\n dominant-baseline: hanging;\\n text-anchor: start;\\n }\\n\\n &.tooltip-item-fixed {\\n path {\\n fill: rgba($tooltip-background-color, 1);\\n }\\n }\\n }\\n\\n .line {\\n position: absolute;\\n height: 400px;\\n border-left: 1px solid $tooltip-line-color;\\n }\\n\\n .custom-tooltip-container {\\n position: absolute;\\n }\\n }\\n\\n .grapher-context-menu {\\n position: absolute;\\n top: 0;\\n left: 0;\\n .menu-item {\\n\\n .menu-text {\\n user-select: all;\\n position: absolute;\\n top: 0;\\n background: $tooltip-background-color;\\n border: 1px solid $annotation-background-color;\\n color: $tooltip-text-color;\\n padding: 2px 4px;\\n max-width: max-content;\\n width: 200px;\\n }\\n }\\n }\\n\\n .grapher-draggable-points {\\n circle {\\n cursor: pointer;\\n }\\n }\\n\\n .grapher-vertical-lines {\\n line {\\n stroke: $vertical-line-color;\\n }\\n\\n polygon {\\n fill: $vertical-line-color;\\n }\\n }\\n\\n .grapher-annotations {\\n position: absolute;\\n top: 0;\\n pointer-events: none;\\n user-select: none;\\n\\n .grapher-annotation {\\n position: absolute;\\n\\n .annotation-marker {\\n display: inline-block;\\n height: $primary-graph-body-height;\\n background: $annotation-background-color;\\n }\\n\\n .annotation-text {\\n position: absolute;\\n top: 0;\\n background: $tooltip-background-color;\\n border: 1px solid $annotation-background-color;\\n color: $tooltip-text-color;\\n padding: 2px 4px;\\n max-width: max-content;\\n width: 200px;\\n }\\n }\\n }\\n\\n .bounds-selection {\\n position: absolute;\\n background: $range-graph-selection-range-color;\\n }\\n }\\n\\n .axis {\\n overflow: visible;\\n user-select: none;\\n\\n &.x-axis {\\n width: 1px;\\n height: $x-axis-height;\\n display: block;\\n\\n .axis-item {\\n text {\\n text-anchor: middle;\\n }\\n\\n &.axis-item-first {\\n text {\\n text-anchor: start;\\n }\\n }\\n\\n &.axis-item-last {\\n text {\\n text-anchor: end;\\n }\\n }\\n }\\n }\\n\\n &.y-axis {\\n height: $primary-graph-body-height;\\n\\n .axis-item text {\\n text-anchor: end;\\n alignment-baseline: middle;\\n }\\n\\n .y-axis-label {\\n text-anchor: middle;\\n fill: $axis-text-color;\\n\\n &.y-axis-big-label {\\n font-size: 18px;\\n }\\n }\\n\\n .series-color-box {\\n cursor: pointer;\\n }\\n\\n &.y-axis-right {\\n .axis-item text {\\n text-anchor: start;\\n }\\n }\\n }\\n\\n .axis-line {\\n stroke: $axis-line-color;\\n stroke-width: $axis-line-width;\\n }\\n\\n .axis-line-shadow {\\n stroke: $axis-tick-color;\\n stroke-width: 1px;\\n }\\n\\n .axis-item {\\n path {\\n stroke: $axis-tick-color;\\n stroke-width: 1px;\\n }\\n\\n text {\\n fill: $axis-text-color;\\n font-size: 8px;\\n }\\n\\n &.axis-item-major {\\n .axis-tick {\\n stroke-width: 2px;\\n }\\n }\\n\\n &.axis-item-big-labels {\\n text {\\n font-size: 16px;\\n }\\n }\\n }\\n }\\n\\n .range-selection-graph {\\n width: 100%;\\n padding-bottom: $range-graph-selection-bar-size;\\n\\n .graph-body-secondary {\\n height: $secondary-graph-body-height;\\n\\n svg {\\n position: absolute;\\n left: 0;\\n height: $secondary-graph-body-height;\\n width: 100%;\\n overflow: visible;\\n\\n .target-selection {\\n fill: $range-graph-selection-range-color;\\n cursor: ew-resize;\\n }\\n\\n .selection-bar {\\n fill: $range-graph-selection-bar-color;\\n cursor: ew-resize;\\n }\\n\\n .selection-bar-track {\\n fill: $range-graph-selection-bar-track-color;\\n }\\n\\n .selection-bar-rifles {\\n fill: none;\\n stroke-width: 1;\\n stroke: $range-graph-selection-bar-rifles-color;\\n }\\n\\n .selection-bar-handle {\\n stroke: $range-graph-handle-color;\\n stroke-width: 1;\\n fill: $range-graph-handle-fill-color;\\n cursor: ew-resize;\\n }\\n\\n .target-selection-outline {\\n stroke: $range-graph-selection-outline-color;\\n fill: none;\\n }\\n\\n .axis-item {\\n text {\\n fill: $range-graph-axis-text-color;\\n text-anchor: start;\\n font-size: 8px;\\n user-select: none;\\n dominant-baseline: text-after-edge;\\n }\\n\\n path {\\n stroke: $axis-tick-color;\\n stroke-width: 1px;\\n }\\n }\\n }\\n }\\n }\\n\\n input, textarea {\\n background: transparent;\\n border: 1px solid $series-key-input-border-color;\\n margin: 2px 0;\\n color: $series-key-input-text-color;\\n padding: 1px 2px;\\n text-align: center;\\n\\n &:focus {\\n outline: none;\\n border-color: $series-key-input-selected-border-color;\\n }\\n }\\n\\n &.grapher-dragging-y {\\n .y-axis {\\n border: 2px dashed silver;\\n margin: -2px;\\n flex-shrink: 0;\\n\\n & + .y-axis {\\n border-left: none;\\n }\\n }\\n }\\n\\n &.grapher-fullscreen {\\n height: calc(100vh - 2*#{$padding});\\n }\\n\\n &.grapher-fixed-height {\\n .grapher-primary-container-outer {\\n height: 100%;\\n\\n .grapher-primary-container-body {\\n height: 100%;\\n display: flex;\\n flex-direction: column;\\n\\n .grapher-main-row {\\n flex-grow: 1;\\n\\n .central-container {\\n display: flex;\\n flex-direction: column;\\n height: 100%;\\n\\n > .graph-body {\\n flex-grow: 1;\\n height: unset;\\n }\\n }\\n\\n .axis.y-axis {\\n height: calc(100% - #{2*$x-axis-height});\\n }\\n }\\n }\\n }\\n }\\n\\n &.new-grapher {\\n height: auto;\\n border: 2px dashed silver;\\n text-align: center;\\n color: $new-grapher-color;\\n }\\n}\\n\\n@mixin grapher-theme-night (\\n $primary-graph-body-height: 400px,\\n $secondary-graph-body-height: 50px,\\n) {\\n @include grapher(\\n $primary-graph-body-height,\\n $secondary-graph-body-height\\n );\\n}\\n\\n@mixin grapher-theme-day (\\n $primary-graph-body-height: 400px,\\n $secondary-graph-body-height: 50px,\\n) {\\n @include grapher(\\n $primary-graph-body-height,\\n $secondary-graph-body-height,\\n\\n $background-color-1: #FFF,\\n $background-color-2: #FFF,\\n\\n $tooltip-line-color: invert(#CCC),\\n $tooltip-background-color: invert(rgba(0, 0, 0, 0.6)),\\n $tooltip-text-color: invert(#F0F0F0),\\n $vertical-line-color: invert(#CCC),\\n\\n $axis-line-color: #656565,\\n $axis-tick-color: #BFBFBF,\\n $axis-text-color: invert(#E0E0E3),\\n\\n $range-selection-text-color: #444,\\n $range-selection-button-color: white,\\n $range-selection-button-selected-color: white,\\n $range-selection-text-selected-color: black,\\n $range-selection-text-color-faded: #888,\\n $range-selection-button-color-faded: #EEE,\\n $range-selection-button-border: 1px dotted silver,\\n $range-selection-selected-button-border: 1px solid black,\\n\\n $range-graph-selection-range-color: rgba(0, 0, 0, 0.02),\\n $range-graph-selection-outline-color: #333,\\n $range-graph-selection-bar-color: #B0B0B7,\\n $range-graph-selection-bar-track-color: #EEE,\\n $range-graph-selection-bar-rifles-color: #333,\\n $range-graph-handle-color: #333,\\n $range-graph-handle-fill-color: #B0B0B7,\\n\\n $annotation-background-color: rgba(0, 0, 0, 0.3),\\n\\n $series-key-axis-container-color: #B0B0B7,\\n $series-key-input-border-color: #E0E0E3,\\n $series-key-input-selected-border-color: #505053,\\n $series-key-input-text-color: #222,\\n $series-key-background: null,\\n $series-key-shadow-color: black,\\n $scale-label-color: black,\\n\\n $title-color: black,\\n\\n $sidebar-background-color: #EEE,\\n $sidebar-text-color: #111,\\n\\n $new-grapher-color: #222\\n );\\n}\\n\\n@mixin grapher-theme-export (\\n $primary-graph-body-height: 400px,\\n $secondary-graph-body-height: 50px,\\n) {\\n @include grapher(\\n $primary-graph-body-height,\\n $secondary-graph-body-height,\\n\\n $background-color-1: #FFF,\\n $background-color-2: #FFF,\\n\\n $tooltip-line-color: invert(#CCC),\\n $tooltip-background-color: invert(rgba(0, 0, 0, 0.6)),\\n $tooltip-text-color: invert(#F0F0F0),\\n $vertical-line-color: invert(#CCC),\\n\\n $axis-line-color: black,\\n $axis-line-width: 1px,\\n $axis-tick-color: #BFBFBF,\\n $axis-text-color: black,\\n\\n $range-selection-text-color: #444,\\n $range-selection-button-color: white,\\n $range-selection-button-selected-color: white,\\n $range-selection-text-selected-color: black,\\n $range-selection-text-color-faded: #888,\\n $range-selection-button-color-faded: #EEE,\\n $range-selection-button-border: 1px dotted silver,\\n $range-selection-selected-button-border: 1px solid black,\\n\\n $range-graph-selection-range-color: rgba(0, 0, 0, 0.02),\\n $range-graph-selection-outline-color: #333,\\n $range-graph-selection-bar-color: #B0B0B7,\\n $range-graph-selection-bar-track-color: #EEE,\\n $range-graph-selection-bar-rifles-color: #333,\\n $range-graph-handle-color: #333,\\n $range-graph-handle-fill-color: #B0B0B7,\\n\\n $annotation-background-color: rgba(0, 0, 0, 0.3),\\n\\n $series-key-axis-container-color: #B0B0B7,\\n $series-key-input-border-color: #E0E0E3,\\n $series-key-input-selected-border-color: #505053,\\n $series-key-input-text-color: #222,\\n $series-key-background: null,\\n $series-key-shadow-color: black,\\n $scale-label-color: black,\\n\\n $title-color: black,\\n\\n $sidebar-background-color: #EEE,\\n $sidebar-text-color: #111,\\n\\n $new-grapher-color: #222\\n );\\n}\\n\\n.grapher-night {\\n @include grapher-theme-night();\\n}\\n\\n.grapher-day {\\n @include grapher-theme-day();\\n}\\n\\n.grapher-export {\\n @include grapher-theme-export();\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","\"use strict\";\n\n/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n*/\nmodule.exports = function (cssWithMappingToString) {\n var list = [];\n\n // return the list of modules as css string\n list.toString = function toString() {\n return this.map(function (item) {\n var content = \"\";\n var needLayer = typeof item[5] !== \"undefined\";\n if (item[4]) {\n content += \"@supports (\".concat(item[4], \") {\");\n }\n if (item[2]) {\n content += \"@media \".concat(item[2], \" {\");\n }\n if (needLayer) {\n content += \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\");\n }\n content += cssWithMappingToString(item);\n if (needLayer) {\n content += \"}\";\n }\n if (item[2]) {\n content += \"}\";\n }\n if (item[4]) {\n content += \"}\";\n }\n return content;\n }).join(\"\");\n };\n\n // import a list of modules into the list\n list.i = function i(modules, media, dedupe, supports, layer) {\n if (typeof modules === \"string\") {\n modules = [[null, modules, undefined]];\n }\n var alreadyImportedModules = {};\n if (dedupe) {\n for (var k = 0; k < this.length; k++) {\n var id = this[k][0];\n if (id != null) {\n alreadyImportedModules[id] = true;\n }\n }\n }\n for (var _k = 0; _k < modules.length; _k++) {\n var item = [].concat(modules[_k]);\n if (dedupe && alreadyImportedModules[item[0]]) {\n continue;\n }\n if (typeof layer !== \"undefined\") {\n if (typeof item[5] === \"undefined\") {\n item[5] = layer;\n } else {\n item[1] = \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\").concat(item[1], \"}\");\n item[5] = layer;\n }\n }\n if (media) {\n if (!item[2]) {\n item[2] = media;\n } else {\n item[1] = \"@media \".concat(item[2], \" {\").concat(item[1], \"}\");\n item[2] = media;\n }\n }\n if (supports) {\n if (!item[4]) {\n item[4] = \"\".concat(supports);\n } else {\n item[1] = \"@supports (\".concat(item[4], \") {\").concat(item[1], \"}\");\n item[4] = supports;\n }\n }\n list.push(item);\n }\n };\n return list;\n};","\"use strict\";\n\nmodule.exports = function (item) {\n var content = item[1];\n var cssMapping = item[3];\n if (!cssMapping) {\n return content;\n }\n if (typeof btoa === \"function\") {\n var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));\n var data = \"sourceMappingURL=data:application/json;charset=utf-8;base64,\".concat(base64);\n var sourceMapping = \"/*# \".concat(data, \" */\");\n return [content].concat([sourceMapping]).join(\"\\n\");\n }\n return [content].join(\"\\n\");\n};","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\n\nfunction emptyFunction() {}\nfunction emptyFunctionWithReset() {}\nemptyFunctionWithReset.resetWarningCache = emptyFunction;\n\nmodule.exports = function() {\n function shim(props, propName, componentName, location, propFullName, secret) {\n if (secret === ReactPropTypesSecret) {\n // It is still safe when called from React.\n return;\n }\n var err = new Error(\n 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n 'Use PropTypes.checkPropTypes() to call them. ' +\n 'Read more at http://fb.me/use-check-prop-types'\n );\n err.name = 'Invariant Violation';\n throw err;\n };\n shim.isRequired = shim;\n function getShim() {\n return shim;\n };\n // Important!\n // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`.\n var ReactPropTypes = {\n array: shim,\n bigint: shim,\n bool: shim,\n func: shim,\n number: shim,\n object: shim,\n string: shim,\n symbol: shim,\n\n any: shim,\n arrayOf: getShim,\n element: shim,\n elementType: shim,\n instanceOf: getShim,\n node: shim,\n objectOf: getShim,\n oneOf: getShim,\n oneOfType: getShim,\n shape: getShim,\n exact: getShim,\n\n checkPropTypes: emptyFunctionWithReset,\n resetWarningCache: emptyFunction\n };\n\n ReactPropTypes.PropTypes = ReactPropTypes;\n\n return ReactPropTypes;\n};\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (process.env.NODE_ENV !== 'production') {\n var ReactIs = require('react-is');\n\n // By explicitly using `prop-types` you are opting into new development behavior.\n // http://fb.me/prop-types-in-prod\n var throwOnDirectAccess = true;\n module.exports = require('./factoryWithTypeCheckers')(ReactIs.isElement, throwOnDirectAccess);\n} else {\n // By explicitly using `prop-types` you are opting into new production behavior.\n // http://fb.me/prop-types-in-prod\n module.exports = require('./factoryWithThrowingShims')();\n}\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nmodule.exports = ReactPropTypesSecret;\n","\"use strict\";\n\nvar stylesInDOM = [];\nfunction getIndexByIdentifier(identifier) {\n var result = -1;\n for (var i = 0; i < stylesInDOM.length; i++) {\n if (stylesInDOM[i].identifier === identifier) {\n result = i;\n break;\n }\n }\n return result;\n}\nfunction modulesToDom(list, options) {\n var idCountMap = {};\n var identifiers = [];\n for (var i = 0; i < list.length; i++) {\n var item = list[i];\n var id = options.base ? item[0] + options.base : item[0];\n var count = idCountMap[id] || 0;\n var identifier = \"\".concat(id, \" \").concat(count);\n idCountMap[id] = count + 1;\n var indexByIdentifier = getIndexByIdentifier(identifier);\n var obj = {\n css: item[1],\n media: item[2],\n sourceMap: item[3],\n supports: item[4],\n layer: item[5]\n };\n if (indexByIdentifier !== -1) {\n stylesInDOM[indexByIdentifier].references++;\n stylesInDOM[indexByIdentifier].updater(obj);\n } else {\n var updater = addElementStyle(obj, options);\n options.byIndex = i;\n stylesInDOM.splice(i, 0, {\n identifier: identifier,\n updater: updater,\n references: 1\n });\n }\n identifiers.push(identifier);\n }\n return identifiers;\n}\nfunction addElementStyle(obj, options) {\n var api = options.domAPI(options);\n api.update(obj);\n var updater = function updater(newObj) {\n if (newObj) {\n if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap && newObj.supports === obj.supports && newObj.layer === obj.layer) {\n return;\n }\n api.update(obj = newObj);\n } else {\n api.remove();\n }\n };\n return updater;\n}\nmodule.exports = function (list, options) {\n options = options || {};\n list = list || [];\n var lastIdentifiers = modulesToDom(list, options);\n return function update(newList) {\n newList = newList || [];\n for (var i = 0; i < lastIdentifiers.length; i++) {\n var identifier = lastIdentifiers[i];\n var index = getIndexByIdentifier(identifier);\n stylesInDOM[index].references--;\n }\n var newLastIdentifiers = modulesToDom(newList, options);\n for (var _i = 0; _i < lastIdentifiers.length; _i++) {\n var _identifier = lastIdentifiers[_i];\n var _index = getIndexByIdentifier(_identifier);\n if (stylesInDOM[_index].references === 0) {\n stylesInDOM[_index].updater();\n stylesInDOM.splice(_index, 1);\n }\n }\n lastIdentifiers = newLastIdentifiers;\n };\n};","\"use strict\";\n\nvar memo = {};\n\n/* istanbul ignore next */\nfunction getTarget(target) {\n if (typeof memo[target] === \"undefined\") {\n var styleTarget = document.querySelector(target);\n\n // Special case to return head of iframe instead of iframe itself\n if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {\n try {\n // This will throw an exception if access to iframe is blocked\n // due to cross-origin restrictions\n styleTarget = styleTarget.contentDocument.head;\n } catch (e) {\n // istanbul ignore next\n styleTarget = null;\n }\n }\n memo[target] = styleTarget;\n }\n return memo[target];\n}\n\n/* istanbul ignore next */\nfunction insertBySelector(insert, style) {\n var target = getTarget(insert);\n if (!target) {\n throw new Error(\"Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.\");\n }\n target.appendChild(style);\n}\nmodule.exports = insertBySelector;","\"use strict\";\n\n/* istanbul ignore next */\nfunction insertStyleElement(options) {\n var element = document.createElement(\"style\");\n options.setAttributes(element, options.attributes);\n options.insert(element, options.options);\n return element;\n}\nmodule.exports = insertStyleElement;","\"use strict\";\n\n/* istanbul ignore next */\nfunction setAttributesWithoutAttributes(styleElement) {\n var nonce = typeof __webpack_nonce__ !== \"undefined\" ? __webpack_nonce__ : null;\n if (nonce) {\n styleElement.setAttribute(\"nonce\", nonce);\n }\n}\nmodule.exports = setAttributesWithoutAttributes;","\"use strict\";\n\n/* istanbul ignore next */\nfunction apply(styleElement, options, obj) {\n var css = \"\";\n if (obj.supports) {\n css += \"@supports (\".concat(obj.supports, \") {\");\n }\n if (obj.media) {\n css += \"@media \".concat(obj.media, \" {\");\n }\n var needLayer = typeof obj.layer !== \"undefined\";\n if (needLayer) {\n css += \"@layer\".concat(obj.layer.length > 0 ? \" \".concat(obj.layer) : \"\", \" {\");\n }\n css += obj.css;\n if (needLayer) {\n css += \"}\";\n }\n if (obj.media) {\n css += \"}\";\n }\n if (obj.supports) {\n css += \"}\";\n }\n var sourceMap = obj.sourceMap;\n if (sourceMap && typeof btoa !== \"undefined\") {\n css += \"\\n/*# sourceMappingURL=data:application/json;base64,\".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), \" */\");\n }\n\n // For old IE\n /* istanbul ignore if */\n options.styleTagTransform(css, styleElement, options.options);\n}\nfunction removeStyleElement(styleElement) {\n // istanbul ignore if\n if (styleElement.parentNode === null) {\n return false;\n }\n styleElement.parentNode.removeChild(styleElement);\n}\n\n/* istanbul ignore next */\nfunction domAPI(options) {\n if (typeof document === \"undefined\") {\n return {\n update: function update() {},\n remove: function remove() {}\n };\n }\n var styleElement = options.insertStyleElement(options);\n return {\n update: function update(obj) {\n apply(styleElement, options, obj);\n },\n remove: function remove() {\n removeStyleElement(styleElement);\n }\n };\n}\nmodule.exports = domAPI;","\"use strict\";\n\n/* istanbul ignore next */\nfunction styleTagTransform(css, styleElement) {\n if (styleElement.styleSheet) {\n styleElement.styleSheet.cssText = css;\n } else {\n while (styleElement.firstChild) {\n styleElement.removeChild(styleElement.firstChild);\n }\n styleElement.appendChild(document.createTextNode(css));\n }\n}\nmodule.exports = styleTagTransform;","module.exports = \"precision highp float;\\n\\nuniform vec4 color;\\n\\nvoid main() {\\n gl_FragColor = vec4(color);\\n}\\n\"","module.exports = \"precision highp float;\\n\\nattribute vec2 position;\\n\\nvoid main() {\\n gl_Position = vec4((position - 0.5)*2.0, 0.0, 1.0);\\n}\\n\"","module.exports = \"#ifdef GL_OES_standard_derivatives\\n#extension GL_OES_standard_derivatives : enable\\n#endif\\n\\nprecision mediump float;\\n\\nuniform vec4 color;\\n\\n// Adapted and modified from https://www.desultoryquest.com/blog/drawing-anti-aliased-circular-points-using-opengl-slash-webgl/\\nvoid main() {\\n float delta = 0.0;\\n float alpha = 1.0;\\n vec2 center = 2.0 * gl_PointCoord - 1.0;\\n float r = dot(center, center);\\n\\n if (r > 1.0) {\\n discard;\\n }\\n\\n #ifdef GL_OES_standard_derivatives\\n delta = fwidth(r);\\n alpha = 1.0 - smoothstep(1.0 - delta, 1.0 + delta, r);\\n #endif\\n\\n gl_FragColor = color * alpha;\\n}\\n\"","module.exports = \"precision mediump float;\\n\\nattribute vec2 position;\\n\\nuniform float width;\\nuniform float height;\\nuniform float pointSize;\\n\\nvoid main() {\\n gl_Position = vec4(2.0*position.x/width - 1.0, 1.0 - 2.0*position.y/height, 0.0, 1.0);\\n gl_PointSize = pointSize;\\n}\"","module.exports = \"precision highp float;\\n\\nuniform vec4 color;\\nuniform float thickness;\\nuniform float shadowBlur;\\nuniform vec4 shadowColor;\\n\\nvarying vec2 position_vec;\\nvarying vec2 prev_position_vec;\\n\\n/**\\n * Calculate distance between point and line in screen space (ie, inputs in pixels, returns distance in pixels)\\n */\\nfloat distance_from_line() {\\n float x0 = gl_FragCoord.x;\\n float y0 = gl_FragCoord.y;\\n\\n // let line be defined by ax + by + c = 0;\\n float a, b, c;\\n\\n if (position_vec.x == prev_position_vec.x) {\\n a = 1.0;\\n b = 0.0;\\n c = -position_vec.x;\\n } else {\\n float slope = (position_vec.y - prev_position_vec.y)/(position_vec.x - prev_position_vec.x);\\n float y_intercept = position_vec.y - slope*position_vec.x;\\n\\n // y = slope*x + y_intercept\\n // (-slope)(x) + (1)(y) - y_intercept = 0;\\n a = -slope;\\n b = 1.0;\\n c = -y_intercept;\\n }\\n\\n return abs(a*x0 + b*y0 + c)/length(vec2(a, b));\\n}\\n\\nvoid main() {\\n vec4 transparent = vec4(0.0, 0.0, 0.0, 0.0);\\n\\n float dist = distance_from_line();\\n\\n if (dist + shadowBlur >= thickness) {\\n float percent_shadowed = ((thickness - dist) / shadowBlur);\\n gl_FragColor = mix(transparent, shadowColor, percent_shadowed*percent_shadowed);\\n } else {\\n gl_FragColor = vec4(color);\\n gl_FragColor.rgb *= gl_FragColor.a;\\n }\\n}\\n\"","module.exports = \"precision highp float;\\n\\nattribute vec2 position;\\nattribute vec2 prevPosition;\\nattribute float vertex;\\n\\nuniform float width;\\nuniform float height;\\nuniform float thickness;\\n\\nvarying vec2 position_vec;\\nvarying vec2 prev_position_vec;\\n\\nvoid main() {\\n vec2 delta = position - prevPosition;\\n vec2 alpha = prevPosition;\\n vec2 beta = position;\\n\\n vec2 normalized_delta = normalize(delta);\\n vec2 normal = vec2(-thickness/2.0 * normalized_delta.y, thickness/2.0 * normalized_delta.x);\\n\\n vec2 vertex_position =\\n step(0.5, mod(vertex, 2.0))*alpha + // alpha if vertex is odd, 0 otherwise\\n step(0.5, mod(vertex + 1.0, 2.0))*beta + // beta if vertex is even, 0 otherwise\\n 2.0*(step(1.5, vertex)-0.5)*normal // -normal if vertex < 2, +normal otherwise\\n ;\\n\\n position_vec = vec2(position.x, height - position.y);\\n prev_position_vec = vec2(prevPosition.x, height - prevPosition.y);\\n\\n gl_Position = vec4(2.0*vertex_position.x/width - 1.0, 1.0 - 2.0*vertex_position.y/height, 0.0, 1.0);\\n}\\n\"","module.exports = __WEBPACK_EXTERNAL_MODULE__9155__;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n// expose the module cache\n__webpack_require__.c = __webpack_module_cache__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".bundle.js\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.p = \"/assets/\";","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t792: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\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\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n// no on chunks loaded\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\n}\n\nvar chunkLoadingGlobal = globalThis[\"webpackChunkGrapher\"] = globalThis[\"webpackChunkGrapher\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.nc = undefined;","// module cache are used so entry inlining is disabled\n// startup\n// Load entry module and return exports\nvar __webpack_exports__ = __webpack_require__(7210);\n"],"names":["root","factory","exports","module","require","define","amd","globalThis","__WEBPACK_EXTERNAL_MODULE__9155__","inProgress","dataWebpackPrefix","wasmImportedFuncCache0","wasmImportedFuncCache1","wasmImportedFuncCache2","wasmImportedFuncCache3","wasmImportedFuncCache4","wasmImportedFuncCache5","wasmImportedFuncCache6","wasmImportedFuncCache7","wasmImportedFuncCache8","wasmImportedFuncCache9","installedWasmModules","wasmImportObjects","wasmModuleMap","SIMPLE_DATA_TYPES","DATA_TYPES","Data","PropTypes","SingleSeries","data","isRequired","type","xKey","yKey","xUnixDates","color","name","xLabel","yLabel","ignoreDiscontinuities","dashed","dashPattern","width","rangeSelectorWidth","axis","expandYWith","defaultAlwaysTooltipped","square","shiftXBy","graph","background","hideFromKey","showIndividualPoints","rendering","negativeColor","gradient","zeroLineWidth","zeroLineColor","pointRadius","tooltipWidth","hasAreaBottom","shadowColor","rangeKey","Series","Axis","axisIndex","series","side","scale","label","Axes","CustomBoundsSelector","calculator","datesOnly","CustomBoundsSelectors","TooltipOptionsRaw","includeSeriesLabel","includeXLabel","includeYLabel","includeXValue","includeYValue","floating","alwaysFixedPosition","floatPosition","floatDelta","savingDisabled","customTooltip","combineTooltips","TooltipOptions","Annotation","x","Date","xEnd","content","Annotations","DraggablePoint","y","radius","fillColor","strokeColor","strokeWidth","onClick","onDoubleClick","DraggablePoints","VerticalLine","lineTop","markTop","style","markerStyle","text","textTop","textStyle","minPixelX","maxPixelX","onRangeGraph","onRangeGraphOnly","VerticalLines","async","sizeCanvas","canvas","context","reset","height","Promise","resolve","requestAnimationFrame","boundingRect","parentNode","getBoundingClientRect","pixelRatio","window","devicePixelRatio","webkitBackingStorePixelRatio","mozBackingStorePixelRatio","msBackingStorePixelRatio","oBackingStorePixelRatio","backingStorePixelRatio","elementWidth","elementHeight","renderWidth","renderHeight","LINE_COLORS","getColor","seriesColor","i","multigrapherSeriesIndex","length","undefined","colorToVector","startsWith","parts","split","map","part","parseFloat","match","test","Error","parseInt","substr","pathsFrom","dataInRenderSpace","splitAtY","paths","currentPath","previouslyDiscontinuous","nullMask","maxYValues","minYValues","yValues","push","minY","maxY","prevY","RustAPI","extractVerticesFromPaths","pointNumber","path","positions","Float32Array","prevPositions","vertices","indices","Uint32Array","verticesPattern","set","vertexPointer","sourceLength","copyWithin","pointI","prevX","j","createGLProgram","gl","vertShaderSource","fragShaderSource","vertexShader","createShader","VERTEX_SHADER","shaderSource","compileShader","getShaderParameter","COMPILE_STATUS","console","error","getShaderInfoLog","fragmentShader","FRAGMENT_SHADER","program","createProgram","attachShader","linkProgram","validateProgram","getProgramParameter","LINK_STATUS","getProgramInfoLog","then","LineProgram","constructor","this","_gl","_program","lineVert","lineFrag","_circleProgram","circleVert","circleFrag","_positionBuffer","createBuffer","_prevPositionBuffer","_vertexBuffer","_indexBuffer","_individualPointBuffer","getExtension","dispose","clear","drawingBufferWidth","drawingBufferHeight","clearColor","DEPTH_BUFFER_BIT","COLOR_BUFFER_BIT","viewport","draw","parameters","useProgram","thickness","highlighted","shadowBlur","get_point_number","extract_vertices","extractVertices","positionIndex","getAttribLocation","prevPositionIndex","vertexIndex","enableVertexAttribArray","bindBuffer","ARRAY_BUFFER","bufferData","STATIC_DRAW","vertexAttribPointer","FLOAT","uniform1f","getUniformLocation","Math","max","uniform4f","ELEMENT_ARRAY_BUFFER","drawElements","TRIANGLES","UNSIGNED_INT","individualPoints","getIndividualPoints","flat","drawArrays","POINTS","Eventable","_listeners","clearListeners","on","eventName","fn","Set","add","off","delete","size","emit","args","arguments","forEach","apply","BackgroundProgram","backgroundVert","backgroundFrag","minXt","maxXt","positionLocation","enable","BLEND","blendFunc","SRC_ALPHA","ONE_MINUS_SRC_ALPHA","drawZeroLine","sizing","zeroColor","zeroWidth","strokeStyle","lineWidth","beginPath","moveTo","lineTo","stroke","getBarWidths","closestSpacing","bounds","axisSeriesCount","fullBarWidth","maxX","minX","totalBarWidth","barWidth","barSpacing","inferType","options","useSimpleData","simpleData","Array","isArray","observe","GraphBodyRenderer","stateController","canvasElement","webgl","checkIntersection","super","_stateController","_checkIntersection","_canvas","_webgl","_context","getContext","_lineProgram","alert","_context2d","_initialized","_initializeCanvas","_boundResize","resize","bind","_cachedAxisCount","_onAxisChange","axes","count","filter","_resizeObserver","disconnect","_intersectionObserver","clearRect","render","singleSeries","inRenderSpace","defaultLineWidth","globalBounds","inRenderSpaceAreaBottom","useDataSpace","currentBounds","inSelectedSpace","inDataSpace","_sizing","commonCPUParams","flush","index","zero","hasNegatives","find","tuple","some","indexInAxis","fillStyle","barBottom","fillRect","drawBars","indexOf","globalGradient","createLinearGradient","value","addColorStop","areaBottom","areaPaths","areaBottomPaths","linePaths","pathI","areaBottomPath","firstX","_startY","lastX","_lastY","fill","positive","arc","PI","drawArea","drawParams","getRanges","object","range","min","pixelX","pixelMinY","pixelMaxY","setLineDash","ranges","horizontalBarWidth","drawLine","renderBackground","inBackgroundSpace","_backgroundProgram","drawBackground","markSizeChanged","ResizeObserver","first","disabled","IntersectionObserver","entries","clearTimeout","_intersectionTimeout","isIntersecting","setTimeout","threshold","sizingPromise","resizeDebounced","_resizeTimeout","recalculatePosition","calculatePrecision","log10","abs","roundToPrecision","precision","isNaN","toString","rounded","toFixed","ceil","stripped","includes","replace","DATE_TIME_FORMATTERS","timezoneToOffsetMS","timeZone","sampleDate","datetimeFormatter","properTimeZone","Intl","DateTimeFormat","resolvedOptions","timeZoneName","offsetPart","formatToParts","hours","minutes","slice","e","startOfDayInTimezone","date","timezone","startOfDay","setHours","offset","setUTCHours","valueOf","formatX","dates","justTime","justDate","justMonthAndDay","clockStyle","unitOverride","integersOnly","inverseEnumMap","time","utc","toLowerCase","localOffset","year","getUTCFullYear","getFullYear","month","getUTCMonth","getMonth","day","getUTCDate","getDate","toLocaleDateString","getUTCHours","getHours","getUTCMinutes","getMinutes","seconds","getUTCSeconds","getSeconds","milliseconds","getUTCMilliseconds","getMilliseconds","timeString","padStart","formatTime","round","formatY","log","Y_AXIS_WIDTH","getYLabelContent","fullYPrecision","TooltipLabel","axisLabel","textLeft","formatXOptions","React","propTypes","CustomPropTypes","Tooltip","props","halfHeight","passThroughProps","preparedTooltips","tooltips","tooltip","pixelY","fixedPosition","multiplier","caretSize","isFinite","transform","commonLabelProps","maxPrecision","baseLeft","yTranslation","axisCount","caretPadding","CustomTooltipComponent","groupedTooltips","combinationThreshold","added","group","totalHeight","maxWidth","sort","a","b","className","key","r","d","_extends","top","left","defaultProps","mouseX","mouseY","ContextMenu","setTextRef","ref","textRef","contextMenu","showing","document","createRange","selection","getSelection","removeAllRanges","selectNodeContents","addRange","focus","formatDateTime","dateTimeStr","datePart","timePart","formattedDate","period","toLocaleString","displayValue","autoFocus","simpleSeriesToDataSpace","tuples","tuplesToDataSpace","values","valuesToDataSpace","objects","objectsToDataSpace","originalXValue","enumToNumber","yValue","valueXStart","xValue","readBinaryFormatValue","view","getUint32","BYTES_PER_ELEMENT","getUint8","getFloat64","point","buffer","ArrayBuffer","DataView","xIndex","channels","yIndex","offsets","subpoint","finalizeBounds","initial","Object","keys","calculateDataBounds","percentile","percentileAsymmetry","sortedByY","_x","_x1","y1","_x2","y2","asymmetry","inBottomPercentile","inTopPercentile","startIndex","floor","endIndex","percentileBounds","spacing","mergeBounds","boundsList","mergedBounds","expandBounds","extendXForNBars","expandedBounds","assign","unscaledMinY","unscaledMaxY","midpoint","binarySearch","targetX","searchParams","returnIndex","middleIndex","searchType","dataSpaceToSelectedSpace","swap","firstAdded","lastAdded","beforeIndex","afterIndex","addToEndOnly","beginningInterpolationIndex","endInterpolationIndex","pop","shift","unshift","interpolationIndex","interpolate","lastIncluded","nullIndex","selectedIndex","splice","dataIndex","begPoint","endPoint","firstIndex","secondIndex","boundary","xBefore","yBefore","xAfter","yAfter","percent","scaleBounds","selectedSpaceToRenderSpace","dataChanged","Uint8Array","Float64Array","scaledBounds","inParams","dataF64","dataNullMask","copyIndexStart","hasSwap","useSwap","extraSpaceFactor","selected_space_to_render_space","prevI","minSeenY","maxSeenY","curY","selectedSpaceToRenderSpaceInPlace","flattenSimpleData","flattened","fI","extractYValue","warn","extractXValue","moveTooltip","distance","sqrt","xDistance","pixelWidth","all","lastMinute","last10Minutes","lastHour","lastDay","condenseDataSpace","targetBucketCount","partiallyCondensedData","concat","CONDENSE_THRESHOLD","condensedData","bucketSize","minInBucket","maxInBucket","currentBucketIndex","bucketIndex","nameForSeries","selectedSpaceToBackgroundSpace","conditions","evaluator","comparator","comparedAgainst","parsedValue","currentSection","condition","interpolatedMaxX","interpolatedMinX","RustAPIPromise","StateController","defaultBoundsCalculator","customBoundsSelectors","requireWASM","defaultShowIndividualPoints","defaultShowSidebar","defaultShowAnnotations","defaultShowOptions","syncPool","grapherID","sharedDataCache","sharedSubscriptions","fullscreen","_requireWASM","_markDirty","_series","_seriesFromOriginalSeries","Map","_axes","_highlightedSeries","_showIndividualPoints","_autoscaleY","_percentile","_percentileAsymmetry","_showingOptions","_maxPrecision","_showingSidebar","_showingAnnotations","_grapherID","_fullscreen","_alwaysTooltipped","_tooltipState","mousePresent","_contextMenuPosition","_savedTooltips","_draggingY","_annotations","_annotationsState","annotations","_enumMap","_hasXEnum","_timingBuffer","_timingIndex","_timingFrameCount","_modifiedSeries","_deferredEmissions","_deferredPriorityEmissions","primaryRenderer","rangeGraphRenderer","_boundsCalculator","givenLabel","customCalculators","BOUND_CALCULATORS","getDefaultBoundsCalculator","_boundsHistory","_boundsIndex","_dataCache","_subscriptions","_subscriptionsShared","_observablesToSeries","_generators","_generatorsToSeries","_generatorCallArgs","_seriesChangedFromPromises","_syncPool","_onDataChange","listener","unsubscribe","_removeSeries","remove","disposed","setSeries","userSeries","userCreated","propsSeries","anyDifferent","originalSeries","_mustResize","newSeriesSet","has","get","_tooltipsChanged","deferredEmit","_assignAxisTo","hidden","_hideSeries","_dataChanged","_frameRequested","frameRequestStart","performance","now","frameExecutionStart","dataProcessingStart","_mustRerender","_annotationsChanged","_onDataAdd","_primarySizeChanged","_calculatePrimarySizeDependents","_rangeGraphSizeChanged","_calculateRangeGraphSizeDependents","dataProcessingEnd","renderPipelineStart","_render","renderPipelineEnd","generatorsStart","_mustCallGenerators","_callGenerators","generatorsEnd","tooltipStart","_recalculateTooltips","tooltipEnd","contextMenuStart","_contextMenuChanged","_recalculateContextMenu","contextMenuEnd","annotationStart","_recalculateAnnotations","annotationEnd","callbacksStart","emission","callbacksEnd","completionTime","loopTime","frameExecution","frameRequestAndExecution","generators","dataProcessing","renderPipeline","callbacks","lastLoopTime","deferredPriorityEmit","_seriesToSimpleData","currentData","sameDataSet","firstSameDataSeries","next","_listenToObservableData","observable","_callGenerator","_listenToPromise","dataPromise","resolved","datum","markObservableModified","_unsubscribeFromStaleSeries","currentSeries","seriesSet","stillHasListener","generator","stillHasSeries","_selection","alwaysTooltipped","savedTooltips","allTooltipped","savedTooltip","minDistance","Infinity","trueX","closestIndex","closestPoint","ignoreYDistance","xDistanceThreshold","yDistanceThreshold","distanceThreshold","yDistance","enumLike","hasEnum","simplePoint","hasXEnum","unsavedTooltips","unsavedTooltipsCount","calculateTooltipState","_tooltipAllNext","_globalBounds","_tooltipStateArg","newX","right","shownSeries","annotation","seriesName","xAsNumber","xEndAsNumber","xStart","pixelEnd","calculateAnnotationsState","_expandYWith","dataBoundsList","simpleDataSliceStart","dataBounds","_dataBounds","_recalculateSelection","disableSwap","selectedBounds","selectedBoundsAreaTop","selectedBoundsAreaBottom","inSelectedSpaceAreaBottom","_recalculateAxisBounds","modifiedSeries","newData","modifiedAxes","modifiedSeriesAndDependents","newDataInDataSpace","newDataBounds","newPointCount","previousSelection","newSelectedData","fixedY","targetBounds","byAxis","selectedBoundsList","selectedDataBounds","boundsCalculator","selectionFromGlobalBounds","_","export","night","_theme","inBackgroundSpacePrimary","inRenderSpacePrimary","_defaultLineWidth","inRenderSpacePrimaryAreaBottom","inRenderSpaceRangeGraph","inRenderSpaceRangeGraphAreaBottom","s","toCondensedSelectedSpaceParams","inCondensedSelectedSpacePrimary","toRenderSpaceParams","inCondensedSelectedSpacePrimaryAreaBottom","inBackgroundSpacePrimaryAreaBottom","toSelectedSpaceParams","inSelectedSpaceRangeGraph","inCondensedSelectedSpaceRangeGraph","inSelectedSpaceRangeGraphAreaBottom","inCondensedSelectedSpaceRangeGraphAreaBottom","_createAxis","_moveAxis","newAxis","oldAxis","oldIndex","leftAxes","rightAxes","exportedAxes","originalAxis","number","seen","candidateAxis","findMatchingAxis","inValueSpacePrimary","inValueSpaceRangeGraph","_showSeries","boundCalculator","reverse","highlightedSeries","autoscaleY","boundHistory","hasNextBounds","hasPreviousBounds","tooltipState","contextMenuState","draggingY","averageLoopTime","loopTimes","result","averageLoopTimes","axisToName","leftCount","rightCount","showingOptions","showingSidebar","showingAnnotations","userCreatedSeries","annotationState","theme","exportMode","_exportMode","enumMap","renderer","_nonExportTheme","boundingFunction","debounceHistory","_boundingCalculatorDebouncer","_addBoundCalculatorToHistory","boundsSelectors","_customBoundsSelectors","indexedCustomBoundSelectors","registerSeriesClick","selectedSeriesIndex","setHighlightedSeries","toggleIndividualPoints","toggleYAutoscaling","toggleExportMode","setBoundsFromSelection","pixelSelection","minPixelY","maxPixelY","pow","boundCalculatorFromSelection","nextBounds","previousBounds","setLabel","toggleScale","oldScale","recalculateTooltips","setTooltipMousePosition","clientX","_tooltipClientX","clientY","_tooltipClientY","shiftKey","shiftKeyPressedOnMove","tooltipAllNext","tooltipStateArg","showOnlySavedTooltips","bottom","newMouseX","newMouseY","setContextMenuMousePosition","toggleAlwaysTooltipped","registerClick","toggleTooltipSaved","oldSavedTooltips","currentTooltips","lastTooltip","currentTooltipIndex","findIndex","clearSavedTooltips","markDragStart","finalizeDrag","draggedSeries","hasAxis","sameGrapherID","timingFrameCount","toggleShowingOptions","toggleMaxPrecision","toggleShowingAnnotations","toggleShowingSidebar","setShowing","skipResize","isX","existingIndex","indexToSet","triggerResize","useEvent","eventSource","initialState","watch","originalInitialState","setValue","useState","useEffect","updatedValue","originalUpdatedValue","usePrimarySize","useAxes","useSeries","useHighlightedSeries","useRightAxisCount","useRightAxes","useLeftAxisCount","useLeftAxes","useAxisBounds","useAutoscaleY","useShowingOptions","useMaxPrecision","useShowingSidebar","useShowingAnnotations","useSizing","useTheme","bodyHeight","lineOnly","draggablePoints","onPointDrag","onDraggablePointsDoubleClick","onPointlessDoubleClick","event","newXT","newYT","xT","yT","stopPropagation","cx","cy","onMouseDown","xOffset","yOffset","onMouseMove","moveEvent","onMouseUp","removeEventListener","addEventListener","verticalLines","isRangeGraph","relevantVerticalLines","line","lineStyle","fontSize","textAnchor","dominantBaseline","x1","x2","points","GraphBody","boundsSelectionEnabled","showTooltips","tooltipOptions","canvasEl","useCallback","el","boundsSelection","setBoundsSelection","start","useTooltipState","showAnnotations","useAnnotationState","useContextMenu","onScroll","onGlobalMouseMove","passive","onMouseLeave","currentNode","target","classList","contains","closest","onContextMenu","preventDefault","placeTick","trueValue","inverted","totalSize","formatter","formatOptions","opts","scaledValue","pixelValue","placeTickByPixel","roundToDivisor","divisor","divisors","bestDelta","bestDivisor","delta","placeGrid","expectedLabelSize","labelPadding","skipFirst","skipLast","paddedLabelSize","ticks","placementParams","amount","unit","span","desiredCount","subspan","getEvenDateTickSpacing","position","currentDate","setMinutes","setSeconds","setMilliseconds","setDate","lastDateString","tick","placeDatesGrid","tickSpacing","roundTo","getEvenTickSpacing","roundToEvenNumber","placeNumbersGrid","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","locals","XAxis","showAxes","showGrid","bigLabels","xTickUnit","formatXAxisLabel","useSelection","useHasXEnum","useEnumMap","minDate","maxDate","calculateTimePrecision","minLabel","maxLabel","expectedLabelWidth","marginBottom","skipGrid","classes","join","xAxisHeight","YAxis","showSeriesKey","sideIndex","dragPositionYOffset","showAxisColors","sidePadding","setDraggedSeries","dragDelta","setDragDelta","dx","dy","highlightedOpacity","unhighlightedOpacity","marginLeft","opacity","edge","strokeDasharray","startDrag","startX","startY","mouseUpEvent","dataset","grapherId","onMouseOver","onMouseOut","RangeSelectionButtonBase","selected","children","description","RangeSelectionButton","currentBoundCalculator","PercentileButton","usePercentile","usePercentileAsymmetry","onChange","onKeyUp","keyCode","focusable","viewBox","Options","sidebarEnabled","useShowIndividualPoints","RangeSelection","customBoundsSelectorsOnly","rightAxisCount","leftAxisCount","marginRight","useGlobalBounds","useBoundCalculator","useBoundHistory","customBoundSelectorNames","RangeGraph","state","selectionBounds","stopDragging","startScroll","startLeftDrag","startRightDrag","componentDidMount","_renderer","setState","componentDidUpdate","prevProps","componentWillUnmount","_dragType","leftX","percentage","_scrollAnchorPercentage","boundToRight","boundToLeft","addListeners","pixelStartX","pixelMinX","pixelMaxX","markDates","SeriesKeyItem","backgroundColor","SeriesKeyAxisContainer","showingLabelInput","toggleLabelInputShowing","placeholder","SeriesKey","dragPosition","setDragPosition","keyRef","useRef","keyWidth","setKeyWidth","reduce","sizeCalculationHandle","current","cancelAnimationFrame","querySelectorAll","clientWidth","calculateStyles","useAlwaysTooltipped","toggleTooltipped","startDragging","seriesKeyEl","targetLeft","seriesKeyLeft","seriesKeyMarginLeft","clientStartX","clientStartY","pointerEvents","zIndex","GraphTitle","title","SeriesToggle","checked","defaultChecked","borderColor","Sidebar","Grapher","grapherDefaultProps","showRangeGraph","showRangeSelectors","useMemo","id","stateControllerInitialization","exportStateController","onRenderTime","onAxisChange","useDraggingY","styles","classNames","calculateClassNamesAndStyles","commonYAxisProps","xAxisIntegersOnly","markRangeGraphDates","syncBounds","syncTooltips","syncDragState","_stateControllers","_syncBounds","_syncTooltips","_syncDragState","otherStateController","stateArg","_tooltipIgnoreState","shouldHideTooltips","random","AVAILABLE_COLORS","BUILT_IN_BOUND_CALCULATORS","___CSS_LOADER_EXPORT___","cssWithMappingToString","list","item","needLayer","modules","media","dedupe","supports","layer","alreadyImportedModules","k","_k","cssMapping","btoa","base64","unescape","encodeURIComponent","JSON","stringify","sourceMapping","ReactPropTypesSecret","emptyFunction","emptyFunctionWithReset","resetWarningCache","shim","propName","componentName","location","propFullName","secret","err","getShim","ReactPropTypes","array","bigint","bool","func","string","symbol","any","arrayOf","element","elementType","instanceOf","node","objectOf","oneOf","oneOfType","shape","exact","checkPropTypes","stylesInDOM","getIndexByIdentifier","identifier","modulesToDom","idCountMap","identifiers","base","indexByIdentifier","obj","css","sourceMap","references","updater","addElementStyle","byIndex","api","update","newObj","lastIdentifiers","newList","newLastIdentifiers","_i","_index","memo","styleTarget","querySelector","HTMLIFrameElement","contentDocument","head","getTarget","appendChild","createElement","attributes","styleElement","nonce","setAttribute","removeChild","removeStyleElement","styleSheet","cssText","firstChild","createTextNode","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","m","c","n","getter","__esModule","definition","o","defineProperty","enumerable","f","chunkId","promises","u","g","Function","prop","prototype","hasOwnProperty","call","l","url","done","script","needAttach","scripts","getElementsByTagName","getAttribute","charset","timeout","nc","src","onScriptComplete","prev","onerror","onload","doneFns","Symbol","toStringTag","p","installedChunks","installedChunkData","promise","reject","errorType","realSrc","message","request","webpackJsonpCallback","parentChunkLoadingFunction","chunkIds","moreModules","runtime","chunkLoadingGlobal","p0i32","p1i32","w","wasm","wasmModuleId","idx","installedWasmModuleData","importObject","req","fetch","WebAssembly","compileStreaming","items","instantiate","instantiateStreaming","arrayBuffer","bytes","res","instance"],"sourceRoot":""}
1
+ {"version":3,"file":"bundle.js","mappings":"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","sources":["webpack://Grapher/webpack/universalModuleDefinition","webpack://Grapher/webpack/runtime/load script","webpack://Grapher/./src/grapher.scss","webpack://Grapher/./node_modules/css-loader/dist/runtime/api.js","webpack://Grapher/./node_modules/css-loader/dist/runtime/sourceMaps.js","webpack://Grapher/./node_modules/prop-types/factoryWithThrowingShims.js","webpack://Grapher/./node_modules/prop-types/index.js","webpack://Grapher/./node_modules/prop-types/lib/ReactPropTypesSecret.js","webpack://Grapher/./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js","webpack://Grapher/./node_modules/style-loader/dist/runtime/insertBySelector.js","webpack://Grapher/./node_modules/style-loader/dist/runtime/insertStyleElement.js","webpack://Grapher/./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js","webpack://Grapher/./node_modules/style-loader/dist/runtime/styleDomAPI.js","webpack://Grapher/./node_modules/style-loader/dist/runtime/styleTagTransform.js","webpack://Grapher/./src/renderer/background.frag","webpack://Grapher/./src/renderer/background.vert","webpack://Grapher/./src/renderer/circle.frag","webpack://Grapher/./src/renderer/circle.vert","webpack://Grapher/./src/renderer/line.frag","webpack://Grapher/./src/renderer/line.vert","webpack://Grapher/external umd \"react\"","webpack://Grapher/webpack/bootstrap","webpack://Grapher/webpack/runtime/compat get default export","webpack://Grapher/webpack/runtime/define property getters","webpack://Grapher/webpack/runtime/ensure chunk","webpack://Grapher/webpack/runtime/get javascript chunk filename","webpack://Grapher/webpack/runtime/hasOwnProperty shorthand","webpack://Grapher/webpack/runtime/make namespace object","webpack://Grapher/webpack/runtime/publicPath","webpack://Grapher/webpack/runtime/jsonp chunk loading","webpack://Grapher/webpack/runtime/nonce","webpack://Grapher/./src/state/data_types.js","webpack://Grapher/./src/helpers/custom_prop_types.js","webpack://Grapher/./src/renderer/size_canvas.js","webpack://Grapher/./src/helpers/colors.js","webpack://Grapher/./src/helpers/color_to_vector.js","webpack://Grapher/./src/renderer/paths_from.js","webpack://Grapher/./src/renderer/extract_vertices.js","webpack://Grapher/./src/renderer/create_gl_program.js","webpack://Grapher/./src/renderer/line_program.js","webpack://Grapher/./src/eventable.js","webpack://Grapher/./src/renderer/background_program.js","webpack://Grapher/./src/renderer/draw_zero_line.js","webpack://Grapher/./src/renderer/draw_bars.js","webpack://Grapher/./src/state/infer_type.js","webpack://Grapher/./src/renderer/graph_body_renderer.js","webpack://Grapher/./src/renderer/draw_area.js","webpack://Grapher/./src/renderer/draw_line.js","webpack://Grapher/./src/renderer/draw_background.js","webpack://Grapher/./src/helpers/format.js","webpack://Grapher/./src/helpers/axis_sizes.js","webpack://Grapher/./src/components/tooltip.js","webpack://Grapher/./src/components/context_menu.js","webpack://Grapher/./src/state/space_conversions/simple_series_to_data_space.js","webpack://Grapher/./src/state/calculate_data_bounds.js","webpack://Grapher/./src/state/merge_bounds.js","webpack://Grapher/./src/state/expand_bounds.js","webpack://Grapher/./src/helpers/binary_search.js","webpack://Grapher/./src/state/space_conversions/data_space_to_selected_space.js","webpack://Grapher/./src/renderer/scale_bounds.js","webpack://Grapher/./src/state/rust_api.js","webpack://Grapher/./src/state/space_conversions/selected_space_to_render_space.js","webpack://Grapher/./src/helpers/flatten_simple_data.js","webpack://Grapher/./src/state/calculate_tooltip_state.js","webpack://Grapher/./src/state/bound_calculators.js","webpack://Grapher/./src/state/space_conversions/condense_data_space.js","webpack://Grapher/./src/helpers/name_for_series.js","webpack://Grapher/./src/state/space_conversions/selected_space_to_background_space.js","webpack://Grapher/./src/state/state_controller.js","webpack://Grapher/./src/state/get_default_bounds_calculator.js","webpack://Grapher/./src/helpers/generator_params_equal.js","webpack://Grapher/./src/state/calculate_annotations_state.js","webpack://Grapher/./src/state/selection_from_global_bounds.js","webpack://Grapher/./src/state/find_matching_axis.js","webpack://Grapher/./src/state/average_loop_times.js","webpack://Grapher/./src/state/bound_calculator_from_selection.js","webpack://Grapher/./src/state/hooks.js","webpack://Grapher/./src/components/annotations.js","webpack://Grapher/./src/components/draggable_points.js","webpack://Grapher/./src/components/vertical_lines.js","webpack://Grapher/./src/components/graph_body.js","webpack://Grapher/./src/grapher.scss?e17f","webpack://Grapher/./src/helpers/place_grid.js","webpack://Grapher/./src/components/x_axis.js","webpack://Grapher/./src/components/y_axis.js","webpack://Grapher/./src/components/range_selection_button_base.js","webpack://Grapher/./src/components/range_selection_button.js","webpack://Grapher/./src/components/percentile_button.js","webpack://Grapher/./src/components/options.js","webpack://Grapher/./src/components/range_selection.js","webpack://Grapher/./src/components/range_graph.js","webpack://Grapher/./src/components/series_key_item.js","webpack://Grapher/./src/components/series_key_axis_container.js","webpack://Grapher/./src/components/series_key.js","webpack://Grapher/./src/components/graph_title.js","webpack://Grapher/./src/components/sidebar.js","webpack://Grapher/./src/grapher.js","webpack://Grapher/./src/state/sync_pool.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"react\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"react\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Grapher\"] = factory(require(\"react\"));\n\telse\n\t\troot[\"Grapher\"] = factory(root[\"react\"]);\n})(globalThis, (__WEBPACK_EXTERNAL_MODULE__155__) => {\nreturn ","var inProgress = {};\nvar dataWebpackPrefix = \"Grapher:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.grapher-night{position:relative;background:linear-gradient(to bottom right, #2a2a2b, #3e3e40);padding:10px;font-family:sans-serif;font-size:12px;line-height:normal}.grapher-night *,.grapher-night :after,.grapher-night :before{box-sizing:content-box}.grapher-night .grapher-title{text-align:center;color:#fff;font-size:18px;margin-bottom:8px}.grapher-night .grapher-primary-container-outer{display:flex}.grapher-night .grapher-primary-container-outer .grapher-sidebar{background:linear-gradient(#111, transparent 75%, transparent 100%);color:#eee;padding:50px 6px 5px 10px;margin-left:-10px;margin-top:-10px;margin-bottom:-10px;overflow-y:auto;flex-shrink:0}.grapher-night .grapher-primary-container-outer .grapher-sidebar .series-toggle{white-space:nowrap}.grapher-night .grapher-primary-container-outer .grapher-sidebar .series-toggle+.series-toggle{margin-top:3px}.grapher-night .grapher-primary-container-outer .grapher-sidebar .series-toggle label{display:inline-block;position:relative;user-select:none}.grapher-night .grapher-primary-container-outer .grapher-sidebar .series-toggle input[type=checkbox]{opacity:0;cursor:pointer;height:0;width:0;margin-right:11px}.grapher-night .grapher-primary-container-outer .grapher-sidebar .series-toggle input:not(:checked)~.checkmark{background-color:rgba(0,0,0,0) !important}.grapher-night .grapher-primary-container-outer .grapher-sidebar .series-toggle input:checked~.checkmark:after{display:block}.grapher-night .grapher-primary-container-outer .grapher-sidebar .series-toggle .checkmark{position:absolute;top:1px;left:0;height:7px;width:7px;background-color:#eee;border:2px solid;border-radius:1px}.grapher-night .grapher-primary-container-outer .grapher-sidebar .series-toggle .checkmark:after{content:\"\";position:absolute;display:none;left:.5px;top:-1.5px;width:3px;height:6px;border:solid #fff;border-width:0 2px 2px 0;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.grapher-night .grapher-primary-container-outer .grapher-primary-container-body{width:100%;padding-left:2px}.grapher-night .series-key{text-align:center;margin-bottom:-14px;position:relative}.grapher-night .series-key .scale-label{display:inline-block;background:#111;color:silver;transform:rotate(-90deg);width:24px;margin-left:-5px;vertical-align:top;margin-top:4px;padding-bottom:2px;cursor:pointer;user-select:none}.grapher-night .series-key .series-key-axis-container{display:inline-block;border:1px solid #111;min-width:18px;min-height:24px;vertical-align:top;white-space:nowrap}.grapher-night .series-key .series-key-axis-container+.series-key-axis-container{margin-left:4px}.grapher-night .series-key .series-key-axis-container.series-key-axis-container-showing-label .scale-label{width:46px;margin-top:15px;margin-left:-15px;margin-right:-12px}.grapher-night .series-key .series-key-axis-container.series-key-axis-container-showing-label .series-key-axis-label-container{display:block}.grapher-night .series-key .series-key-axis-container.series-key-axis-container-showing-label .label-input-toggler path{fill:#e0e0e3}.grapher-night .series-key .series-key-axis-container .series-key-axis-container-body{display:inline-block}.grapher-night .series-key .series-key-axis-container .series-key-axis-container-body>div{white-space:initial}.grapher-night .series-key .series-key-axis-container .series-key-axis-label-container{display:none}.grapher-night .series-key .series-key-axis-container .label-input-toggler{width:16px;cursor:pointer;display:inline-block;vertical-align:top;margin:4px 2px}.grapher-night .series-key .series-key-axis-container .label-input-toggler path{fill:#111}.grapher-night .series-key .series-key-axis-container .label-input-toggler:hover path{fill:#e0e0e3}.grapher-night .series-key .series-key-item{border:1px solid currentColor;padding:2px;margin:2px;display:inline-block;cursor:pointer;user-select:none;background:rgba(0,0,0,0)}.grapher-night .series-key .series-key-item+.series-key-item{margin-left:4px}.grapher-night .series-key .series-key-item.series-key-item-highlighted{box-shadow:0 0 4px silver}.grapher-night .range-selection{color:silver;user-select:none}.grapher-night .range-selection.range-not-dates{color:#aaa}.grapher-night .range-selection .range-buttons{text-align:right}.grapher-night .range-selection .range-buttons .options-bar{display:inline-block}.grapher-night .range-selection .range-buttons .option-tooltip{position:relative;display:inline-block;border-bottom:1px dotted #000}.grapher-night .range-selection .range-buttons .option-tooltip .option-tooltip-text{visibility:hidden;color:silver;background:#000;text-align:center;padding:5px 5px;border-radius:6px;position:absolute;z-index:1;border:1px solid #000;width:120px;margin-left:-65px;top:calc(100% + 7px);left:50%}.grapher-night .range-selection .range-buttons .option-tooltip:hover .option-tooltip-text{visibility:visible}.grapher-night .range-selection .range-buttons .option-tooltip .option-tooltip-text::after{content:\" \";position:absolute;bottom:100%;left:50%;margin-left:-5px;border-width:5px;border-style:solid;border-color:rgba(0,0,0,0) rgba(0,0,0,0) #000 rgba(0,0,0,0)}.grapher-night .range-selection .range-buttons .range-button{display:inline-block;cursor:pointer;padding:4px 8px;margin-left:6px;border-radius:2px;background:#505053}.grapher-night .range-selection .range-buttons .range-button.range-button-selected{color:silver;background:#000}.grapher-night .range-selection .range-buttons .range-button.range-button-disabled,.grapher-night .range-selection .range-buttons .range-button.range-button-selected.range-button-disabled{cursor:not-allowed;color:#aaa;background:#7a7a7a}.grapher-night .range-selection .range-buttons .range-button .icon-container{position:relative;width:0}.grapher-night .range-selection .range-buttons .range-button .icon-container.icon-container-narrow svg{left:-3px}.grapher-night .range-selection .range-buttons .range-button .icon-container.icon-container-square{width:5px}.grapher-night .range-selection .range-buttons .range-button .icon-container.icon-container-square svg{left:-5px}.grapher-night .range-selection .range-buttons .range-button .icon-container.icon-container-448{width:3px}.grapher-night .range-selection .range-buttons .range-button .icon-container.icon-container-448 svg{left:-5px}.grapher-night .range-selection .range-buttons .range-button .icon-container:before{content:\"A\";opacity:0}.grapher-night .range-selection .range-buttons .range-button .icon-container svg{height:15px;position:absolute;top:-1px;left:-4px}.grapher-night .range-selection .range-buttons .range-selection-history+.range-selection-history{margin-right:8px;margin-left:4px}.grapher-night .range-selection .range-buttons .percentile-button>div{display:inline-block}.grapher-night .range-selection .range-buttons .percentile-button input{background:rgba(0,0,0,0);border:1px solid #505053;margin:2px 8px 2px 0;color:#e0e0e3;padding:1px 2px;width:20px;font-size:11px;-moz-appearance:textfield}.grapher-night .range-selection .range-buttons .percentile-button input:focus{outline:none;border-color:#e0e0e3}.grapher-night .range-selection .range-buttons .percentile-button input::-webkit-outer-spin-button,.grapher-night .range-selection .range-buttons .percentile-button input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.grapher-night .range-selection .range-buttons .percentile-button .icon-container.icon-container-narrow svg{height:12px;top:1px;left:-5px}.grapher-night .range-selection .range-buttons .showing-options-button{margin-right:8px}.grapher-night .grapher-main-row{display:flex}.grapher-night .grapher-main-row .central-container{width:100%}.grapher-night .range-graph-container{display:flex}.grapher-night .graph-body{width:100%;height:400px;position:relative}.grapher-night .graph-body canvas{width:100%;height:100%}.grapher-night .graph-body .grapher-tooltip,.grapher-night .graph-body .grapher-draggable-points,.grapher-night .graph-body .grapher-vertical-lines{position:absolute;top:0;left:0;right:0}.grapher-night .graph-body .grapher-tooltip>svg,.grapher-night .graph-body .grapher-draggable-points>svg,.grapher-night .graph-body .grapher-vertical-lines>svg{position:absolute;overflow:visible;left:0}.grapher-night .graph-body .grapher-vertical-lines{pointer-events:none;user-select:none}.grapher-night .graph-body .grapher-tooltip .tooltip-item path{fill:rgba(0,0,0,.6)}.grapher-night .graph-body .grapher-tooltip .tooltip-item text{fill:#f0f0f0;dominant-baseline:hanging;text-anchor:start}.grapher-night .graph-body .grapher-tooltip .tooltip-item.tooltip-item-fixed path{fill:#000}.grapher-night .graph-body .grapher-tooltip .line{position:absolute;height:400px;border-left:1px solid #ccc}.grapher-night .graph-body .grapher-tooltip .custom-tooltip-container{position:absolute}.grapher-night .graph-body .grapher-context-menu{position:absolute;top:0;left:0}.grapher-night .graph-body .grapher-context-menu .menu-item .menu-text{user-select:all;position:absolute;top:0;background:rgba(0,0,0,.6);border:1px solid rgba(255,255,255,.3);color:#f0f0f0;padding:2px 4px;max-width:max-content;width:200px}.grapher-night .graph-body .grapher-draggable-points circle{cursor:pointer}.grapher-night .graph-body .grapher-vertical-lines line{stroke:#ccc}.grapher-night .graph-body .grapher-vertical-lines polygon{fill:#ccc}.grapher-night .graph-body .grapher-annotations{position:absolute;top:0;pointer-events:none;user-select:none}.grapher-night .graph-body .grapher-annotations .grapher-annotation{position:absolute}.grapher-night .graph-body .grapher-annotations .grapher-annotation .annotation-marker{display:inline-block;height:400px;background:rgba(255,255,255,.3)}.grapher-night .graph-body .grapher-annotations .grapher-annotation .annotation-text{position:absolute;top:0;background:rgba(0,0,0,.6);border:1px solid rgba(255,255,255,.3);color:#f0f0f0;padding:2px 4px;max-width:max-content;width:200px}.grapher-night .graph-body .bounds-selection{position:absolute;background:rgba(255,255,255,.1)}.grapher-night .axis{overflow:visible;user-select:none}.grapher-night .axis.x-axis{width:1px;height:20px;display:block}.grapher-night .axis.x-axis .axis-item text{text-anchor:middle}.grapher-night .axis.x-axis .axis-item.axis-item-first text{text-anchor:start}.grapher-night .axis.x-axis .axis-item.axis-item-last text{text-anchor:end}.grapher-night .axis.y-axis{height:400px}.grapher-night .axis.y-axis .axis-item text{text-anchor:end;alignment-baseline:middle}.grapher-night .axis.y-axis .y-axis-label{text-anchor:middle;fill:#e0e0e3}.grapher-night .axis.y-axis .y-axis-label.y-axis-big-label{font-size:18px}.grapher-night .axis.y-axis .series-color-box{cursor:pointer}.grapher-night .axis.y-axis.y-axis-right .axis-item text{text-anchor:start}.grapher-night .axis .axis-line{stroke:silver;stroke-width:2px}.grapher-night .axis .axis-line-shadow{stroke:#505053;stroke-width:1px}.grapher-night .axis .axis-item path{stroke:#505053;stroke-width:1px}.grapher-night .axis .axis-item text{fill:#e0e0e3;font-size:8px}.grapher-night .axis .axis-item.axis-item-major .axis-tick{stroke-width:2px}.grapher-night .axis .axis-item.axis-item-big-labels text{font-size:16px}.grapher-night .range-selection-graph{width:100%;padding-bottom:14px}.grapher-night .range-selection-graph .graph-body-secondary{height:50px}.grapher-night .range-selection-graph .graph-body-secondary svg{position:absolute;left:0;height:50px;width:100%;overflow:visible}.grapher-night .range-selection-graph .graph-body-secondary svg .target-selection{fill:rgba(255,255,255,.1);cursor:ew-resize}.grapher-night .range-selection-graph .graph-body-secondary svg .selection-bar{fill:#808083;cursor:ew-resize}.grapher-night .range-selection-graph .graph-body-secondary svg .selection-bar-track{fill:#303033}.grapher-night .range-selection-graph .graph-body-secondary svg .selection-bar-rifles{fill:none;stroke-width:1;stroke:#fff}.grapher-night .range-selection-graph .graph-body-secondary svg .selection-bar-handle{stroke:#aaa;stroke-width:1;fill:#666;cursor:ew-resize}.grapher-night .range-selection-graph .graph-body-secondary svg .target-selection-outline{stroke:#aaa;fill:none}.grapher-night .range-selection-graph .graph-body-secondary svg .axis-item text{fill:#9f9f9f;text-anchor:start;font-size:8px;user-select:none;dominant-baseline:text-after-edge}.grapher-night .range-selection-graph .graph-body-secondary svg .axis-item path{stroke:#505053;stroke-width:1px}.grapher-night input,.grapher-night textarea{background:rgba(0,0,0,0);border:1px solid #505053;margin:2px 0;color:#e0e0e3;padding:1px 2px;text-align:center}.grapher-night input:focus,.grapher-night textarea:focus{outline:none;border-color:#e0e0e3}.grapher-night.grapher-dragging-y .y-axis{border:2px dashed silver;margin:-2px;flex-shrink:0}.grapher-night.grapher-dragging-y .y-axis+.y-axis{border-left:none}.grapher-night.grapher-fullscreen{height:calc(100vh - 2*10px)}.grapher-night.grapher-fixed-height .grapher-primary-container-outer{height:100%}.grapher-night.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body{height:100%;display:flex;flex-direction:column}.grapher-night.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row{flex-grow:1}.grapher-night.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row .central-container{display:flex;flex-direction:column;height:100%}.grapher-night.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row .central-container>.graph-body{flex-grow:1;height:unset}.grapher-night.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row .axis.y-axis{height:calc(100% - 40px)}.grapher-night.new-grapher{height:auto;border:2px dashed silver;text-align:center;color:#ddd}.grapher-day{position:relative;background:linear-gradient(to bottom right, #FFF, #FFF);padding:10px;font-family:sans-serif;font-size:12px;line-height:normal}.grapher-day *,.grapher-day :after,.grapher-day :before{box-sizing:content-box}.grapher-day .grapher-title{text-align:center;color:#000;font-size:18px;margin-bottom:8px}.grapher-day .grapher-primary-container-outer{display:flex}.grapher-day .grapher-primary-container-outer .grapher-sidebar{background:linear-gradient(#EEE, transparent 75%, transparent 100%);color:#111;padding:50px 6px 5px 10px;margin-left:-10px;margin-top:-10px;margin-bottom:-10px;overflow-y:auto;flex-shrink:0}.grapher-day .grapher-primary-container-outer .grapher-sidebar .series-toggle{white-space:nowrap}.grapher-day .grapher-primary-container-outer .grapher-sidebar .series-toggle+.series-toggle{margin-top:3px}.grapher-day .grapher-primary-container-outer .grapher-sidebar .series-toggle label{display:inline-block;position:relative;user-select:none}.grapher-day .grapher-primary-container-outer .grapher-sidebar .series-toggle input[type=checkbox]{opacity:0;cursor:pointer;height:0;width:0;margin-right:11px}.grapher-day .grapher-primary-container-outer .grapher-sidebar .series-toggle input:not(:checked)~.checkmark{background-color:rgba(0,0,0,0) !important}.grapher-day .grapher-primary-container-outer .grapher-sidebar .series-toggle input:checked~.checkmark:after{display:block}.grapher-day .grapher-primary-container-outer .grapher-sidebar .series-toggle .checkmark{position:absolute;top:1px;left:0;height:7px;width:7px;background-color:#eee;border:2px solid;border-radius:1px}.grapher-day .grapher-primary-container-outer .grapher-sidebar .series-toggle .checkmark:after{content:\"\";position:absolute;display:none;left:.5px;top:-1.5px;width:3px;height:6px;border:solid #fff;border-width:0 2px 2px 0;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.grapher-day .grapher-primary-container-outer .grapher-primary-container-body{width:100%;padding-left:2px}.grapher-day .series-key{text-align:center;margin-bottom:-14px;position:relative}.grapher-day .series-key .scale-label{display:inline-block;background:#b0b0b7;color:#000;transform:rotate(-90deg);width:24px;margin-left:-5px;vertical-align:top;margin-top:4px;padding-bottom:2px;cursor:pointer;user-select:none}.grapher-day .series-key .series-key-axis-container{display:inline-block;border:1px solid #b0b0b7;min-width:18px;min-height:24px;vertical-align:top;white-space:nowrap}.grapher-day .series-key .series-key-axis-container+.series-key-axis-container{margin-left:4px}.grapher-day .series-key .series-key-axis-container.series-key-axis-container-showing-label .scale-label{width:46px;margin-top:15px;margin-left:-15px;margin-right:-12px}.grapher-day .series-key .series-key-axis-container.series-key-axis-container-showing-label .series-key-axis-label-container{display:block}.grapher-day .series-key .series-key-axis-container.series-key-axis-container-showing-label .label-input-toggler path{fill:#505053}.grapher-day .series-key .series-key-axis-container .series-key-axis-container-body{display:inline-block}.grapher-day .series-key .series-key-axis-container .series-key-axis-container-body>div{white-space:initial}.grapher-day .series-key .series-key-axis-container .series-key-axis-label-container{display:none}.grapher-day .series-key .series-key-axis-container .label-input-toggler{width:16px;cursor:pointer;display:inline-block;vertical-align:top;margin:4px 2px}.grapher-day .series-key .series-key-axis-container .label-input-toggler path{fill:#b0b0b7}.grapher-day .series-key .series-key-axis-container .label-input-toggler:hover path{fill:#505053}.grapher-day .series-key .series-key-item{border:1px solid currentColor;padding:2px;margin:2px;display:inline-block;cursor:pointer;user-select:none}.grapher-day .series-key .series-key-item+.series-key-item{margin-left:4px}.grapher-day .series-key .series-key-item.series-key-item-highlighted{box-shadow:0 0 4px #000}.grapher-day .range-selection{color:#444;user-select:none}.grapher-day .range-selection.range-not-dates{color:#888}.grapher-day .range-selection .range-buttons{text-align:right}.grapher-day .range-selection .range-buttons .options-bar{display:inline-block}.grapher-day .range-selection .range-buttons .option-tooltip{position:relative;display:inline-block;border-bottom:1px dotted #000}.grapher-day .range-selection .range-buttons .option-tooltip .option-tooltip-text{visibility:hidden;color:#000;background:#fff;text-align:center;padding:5px 5px;border-radius:6px;position:absolute;z-index:1;border:1px solid #000;width:120px;margin-left:-65px;top:calc(100% + 7px);left:50%}.grapher-day .range-selection .range-buttons .option-tooltip:hover .option-tooltip-text{visibility:visible}.grapher-day .range-selection .range-buttons .option-tooltip .option-tooltip-text::after{content:\" \";position:absolute;bottom:100%;left:50%;margin-left:-5px;border-width:5px;border-style:solid;border-color:rgba(0,0,0,0) rgba(0,0,0,0) #000 rgba(0,0,0,0)}.grapher-day .range-selection .range-buttons .range-button{display:inline-block;cursor:pointer;padding:4px 8px;margin-left:4px;border-radius:2px;background:#fff;border:1px dotted silver}.grapher-day .range-selection .range-buttons .range-button.range-button-selected{color:#000;background:#fff;border:1px solid #000}.grapher-day .range-selection .range-buttons .range-button.range-button-disabled,.grapher-day .range-selection .range-buttons .range-button.range-button-selected.range-button-disabled{cursor:not-allowed;color:#888;background:#eee}.grapher-day .range-selection .range-buttons .range-button .icon-container{position:relative;width:0}.grapher-day .range-selection .range-buttons .range-button .icon-container.icon-container-narrow svg{left:-3px}.grapher-day .range-selection .range-buttons .range-button .icon-container.icon-container-square{width:5px}.grapher-day .range-selection .range-buttons .range-button .icon-container.icon-container-square svg{left:-5px}.grapher-day .range-selection .range-buttons .range-button .icon-container.icon-container-448{width:3px}.grapher-day .range-selection .range-buttons .range-button .icon-container.icon-container-448 svg{left:-5px}.grapher-day .range-selection .range-buttons .range-button .icon-container:before{content:\"A\";opacity:0}.grapher-day .range-selection .range-buttons .range-button .icon-container svg{height:15px;position:absolute;top:-1px;left:-4px}.grapher-day .range-selection .range-buttons .range-selection-history+.range-selection-history{margin-right:8px;margin-left:4px}.grapher-day .range-selection .range-buttons .percentile-button>div{display:inline-block}.grapher-day .range-selection .range-buttons .percentile-button input{background:rgba(0,0,0,0);border:1px solid #e0e0e3;margin:2px 8px 2px 0;color:#222;padding:1px 2px;width:20px;font-size:11px;-moz-appearance:textfield}.grapher-day .range-selection .range-buttons .percentile-button input:focus{outline:none;border-color:#505053}.grapher-day .range-selection .range-buttons .percentile-button input::-webkit-outer-spin-button,.grapher-day .range-selection .range-buttons .percentile-button input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.grapher-day .range-selection .range-buttons .percentile-button .icon-container.icon-container-narrow svg{height:12px;top:1px;left:-5px}.grapher-day .range-selection .range-buttons .showing-options-button{margin-right:8px}.grapher-day .grapher-main-row{display:flex}.grapher-day .grapher-main-row .central-container{width:100%}.grapher-day .range-graph-container{display:flex}.grapher-day .graph-body{width:100%;height:400px;position:relative}.grapher-day .graph-body canvas{width:100%;height:100%}.grapher-day .graph-body .grapher-tooltip,.grapher-day .graph-body .grapher-draggable-points,.grapher-day .graph-body .grapher-vertical-lines{position:absolute;top:0;left:0;right:0}.grapher-day .graph-body .grapher-tooltip>svg,.grapher-day .graph-body .grapher-draggable-points>svg,.grapher-day .graph-body .grapher-vertical-lines>svg{position:absolute;overflow:visible;left:0}.grapher-day .graph-body .grapher-vertical-lines{pointer-events:none;user-select:none}.grapher-day .graph-body .grapher-tooltip .tooltip-item path{fill:rgba(255,255,255,.6)}.grapher-day .graph-body .grapher-tooltip .tooltip-item text{fill:#0f0f0f;dominant-baseline:hanging;text-anchor:start}.grapher-day .graph-body .grapher-tooltip .tooltip-item.tooltip-item-fixed path{fill:#fff}.grapher-day .graph-body .grapher-tooltip .line{position:absolute;height:400px;border-left:1px solid #333}.grapher-day .graph-body .grapher-tooltip .custom-tooltip-container{position:absolute}.grapher-day .graph-body .grapher-context-menu{position:absolute;top:0;left:0}.grapher-day .graph-body .grapher-context-menu .menu-item .menu-text{user-select:all;position:absolute;top:0;background:rgba(255,255,255,.6);border:1px solid rgba(0,0,0,.3);color:#0f0f0f;padding:2px 4px;max-width:max-content;width:200px}.grapher-day .graph-body .grapher-draggable-points circle{cursor:pointer}.grapher-day .graph-body .grapher-vertical-lines line{stroke:#333}.grapher-day .graph-body .grapher-vertical-lines polygon{fill:#333}.grapher-day .graph-body .grapher-annotations{position:absolute;top:0;pointer-events:none;user-select:none}.grapher-day .graph-body .grapher-annotations .grapher-annotation{position:absolute}.grapher-day .graph-body .grapher-annotations .grapher-annotation .annotation-marker{display:inline-block;height:400px;background:rgba(0,0,0,.3)}.grapher-day .graph-body .grapher-annotations .grapher-annotation .annotation-text{position:absolute;top:0;background:rgba(255,255,255,.6);border:1px solid rgba(0,0,0,.3);color:#0f0f0f;padding:2px 4px;max-width:max-content;width:200px}.grapher-day .graph-body .bounds-selection{position:absolute;background:rgba(0,0,0,.02)}.grapher-day .axis{overflow:visible;user-select:none}.grapher-day .axis.x-axis{width:1px;height:20px;display:block}.grapher-day .axis.x-axis .axis-item text{text-anchor:middle}.grapher-day .axis.x-axis .axis-item.axis-item-first text{text-anchor:start}.grapher-day .axis.x-axis .axis-item.axis-item-last text{text-anchor:end}.grapher-day .axis.y-axis{height:400px}.grapher-day .axis.y-axis .axis-item text{text-anchor:end;alignment-baseline:middle}.grapher-day .axis.y-axis .y-axis-label{text-anchor:middle;fill:#1f1f1c}.grapher-day .axis.y-axis .y-axis-label.y-axis-big-label{font-size:18px}.grapher-day .axis.y-axis .series-color-box{cursor:pointer}.grapher-day .axis.y-axis.y-axis-right .axis-item text{text-anchor:start}.grapher-day .axis .axis-line{stroke:#656565;stroke-width:2px}.grapher-day .axis .axis-line-shadow{stroke:#bfbfbf;stroke-width:1px}.grapher-day .axis .axis-item path{stroke:#bfbfbf;stroke-width:1px}.grapher-day .axis .axis-item text{fill:#1f1f1c;font-size:8px}.grapher-day .axis .axis-item.axis-item-major .axis-tick{stroke-width:2px}.grapher-day .axis .axis-item.axis-item-big-labels text{font-size:16px}.grapher-day .range-selection-graph{width:100%;padding-bottom:14px}.grapher-day .range-selection-graph .graph-body-secondary{height:50px}.grapher-day .range-selection-graph .graph-body-secondary svg{position:absolute;left:0;height:50px;width:100%;overflow:visible}.grapher-day .range-selection-graph .graph-body-secondary svg .target-selection{fill:rgba(0,0,0,.02);cursor:ew-resize}.grapher-day .range-selection-graph .graph-body-secondary svg .selection-bar{fill:#b0b0b7;cursor:ew-resize}.grapher-day .range-selection-graph .graph-body-secondary svg .selection-bar-track{fill:#eee}.grapher-day .range-selection-graph .graph-body-secondary svg .selection-bar-rifles{fill:none;stroke-width:1;stroke:#333}.grapher-day .range-selection-graph .graph-body-secondary svg .selection-bar-handle{stroke:#333;stroke-width:1;fill:#b0b0b7;cursor:ew-resize}.grapher-day .range-selection-graph .graph-body-secondary svg .target-selection-outline{stroke:#333;fill:none}.grapher-day .range-selection-graph .graph-body-secondary svg .axis-item text{fill:#9f9f9f;text-anchor:start;font-size:8px;user-select:none;dominant-baseline:text-after-edge}.grapher-day .range-selection-graph .graph-body-secondary svg .axis-item path{stroke:#bfbfbf;stroke-width:1px}.grapher-day input,.grapher-day textarea{background:rgba(0,0,0,0);border:1px solid #e0e0e3;margin:2px 0;color:#222;padding:1px 2px;text-align:center}.grapher-day input:focus,.grapher-day textarea:focus{outline:none;border-color:#505053}.grapher-day.grapher-dragging-y .y-axis{border:2px dashed silver;margin:-2px;flex-shrink:0}.grapher-day.grapher-dragging-y .y-axis+.y-axis{border-left:none}.grapher-day.grapher-fullscreen{height:calc(100vh - 2*10px)}.grapher-day.grapher-fixed-height .grapher-primary-container-outer{height:100%}.grapher-day.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body{height:100%;display:flex;flex-direction:column}.grapher-day.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row{flex-grow:1}.grapher-day.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row .central-container{display:flex;flex-direction:column;height:100%}.grapher-day.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row .central-container>.graph-body{flex-grow:1;height:unset}.grapher-day.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row .axis.y-axis{height:calc(100% - 40px)}.grapher-day.new-grapher{height:auto;border:2px dashed silver;text-align:center;color:#222}.grapher-export{position:relative;background:linear-gradient(to bottom right, #FFF, #FFF);padding:10px;font-family:sans-serif;font-size:12px;line-height:normal}.grapher-export *,.grapher-export :after,.grapher-export :before{box-sizing:content-box}.grapher-export .grapher-title{text-align:center;color:#000;font-size:18px;margin-bottom:8px}.grapher-export .grapher-primary-container-outer{display:flex}.grapher-export .grapher-primary-container-outer .grapher-sidebar{background:linear-gradient(#EEE, transparent 75%, transparent 100%);color:#111;padding:50px 6px 5px 10px;margin-left:-10px;margin-top:-10px;margin-bottom:-10px;overflow-y:auto;flex-shrink:0}.grapher-export .grapher-primary-container-outer .grapher-sidebar .series-toggle{white-space:nowrap}.grapher-export .grapher-primary-container-outer .grapher-sidebar .series-toggle+.series-toggle{margin-top:3px}.grapher-export .grapher-primary-container-outer .grapher-sidebar .series-toggle label{display:inline-block;position:relative;user-select:none}.grapher-export .grapher-primary-container-outer .grapher-sidebar .series-toggle input[type=checkbox]{opacity:0;cursor:pointer;height:0;width:0;margin-right:11px}.grapher-export .grapher-primary-container-outer .grapher-sidebar .series-toggle input:not(:checked)~.checkmark{background-color:rgba(0,0,0,0) !important}.grapher-export .grapher-primary-container-outer .grapher-sidebar .series-toggle input:checked~.checkmark:after{display:block}.grapher-export .grapher-primary-container-outer .grapher-sidebar .series-toggle .checkmark{position:absolute;top:1px;left:0;height:7px;width:7px;background-color:#eee;border:2px solid;border-radius:1px}.grapher-export .grapher-primary-container-outer .grapher-sidebar .series-toggle .checkmark:after{content:\"\";position:absolute;display:none;left:.5px;top:-1.5px;width:3px;height:6px;border:solid #fff;border-width:0 2px 2px 0;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.grapher-export .grapher-primary-container-outer .grapher-primary-container-body{width:100%;padding-left:2px}.grapher-export .series-key{text-align:center;margin-bottom:-14px;position:relative}.grapher-export .series-key .scale-label{display:inline-block;background:#b0b0b7;color:#000;transform:rotate(-90deg);width:24px;margin-left:-5px;vertical-align:top;margin-top:4px;padding-bottom:2px;cursor:pointer;user-select:none}.grapher-export .series-key .series-key-axis-container{display:inline-block;border:1px solid #b0b0b7;min-width:18px;min-height:24px;vertical-align:top;white-space:nowrap}.grapher-export .series-key .series-key-axis-container+.series-key-axis-container{margin-left:4px}.grapher-export .series-key .series-key-axis-container.series-key-axis-container-showing-label .scale-label{width:46px;margin-top:15px;margin-left:-15px;margin-right:-12px}.grapher-export .series-key .series-key-axis-container.series-key-axis-container-showing-label .series-key-axis-label-container{display:block}.grapher-export .series-key .series-key-axis-container.series-key-axis-container-showing-label .label-input-toggler path{fill:#505053}.grapher-export .series-key .series-key-axis-container .series-key-axis-container-body{display:inline-block}.grapher-export .series-key .series-key-axis-container .series-key-axis-container-body>div{white-space:initial}.grapher-export .series-key .series-key-axis-container .series-key-axis-label-container{display:none}.grapher-export .series-key .series-key-axis-container .label-input-toggler{width:16px;cursor:pointer;display:inline-block;vertical-align:top;margin:4px 2px}.grapher-export .series-key .series-key-axis-container .label-input-toggler path{fill:#b0b0b7}.grapher-export .series-key .series-key-axis-container .label-input-toggler:hover path{fill:#505053}.grapher-export .series-key .series-key-item{border:1px solid currentColor;padding:2px;margin:2px;display:inline-block;cursor:pointer;user-select:none}.grapher-export .series-key .series-key-item+.series-key-item{margin-left:4px}.grapher-export .series-key .series-key-item.series-key-item-highlighted{box-shadow:0 0 4px #000}.grapher-export .range-selection{color:#444;user-select:none}.grapher-export .range-selection.range-not-dates{color:#888}.grapher-export .range-selection .range-buttons{text-align:right}.grapher-export .range-selection .range-buttons .options-bar{display:inline-block}.grapher-export .range-selection .range-buttons .option-tooltip{position:relative;display:inline-block;border-bottom:1px dotted #000}.grapher-export .range-selection .range-buttons .option-tooltip .option-tooltip-text{visibility:hidden;color:#000;background:#fff;text-align:center;padding:5px 5px;border-radius:6px;position:absolute;z-index:1;border:1px solid #000;width:120px;margin-left:-65px;top:calc(100% + 7px);left:50%}.grapher-export .range-selection .range-buttons .option-tooltip:hover .option-tooltip-text{visibility:visible}.grapher-export .range-selection .range-buttons .option-tooltip .option-tooltip-text::after{content:\" \";position:absolute;bottom:100%;left:50%;margin-left:-5px;border-width:5px;border-style:solid;border-color:rgba(0,0,0,0) rgba(0,0,0,0) #000 rgba(0,0,0,0)}.grapher-export .range-selection .range-buttons .range-button{display:inline-block;cursor:pointer;padding:4px 8px;margin-left:4px;border-radius:2px;background:#fff;border:1px dotted silver}.grapher-export .range-selection .range-buttons .range-button.range-button-selected{color:#000;background:#fff;border:1px solid #000}.grapher-export .range-selection .range-buttons .range-button.range-button-disabled,.grapher-export .range-selection .range-buttons .range-button.range-button-selected.range-button-disabled{cursor:not-allowed;color:#888;background:#eee}.grapher-export .range-selection .range-buttons .range-button .icon-container{position:relative;width:0}.grapher-export .range-selection .range-buttons .range-button .icon-container.icon-container-narrow svg{left:-3px}.grapher-export .range-selection .range-buttons .range-button .icon-container.icon-container-square{width:5px}.grapher-export .range-selection .range-buttons .range-button .icon-container.icon-container-square svg{left:-5px}.grapher-export .range-selection .range-buttons .range-button .icon-container.icon-container-448{width:3px}.grapher-export .range-selection .range-buttons .range-button .icon-container.icon-container-448 svg{left:-5px}.grapher-export .range-selection .range-buttons .range-button .icon-container:before{content:\"A\";opacity:0}.grapher-export .range-selection .range-buttons .range-button .icon-container svg{height:15px;position:absolute;top:-1px;left:-4px}.grapher-export .range-selection .range-buttons .range-selection-history+.range-selection-history{margin-right:8px;margin-left:4px}.grapher-export .range-selection .range-buttons .percentile-button>div{display:inline-block}.grapher-export .range-selection .range-buttons .percentile-button input{background:rgba(0,0,0,0);border:1px solid #e0e0e3;margin:2px 8px 2px 0;color:#222;padding:1px 2px;width:20px;font-size:11px;-moz-appearance:textfield}.grapher-export .range-selection .range-buttons .percentile-button input:focus{outline:none;border-color:#505053}.grapher-export .range-selection .range-buttons .percentile-button input::-webkit-outer-spin-button,.grapher-export .range-selection .range-buttons .percentile-button input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.grapher-export .range-selection .range-buttons .percentile-button .icon-container.icon-container-narrow svg{height:12px;top:1px;left:-5px}.grapher-export .range-selection .range-buttons .showing-options-button{margin-right:8px}.grapher-export .grapher-main-row{display:flex}.grapher-export .grapher-main-row .central-container{width:100%}.grapher-export .range-graph-container{display:flex}.grapher-export .graph-body{width:100%;height:400px;position:relative}.grapher-export .graph-body canvas{width:100%;height:100%}.grapher-export .graph-body .grapher-tooltip,.grapher-export .graph-body .grapher-draggable-points,.grapher-export .graph-body .grapher-vertical-lines{position:absolute;top:0;left:0;right:0}.grapher-export .graph-body .grapher-tooltip>svg,.grapher-export .graph-body .grapher-draggable-points>svg,.grapher-export .graph-body .grapher-vertical-lines>svg{position:absolute;overflow:visible;left:0}.grapher-export .graph-body .grapher-vertical-lines{pointer-events:none;user-select:none}.grapher-export .graph-body .grapher-tooltip .tooltip-item path{fill:rgba(255,255,255,.6)}.grapher-export .graph-body .grapher-tooltip .tooltip-item text{fill:#0f0f0f;dominant-baseline:hanging;text-anchor:start}.grapher-export .graph-body .grapher-tooltip .tooltip-item.tooltip-item-fixed path{fill:#fff}.grapher-export .graph-body .grapher-tooltip .line{position:absolute;height:400px;border-left:1px solid #333}.grapher-export .graph-body .grapher-tooltip .custom-tooltip-container{position:absolute}.grapher-export .graph-body .grapher-context-menu{position:absolute;top:0;left:0}.grapher-export .graph-body .grapher-context-menu .menu-item .menu-text{user-select:all;position:absolute;top:0;background:rgba(255,255,255,.6);border:1px solid rgba(0,0,0,.3);color:#0f0f0f;padding:2px 4px;max-width:max-content;width:200px}.grapher-export .graph-body .grapher-draggable-points circle{cursor:pointer}.grapher-export .graph-body .grapher-vertical-lines line{stroke:#333}.grapher-export .graph-body .grapher-vertical-lines polygon{fill:#333}.grapher-export .graph-body .grapher-annotations{position:absolute;top:0;pointer-events:none;user-select:none}.grapher-export .graph-body .grapher-annotations .grapher-annotation{position:absolute}.grapher-export .graph-body .grapher-annotations .grapher-annotation .annotation-marker{display:inline-block;height:400px;background:rgba(0,0,0,.3)}.grapher-export .graph-body .grapher-annotations .grapher-annotation .annotation-text{position:absolute;top:0;background:rgba(255,255,255,.6);border:1px solid rgba(0,0,0,.3);color:#0f0f0f;padding:2px 4px;max-width:max-content;width:200px}.grapher-export .graph-body .bounds-selection{position:absolute;background:rgba(0,0,0,.02)}.grapher-export .axis{overflow:visible;user-select:none}.grapher-export .axis.x-axis{width:1px;height:20px;display:block}.grapher-export .axis.x-axis .axis-item text{text-anchor:middle}.grapher-export .axis.x-axis .axis-item.axis-item-first text{text-anchor:start}.grapher-export .axis.x-axis .axis-item.axis-item-last text{text-anchor:end}.grapher-export .axis.y-axis{height:400px}.grapher-export .axis.y-axis .axis-item text{text-anchor:end;alignment-baseline:middle}.grapher-export .axis.y-axis .y-axis-label{text-anchor:middle;fill:#000}.grapher-export .axis.y-axis .y-axis-label.y-axis-big-label{font-size:18px}.grapher-export .axis.y-axis .series-color-box{cursor:pointer}.grapher-export .axis.y-axis.y-axis-right .axis-item text{text-anchor:start}.grapher-export .axis .axis-line{stroke:#000;stroke-width:1px}.grapher-export .axis .axis-line-shadow{stroke:#bfbfbf;stroke-width:1px}.grapher-export .axis .axis-item path{stroke:#bfbfbf;stroke-width:1px}.grapher-export .axis .axis-item text{fill:#000;font-size:8px}.grapher-export .axis .axis-item.axis-item-major .axis-tick{stroke-width:2px}.grapher-export .axis .axis-item.axis-item-big-labels text{font-size:16px}.grapher-export .range-selection-graph{width:100%;padding-bottom:14px}.grapher-export .range-selection-graph .graph-body-secondary{height:50px}.grapher-export .range-selection-graph .graph-body-secondary svg{position:absolute;left:0;height:50px;width:100%;overflow:visible}.grapher-export .range-selection-graph .graph-body-secondary svg .target-selection{fill:rgba(0,0,0,.02);cursor:ew-resize}.grapher-export .range-selection-graph .graph-body-secondary svg .selection-bar{fill:#b0b0b7;cursor:ew-resize}.grapher-export .range-selection-graph .graph-body-secondary svg .selection-bar-track{fill:#eee}.grapher-export .range-selection-graph .graph-body-secondary svg .selection-bar-rifles{fill:none;stroke-width:1;stroke:#333}.grapher-export .range-selection-graph .graph-body-secondary svg .selection-bar-handle{stroke:#333;stroke-width:1;fill:#b0b0b7;cursor:ew-resize}.grapher-export .range-selection-graph .graph-body-secondary svg .target-selection-outline{stroke:#333;fill:none}.grapher-export .range-selection-graph .graph-body-secondary svg .axis-item text{fill:#9f9f9f;text-anchor:start;font-size:8px;user-select:none;dominant-baseline:text-after-edge}.grapher-export .range-selection-graph .graph-body-secondary svg .axis-item path{stroke:#bfbfbf;stroke-width:1px}.grapher-export input,.grapher-export textarea{background:rgba(0,0,0,0);border:1px solid #e0e0e3;margin:2px 0;color:#222;padding:1px 2px;text-align:center}.grapher-export input:focus,.grapher-export textarea:focus{outline:none;border-color:#505053}.grapher-export.grapher-dragging-y .y-axis{border:2px dashed silver;margin:-2px;flex-shrink:0}.grapher-export.grapher-dragging-y .y-axis+.y-axis{border-left:none}.grapher-export.grapher-fullscreen{height:calc(100vh - 2*10px)}.grapher-export.grapher-fixed-height .grapher-primary-container-outer{height:100%}.grapher-export.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body{height:100%;display:flex;flex-direction:column}.grapher-export.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row{flex-grow:1}.grapher-export.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row .central-container{display:flex;flex-direction:column;height:100%}.grapher-export.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row .central-container>.graph-body{flex-grow:1;height:unset}.grapher-export.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row .axis.y-axis{height:calc(100% - 40px)}.grapher-export.new-grapher{height:auto;border:2px dashed silver;text-align:center;color:#222}`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/grapher.scss\"],\"names\":[],\"mappings\":\"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\",\"sourcesContent\":[\"@mixin grapher(\\n $primary-graph-body-height: 400px,\\n $secondary-graph-body-height: 50px,\\n\\n $background-color-1: #2a2a2b,\\n $background-color-2: #3e3e40,\\n\\n $tooltip-line-color: #CCC,\\n $tooltip-background-color: rgba(0, 0, 0, 0.6),\\n $tooltip-text-color: #F0F0F0,\\n $vertical-line-color: #CCC,\\n\\n $axis-line-color: silver,\\n $axis-line-width: 2px,\\n $axis-tick-color: #505053,\\n $axis-text-color: #E0E0E3,\\n\\n $range-selection-text-color: silver,\\n $range-selection-button-color: #505053,\\n $range-selection-button-selected-color: black,\\n $range-selection-text-selected-color: silver,\\n $range-selection-text-color-faded: #AAA,\\n $range-selection-button-color-faded: #7A7A7A,\\n $range-selection-button-border: null,\\n $range-selection-selected-button-border: null,\\n\\n $range-graph-selection-bar-size: 14px,\\n $range-graph-selection-range-color: rgba(255, 255, 255, 0.1),\\n $range-graph-selection-outline-color: #AAA,\\n $range-graph-selection-bar-color: #808083,\\n $range-graph-selection-bar-track-color: #303033,\\n $range-graph-selection-bar-rifles-color: #FFF,\\n $range-graph-handle-color: #AAA,\\n $range-graph-handle-fill-color: #666,\\n $range-graph-axis-text-color: #9f9f9f,\\n\\n $annotation-background-color: rgba(255, 255, 255, 0.3),\\n\\n $series-key-axis-container-color: #111,\\n $series-key-input-border-color: #505053,\\n $series-key-input-selected-border-color: #E0E0E3,\\n $series-key-input-text-color: #E0E0E3,\\n $series-key-background: transparent,\\n $scale-label-color: silver,\\n $series-key-shadow-color: silver,\\n\\n $title-color: white,\\n\\n $sidebar-background-color: #111,\\n $sidebar-text-color: #EEE,\\n\\n $new-grapher-color: #DDD\\n) {\\n $x-axis-height: 20px;\\n $padding: 10px;\\n\\n $axis-z-index: 0;\\n $graph-body-z-index: 1;\\n\\n position: relative;\\n background: linear-gradient(to bottom right, $background-color-1, $background-color-2);\\n padding: $padding;\\n\\n font-family: sans-serif;\\n font-size: 12px;\\n line-height: normal;\\n\\n *, :after, :before {\\n box-sizing: content-box;\\n }\\n\\n .grapher-title {\\n text-align: center;\\n color: $title-color;\\n font-size: 18px;\\n margin-bottom: 8px;\\n }\\n\\n .grapher-primary-container-outer {\\n display: flex;\\n\\n .grapher-sidebar {\\n background: linear-gradient($sidebar-background-color, transparent 75%, transparent 100%);\\n color: $sidebar-text-color;\\n padding: 50px 6px 5px 10px;\\n margin-left: -$padding;\\n margin-top: -$padding;\\n margin-bottom: -$padding;\\n overflow-y: auto;\\n flex-shrink: 0;\\n\\n .series-toggle {\\n white-space: nowrap;\\n\\n & + .series-toggle {\\n margin-top: 3px;\\n }\\n\\n label {\\n display: inline-block;\\n position: relative;\\n user-select: none;\\n }\\n\\n input[type='checkbox'] {\\n opacity: 0;\\n cursor: pointer;\\n height: 0;\\n width: 0;\\n margin-right: 11px;\\n }\\n\\n input:not(:checked) ~ .checkmark {\\n background-color: transparent !important;\\n }\\n\\n input:checked ~ .checkmark:after {\\n display: block;\\n }\\n\\n .checkmark {\\n position: absolute;\\n top: 1px;\\n left: 0;\\n height: 7px;\\n width: 7px;\\n background-color: #eee;\\n border: 2px solid;\\n border-radius: 1px;\\n }\\n\\n .checkmark:after {\\n content: \\\"\\\";\\n position: absolute;\\n display: none;\\n\\n left: 0.5px;\\n top: -1.5px;\\n width: 3px;\\n height: 6px;\\n border: solid white;\\n border-width: 0 2px 2px 0;\\n -webkit-transform: rotate(45deg);\\n -ms-transform: rotate(45deg);\\n transform: rotate(45deg);\\n }\\n }\\n }\\n\\n .grapher-primary-container-body {\\n width: 100%;\\n padding-left: 2px;\\n }\\n }\\n\\n .series-key {\\n text-align: center;\\n margin-bottom: -14px;\\n position: relative;\\n\\n .scale-label {\\n display: inline-block;\\n background: $series-key-axis-container-color;\\n color: $scale-label-color;\\n transform: rotate(-90deg);\\n width: 24px;\\n margin-left: -5px;\\n vertical-align: top;\\n margin-top: 4px;\\n padding-bottom: 2px;\\n cursor: pointer;\\n user-select: none;\\n }\\n\\n .series-key-axis-container {\\n display: inline-block;\\n border: 1px solid $series-key-axis-container-color;\\n\\n min-width: 18px;\\n min-height: 24px;\\n vertical-align: top;\\n\\n white-space: nowrap;\\n\\n & + .series-key-axis-container {\\n margin-left: 4px;\\n }\\n\\n &.series-key-axis-container-showing-label {\\n .scale-label {\\n width: 46px;\\n margin-top: 15px;\\n margin-left: -15px;\\n margin-right: -12px;\\n }\\n\\n .series-key-axis-label-container {\\n display: block;\\n }\\n\\n .label-input-toggler {\\n path {\\n fill: $series-key-input-selected-border-color;\\n }\\n }\\n }\\n\\n .series-key-axis-container-body {\\n display: inline-block;\\n\\n & > div {\\n white-space: initial;\\n }\\n }\\n\\n .series-key-axis-label-container {\\n display: none;\\n }\\n\\n .label-input-toggler {\\n width: 16px;\\n cursor: pointer;\\n display: inline-block;\\n vertical-align: top;\\n margin: 4px 2px;\\n\\n path {\\n fill: $series-key-axis-container-color;\\n }\\n\\n &:hover {\\n path {\\n fill: $series-key-input-selected-border-color;\\n }\\n }\\n }\\n }\\n\\n .series-key-item {\\n border: 1px solid currentColor;\\n padding: 2px;\\n margin: 2px;\\n display: inline-block;\\n cursor: pointer;\\n user-select: none;\\n background: $series-key-background;\\n\\n & + .series-key-item {\\n margin-left: 4px;\\n }\\n\\n &.series-key-item-highlighted {\\n box-shadow: 0 0 4px $series-key-shadow-color;\\n }\\n }\\n }\\n\\n .range-selection {\\n color: $range-selection-text-color;\\n user-select: none;\\n\\n &.range-not-dates {\\n color: $range-selection-text-color-faded;\\n }\\n\\n .range-buttons {\\n text-align: right;\\n\\n .options-bar {\\n display: inline-block;\\n }\\n\\n .option-tooltip {\\n position: relative;\\n display: inline-block;\\n border-bottom: 1px dotted black;\\n\\n .option-tooltip-text {\\n visibility: hidden;\\n color: $range-selection-text-selected-color;\\n background: $range-selection-button-selected-color;\\n text-align: center;\\n padding: 5px 5px;\\n border-radius: 6px;\\n position: absolute;\\n z-index: 1;\\n border: 1px solid black;\\n\\n width: 120px;\\n margin-left: -65px;\\n top: calc(100% + 7px);\\n left: 50%;\\n }\\n\\n &:hover .option-tooltip-text {\\n visibility: visible;\\n }\\n\\n .option-tooltip-text::after {\\n content: \\\" \\\";\\n position: absolute;\\n bottom: 100%;\\n left: 50%;\\n margin-left: -5px;\\n border-width: 5px;\\n border-style: solid;\\n border-color: transparent transparent black transparent;\\n }\\n }\\n\\n .range-button {\\n display: inline-block;\\n cursor: pointer;\\n padding: 4px 8px;\\n @if ($range-selection-button-border == null) {\\n margin-left: 6px;\\n } @else {\\n margin-left: 4px;\\n }\\n\\n border-radius: 2px;\\n background: $range-selection-button-color;\\n border: $range-selection-button-border;\\n\\n &.range-button-selected {\\n color: $range-selection-text-selected-color;\\n background: $range-selection-button-selected-color;\\n border: $range-selection-selected-button-border;\\n }\\n\\n &.range-button-disabled, &.range-button-selected.range-button-disabled {\\n cursor: not-allowed;\\n color: $range-selection-text-color-faded;\\n background: $range-selection-button-color-faded;\\n }\\n\\n .icon-container {\\n position: relative;\\n width: 0;\\n\\n &.icon-container-narrow {\\n svg {\\n left: -3px;\\n }\\n }\\n\\n &.icon-container-square {\\n width: 5px;\\n\\n svg {\\n left: -5px;\\n }\\n }\\n\\n &.icon-container-448 {\\n width: 3px;\\n\\n svg {\\n left: -5px;\\n }\\n }\\n\\n &:before {\\n content: 'A';\\n opacity: 0;\\n }\\n\\n svg {\\n height: 15px;\\n position: absolute;\\n top: -1px;\\n left: -4px;\\n }\\n }\\n }\\n\\n .range-selection-history + .range-selection-history {\\n margin-right: 8px;\\n margin-left: 4px;\\n }\\n\\n .percentile-button {\\n & > div {\\n display: inline-block;\\n }\\n\\n input {\\n background: transparent;\\n border: 1px solid $series-key-input-border-color;\\n margin: 2px 8px 2px 0;\\n color: $series-key-input-text-color;\\n padding: 1px 2px;\\n width: 20px;\\n font-size: 11px;\\n -moz-appearance: textfield;\\n\\n &:focus {\\n outline: none;\\n border-color: $series-key-input-selected-border-color;\\n }\\n\\n &::-webkit-outer-spin-button,\\n &::-webkit-inner-spin-button {\\n -webkit-appearance: none;\\n margin: 0;\\n }\\n }\\n\\n .icon-container.icon-container-narrow {\\n svg {\\n height: 12px;\\n top: 1px;\\n left: -5px;\\n }\\n }\\n }\\n\\n .showing-options-button {\\n margin-right: 8px;\\n }\\n }\\n }\\n\\n .grapher-main-row {\\n display: flex;\\n\\n .central-container {\\n width: 100%;\\n }\\n }\\n\\n .range-graph-container {\\n display: flex;\\n }\\n\\n .graph-body {\\n width: 100%;\\n height: $primary-graph-body-height;\\n position: relative;\\n\\n canvas {\\n width: 100%;\\n height: 100%;\\n }\\n\\n .grapher-tooltip, .grapher-draggable-points, .grapher-vertical-lines {\\n position: absolute;\\n top: 0;\\n left: 0;\\n right: 0;\\n\\n > svg {\\n position: absolute;\\n overflow: visible;\\n left: 0;\\n }\\n }\\n\\n .grapher-vertical-lines {\\n pointer-events: none;\\n user-select: none;\\n }\\n\\n .grapher-tooltip {\\n .tooltip-item {\\n path {\\n fill: $tooltip-background-color;\\n }\\n\\n text {\\n fill: $tooltip-text-color;\\n dominant-baseline: hanging;\\n text-anchor: start;\\n }\\n\\n &.tooltip-item-fixed {\\n path {\\n fill: rgba($tooltip-background-color, 1);\\n }\\n }\\n }\\n\\n .line {\\n position: absolute;\\n height: 400px;\\n border-left: 1px solid $tooltip-line-color;\\n }\\n\\n .custom-tooltip-container {\\n position: absolute;\\n }\\n }\\n\\n .grapher-context-menu {\\n position: absolute;\\n top: 0;\\n left: 0;\\n .menu-item {\\n\\n .menu-text {\\n user-select: all;\\n position: absolute;\\n top: 0;\\n background: $tooltip-background-color;\\n border: 1px solid $annotation-background-color;\\n color: $tooltip-text-color;\\n padding: 2px 4px;\\n max-width: max-content;\\n width: 200px;\\n }\\n }\\n }\\n\\n .grapher-draggable-points {\\n circle {\\n cursor: pointer;\\n }\\n }\\n\\n .grapher-vertical-lines {\\n line {\\n stroke: $vertical-line-color;\\n }\\n\\n polygon {\\n fill: $vertical-line-color;\\n }\\n }\\n\\n .grapher-annotations {\\n position: absolute;\\n top: 0;\\n pointer-events: none;\\n user-select: none;\\n\\n .grapher-annotation {\\n position: absolute;\\n\\n .annotation-marker {\\n display: inline-block;\\n height: $primary-graph-body-height;\\n background: $annotation-background-color;\\n }\\n\\n .annotation-text {\\n position: absolute;\\n top: 0;\\n background: $tooltip-background-color;\\n border: 1px solid $annotation-background-color;\\n color: $tooltip-text-color;\\n padding: 2px 4px;\\n max-width: max-content;\\n width: 200px;\\n }\\n }\\n }\\n\\n .bounds-selection {\\n position: absolute;\\n background: $range-graph-selection-range-color;\\n }\\n }\\n\\n .axis {\\n overflow: visible;\\n user-select: none;\\n\\n &.x-axis {\\n width: 1px;\\n height: $x-axis-height;\\n display: block;\\n\\n .axis-item {\\n text {\\n text-anchor: middle;\\n }\\n\\n &.axis-item-first {\\n text {\\n text-anchor: start;\\n }\\n }\\n\\n &.axis-item-last {\\n text {\\n text-anchor: end;\\n }\\n }\\n }\\n }\\n\\n &.y-axis {\\n height: $primary-graph-body-height;\\n\\n .axis-item text {\\n text-anchor: end;\\n alignment-baseline: middle;\\n }\\n\\n .y-axis-label {\\n text-anchor: middle;\\n fill: $axis-text-color;\\n\\n &.y-axis-big-label {\\n font-size: 18px;\\n }\\n }\\n\\n .series-color-box {\\n cursor: pointer;\\n }\\n\\n &.y-axis-right {\\n .axis-item text {\\n text-anchor: start;\\n }\\n }\\n }\\n\\n .axis-line {\\n stroke: $axis-line-color;\\n stroke-width: $axis-line-width;\\n }\\n\\n .axis-line-shadow {\\n stroke: $axis-tick-color;\\n stroke-width: 1px;\\n }\\n\\n .axis-item {\\n path {\\n stroke: $axis-tick-color;\\n stroke-width: 1px;\\n }\\n\\n text {\\n fill: $axis-text-color;\\n font-size: 8px;\\n }\\n\\n &.axis-item-major {\\n .axis-tick {\\n stroke-width: 2px;\\n }\\n }\\n\\n &.axis-item-big-labels {\\n text {\\n font-size: 16px;\\n }\\n }\\n }\\n }\\n\\n .range-selection-graph {\\n width: 100%;\\n padding-bottom: $range-graph-selection-bar-size;\\n\\n .graph-body-secondary {\\n height: $secondary-graph-body-height;\\n\\n svg {\\n position: absolute;\\n left: 0;\\n height: $secondary-graph-body-height;\\n width: 100%;\\n overflow: visible;\\n\\n .target-selection {\\n fill: $range-graph-selection-range-color;\\n cursor: ew-resize;\\n }\\n\\n .selection-bar {\\n fill: $range-graph-selection-bar-color;\\n cursor: ew-resize;\\n }\\n\\n .selection-bar-track {\\n fill: $range-graph-selection-bar-track-color;\\n }\\n\\n .selection-bar-rifles {\\n fill: none;\\n stroke-width: 1;\\n stroke: $range-graph-selection-bar-rifles-color;\\n }\\n\\n .selection-bar-handle {\\n stroke: $range-graph-handle-color;\\n stroke-width: 1;\\n fill: $range-graph-handle-fill-color;\\n cursor: ew-resize;\\n }\\n\\n .target-selection-outline {\\n stroke: $range-graph-selection-outline-color;\\n fill: none;\\n }\\n\\n .axis-item {\\n text {\\n fill: $range-graph-axis-text-color;\\n text-anchor: start;\\n font-size: 8px;\\n user-select: none;\\n dominant-baseline: text-after-edge;\\n }\\n\\n path {\\n stroke: $axis-tick-color;\\n stroke-width: 1px;\\n }\\n }\\n }\\n }\\n }\\n\\n input, textarea {\\n background: transparent;\\n border: 1px solid $series-key-input-border-color;\\n margin: 2px 0;\\n color: $series-key-input-text-color;\\n padding: 1px 2px;\\n text-align: center;\\n\\n &:focus {\\n outline: none;\\n border-color: $series-key-input-selected-border-color;\\n }\\n }\\n\\n &.grapher-dragging-y {\\n .y-axis {\\n border: 2px dashed silver;\\n margin: -2px;\\n flex-shrink: 0;\\n\\n & + .y-axis {\\n border-left: none;\\n }\\n }\\n }\\n\\n &.grapher-fullscreen {\\n height: calc(100vh - 2*#{$padding});\\n }\\n\\n &.grapher-fixed-height {\\n .grapher-primary-container-outer {\\n height: 100%;\\n\\n .grapher-primary-container-body {\\n height: 100%;\\n display: flex;\\n flex-direction: column;\\n\\n .grapher-main-row {\\n flex-grow: 1;\\n\\n .central-container {\\n display: flex;\\n flex-direction: column;\\n height: 100%;\\n\\n > .graph-body {\\n flex-grow: 1;\\n height: unset;\\n }\\n }\\n\\n .axis.y-axis {\\n height: calc(100% - #{2*$x-axis-height});\\n }\\n }\\n }\\n }\\n }\\n\\n &.new-grapher {\\n height: auto;\\n border: 2px dashed silver;\\n text-align: center;\\n color: $new-grapher-color;\\n }\\n}\\n\\n@mixin grapher-theme-night (\\n $primary-graph-body-height: 400px,\\n $secondary-graph-body-height: 50px,\\n) {\\n @include grapher(\\n $primary-graph-body-height,\\n $secondary-graph-body-height\\n );\\n}\\n\\n@mixin grapher-theme-day (\\n $primary-graph-body-height: 400px,\\n $secondary-graph-body-height: 50px,\\n) {\\n @include grapher(\\n $primary-graph-body-height,\\n $secondary-graph-body-height,\\n\\n $background-color-1: #FFF,\\n $background-color-2: #FFF,\\n\\n $tooltip-line-color: invert(#CCC),\\n $tooltip-background-color: invert(rgba(0, 0, 0, 0.6)),\\n $tooltip-text-color: invert(#F0F0F0),\\n $vertical-line-color: invert(#CCC),\\n\\n $axis-line-color: #656565,\\n $axis-tick-color: #BFBFBF,\\n $axis-text-color: invert(#E0E0E3),\\n\\n $range-selection-text-color: #444,\\n $range-selection-button-color: white,\\n $range-selection-button-selected-color: white,\\n $range-selection-text-selected-color: black,\\n $range-selection-text-color-faded: #888,\\n $range-selection-button-color-faded: #EEE,\\n $range-selection-button-border: 1px dotted silver,\\n $range-selection-selected-button-border: 1px solid black,\\n\\n $range-graph-selection-range-color: rgba(0, 0, 0, 0.02),\\n $range-graph-selection-outline-color: #333,\\n $range-graph-selection-bar-color: #B0B0B7,\\n $range-graph-selection-bar-track-color: #EEE,\\n $range-graph-selection-bar-rifles-color: #333,\\n $range-graph-handle-color: #333,\\n $range-graph-handle-fill-color: #B0B0B7,\\n\\n $annotation-background-color: rgba(0, 0, 0, 0.3),\\n\\n $series-key-axis-container-color: #B0B0B7,\\n $series-key-input-border-color: #E0E0E3,\\n $series-key-input-selected-border-color: #505053,\\n $series-key-input-text-color: #222,\\n $series-key-background: null,\\n $series-key-shadow-color: black,\\n $scale-label-color: black,\\n\\n $title-color: black,\\n\\n $sidebar-background-color: #EEE,\\n $sidebar-text-color: #111,\\n\\n $new-grapher-color: #222\\n );\\n}\\n\\n@mixin grapher-theme-export (\\n $primary-graph-body-height: 400px,\\n $secondary-graph-body-height: 50px,\\n) {\\n @include grapher(\\n $primary-graph-body-height,\\n $secondary-graph-body-height,\\n\\n $background-color-1: #FFF,\\n $background-color-2: #FFF,\\n\\n $tooltip-line-color: invert(#CCC),\\n $tooltip-background-color: invert(rgba(0, 0, 0, 0.6)),\\n $tooltip-text-color: invert(#F0F0F0),\\n $vertical-line-color: invert(#CCC),\\n\\n $axis-line-color: black,\\n $axis-line-width: 1px,\\n $axis-tick-color: #BFBFBF,\\n $axis-text-color: black,\\n\\n $range-selection-text-color: #444,\\n $range-selection-button-color: white,\\n $range-selection-button-selected-color: white,\\n $range-selection-text-selected-color: black,\\n $range-selection-text-color-faded: #888,\\n $range-selection-button-color-faded: #EEE,\\n $range-selection-button-border: 1px dotted silver,\\n $range-selection-selected-button-border: 1px solid black,\\n\\n $range-graph-selection-range-color: rgba(0, 0, 0, 0.02),\\n $range-graph-selection-outline-color: #333,\\n $range-graph-selection-bar-color: #B0B0B7,\\n $range-graph-selection-bar-track-color: #EEE,\\n $range-graph-selection-bar-rifles-color: #333,\\n $range-graph-handle-color: #333,\\n $range-graph-handle-fill-color: #B0B0B7,\\n\\n $annotation-background-color: rgba(0, 0, 0, 0.3),\\n\\n $series-key-axis-container-color: #B0B0B7,\\n $series-key-input-border-color: #E0E0E3,\\n $series-key-input-selected-border-color: #505053,\\n $series-key-input-text-color: #222,\\n $series-key-background: null,\\n $series-key-shadow-color: black,\\n $scale-label-color: black,\\n\\n $title-color: black,\\n\\n $sidebar-background-color: #EEE,\\n $sidebar-text-color: #111,\\n\\n $new-grapher-color: #222\\n );\\n}\\n\\n.grapher-night {\\n @include grapher-theme-night();\\n}\\n\\n.grapher-day {\\n @include grapher-theme-day();\\n}\\n\\n.grapher-export {\\n @include grapher-theme-export();\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","\"use strict\";\n\n/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n*/\nmodule.exports = function (cssWithMappingToString) {\n var list = [];\n\n // return the list of modules as css string\n list.toString = function toString() {\n return this.map(function (item) {\n var content = \"\";\n var needLayer = typeof item[5] !== \"undefined\";\n if (item[4]) {\n content += \"@supports (\".concat(item[4], \") {\");\n }\n if (item[2]) {\n content += \"@media \".concat(item[2], \" {\");\n }\n if (needLayer) {\n content += \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\");\n }\n content += cssWithMappingToString(item);\n if (needLayer) {\n content += \"}\";\n }\n if (item[2]) {\n content += \"}\";\n }\n if (item[4]) {\n content += \"}\";\n }\n return content;\n }).join(\"\");\n };\n\n // import a list of modules into the list\n list.i = function i(modules, media, dedupe, supports, layer) {\n if (typeof modules === \"string\") {\n modules = [[null, modules, undefined]];\n }\n var alreadyImportedModules = {};\n if (dedupe) {\n for (var k = 0; k < this.length; k++) {\n var id = this[k][0];\n if (id != null) {\n alreadyImportedModules[id] = true;\n }\n }\n }\n for (var _k = 0; _k < modules.length; _k++) {\n var item = [].concat(modules[_k]);\n if (dedupe && alreadyImportedModules[item[0]]) {\n continue;\n }\n if (typeof layer !== \"undefined\") {\n if (typeof item[5] === \"undefined\") {\n item[5] = layer;\n } else {\n item[1] = \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\").concat(item[1], \"}\");\n item[5] = layer;\n }\n }\n if (media) {\n if (!item[2]) {\n item[2] = media;\n } else {\n item[1] = \"@media \".concat(item[2], \" {\").concat(item[1], \"}\");\n item[2] = media;\n }\n }\n if (supports) {\n if (!item[4]) {\n item[4] = \"\".concat(supports);\n } else {\n item[1] = \"@supports (\".concat(item[4], \") {\").concat(item[1], \"}\");\n item[4] = supports;\n }\n }\n list.push(item);\n }\n };\n return list;\n};","\"use strict\";\n\nmodule.exports = function (item) {\n var content = item[1];\n var cssMapping = item[3];\n if (!cssMapping) {\n return content;\n }\n if (typeof btoa === \"function\") {\n var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));\n var data = \"sourceMappingURL=data:application/json;charset=utf-8;base64,\".concat(base64);\n var sourceMapping = \"/*# \".concat(data, \" */\");\n return [content].concat([sourceMapping]).join(\"\\n\");\n }\n return [content].join(\"\\n\");\n};","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\n\nfunction emptyFunction() {}\nfunction emptyFunctionWithReset() {}\nemptyFunctionWithReset.resetWarningCache = emptyFunction;\n\nmodule.exports = function() {\n function shim(props, propName, componentName, location, propFullName, secret) {\n if (secret === ReactPropTypesSecret) {\n // It is still safe when called from React.\n return;\n }\n var err = new Error(\n 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n 'Use PropTypes.checkPropTypes() to call them. ' +\n 'Read more at http://fb.me/use-check-prop-types'\n );\n err.name = 'Invariant Violation';\n throw err;\n };\n shim.isRequired = shim;\n function getShim() {\n return shim;\n };\n // Important!\n // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`.\n var ReactPropTypes = {\n array: shim,\n bigint: shim,\n bool: shim,\n func: shim,\n number: shim,\n object: shim,\n string: shim,\n symbol: shim,\n\n any: shim,\n arrayOf: getShim,\n element: shim,\n elementType: shim,\n instanceOf: getShim,\n node: shim,\n objectOf: getShim,\n oneOf: getShim,\n oneOfType: getShim,\n shape: getShim,\n exact: getShim,\n\n checkPropTypes: emptyFunctionWithReset,\n resetWarningCache: emptyFunction\n };\n\n ReactPropTypes.PropTypes = ReactPropTypes;\n\n return ReactPropTypes;\n};\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (process.env.NODE_ENV !== 'production') {\n var ReactIs = require('react-is');\n\n // By explicitly using `prop-types` you are opting into new development behavior.\n // http://fb.me/prop-types-in-prod\n var throwOnDirectAccess = true;\n module.exports = require('./factoryWithTypeCheckers')(ReactIs.isElement, throwOnDirectAccess);\n} else {\n // By explicitly using `prop-types` you are opting into new production behavior.\n // http://fb.me/prop-types-in-prod\n module.exports = require('./factoryWithThrowingShims')();\n}\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nmodule.exports = ReactPropTypesSecret;\n","\"use strict\";\n\nvar stylesInDOM = [];\nfunction getIndexByIdentifier(identifier) {\n var result = -1;\n for (var i = 0; i < stylesInDOM.length; i++) {\n if (stylesInDOM[i].identifier === identifier) {\n result = i;\n break;\n }\n }\n return result;\n}\nfunction modulesToDom(list, options) {\n var idCountMap = {};\n var identifiers = [];\n for (var i = 0; i < list.length; i++) {\n var item = list[i];\n var id = options.base ? item[0] + options.base : item[0];\n var count = idCountMap[id] || 0;\n var identifier = \"\".concat(id, \" \").concat(count);\n idCountMap[id] = count + 1;\n var indexByIdentifier = getIndexByIdentifier(identifier);\n var obj = {\n css: item[1],\n media: item[2],\n sourceMap: item[3],\n supports: item[4],\n layer: item[5]\n };\n if (indexByIdentifier !== -1) {\n stylesInDOM[indexByIdentifier].references++;\n stylesInDOM[indexByIdentifier].updater(obj);\n } else {\n var updater = addElementStyle(obj, options);\n options.byIndex = i;\n stylesInDOM.splice(i, 0, {\n identifier: identifier,\n updater: updater,\n references: 1\n });\n }\n identifiers.push(identifier);\n }\n return identifiers;\n}\nfunction addElementStyle(obj, options) {\n var api = options.domAPI(options);\n api.update(obj);\n var updater = function updater(newObj) {\n if (newObj) {\n if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap && newObj.supports === obj.supports && newObj.layer === obj.layer) {\n return;\n }\n api.update(obj = newObj);\n } else {\n api.remove();\n }\n };\n return updater;\n}\nmodule.exports = function (list, options) {\n options = options || {};\n list = list || [];\n var lastIdentifiers = modulesToDom(list, options);\n return function update(newList) {\n newList = newList || [];\n for (var i = 0; i < lastIdentifiers.length; i++) {\n var identifier = lastIdentifiers[i];\n var index = getIndexByIdentifier(identifier);\n stylesInDOM[index].references--;\n }\n var newLastIdentifiers = modulesToDom(newList, options);\n for (var _i = 0; _i < lastIdentifiers.length; _i++) {\n var _identifier = lastIdentifiers[_i];\n var _index = getIndexByIdentifier(_identifier);\n if (stylesInDOM[_index].references === 0) {\n stylesInDOM[_index].updater();\n stylesInDOM.splice(_index, 1);\n }\n }\n lastIdentifiers = newLastIdentifiers;\n };\n};","\"use strict\";\n\nvar memo = {};\n\n/* istanbul ignore next */\nfunction getTarget(target) {\n if (typeof memo[target] === \"undefined\") {\n var styleTarget = document.querySelector(target);\n\n // Special case to return head of iframe instead of iframe itself\n if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {\n try {\n // This will throw an exception if access to iframe is blocked\n // due to cross-origin restrictions\n styleTarget = styleTarget.contentDocument.head;\n } catch (e) {\n // istanbul ignore next\n styleTarget = null;\n }\n }\n memo[target] = styleTarget;\n }\n return memo[target];\n}\n\n/* istanbul ignore next */\nfunction insertBySelector(insert, style) {\n var target = getTarget(insert);\n if (!target) {\n throw new Error(\"Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.\");\n }\n target.appendChild(style);\n}\nmodule.exports = insertBySelector;","\"use strict\";\n\n/* istanbul ignore next */\nfunction insertStyleElement(options) {\n var element = document.createElement(\"style\");\n options.setAttributes(element, options.attributes);\n options.insert(element, options.options);\n return element;\n}\nmodule.exports = insertStyleElement;","\"use strict\";\n\n/* istanbul ignore next */\nfunction setAttributesWithoutAttributes(styleElement) {\n var nonce = typeof __webpack_nonce__ !== \"undefined\" ? __webpack_nonce__ : null;\n if (nonce) {\n styleElement.setAttribute(\"nonce\", nonce);\n }\n}\nmodule.exports = setAttributesWithoutAttributes;","\"use strict\";\n\n/* istanbul ignore next */\nfunction apply(styleElement, options, obj) {\n var css = \"\";\n if (obj.supports) {\n css += \"@supports (\".concat(obj.supports, \") {\");\n }\n if (obj.media) {\n css += \"@media \".concat(obj.media, \" {\");\n }\n var needLayer = typeof obj.layer !== \"undefined\";\n if (needLayer) {\n css += \"@layer\".concat(obj.layer.length > 0 ? \" \".concat(obj.layer) : \"\", \" {\");\n }\n css += obj.css;\n if (needLayer) {\n css += \"}\";\n }\n if (obj.media) {\n css += \"}\";\n }\n if (obj.supports) {\n css += \"}\";\n }\n var sourceMap = obj.sourceMap;\n if (sourceMap && typeof btoa !== \"undefined\") {\n css += \"\\n/*# sourceMappingURL=data:application/json;base64,\".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), \" */\");\n }\n\n // For old IE\n /* istanbul ignore if */\n options.styleTagTransform(css, styleElement, options.options);\n}\nfunction removeStyleElement(styleElement) {\n // istanbul ignore if\n if (styleElement.parentNode === null) {\n return false;\n }\n styleElement.parentNode.removeChild(styleElement);\n}\n\n/* istanbul ignore next */\nfunction domAPI(options) {\n if (typeof document === \"undefined\") {\n return {\n update: function update() {},\n remove: function remove() {}\n };\n }\n var styleElement = options.insertStyleElement(options);\n return {\n update: function update(obj) {\n apply(styleElement, options, obj);\n },\n remove: function remove() {\n removeStyleElement(styleElement);\n }\n };\n}\nmodule.exports = domAPI;","\"use strict\";\n\n/* istanbul ignore next */\nfunction styleTagTransform(css, styleElement) {\n if (styleElement.styleSheet) {\n styleElement.styleSheet.cssText = css;\n } else {\n while (styleElement.firstChild) {\n styleElement.removeChild(styleElement.firstChild);\n }\n styleElement.appendChild(document.createTextNode(css));\n }\n}\nmodule.exports = styleTagTransform;","module.exports = \"precision highp float;\\n\\nuniform vec4 color;\\n\\nvoid main() {\\n gl_FragColor = vec4(color);\\n}\\n\"","module.exports = \"precision highp float;\\n\\nattribute vec2 position;\\n\\nvoid main() {\\n gl_Position = vec4((position - 0.5)*2.0, 0.0, 1.0);\\n}\\n\"","module.exports = \"#ifdef GL_OES_standard_derivatives\\n#extension GL_OES_standard_derivatives : enable\\n#endif\\n\\nprecision mediump float;\\n\\nuniform vec4 color;\\n\\n// Adapted and modified from https://www.desultoryquest.com/blog/drawing-anti-aliased-circular-points-using-opengl-slash-webgl/\\nvoid main() {\\n float delta = 0.0;\\n float alpha = 1.0;\\n vec2 center = 2.0 * gl_PointCoord - 1.0;\\n float r = dot(center, center);\\n\\n if (r > 1.0) {\\n discard;\\n }\\n\\n #ifdef GL_OES_standard_derivatives\\n delta = fwidth(r);\\n alpha = 1.0 - smoothstep(1.0 - delta, 1.0 + delta, r);\\n #endif\\n\\n gl_FragColor = color * alpha;\\n}\\n\"","module.exports = \"precision mediump float;\\n\\nattribute vec2 position;\\n\\nuniform float width;\\nuniform float height;\\nuniform float pointSize;\\n\\nvoid main() {\\n gl_Position = vec4(2.0*position.x/width - 1.0, 1.0 - 2.0*position.y/height, 0.0, 1.0);\\n gl_PointSize = pointSize;\\n}\"","module.exports = \"precision highp float;\\n\\nuniform vec4 color;\\nuniform float thickness;\\nuniform float shadowBlur;\\nuniform vec4 shadowColor;\\n\\nvarying vec2 position_vec;\\nvarying vec2 prev_position_vec;\\n\\n/**\\n * Calculate distance between point and line in screen space (ie, inputs in pixels, returns distance in pixels)\\n */\\nfloat distance_from_line() {\\n float x0 = gl_FragCoord.x;\\n float y0 = gl_FragCoord.y;\\n\\n // let line be defined by ax + by + c = 0;\\n float a, b, c;\\n\\n if (position_vec.x == prev_position_vec.x) {\\n a = 1.0;\\n b = 0.0;\\n c = -position_vec.x;\\n } else {\\n float slope = (position_vec.y - prev_position_vec.y)/(position_vec.x - prev_position_vec.x);\\n float y_intercept = position_vec.y - slope*position_vec.x;\\n\\n // y = slope*x + y_intercept\\n // (-slope)(x) + (1)(y) - y_intercept = 0;\\n a = -slope;\\n b = 1.0;\\n c = -y_intercept;\\n }\\n\\n return abs(a*x0 + b*y0 + c)/length(vec2(a, b));\\n}\\n\\nvoid main() {\\n vec4 transparent = vec4(0.0, 0.0, 0.0, 0.0);\\n\\n float dist = distance_from_line();\\n\\n if (dist + shadowBlur >= thickness) {\\n float percent_shadowed = ((thickness - dist) / shadowBlur);\\n gl_FragColor = mix(transparent, shadowColor, percent_shadowed*percent_shadowed);\\n } else {\\n gl_FragColor = vec4(color);\\n gl_FragColor.rgb *= gl_FragColor.a;\\n }\\n}\\n\"","module.exports = \"precision highp float;\\n\\nattribute vec2 position;\\nattribute vec2 prevPosition;\\nattribute float vertex;\\n\\nuniform float width;\\nuniform float height;\\nuniform float thickness;\\n\\nvarying vec2 position_vec;\\nvarying vec2 prev_position_vec;\\n\\nvoid main() {\\n vec2 delta = position - prevPosition;\\n vec2 alpha = prevPosition;\\n vec2 beta = position;\\n\\n vec2 normalized_delta = normalize(delta);\\n vec2 normal = vec2(-thickness/2.0 * normalized_delta.y, thickness/2.0 * normalized_delta.x);\\n\\n vec2 vertex_position =\\n step(0.5, mod(vertex, 2.0))*alpha + // alpha if vertex is odd, 0 otherwise\\n step(0.5, mod(vertex + 1.0, 2.0))*beta + // beta if vertex is even, 0 otherwise\\n 2.0*(step(1.5, vertex)-0.5)*normal // -normal if vertex < 2, +normal otherwise\\n ;\\n\\n position_vec = vec2(position.x, height - position.y);\\n prev_position_vec = vec2(prevPosition.x, height - prevPosition.y);\\n\\n gl_Position = vec4(2.0*vertex_position.x/width - 1.0, 1.0 - 2.0*vertex_position.y/height, 0.0, 1.0);\\n}\\n\"","module.exports = __WEBPACK_EXTERNAL_MODULE__155__;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".bundle.js\";\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.p = \"/assets/\";","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t792: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\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\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n// no on chunks loaded\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\n}\n\nvar chunkLoadingGlobal = globalThis[\"webpackChunkGrapher\"] = globalThis[\"webpackChunkGrapher\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.nc = undefined;","export const SIMPLE_DATA_TYPES = [\n 'values',\n 'tuples',\n 'objects'\n];\n\nexport const COMPLEX_DATA_TYPES = [\n 'tuple_observable',\n 'object_observable',\n 'generator'\n];\n\nexport const DATA_TYPES = [...SIMPLE_DATA_TYPES, ...COMPLEX_DATA_TYPES];\n","import PropTypes from 'prop-types';\nimport {DATA_TYPES} from '../state/data_types';\n\n// checking the shape of data is slow if there's a lot of it\n// it can be convenient in development, but should not be done when testing high cardinality data\nconst ENABLE_DATA_CHECK = false;\n\nconst PointY = function (props, propName) {\n if (typeof props[propName] !== 'number' && props[propName] !== null) {\n return new Error(`${propName} needs to be a number or null`);\n }\n\n return null;\n};\n\nconst PointTuple = function (props, propName) {\n if (!Array.isArray(props) || props.length !== 2) { // eslint-disable-line react/prop-types\n return new Error(`${propName} needs to be an array of length two`);\n }\n\n const [x, y] = props;\n if (typeof x !== 'number' && !(x instanceof Date)) {\n return new Error(`${propName}.x needs to be a number or date`);\n }\n\n if (typeof y !== 'number' && y !== null) {\n return new Error(`${propName}.y needs to be a number or null`);\n }\n\n return null;\n};\n\nconst Data = ENABLE_DATA_CHECK ? PropTypes.oneOfType([\n PropTypes.arrayOf(PointY), // values\n PropTypes.arrayOf(PropTypes.arrayOf(PointTuple)), // tuples\n PropTypes.arrayOf(PropTypes.object), // objects\n PropTypes.shape({ observe: PropTypes.func.isRequired }), // observable\n PropTypes.func // generator function\n]) : PropTypes.any;\n\nconst SingleSeries = PropTypes.shape({\n data: Data.isRequired,\n type: PropTypes.oneOf([\n ...DATA_TYPES,\n 'infer'\n ]),\n xKey: PropTypes.string,\n yKey: PropTypes.string,\n xUnixDates: PropTypes.bool,\n color: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n name: PropTypes.string,\n xLabel: PropTypes.string,\n yLabel: PropTypes.string,\n ignoreDiscontinuities: PropTypes.bool,\n dashed: PropTypes.bool,\n dashPattern: PropTypes.arrayOf(PropTypes.number),\n width: PropTypes.number,\n rangeSelectorWidth: PropTypes.number,\n axis: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),\n expandYWith: PropTypes.arrayOf(PropTypes.number),\n defaultAlwaysTooltipped: PropTypes.bool,\n square: PropTypes.bool,\n shiftXBy: PropTypes.number,\n graph: PropTypes.number, // affects multigrapher only\n background: PropTypes.object,\n hideFromKey: PropTypes.bool,\n showIndividualPoints: PropTypes.bool,\n rendering: PropTypes.oneOf(['line', 'bar', 'area']), // defaults to line\n negativeColor: PropTypes.string, // only applies to bar\n gradient: PropTypes.array, // only applies to area\n zeroLineWidth: PropTypes.number, // only applies to bar and area\n zeroLineColor: PropTypes.string, // only applies to bar and area\n zeroLineY: PropTypes.number, // only applies to bar and area\n pointRadius: PropTypes.number, // only applies to area\n tooltipWidth: PropTypes.number,\n hasAreaBottom: PropTypes.bool,\n shadowColor: PropTypes.string,\n rangeKey: PropTypes.string\n});\n\nconst Series = PropTypes.arrayOf(SingleSeries);\n\nconst Axis = PropTypes.shape({\n axisIndex: PropTypes.number.isRequired,\n series: PropTypes.array.isRequired,\n side: PropTypes.oneOf(['left', 'right']).isRequired,\n scale: PropTypes.oneOf(['linear', 'log']).isRequired,\n label: PropTypes.string\n});\n\nconst Axes = PropTypes.arrayOf(Axis);\n\nconst CustomBoundsSelector = PropTypes.shape({\n label: PropTypes.string.isRequired,\n calculator: PropTypes.func.isRequired,\n datesOnly: PropTypes.bool\n});\n\nconst CustomBoundsSelectors = PropTypes.arrayOf(CustomBoundsSelector);\n\nconst TooltipOptionsRaw = {\n includeSeriesLabel: PropTypes.bool,\n includeXLabel: PropTypes.bool,\n includeYLabel: PropTypes.bool,\n includeXValue: PropTypes.bool,\n includeYValue: PropTypes.bool,\n floating: PropTypes.bool,\n alwaysFixedPosition: PropTypes.bool,\n floatPosition: PropTypes.oneOf(['top', 'bottom']),\n floatDelta: PropTypes.number,\n savingDisabled: PropTypes.bool,\n customTooltip: PropTypes.func,\n combineTooltips: PropTypes.oneOfType([PropTypes.bool, PropTypes.number])\n};\n\nconst TooltipOptions = PropTypes.shape(TooltipOptionsRaw);\n\nconst Annotation = PropTypes.shape({\n x: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.instanceOf(Date)]).isRequired,\n xEnd: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.instanceOf(Date)]),\n series: PropTypes.arrayOf(PropTypes.string),\n content: PropTypes.string.isRequired\n});\nconst Annotations = PropTypes.arrayOf(Annotation);\n\nconst DraggablePoint = PropTypes.shape({\n x: PropTypes.number.isRequired,\n y: PropTypes.number.isRequired,\n radius: PropTypes.number,\n fillColor: PropTypes.string,\n strokeColor: PropTypes.string,\n strokeWidth: PropTypes.number,\n onClick: PropTypes.func,\n onDoubleClick: PropTypes.func\n});\nconst DraggablePoints = PropTypes.arrayOf(DraggablePoint);\n\nconst VerticalLine = PropTypes.shape({\n x: PropTypes.number.isRequired,\n color: PropTypes.string,\n lineTop: PropTypes.number,\n width: PropTypes.number,\n markTop: PropTypes.bool,\n style: PropTypes.object,\n markerStyle: PropTypes.object,\n text: PropTypes.string,\n textTop: PropTypes.number,\n textStyle: PropTypes.object,\n minPixelX: PropTypes.number,\n maxPixelX: PropTypes.number,\n onRangeGraph: PropTypes.oneOfType([\n PropTypes.bool,\n PropTypes.object // anything that can be passed into the overall vertical line\n ]),\n onRangeGraphOnly: PropTypes.bool\n});\nconst VerticalLines = PropTypes.arrayOf(VerticalLine);\n\nconst CustomPropTypes = {\n Data,\n SingleSeries,\n Series,\n Axis,\n Axes,\n CustomBoundsSelector,\n CustomBoundsSelectors,\n TooltipOptions,\n TooltipOptionsRaw,\n Annotations,\n DraggablePoint,\n DraggablePoints,\n VerticalLine,\n VerticalLines\n};\n\n\nexport default CustomPropTypes;\n","export const DPI_INCREASE = 2;\n\n/**\n * Sizes the canvas such that rendering is pixel perfect\n * Returns the sizing information\n *\n * @param {HTMLCanvasElement} canvas\n * @param {CanvasRenderingContext2D} context\n * @param {Boolean} reset - if true, will reset the canvas size before checking sizing\n * @return {Promise<{boundingRect: DOMRect, pixelRatio: number, elementHeight: number, renderWidth: number, renderHeight: number, elementWidth: number}>}\n */\nexport default async function sizeCanvas(canvas, context, {reset=true}={}) {\n if (reset) {\n canvas.width = '';\n canvas.height = '';\n canvas.style.width = '0';\n canvas.style.height = '';\n\n await new Promise((resolve) => requestAnimationFrame(resolve));\n }\n\n let boundingRect = canvas.parentNode.getBoundingClientRect();\n\n while (boundingRect.width === 0) {\n await new Promise((resolve) => requestAnimationFrame(resolve));\n boundingRect = canvas.getBoundingClientRect();\n }\n\n const dpr = window.devicePixelRatio || 1;\n const bsr = context.webkitBackingStorePixelRatio ||\n context.mozBackingStorePixelRatio ||\n context.msBackingStorePixelRatio ||\n context.oBackingStorePixelRatio ||\n context.backingStorePixelRatio || 1;\n\n const pixelRatio = DPI_INCREASE*dpr / bsr;\n\n const elementWidth = boundingRect.width;\n const elementHeight = boundingRect.height;\n const renderWidth = elementWidth * pixelRatio;\n const renderHeight = elementHeight * pixelRatio;\n\n canvas.width = renderWidth;\n canvas.height = renderHeight;\n canvas.style.width = `${elementWidth}px`;\n canvas.style.height = `${elementHeight}px`;\n\n // We could us this to make coordinates behave as if they weren't transformed if we wanted\n // context.setTransform(this.pixelRatio, 0, 0, this.pixelRatio, 0, 0)\n\n return {\n pixelRatio,\n elementWidth,\n elementHeight,\n renderWidth,\n renderHeight,\n boundingRect\n };\n}\n","export const LINE_COLORS = [\n '#F1C232',\n '#1259f8',\n '#cb4b4b',\n '#4da74d',\n '#9440ed',\n '#61e0ed',\n '#ed6d2c',\n '#ed13c6',\n '#bbed59'\n];\n\nexport default function getColor(seriesColor, i, multigrapherSeriesIndex) {\n if (typeof seriesColor === 'string') {\n return seriesColor;\n }\n\n if (typeof seriesColor === 'number') {\n return LINE_COLORS[seriesColor % LINE_COLORS.length];\n }\n\n if (multigrapherSeriesIndex !== undefined) {\n return LINE_COLORS[multigrapherSeriesIndex % LINE_COLORS.length];\n }\n\n return LINE_COLORS[i % LINE_COLORS.length];\n}\n","/**\n * Returns the color as a [r, g, b, a] array with domain 0 to 1 for use in webgl\n *\n * @param color\n * @return {[number, number, number, number]|[number, number, number, number]}\n */\nexport default function colorToVector(color) {\n if (color === 'black') {\n color = '#000000';\n } else if (color === 'white') {\n color = '#FFFFFF';\n } else if (color === 'transparent') {\n return [0, 0, 0, 0];\n }\n\n if (color.startsWith('rgb')) {\n const parts = color.split(',').map((part) => parseFloat(part.match(/\\d+(\\.\\d+)?/)[0]));\n return [\n parts[0]/255,\n parts[1]/255,\n parts[2]/255,\n parts.length >= 4 ? parts[3] : 1\n ];\n }\n\n if (typeof color !== 'string' || !/^#[\\dA-F]{6}$/i.test(color)) {\n throw new Error(`Color must be a hex string: ${color}`);\n }\n\n const r = parseInt(color.substr(1, 2), 16)/255;\n const g = parseInt(color.substr(3, 2), 16)/255;\n const b = parseInt(color.substr(5, 2), 16)/255;\n const a = 1.0;\n return [r, g, b, a];\n}\n","import {DPI_INCREASE} from './size_canvas';\n\n/**\n * Returns an array of contiguous paths from data in render space\n *\n * @param {{nullMask: Uint8Array, maxYValues: Float64Array, minYValues: Float64Array, yValues: Float64Array}} dataInRenderSpace\n * @param {Object} options\n * @param {Number} options.splitAtY - split the path whenever it's suddenly less or greater than this value\n * @return {[[Number]]}\n */\nexport default function pathsFrom(dataInRenderSpace, {splitAtY}={}) {\n const paths = [];\n let currentPath = [];\n let previouslyDiscontinuous = true;\n\n const { nullMask, maxYValues, minYValues, yValues } = dataInRenderSpace;\n\n for (let i = 0; i < yValues.length; i++) {\n const x = i*DPI_INCREASE;\n const y = yValues[i];\n\n if (nullMask[i] & 0b001) { // y null\n if (!previouslyDiscontinuous) {\n paths.push(currentPath);\n currentPath = [];\n }\n\n previouslyDiscontinuous = true;\n continue;\n }\n\n currentPath.push([x, y]);\n\n const minY = minYValues[i];\n const maxY = maxYValues[i];\n\n if (minY !== maxY) {\n if (!(nullMask[i] & 0b010)) {\n currentPath.push([x, minY]);\n }\n\n if (!(nullMask[i] & 0b100)) {\n currentPath.push([x, maxY]);\n }\n currentPath.push([x, y]);\n }\n\n previouslyDiscontinuous = false;\n\n if (typeof splitAtY === 'number' && i > 0) {\n const prevY = yValues[i-1];\n const signFlipped = !(nullMask[i-1] & 0b001) && (prevY < splitAtY && y >= splitAtY) || (prevY > splitAtY && y <= splitAtY) || (prevY === splitAtY && y !== splitAtY);\n\n if (signFlipped) {\n if (!previouslyDiscontinuous) {\n paths.push(currentPath);\n currentPath = [\n [x, y]\n ];\n }\n\n previouslyDiscontinuous = true;\n }\n }\n }\n\n if (!previouslyDiscontinuous) {\n paths.push(currentPath);\n }\n\n return paths;\n}\n","import pathsFrom from './paths_from';\nimport {DPI_INCREASE} from './size_canvas';\nlet RustAPI;\nimport('../rust/pkg/index.js').then((module) => {\n RustAPI = module;\n});\n\n/**\n *\n * @param {[[Number]]} paths\n * @param {Boolean} dashed\n * @param {Array} dashPattern\n * @return {{prevPositions: Float32Array, indices: Uint32Array, vertices: Float32Array, positions: Float32Array}}\n */\nexport function extractVerticesFromPaths(paths, { dashed, dashPattern }) {\n let pointNumber = 0;\n for (let path of paths) {\n if (dashed) {\n for (let i = 0; i < path.length; i++) {\n if (dashed && i % (dashPattern[0] + dashPattern[1]) >= dashPattern[0]) {\n continue;\n }\n pointNumber++;\n }\n } else {\n pointNumber += path.length;\n }\n }\n\n const positions = new Float32Array(pointNumber*8);\n const prevPositions = new Float32Array(pointNumber*8);\n const vertices = new Float32Array(pointNumber*4);\n const indices = new Uint32Array(pointNumber*6);\n\n if (pointNumber > 0) {\n const verticesPattern = new Float32Array([0, 1, 2, 3]);\n vertices.set(verticesPattern);\n let vertexPointer = verticesPattern.length;\n let sourceLength = verticesPattern.length;\n while (vertexPointer < vertices.length) {\n if (vertexPointer + sourceLength > vertices.length) {\n sourceLength = vertices.length - vertexPointer;\n }\n\n vertices.copyWithin(vertexPointer, 0, sourceLength);\n vertexPointer += sourceLength;\n sourceLength <<= 1;\n }\n }\n\n let pointI = 0;\n for (let path of paths) {\n for (let i = 0; i < path.length; i++) {\n if (dashed && i % (dashPattern[0] + dashPattern[1]) >= dashPattern[0]) {\n continue;\n }\n\n const [x, y] = path[i];\n\n let prevX, prevY;\n\n if (i === 0) {\n prevX = x - 1;\n prevY = y;\n } else {\n [prevX, prevY] = path[i - 1];\n }\n\n for (let j = 0; j < 4; j++) {\n positions[pointI * 8 + 2 * j] = x;\n positions[pointI * 8 + 2 * j + 1] = y;\n prevPositions[pointI * 8 + 2 * j] = prevX;\n prevPositions[pointI * 8 + 2 * j + 1] = prevY;\n }\n\n indices[pointI * 6] = pointI * 4;\n indices[pointI * 6 + 1] = pointI * 4 + 1;\n indices[pointI * 6 + 2] = pointI * 4 + 3;\n\n indices[pointI * 6 + 3] = pointI * 4;\n indices[pointI * 6 + 4] = pointI * 4 + 2;\n indices[pointI * 6 + 5] = pointI * 4 + 3;\n\n pointI++;\n }\n }\n\n return {\n positions,\n prevPositions,\n vertices,\n indices\n };\n}\n\n/**\n * Takes the paths and turns them into what's needed for the line webgl program\n *\n * @param {{nullMask: Uint8Array, maxYValues: Float64Array, minYValues: Float64Array, yValues: Float64Array, paths?: [[Number]]}} dataInRenderSpace\n * @param {Boolean} dashed\n * @param {Array} dashPattern\n * @return {{prevPositions: Float32Array, indices: Uint32Array, vertices: Float32Array, positions: Float32Array}}\n */\nexport default function extractVertices(dataInRenderSpace, { dashed, dashPattern }) {\n if (dataInRenderSpace.paths) {\n return extractVerticesFromPaths(dataInRenderSpace.paths, { dashed, dashPattern});\n }\n\n if (!RustAPI) {\n const paths = pathsFrom(dataInRenderSpace);\n return extractVerticesFromPaths(paths, { dashed, dashPattern});\n }\n\n const pointNumber = RustAPI.get_point_number(\n dataInRenderSpace.nullMask, dataInRenderSpace.yValues, dataInRenderSpace.minYValues, dataInRenderSpace.maxYValues,\n dashed, dashPattern[0], dashPattern[1]\n );\n\n let positions = new Float32Array(pointNumber*8);\n let prevPositions = new Float32Array(pointNumber*8);\n let vertices = new Float32Array(pointNumber*4);\n let indices = new Uint32Array(pointNumber*6);\n\n RustAPI.extract_vertices(\n DPI_INCREASE,\n dataInRenderSpace.nullMask, dataInRenderSpace.yValues, dataInRenderSpace.minYValues, dataInRenderSpace.maxYValues,\n positions, prevPositions, vertices, indices,\n dashed, dashPattern[0], dashPattern[1]\n );\n\n return {\n positions,\n prevPositions,\n vertices,\n indices\n };\n}\n","/**\n * Creates a webgl program, linking the shaders and checking for errors\n *\n * @param gl\n * @param vertShaderSource\n * @param fragShaderSource\n * @return {WebGLProgram}\n */\nexport default function createGLProgram(gl, vertShaderSource, fragShaderSource) {\n const vertexShader = gl.createShader(gl.VERTEX_SHADER);\n gl.shaderSource(vertexShader, vertShaderSource);\n gl.compileShader(vertexShader);\n if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {\n console.error(gl.getShaderInfoLog(vertexShader)); // eslint-disable-line no-console\n }\n\n const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n gl.shaderSource(fragmentShader, fragShaderSource);\n gl.compileShader(fragmentShader);\n if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {\n console.error(gl.getShaderInfoLog(fragmentShader)); // eslint-disable-line no-console\n }\n\n const program = gl.createProgram();\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n\n gl.linkProgram(program);\n gl.validateProgram(program);\n\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n console.error(gl.getProgramInfoLog(program)); // eslint-disable-line no-console\n }\n\n return program;\n}\n","import lineFrag from './line.frag';\nimport lineVert from './line.vert';\nimport circleFrag from './circle.frag';\nimport circleVert from './circle.vert';\nimport colorToVector from '../helpers/color_to_vector';\nimport extractVertices from './extract_vertices';\nimport createGLProgram from './create_gl_program';\nimport {DPI_INCREASE} from './size_canvas';\n\nexport default class LineProgram {\n\n constructor(gl) {\n this._gl = gl;\n\n this._program = createGLProgram(gl, lineVert, lineFrag);\n this._circleProgram = createGLProgram(gl, circleVert, circleFrag);\n\n this._positionBuffer = gl.createBuffer();\n this._prevPositionBuffer = gl.createBuffer();\n this._vertexBuffer = gl.createBuffer();\n this._indexBuffer = gl.createBuffer();\n this._individualPointBuffer = gl.createBuffer();\n\n if (!gl.getExtension('OES_element_index_uint')) {\n console.error('Your browser does not support OES_element_index_uint'); // eslint-disable-line no-console\n }\n }\n\n dispose() {\n\n }\n\n clear() {\n const gl = this._gl;\n const width = gl.drawingBufferWidth;\n const height = gl.drawingBufferHeight;\n\n gl.clearColor(0, 0, 0, 0);\n gl.clear(gl.DEPTH_BUFFER_BIT | gl.COLOR_BUFFER_BIT);\n gl.viewport(0, 0, width, height);\n }\n\n /**\n * Draws the data on the canvas\n * Assumes the data is in render space\n *\n * @param {{nullMask: Uint8Array, maxYValues: Float64Array, minYValues: Float64Array, yValues: Float64Array}} dataInRenderSpace - the data to render\n * @param {Object} parameters - set of options\n * @param {String} parameters.color - color of the line to draw\n * @param {Number} [parameters.width] - line width\n * @param {Number} [parameters.shadowBlur] - level to blur shadow to\n * @param {String} [parameters.shadowColor] - color of the shadow\n * @param {String} [parameters.dashed] - whether or not to make the line dashed\n * @param {Array<Number>} [parameters.dashPattern] - dash array for the canvas\n * @param {Boolean} [parameters.highlighted] - whether the line is highlighted or not\n * @param {Boolean} [parameters.showIndividualPoints] - draw circles at each point\n * @param {Function} [parameters.getIndividualPoints] - points to draw circles at. Only called when needed.\n * @private\n */\n draw(dataInRenderSpace, parameters) {\n const gl = this._gl;\n const width = gl.drawingBufferWidth;\n const height = gl.drawingBufferHeight;\n gl.useProgram(this._program);\n\n // gl.disable(gl.DEPTH_TEST);\n\n const thickness = DPI_INCREASE*((parameters.width || 1) + (parameters.highlighted ? 2 : 0));\n const shadowBlur = parameters.shadowBlur === undefined ? 2 : parameters.shadowBlur;\n const shadowColor = parameters.shadowColor || 'black';\n const dashed = parameters.dashed || false;\n const dashPattern = parameters.dashPattern || [5, 5];\n\n const {positions, prevPositions, vertices, indices} = extractVertices(dataInRenderSpace, { dashed, dashPattern });\n\n const positionIndex = gl.getAttribLocation(this._program, 'position');\n const prevPositionIndex = gl.getAttribLocation(this._program, 'prevPosition');\n const vertexIndex = gl.getAttribLocation(this._program, 'vertex');\n\n gl.enableVertexAttribArray(positionIndex);\n gl.bindBuffer(gl.ARRAY_BUFFER, this._positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, positions, gl.STATIC_DRAW);\n gl.vertexAttribPointer(positionIndex, 2, gl.FLOAT, false, 0, 0);\n\n gl.enableVertexAttribArray(prevPositionIndex);\n gl.bindBuffer(gl.ARRAY_BUFFER, this._prevPositionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, prevPositions, gl.STATIC_DRAW);\n gl.vertexAttribPointer(prevPositionIndex, 2, gl.FLOAT, false, 0, 0);\n\n gl.enableVertexAttribArray(vertexIndex);\n gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n gl.vertexAttribPointer(vertexIndex, 1, gl.FLOAT, false, 0, 0);\n\n gl.uniform1f(gl.getUniformLocation(this._program, 'width'), width);\n gl.uniform1f(gl.getUniformLocation(this._program, 'height'), height);\n gl.uniform1f(gl.getUniformLocation(this._program, 'thickness'), Math.max(thickness, 1)+shadowBlur);\n gl.uniform1f(gl.getUniformLocation(this._program, 'shadowBlur'), shadowBlur);\n gl.uniform4f(gl.getUniformLocation(this._program, 'color'), ...colorToVector(parameters.color));\n gl.uniform4f(gl.getUniformLocation(this._program, 'shadowColor'), ...colorToVector(shadowColor));\n\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n gl.drawElements(gl.TRIANGLES, indices.length, gl.UNSIGNED_INT, 0);\n\n if (parameters.showIndividualPoints) {\n gl.useProgram(this._circleProgram);\n\n gl.uniform1f(gl.getUniformLocation(this._circleProgram, 'width'), width);\n gl.uniform1f(gl.getUniformLocation(this._circleProgram, 'height'), height);\n gl.uniform1f(gl.getUniformLocation(this._circleProgram, 'pointSize'), 2*(thickness+6));\n gl.uniform4f(gl.getUniformLocation(this._circleProgram, 'color'), ...colorToVector(parameters.color));\n\n const individualPoints = parameters.getIndividualPoints();\n\n gl.enableVertexAttribArray(0);\n gl.bindBuffer(gl.ARRAY_BUFFER, this._individualPointBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(individualPoints.flat()), gl.STATIC_DRAW);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);\n\n gl.drawArrays(gl.POINTS, 0, individualPoints.length);\n }\n }\n\n}\n","export default class Eventable {\n\n constructor() {\n this._listeners = {};\n }\n\n /**\n * Clears all listeners\n * @protected\n */\n clearListeners() {\n this._listeners = {};\n }\n\n /**\n * Create a new listener for the event\n * When the event is emitted, it will call the provided function\n *\n * @param {String|symbol} eventName - the name of the event to start listening to\n * @param {Function} fn - the listener to add\n */\n on(eventName, fn) {\n this._listeners[eventName] = this._listeners[eventName] || new Set();\n this._listeners[eventName].add(fn);\n }\n\n /**\n * Removes an existing listener for the event\n *\n * @param {String|symbol} eventName - the name of the event to stop listening to\n * @param {Function} fn - the listener to remove\n */\n off(eventName, fn) {\n if (!this._listeners[eventName]) {\n return;\n }\n\n this._listeners[eventName].delete(fn);\n\n if (this._listeners[eventName].size === 0) {\n delete this._listeners[eventName];\n }\n }\n\n /**\n * Emits an event that will go out to all _listeners on eventName\n *\n * @param {String|symbol} eventName - the name of the event to emit\n */\n emit(eventName) {\n if (!this._listeners[eventName]) {\n return;\n }\n\n const args = [];\n for (let i = 1; i < arguments.length; i++) {\n args.push(arguments[i]);\n }\n\n this._listeners[eventName].forEach((fn) => {\n fn.apply(this, args);\n });\n }\n\n}\n","import backgroundFrag from './background.frag';\nimport backgroundVert from './background.vert';\nimport colorToVector from '../helpers/color_to_vector';\nimport createGLProgram from './create_gl_program';\n\nexport default class BackgroundProgram {\n\n constructor(gl) {\n this._gl = gl;\n\n this._program = createGLProgram(gl, backgroundVert, backgroundFrag);\n\n this._vertexBuffer = gl.createBuffer();\n this._indexBuffer = gl.createBuffer();\n\n if (!gl.getExtension('OES_element_index_uint')) {\n console.error('Your browser does not support OES_element_index_uint'); // eslint-disable-line no-console\n }\n }\n\n draw({ data }) {\n const gl = this._gl;\n gl.useProgram(this._program);\n\n // gl.disable(gl.DEPTH_TEST);\n\n for (let { minXt, maxXt, color } of data) {\n gl.uniform4f(gl.getUniformLocation(this._program, 'color'), ...colorToVector(color));\n\n const vertices = new Float32Array([\n minXt, 1, maxXt, 1, maxXt, -1,\n minXt, 1, maxXt, -1, minXt, -1\n ]);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);\n\n const positionLocation = gl.getAttribLocation(this._program, 'position');\n gl.enableVertexAttribArray(positionLocation);\n gl.vertexAttribPointer(positionLocation, 2, gl.FLOAT, false, 0, 0);\n\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n }\n }\n\n}\n","/**\n * Draws a horizontal line at the specified y-coordinate.\n *\n * @param {Number} y\n * @param {Object} options\n * @param {CanvasRenderingContext2D} options.context\n * @param {{renderWidth: Number, renderHeight: Number}} options.sizing\n * @param {String} options.color\n * @param {String} options.zeroColor\n * @param {Number} options.zeroWidth\n */\nexport function drawZeroLine(y, { context, sizing, color, zeroColor, zeroWidth}) {\n if (!zeroWidth) {\n return;\n }\n\n context.strokeStyle = zeroColor || color;\n context.lineWidth = zeroWidth;\n\n context.beginPath();\n context.moveTo(0, y);\n context.lineTo(sizing.renderWidth, y);\n context.stroke();\n}\n","import {drawZeroLine} from './draw_zero_line';\n\n/**\n * Draws the data on the canvas\n * Assumes the data is in individual point render space, ie x and y in pixels\n *\n * @param {Array<[number, number]>} individualPoints - data to draw\n * @param {Object} options - set of options\n * @param {Object} options.context - the context to draw on\n * @param {String} options.color - color of the bar to draw\n * @param {{renderWidth: Number, renderHeight: Number}} options.sizing - size of the canvas, in pixels\n * @param {Number} options.indexInAxis - index of the series in the axis\n * @param {Number} options.axisSeriesCount - number of series in the axis\n * @param {Number} options.zero - y coordinate that represents \"zero\"\n * @param {Boolean} options.hasNegatives - if any values are negative (in which case should render from zero)\n * @param {String} options.negativeColor - color of the bar to draw if negative\n * @param {String} options.zeroColor - color of the zero line\n * @param {Number} options.zeroWidth - width of the zero line\n * @param {Number} options.closestSpacing - closest x spacing between points, in data space\n * @param {{minX: Number, maxX: Number}} options.bounds - bounds of the data as rendered\n * @private\n */\nexport default function drawBars(individualPoints, {\n color, context, sizing, indexInAxis, axisSeriesCount, zero, hasNegatives, negativeColor, zeroColor, zeroWidth, closestSpacing, bounds\n}) {\n context.strokeStyle = color;\n context.fillStyle = color;\n\n const {barWidth, totalBarWidth} = getBarWidths({ closestSpacing, bounds, sizing, axisSeriesCount });\n const barBottom = hasNegatives ? zero : sizing.renderHeight;\n\n for (let i = 0; i < individualPoints.length; i++) {\n const [x, y] = individualPoints[i];\n\n if (hasNegatives) {\n if (y <= zero) {\n context.fillStyle = color;\n } else {\n context.fillStyle = negativeColor;\n }\n }\n\n context.fillRect(x - totalBarWidth / 2 + barWidth*indexInAxis, y, barWidth, barBottom-y);\n }\n\n if (zeroWidth) {\n drawZeroLine(barBottom, {\n context,\n sizing,\n color,\n zero,\n zeroColor,\n zeroWidth\n });\n }\n}\n\n/**\n * Calculates the widths of the bars\n *\n * @param {Number} closestSpacing - closest x spacing between points, in data space\n * @param {{minX: Number, maxX: Number}} bounds - bounds of the data as rendered\n * @param {{renderWidth: Number, renderHeight: Number}} sizing - size of the canvas, in pixels\n * @param {Number} axisSeriesCount - number of series in the axis\n * @return {{barWidth: Number, totalBarWidth: Number, barSpacing: Number}}\n */\nexport function getBarWidths({closestSpacing, bounds, sizing, axisSeriesCount}) {\n // width of bar plus spacing, which we define as the closest distance between points in pixel space\n const fullBarWidth = closestSpacing / (bounds.maxX - bounds.minX) * sizing.renderWidth;\n\n const totalBarWidth = fullBarWidth * 0.8;\n const barSpacing = fullBarWidth * 0.2;\n const barWidth = totalBarWidth / axisSeriesCount;\n\n return {\n barWidth,\n totalBarWidth,\n barSpacing\n };\n}\n","import {extractYValue} from '../helpers/flatten_simple_data.js';\n\n/**\n * Given a series object, figures out the form of the data\n * Note that this is not a validator, nor is it guaranteed to get it right 100% of the time!\n * If it is giving the wrong type, it is recommended to specify the type manually\n *\n * @param {*} series\n * @param {Boolean} options.useSimpleData\n * @param {Array} options.data\n * @return {String}\n */\nexport default function inferType(series, options={ useSimpleData: false }) {\n if (series.type && series.type !== 'infer') {\n return series.type;\n }\n\n const data = options.data || (options.useSimpleData ? (series.simpleData || series.data) : series.data);\n\n if (!data) {\n throw new Error('Data must be provided');\n }\n\n if (Array.isArray(data)) {\n if (data.length === 0) {\n return 'tuples';\n }\n\n if (Array.isArray(data[0])) {\n return 'tuples';\n }\n\n if (typeof data[0] === 'number' || !data[0]) {\n return 'values';\n }\n\n return 'objects';\n }\n\n if (data.observe) {\n if (series.xKey) {\n return 'object_observable';\n } else {\n return 'tuple_observable';\n }\n }\n\n if (typeof data === 'function') {\n return 'generator';\n }\n\n throw new Error('Could not infer type');\n}\n\n/**\n *\n * @param simpleData\n * @param singleSeries\n * @return {boolean}\n */\nexport function isEnumLike(simpleData, singleSeries) {\n for (let i = 0; i < simpleData.length; i++) {\n const y = extractYValue(simpleData[simpleData.length - 1], singleSeries);\n if (y === null || y === undefined) {\n continue;\n }\n\n if (typeof y === 'string') {\n return true;\n }\n }\n\n return false;\n}\n","import sizeCanvas from './size_canvas';\nimport getColor from '../helpers/colors';\nimport LineProgram from './line_program';\nimport drawLine from './draw_line';\nimport Eventable from '../eventable';\nimport drawBackground from './draw_background.js';\nimport BackgroundProgram from './background_program.js';\nimport drawBars from './draw_bars';\nimport drawArea from './draw_area';\nimport inferType from '../state/infer_type';\n\nexport default class GraphBodyRenderer extends Eventable {\n\n constructor({stateController, canvasElement, webgl=false, checkIntersection=true }) {\n super();\n\n this._stateController = stateController;\n\n this._checkIntersection = checkIntersection;\n this._canvas = canvasElement;\n this._webgl = webgl;\n if (webgl) {\n this._context = this._canvas.getContext('webgl');\n if (this._context) {\n this._lineProgram = new LineProgram(this._context);\n } else {\n alert('WebGL failed! Attempting fallback to CPU rendering');\n this._webgl = false;\n }\n }\n\n if (!this._webgl) {\n this._context = this._canvas.getContext( '2d');\n this._context2d = this._context;\n }\n\n this._initialized = this._initializeCanvas();\n\n this._boundResize = this.resize.bind(this);\n this._cachedAxisCount = null;\n this._onAxisChange = (axes) => {\n const count = axes.filter(({ series }) => series.length > 0).length;\n if (this._cachedAxisCount !== count) {\n this._cachedAxisCount = count;\n this.resize();\n }\n };\n\n stateController.on('axes_changed', this._onAxisChange);\n stateController.on('dragging_y_changed', this._boundResize);\n stateController.on('showing_sidebar_changed', this._boundResize);\n }\n\n /**\n * Cleans up after this renderer\n */\n dispose() {\n this.clearListeners();\n this._lineProgram && this._lineProgram.dispose();\n this._cachedAxisCount = null;\n this._stateController.off('axes_changed', this._onAxisChange);\n this._stateController.off('dragging_y_changed', this._boundResize);\n\n if (this._resizeObserver) {\n this._resizeObserver.disconnect();\n }\n\n if (this._intersectionObserver) {\n this._intersectionObserver.disconnect();\n }\n }\n\n clear() {\n if (this._webgl) {\n this._lineProgram.clear();\n } else {\n this._context.clearRect(0, 0, this._context.canvas.width, this._context.canvas.height);\n }\n }\n\n render(singleSeries, inRenderSpace, { highlighted, showIndividualPoints, shadowColor, shadowBlur, width, defaultLineWidth, bounds, globalBounds, inRenderSpaceAreaBottom }) {\n const getIndividualPoints = (useDataSpace) => {\n if (!bounds) {\n bounds = singleSeries.axis.currentBounds;\n }\n\n const individualPoints = [];\n let data = singleSeries.inSelectedSpace.data;\n if (useDataSpace) {\n data = singleSeries.inDataSpace;\n }\n\n for (let [x, y] of data) {\n if (y === null) {\n continue;\n }\n\n individualPoints.push([\n (x - bounds.minX) / (bounds.maxX - bounds.minX) * this._sizing.renderWidth,\n (1.0 - (y - bounds.minY) / (bounds.maxY - bounds.minY)) * this._sizing.renderHeight\n ]);\n }\n\n return individualPoints;\n };\n\n const getRanges = () => {\n if (!bounds) {\n bounds = singleSeries.axis.currentBounds;\n }\n\n if (!singleSeries.rangeKey) {\n return [];\n }\n\n const inferredType = inferType(singleSeries, { useSimpleData: true });\n if (inferredType !== 'objects') {\n return [];\n }\n\n return (singleSeries.simpleData || singleSeries.data).map((object) => {\n const range = object[singleSeries.rangeKey];\n\n if (!range) {\n return null;\n }\n\n const min = range.min;\n const max = range.max;\n const x = object[singleSeries.xKey];\n\n return {\n x,\n range,\n\n pixelX: (x - bounds.minX) / (bounds.maxX - bounds.minX) * this._sizing.renderWidth,\n pixelMinY: typeof min === 'number' ? (1.0 - (min - bounds.minY) / (bounds.maxY - bounds.minY)) * this._sizing.renderHeight : null,\n pixelMaxY: typeof max === 'number' ? (1.0 - (max - bounds.minY) / (bounds.maxY - bounds.minY)) * this._sizing.renderHeight : null\n };\n });\n };\n\n const cpuRendering = singleSeries.rendering === 'bar' || singleSeries.rendering === 'area';\n let commonCPUParams;\n\n if (cpuRendering) {\n // we can currently only render bars with the CPU\n this._context2d = this._context2d || this._canvas.getContext('2d');\n\n if (this._webgl) {\n // make sure we don't have any webgl stuff in the way before we get back to CPU rendering\n this._context.flush();\n }\n\n if (!bounds) {\n bounds = singleSeries.axis.currentBounds;\n }\n\n commonCPUParams = {\n context: this._context2d,\n color: getColor(singleSeries.color, singleSeries.index, singleSeries.multigrapherSeriesIndex),\n sizing: this._sizing,\n zero: (1.0 - ((singleSeries.zeroLineY || 0) - bounds.minY) / (bounds.maxY - bounds.minY)) * this._sizing.renderHeight,\n hasNegatives: !!singleSeries.inDataSpace.find((tuple) => tuple[1] < 0),\n negativeColor: singleSeries.negativeColor,\n zeroWidth: singleSeries.zeroLineWidth,\n zeroColor: singleSeries.zeroLineColor\n };\n\n if (!commonCPUParams.hasNegatives && singleSeries.expandYWith) {\n commonCPUParams.hasNegatives = singleSeries.expandYWith.some((y) => y < 0);\n }\n }\n\n if (singleSeries.rendering === 'bar') {\n drawBars(getIndividualPoints(true), {\n ...commonCPUParams,\n indexInAxis: singleSeries.axis.series.indexOf(singleSeries),\n axisSeriesCount: singleSeries.axis.series.length,\n closestSpacing: globalBounds.closestSpacing,\n bounds\n });\n return;\n }\n\n if (singleSeries.rendering === 'area') {\n drawArea(getIndividualPoints(true), inRenderSpace, {\n ...commonCPUParams,\n showIndividualPoints: typeof singleSeries.showIndividualPoints === 'boolean' ? singleSeries.showIndividualPoints : showIndividualPoints,\n gradient: singleSeries.gradient,\n pointRadius: singleSeries.pointRadius,\n highlighted,\n width: width || singleSeries.width || defaultLineWidth,\n shadowColor,\n shadowBlur,\n inRenderSpaceAreaBottom\n });\n return;\n }\n\n const drawParams = {\n color: getColor(singleSeries.color, singleSeries.index, singleSeries.multigrapherSeriesIndex),\n context: this._context,\n width: width || singleSeries.width || defaultLineWidth,\n shadowColor,\n shadowBlur,\n dashed: singleSeries.dashed,\n dashPattern: singleSeries.dashPattern,\n highlighted,\n showIndividualPoints: typeof singleSeries.showIndividualPoints === 'boolean' ? singleSeries.showIndividualPoints : showIndividualPoints,\n getIndividualPoints,\n getRanges: singleSeries.rangeKey ? getRanges : null\n };\n\n if (this._webgl) {\n this._lineProgram.draw(inRenderSpace, drawParams);\n } else {\n drawLine(inRenderSpace, drawParams);\n }\n }\n\n renderBackground(inBackgroundSpace) {\n if (!inBackgroundSpace) {\n return;\n }\n\n if (this._webgl) {\n if (!this._backgroundProgram) {\n this._backgroundProgram = new BackgroundProgram(this._context);\n }\n \n this._backgroundProgram.draw(inBackgroundSpace);\n } else {\n drawBackground(inBackgroundSpace, {\n context: this._context\n });\n }\n }\n\n /**\n * Initializes canvas\n * Currently, just sets sizing\n */\n async _initializeCanvas() {\n this._sizing = await sizeCanvas(this._canvas, this._context);\n\n this.emit('size_changed', this._sizing);\n this._stateController.markSizeChanged();\n\n if (window.ResizeObserver) {\n let first = true;\n let disabled = false;\n\n this._resizeObserver = new window.ResizeObserver( () => {\n if (first) { // always fires once at the beginning\n first = false;\n return;\n }\n\n if (disabled) {\n return;\n }\n\n disabled = true;\n this.resize().then(() => {\n disabled = false;\n });\n });\n\n this._resizeObserver.observe(this._canvas.parentNode);\n }\n\n if (this._checkIntersection && window.IntersectionObserver) {\n this._intersectionObserver = new window.IntersectionObserver((entries) => {\n clearTimeout(this._intersectionTimeout);\n\n if (!entries[0].isIntersecting) {\n return;\n }\n\n this._intersectionTimeout = setTimeout(() => {\n this.resize();\n }, 50);\n }, {\n threshold: 0.1\n });\n\n this._intersectionObserver.observe(this._canvas.parentNode);\n }\n }\n\n async resize() {\n const sizingPromise = sizeCanvas(this._canvas, this._context, { reset: true });\n this._initialized = sizingPromise;\n\n this._sizing = await this._initialized;\n if (this._initialized !== sizingPromise) {\n return;\n }\n\n this.emit('size_changed', this._sizing);\n this._stateController.markSizeChanged(this);\n }\n\n resizeDebounced() {\n if (this._resizeTimeout) {\n clearTimeout(this._resizeTimeout);\n }\n\n this._resizeTimeout = setTimeout(() => {\n this.resize();\n this._resizeTimeout = null;\n }, 50);\n }\n\n recalculatePosition() {\n if (!this._sizing) {\n return;\n }\n\n this._sizing.boundingRect = this._canvas.getBoundingClientRect();\n }\n\n /**\n * Returns the bounding rect of the element\n *\n * @return {DOMRect}\n */\n get boundingRect() {\n return this._sizing.boundingRect;\n }\n\n get sizing() {\n return this._sizing;\n }\n\n}\n","import pathsFrom from './paths_from';\nimport {drawZeroLine} from './draw_zero_line';\nimport {DPI_INCREASE} from './size_canvas';\n\n/**\n * Draws the data on the canvas\n * Assumes the data is in individual point render space, ie x and y in pixels\n *\n * @param {Array<[number, number]>} individualPoints - data to draw\n * @param {Object} dataInRenderSpace\n * @param {Object} options - set of options\n * @param {Object} options.context - the context to draw on\n * @param {String} options.color - color of the bar to draw\n * @param {{renderWidth: Number, renderHeight: Number}} options.sizing - size of the canvas, in pixels\n * @param {Number} options.zero - y coordinate that represents \"zero\"\n * @param {Boolean} options.hasNegatives - if any values are negative (in which case should render from zero)\n * @param {Array<String>} [options.gradient] - an array of stops, from top to bottom of canvas, to draw with\n * @param {String} [options.zeroColor] - color of the zero line\n * @param {Number} [options.zeroWidth] - width of the zero line\n * @param {Boolean} [options.showIndividualPoints] - draw circles at each point\n * @param {String} [options.negativeColor] - color of the area below zero\n * @param {Number} [options.width] - line width\n * @param {Object} [options.inRenderSpaceAreaBottom] - if provided, will use this as the area bottom instead of zero/sizing.renderHeight\n * @private\n */\nexport default function drawArea(individualPoints, dataInRenderSpace, {\n color, context, sizing, zero, hasNegatives, gradient,\n zeroColor, zeroWidth, showIndividualPoints, negativeColor, pointRadius, width, highlighted,\n shadowColor='black', shadowBlur=5, inRenderSpaceAreaBottom\n}) {\n context.fillStyle = color;\n context.shadowColor = shadowColor;\n context.shadowBlur = shadowBlur;\n\n if (gradient && gradient.length > 2) {\n const globalGradient = context.createLinearGradient(0, 0, 0, sizing.renderHeight);\n\n for (let i = 0; i < gradient.length; i++) {\n const value = gradient[i];\n if (Array.isArray(value)) {\n globalGradient.addColorStop(value[0], value[1]);\n } else {\n globalGradient.addColorStop(i / (gradient.length - 1), value);\n }\n }\n\n context.fillStyle = globalGradient;\n\n if (color === 'gradient') {\n context.strokeStyle = globalGradient;\n }\n } else {\n context.fillStyle = color;\n }\n\n if (!individualPoints.length) {\n return;\n }\n\n // we want to draw a polygon with a flat line at areaBottom, and then follows the shape of the data\n const areaBottom = hasNegatives ? zero : sizing.renderHeight;\n\n const areaPaths = pathsFrom(dataInRenderSpace);\n const areaBottomPaths = inRenderSpaceAreaBottom && pathsFrom(inRenderSpaceAreaBottom);\n\n const linePaths = pathsFrom(dataInRenderSpace, {\n splitAtY: zero\n });\n\n for (let pathI = 0; pathI < areaPaths.length; pathI++) {\n const path = areaPaths[pathI];\n const areaBottomPath = areaBottomPaths && areaBottomPaths[pathI];\n context.beginPath();\n\n const [firstX, _startY] = path[0];\n const [lastX, _lastY] = path[path.length - 1];\n\n if (!areaBottomPaths) {\n context.moveTo(firstX, areaBottom);\n }\n\n for (let i = 0; i < path.length; i++) {\n const [x, y] = path[i];\n context.lineTo(x, y);\n }\n\n if (areaBottomPath && areaBottomPath.length) {\n for (let i = areaBottomPath.length - 1; i >= 0; i--) {\n const [x, y] = areaBottomPath[i];\n context.lineTo(x, y);\n }\n\n context.lineTo(...path[0]);\n } else {\n context.lineTo(lastX, areaBottom);\n }\n\n context.fill();\n }\n\n if (highlighted) {\n width += 2;\n }\n\n width *= DPI_INCREASE;\n context.strokeStyle = color;\n context.lineWidth = width;\n // context.shadowBlur = 1;\n\n for (let path of linePaths) {\n if (!path.length) {\n continue;\n }\n\n if (hasNegatives) {\n let positive = true;\n if (path.length >= 2) {\n positive = path[1][1] <= zero;\n } else {\n positive = path[0][1] <= zero;\n }\n\n if (positive) {\n context.strokeStyle = color;\n } else {\n context.strokeStyle = negativeColor;\n }\n }\n\n context.beginPath();\n\n for (let i = 0; i < path.length; i++) {\n const [x, y] = path[i];\n\n if (i === 0) {\n context.moveTo(x, y);\n } else {\n context.lineTo(x, y);\n }\n }\n\n context.stroke();\n }\n\n if (zeroWidth) {\n drawZeroLine(areaBottom, {\n context,\n sizing,\n color,\n zero,\n zeroColor,\n zeroWidth\n });\n }\n\n if (showIndividualPoints) {\n context.fillStyle = color;\n\n for (let [x, y] of individualPoints) {\n if (negativeColor && hasNegatives) {\n if (y === zero && zeroColor) {\n context.fillStyle = zeroColor;\n } else if (y < zero) {\n context.fillStyle = color;\n } else {\n context.fillStyle = negativeColor;\n }\n }\n\n context.beginPath();\n context.arc(x, y, pointRadius ||8, 0, 2 * Math.PI, false);\n context.fill();\n }\n }\n}\n","import {DPI_INCREASE} from './size_canvas';\nimport pathsFrom from './paths_from';\n\n/**\n * Draws the data on the canvas\n * Assumes the data is in render space\n *\n * @param {{nullMask: Uint8Array, maxYValues: Float64Array, minYValues: Float64Array, yValues: Float64Array}} dataInRenderSpace - the data to render\n * @param {Object} options - set of options\n * @param {Object} options.context - the context to draw on\n * @param {String} options.color - color of the line to draw\n * @param {Number} [options.width] - line width\n * @param {Number} [options.shadowBlur] - level to blur shadow to\n * @param {String} [options.shadowColor] - color of the shadow\n * @param {String} [options.dashed] - whether or not to make the line dashed\n * @param {Array<Number>} [options.dashPattern] - dash array for the canvas\n * @param {Boolean} [options.highlighted] - whether the line is highlighted or not\n * @param {Boolean} [options.showIndividualPoints] - draw circles at each point\n * @param {Function} [options.getIndividualPoints] - points to draw circles at. Only called when needed.\n * @param {Function} [options.getRanges] - ranges to draw. Only called when needed\n * @private\n */\nexport default function drawLine(dataInRenderSpace, {\n color, width=1, context, shadowColor='black', shadowBlur=5, dashed=false, dashPattern=null, highlighted=false, showIndividualPoints=false, getIndividualPoints, getRanges\n}) {\n if (highlighted) {\n width += 2;\n }\n width *= DPI_INCREASE;\n\n context.strokeStyle = color;\n context.lineWidth = width;\n context.shadowColor = shadowColor;\n context.shadowBlur = shadowBlur;\n\n if (dashed) {\n context.setLineDash(dashPattern || [5, 5]);\n } else {\n context.setLineDash([]);\n }\n\n const paths = pathsFrom(dataInRenderSpace);\n\n for (let path of paths) {\n context.beginPath();\n\n for (let i = 0; i < path.length; i++) {\n const [x, y] = path[i];\n\n if (i === 0) {\n context.moveTo(x, y);\n } else {\n context.lineTo(x, y);\n }\n }\n\n context.stroke();\n }\n\n if (getRanges) {\n const ranges = getRanges();\n\n context.lineWidth = width; // ensure the same width\n context.strokeStyle = color;\n context.setLineDash([]);\n const horizontalBarWidth = 8 * DPI_INCREASE;\n\n for (let range of ranges) {\n if (!range) {\n continue;\n }\n\n const { pixelX, pixelMinY, pixelMaxY } = range;\n\n // bar on bottom\n if (pixelMinY !== null) {\n context.beginPath();\n context.moveTo(pixelX - (horizontalBarWidth / 2), pixelMinY);\n context.lineTo(pixelX + (horizontalBarWidth / 2), pixelMinY);\n context.stroke();\n }\n\n // bar on top\n if (pixelMaxY !== null) {\n context.beginPath();\n context.moveTo(pixelX - (horizontalBarWidth / 2), pixelMaxY);\n context.lineTo(pixelX + (horizontalBarWidth / 2), pixelMaxY);\n context.stroke();\n }\n\n if (pixelMinY === null || pixelMaxY === null) {\n continue;\n }\n\n // draw a vertical line for the range\n context.beginPath();\n context.moveTo(pixelX, pixelMinY);\n context.lineTo(pixelX, pixelMaxY);\n context.stroke();\n }\n }\n\n if (showIndividualPoints) {\n context.fillStyle = color;\n const individualPoints = getIndividualPoints();\n\n for (let [x, y] of individualPoints) {\n context.beginPath();\n context.arc(x, y, width + 4, 0, 2 * Math.PI, false);\n context.fill();\n }\n }\n}\n","/**\n * Draws the background on a 2d canvas\n *\n * @param {Array<{ minXt: number, maxXt: number, color: string }>} data\n * @param {CanvasRenderingContext2D} context\n */\nexport default function drawBackground({ data }, { context }) {\n const width = context.canvas.width;\n const height = context.canvas.height;\n\n for (let { minXt, maxXt, color } of data) {\n context.fillStyle = color;\n context.fillRect(minXt*width, 0, (maxXt - minXt)*width, height);\n }\n}\n","export function calculatePrecision(value) {\n return Math.max(-Math.log10(Math.abs(value)) + 2, 0);\n}\n\nexport function calculateTimePrecision(minDate, maxDate) {\n minDate = new Date(minDate);\n maxDate = new Date(maxDate);\n\n const range = maxDate.valueOf() - minDate.valueOf();\n if (range < 3*1000) {\n return 'ms';\n } else if (range < 10*60*1000) {\n return 's';\n } else {\n return 'm';\n }\n}\n\nexport function roundToPrecision(value, precision=null) {\n if (precision === null) {\n precision = calculatePrecision(value);\n }\n\n if (isNaN(precision) || precision > 100) {\n return value.toString();\n }\n\n const rounded = value.toFixed(Math.ceil(precision));\n let stripped = rounded;\n if (rounded.includes('.')) {\n stripped = stripped.replace(/\\.?0+$/g, '');\n }\n\n if (stripped === '') {\n return '0';\n }\n\n return stripped;\n}\n\nconst DATE_TIME_FORMATTERS = {};\n\n/**\n * Given a timezone string, gets the offset relative to utc in milliseconds\n * For example, America/New_York in winter is GMT-05:00, so it evaluates to -5*60*60*1000\n *\n * @param {String} timeZone - the time zone string\n * @param {Date} sampleDate - a date to use in the conversions, since it can be time-of-year dependent with Daylight Savings Time\n * @return {number|null}\n */\nfunction timezoneToOffsetMS(timeZone, sampleDate) {\n try { // formats are finicky, so give up rather than abort rendering\n let datetimeFormatter = DATE_TIME_FORMATTERS[timeZone];\n if (!datetimeFormatter) {\n let properTimeZone = timeZone;\n if (!timeZone || timeZone === 'local') {\n properTimeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n }\n\n datetimeFormatter = new Intl.DateTimeFormat('en-US', {\n timeZone: properTimeZone,\n timeZoneName: 'longOffset'\n });\n DATE_TIME_FORMATTERS[timeZone] = datetimeFormatter;\n }\n\n const parts = datetimeFormatter.formatToParts(sampleDate);\n const offsetPart = parts.find(part => part.type === 'timeZoneName');\n\n if (!offsetPart) {\n return null;\n }\n\n if (offsetPart.value === 'GMT') {\n return 0;\n }\n\n if (!/^GMT[+-]\\d{2}:\\d{2}$/.test(offsetPart.value)) {\n return null;\n }\n\n const [hours, minutes] = offsetPart.value.slice(3).split(':');\n\n return parseInt(hours)*60*60*1000 + parseInt(minutes)*60*1000;\n } catch (e) {\n console.error(new Error(`Could not parse timezone offset for ${sampleDate} in ${timeZone}`)); // eslint-disable-line no-console\n console.error(e); // eslint-disable-line no-console\n return null;\n }\n}\n\n/**\n * Gets the Date object that represents the start of day in a given timezone\n * Note that this is still a native date object, so it will be in the local timezone\n * Its timestamp, however, will correspond to the start of the day in the given timezone\n *\n * @param date\n * @param timezone\n * @return {Date}\n */\nexport function startOfDayInTimezone(date, timezone) {\n if (!timezone) {\n const startOfDay = new Date(date);\n startOfDay.setHours(0, 0, 0, 0);\n return startOfDay;\n }\n\n const offset = timezoneToOffsetMS(timezone, date); // ms between timezone and utc\n let startOfDay = new Date(date);\n startOfDay.setUTCHours(0, 0, 0, 0);\n\n const difference = startOfDay.valueOf() - date.valueOf();\n\n // if we would have gone forward a day when offset is taken into account, we need to go back a day again\n if (difference > offset) {\n startOfDay = new Date(startOfDay.valueOf() - 24*60*60*1000);\n }\n\n return new Date(startOfDay.valueOf() - offset);\n}\n\nfunction formatTime(time, {precision, justTime, justDate, justMonthAndDay, unitOverride, clockStyle='24h', timeZone}) {\n const utc = timeZone && timeZone.toLowerCase() === 'utc';\n if (timeZone && !utc && timeZone !== 'local' && window.Intl && window.Intl.DateTimeFormat) {\n const offset = timezoneToOffsetMS(timeZone, time);\n const localOffset = timezoneToOffsetMS('local', time);\n\n if (typeof offset === 'number' && typeof localOffset === 'number') {\n time = new Date(time.valueOf() + offset - localOffset);\n }\n }\n\n const year = utc ? time.getUTCFullYear() : time.getFullYear();\n const month = (utc ? time.getUTCMonth() : time.getMonth()) + 1;\n const day = utc ? time.getUTCDate() : time.getDate();\n\n if (unitOverride === 'year') {\n return year.toString();\n }\n\n if (justDate) {\n return utc ? `${month}/${day}/${year}` : time.toLocaleDateString();\n }\n\n if (justMonthAndDay) {\n // eg Jan 19\n const monthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n return `${monthNames[month - 1]} ${day}`;\n }\n\n const hours = utc ? time.getUTCHours() : time.getHours();\n const minutes = utc ? time.getUTCMinutes() : time.getMinutes();\n const seconds = utc ? time.getUTCSeconds() : time.getSeconds();\n const milliseconds = utc ? time.getUTCMilliseconds() : time.getMilliseconds();\n\n let timeString;\n\n if (clockStyle === '12h') {\n timeString = `${((hours + 11) % 12 + 1).toString()}:${minutes.toString().padStart(2, '0')}`;\n } else {\n timeString = `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}`;\n }\n\n if (precision === 's' || precision === 'ms') {\n timeString += `:${seconds.toString().padStart(2, '0')}`;\n }\n\n if (precision === 'ms') {\n timeString += `.${milliseconds.toString().padStart(3, '0')}`;\n }\n\n if (clockStyle === '12h') {\n timeString += hours >= 12 ? 'pm' : 'am';\n }\n\n if (justTime) {\n return timeString;\n }\n\n if (utc) {\n timeString += ' UTC';\n }\n\n return (utc ? `${month}/${day}/${year}` : time.toLocaleDateString()) + ' ' + timeString;\n}\n\nexport function formatX(x, {dates=false, precision=null, justTime=false, justDate=false, justMonthAndDay=false, clockStyle='24h', unitOverride, timeZone, integersOnly=false, inverseEnumMap}={}) {\n if (dates && !(x instanceof Date)) {\n x = new Date(x);\n\n if (isNaN(x)) {\n return 'Invalid Date';\n }\n }\n\n if (x instanceof Date) {\n return formatTime(x, {precision, justTime, justDate, justMonthAndDay, unitOverride, clockStyle, timeZone});\n }\n\n if (isNaN(x)) {\n return 'NaN';\n }\n\n if (inverseEnumMap) {\n if (Math.abs(x - Math.round(x)) > 1e-10) {\n return '';\n }\n\n return inverseEnumMap[Math.round(x)];\n }\n\n if (integersOnly && Math.abs(x - Math.round(x)) > 1e-10) {\n return '';\n }\n\n return roundToPrecision(x, precision);\n}\n\nexport function formatY(y, {precision=null, log=false}={}) {\n if (y === null) {\n return 'null';\n }\n\n if (isNaN(y)) {\n return 'NaN';\n }\n\n if (log) {\n return `10^${roundToPrecision(Math.log10(y), precision)}`;\n }\n\n return roundToPrecision(y, precision);\n}\n","export const Y_AXIS_WIDTH = 32;\nexport const BIG_Y_AXIS_LABEL_OFFSET = 20;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport {formatX, formatY} from '../helpers/format';\nimport {Y_AXIS_WIDTH} from '../helpers/axis_sizes';\nimport CustomPropTypes from '../helpers/custom_prop_types';\n\nfunction getYLabelContent({ yLabel, y, fullYPrecision}) {\n if (fullYPrecision && !yLabel) {\n if (y === undefined) {\n return 'undefined';\n }\n\n if (y === null) {\n return 'null';\n }\n\n return y.toString();\n }\n\n if (typeof yLabel === 'number') {\n if (fullYPrecision) {\n return yLabel.toString();\n } else {\n return formatY(yLabel);\n }\n }\n\n if (typeof yLabel === 'object') {\n return formatY(y);\n }\n\n return yLabel || formatY(y);\n}\n\nfunction TooltipLabel({ axisLabel, x, y, xLabel, yLabel, textLeft, textTop, includeSeriesLabel, includeXValue, includeYValue, includeXLabel, includeYLabel, fullYPrecision, formatXOptions }) {\n let i = 0;\n\n return (\n <g>\n {\n includeSeriesLabel &&\n <text x={textLeft} y={textTop + (i++)*12}>\n {axisLabel}\n </text>\n }\n\n {\n includeXValue &&\n <text x={textLeft} y={textTop + (i++) * 12}>\n {includeXLabel && 'x: '}{xLabel || formatX(x, formatXOptions)}\n </text>\n }\n\n {\n includeYValue &&\n <text x={textLeft} y={textTop + (i++) * 12}>\n {includeYLabel && 'y: '}{getYLabelContent({ yLabel, y, fullYPrecision})}\n </text>\n }\n </g>\n );\n}\n\nTooltipLabel.propTypes = {\n axisLabel: PropTypes.string,\n x: PropTypes.oneOfType([PropTypes.number, PropTypes.instanceOf(Date)]),\n y: PropTypes.number,\n xLabel: PropTypes.string,\n yLabel: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n textLeft: PropTypes.number.isRequired,\n textTop: PropTypes.number.isRequired,\n fullYPrecision: PropTypes.bool,\n formatXOptions: PropTypes.object,\n ...CustomPropTypes.TooltipOptionsRaw\n};\n\nexport default class Tooltip extends React.PureComponent {\n\n render() {\n const textPadding = 3;\n let height = 12*3 + 2*textPadding;\n\n if (!this.props.includeSeriesLabel) {\n height -= 12;\n }\n\n if (!this.props.includeXValue) {\n height -= 12;\n }\n\n if (!this.props.includeYValue) {\n height -= 12;\n }\n\n const caretSize = 7;\n const halfHeight = height/2;\n const caretPadding = 4;\n\n const textTop = -halfHeight + textPadding;\n\n const formatXOptions = {\n clockStyle: this.props.clockStyle,\n timeZone: this.props.timeZone\n };\n\n const passThroughProps = {\n includeSeriesLabel: this.props.includeSeriesLabel,\n includeXLabel: this.props.includeXLabel,\n includeYLabel: this.props.includeYLabel,\n includeXValue: this.props.includeXValue,\n includeYValue: this.props.includeYValue,\n formatXOptions\n };\n\n const preparedTooltips = this.props.tooltips.map((tooltip) => {\n const { x, y, pixelY, pixelX, series, index, xLabel, yLabel, fullYPrecision } = tooltip;\n\n if (typeof pixelX !== 'number') {\n return null;\n }\n\n const axisLabel = (series.name || series.yKey || index).toString();\n let width = Math.max(axisLabel.length, (xLabel || formatX(x, formatXOptions)).length + 4, getYLabelContent({ yLabel, y, fullYPrecision}).length + 4) * 7.5;\n if (series.tooltipWidth) {\n width = series.tooltipWidth;\n }\n\n let fixedPosition = this.props.elementWidth < (width + 2*caretSize + 2*caretPadding);\n\n let multiplier = 1;\n if (pixelX >= this.props.elementWidth - (width + 2*caretSize + caretPadding)) {\n multiplier = -1;\n }\n\n if (pixelX < width + 2*caretSize + caretPadding && multiplier === -1) {\n fixedPosition = true;\n }\n\n if (y === null) {\n fixedPosition = true;\n }\n\n if (this.props.alwaysFixedPosition) {\n fixedPosition = true;\n }\n\n let textLeft = caretSize + caretPadding;\n if (multiplier < 0) {\n textLeft = -width - textLeft;\n } else {\n textLeft += 6;\n }\n\n if (!isFinite(pixelX)) {\n return null;\n }\n\n const transform = `translate(${pixelX},${pixelY})`;\n\n const commonLabelProps = {\n fullYPrecision: fullYPrecision || this.props.maxPrecision,\n x,\n y,\n axisLabel,\n xLabel,\n yLabel,\n ...passThroughProps\n };\n\n let yTranslation = 0;\n let baseLeft;\n\n if (fixedPosition) {\n textLeft = 6;\n\n baseLeft = this.props.elementWidth / 2 - width / 2;\n\n if (width > this.props.elementWidth && !this.props.floating) {\n baseLeft -= Y_AXIS_WIDTH * this.props.axisCount / 2;\n }\n\n yTranslation = 18;\n\n if (this.props.floating) {\n if (this.props.floatPosition === 'bottom') {\n yTranslation = this.props.elementHeight + halfHeight + 4;\n } else {\n yTranslation = -height;\n }\n\n if (this.props.floatDelta) {\n yTranslation += this.props.floatDelta;\n }\n }\n }\n\n return {\n ...tooltip,\n label: axisLabel,\n indexInAxis: series?.axis?.series?.indexOf(series),\n axisLabel,\n width,\n fixedPosition,\n multiplier,\n textLeft,\n transform,\n commonLabelProps,\n textTop,\n height,\n caretSize,\n halfHeight,\n caretPadding,\n yTranslation,\n baseLeft\n };\n }).filter(Boolean);\n\n const CustomTooltipComponent = this.props.customTooltip;\n\n let groupedTooltips;\n if (this.props.combineTooltips) {\n let combinationThreshold = 50; // in px how close tooltips should be to combine\n if (typeof this.props.combineTooltips === 'number') {\n combinationThreshold = this.props.combineTooltips;\n }\n\n groupedTooltips = [];\n\n for (let tooltip of preparedTooltips) {\n let added = false;\n for (let group of groupedTooltips) {\n if (Math.abs(group.pixelX - tooltip.pixelX) <= combinationThreshold) {\n group.tooltips.push(tooltip);\n if (tooltip.pixelX > group.pixelX) {\n group.pixelX = tooltip.pixelX;\n group.multiplier = tooltip.multiplier;\n }\n\n if (tooltip.pixelY < group.pixelY) {\n group.pixelY = tooltip.pixelY;\n }\n\n added = true;\n break;\n }\n }\n\n if (!added) {\n groupedTooltips.push({\n pixelX: tooltip.pixelX,\n pixelY: tooltip.pixelY,\n multiplier: tooltip.multiplier,\n tooltips: [tooltip]\n });\n }\n }\n\n for (let group of groupedTooltips) {\n let totalHeight = 0;\n let maxWidth = 0;\n\n // sort by indexInAxis\n group.tooltips.sort((a, b) => a.indexInAxis - b.indexInAxis);\n\n for (let i = 0; i < group.tooltips.length; i++) {\n group.tooltips[i].textTop = totalHeight;\n totalHeight += group.tooltips[i].height;\n maxWidth = Math.max(maxWidth, group.tooltips[i].width);\n }\n\n for (let i = 0; i < group.tooltips.length; i++) {\n group.tooltips[i].textTop -= totalHeight/2;\n group.tooltips[i].textTop += textPadding;\n }\n\n group.height = totalHeight;\n group.halfHeight = totalHeight / 2;\n group.caretSize = caretSize;\n group.width = maxWidth;\n }\n }\n\n return (\n <div className=\"grapher-tooltip\">\n <svg>\n {\n preparedTooltips.map((tooltip, i) => {\n const { color, fixedPosition, width, transform, baseLeft, commonLabelProps, yTranslation, multiplier, textLeft, textTop } = tooltip;\n\n if (this.props.customTooltip || groupedTooltips) {\n return (\n <g key={i} transform={transform} className=\"tooltip-item\">\n <circle r={4} fill={color}/>\n </g>\n );\n }\n\n // display in a fixed position if not wide enough\n if (fixedPosition) {\n return (\n <g key={i} className=\"tooltip-item tooltip-item-fixed\">\n <circle r={4} fill={color} transform={transform} />\n\n <g transform={`translate(${baseLeft}, ${yTranslation})`}>\n <path stroke={color} d={`M0,0 V-${halfHeight} h${width} V${halfHeight} h${-width} V0`} />\n\n <TooltipLabel\n textLeft={textLeft} textTop={textTop}\n {...commonLabelProps}\n />\n </g>\n </g>\n );\n }\n\n return (\n <g key={i} transform={transform} className=\"tooltip-item\">\n <circle r={4} fill={color} />\n\n <path stroke={color} d={`M${multiplier*caretPadding},0 L${multiplier*caretSize*2},-${caretSize} V-${halfHeight} h${multiplier*width} V${halfHeight} h${multiplier*-width} V${caretSize} L${multiplier*caretPadding},0`} />\n\n <TooltipLabel\n textLeft={textLeft} textTop={textTop}\n {...commonLabelProps}\n />\n </g>\n );\n })\n }\n\n {\n !this.props.customTooltip && groupedTooltips &&\n groupedTooltips.map(({ tooltips, pixelX, pixelY, halfHeight, multiplier, color, width }, i) =>\n <g key={i} transform={`translate(${pixelX},${pixelY})`} className=\"tooltip-item\">\n <path stroke={color} d={`M${multiplier*caretPadding},0 L${multiplier*caretSize*2},-${caretSize} V-${halfHeight} h${multiplier*width} V${halfHeight} h${multiplier*-width} V${caretSize} L${multiplier*caretPadding},0`} />\n\n {\n tooltips.map((tooltip, j) =>\n <TooltipLabel\n key={j}\n textTop={tooltip.textTop}\n textLeft={tooltip.textLeft}\n {...tooltip.commonLabelProps}\n />\n )\n }\n </g>\n )\n }\n </svg>\n\n {\n this.props.customTooltip &&\n (groupedTooltips || preparedTooltips).map((tooltip, i) =>\n <div\n key={i}\n className=\"custom-tooltip-container\"\n style={{top: tooltip.pixelY, left: tooltip.pixelX}}\n >\n <CustomTooltipComponent {...tooltip} />\n </div>\n )\n }\n </div>\n );\n }\n\n}\n\nTooltip.defaultProps = {\n includeSeriesLabel: true,\n includeXLabel: true,\n includeYLabel: true,\n includeXValue: true,\n includeYValue: true\n};\n\nTooltip.propTypes = {\n mouseX: PropTypes.number.isRequired,\n mouseY: PropTypes.number.isRequired,\n elementHeight: PropTypes.number.isRequired,\n elementWidth: PropTypes.number.isRequired,\n tooltips: PropTypes.arrayOf(PropTypes.shape({\n x: PropTypes.oneOfType([PropTypes.number, PropTypes.instanceOf(Date)]),\n y: PropTypes.number,\n pixelY: PropTypes.number,\n color: PropTypes.string,\n xLabel: PropTypes.string,\n yLabel: PropTypes.any,\n fullYPrecision: PropTypes.bool\n })),\n axisCount: PropTypes.number.isRequired,\n maxPrecision: PropTypes.bool.isRequired,\n clockStyle: PropTypes.oneOf(['12h', '24h']),\n timeZone: PropTypes.string,\n ...CustomPropTypes.TooltipOptionsRaw\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nexport default class ContextMenu extends React.PureComponent {\n constructor(props) {\n super(props);\n this.setTextRef = this.setTextRef.bind(this);\n }\n \n setTextRef(ref) {\n this.textRef = ref;\n\n if (this.props.contextMenu.showing && this.textRef) {\n const range = document.createRange();\n const selection = window.getSelection();\n\n selection.removeAllRanges();\n\n range.selectNodeContents(this.textRef);\n selection.addRange(range);\n this.textRef.focus();\n }\n }\n \n formatDateTime(dateTimeStr) {\n const [datePart, timePart] = dateTimeStr.split(', ');\n\n const [month, day, year] = datePart.split('/');\n const formattedDate = `${month.padStart(2, '0')}/${day.padStart(2, '0')}/${year}`;\n\n const [time, period] = timePart.split(' ');\n const [hours, minutes] = time.split(':');\n const formattedHours = hours.padStart(2, '0');\n const formattedTime = `${formattedHours}:${minutes} ${period}`;\n\n return `${formattedDate} ${formattedTime}`;\n }\n \n render() {\n const { x, y, showing, value } = this.props.contextMenu;\n\n const style = { left: x, top: y, width: '150px'};\n \n if (!showing || !value || value.toLocaleString() === 'Invalid Date' || isNaN(x) || isNaN(y)) {\n return null;\n }\n\n const displayValue = value instanceof Date ? this.formatDateTime(value.toLocaleString()) : value;\n return (\n <div className=\"grapher-context-menu\" style={style}>\n <div className=\"menu-item\">\n <div className=\"menu-text\" autoFocus={true} ref={this.setTextRef}>\n {displayValue}\n </div>\n </div>\n </div>\n );\n }\n\n}\n\nContextMenu.propTypes = {\n contextMenu: PropTypes.shape({\n x: PropTypes.number,\n y: PropTypes.number,\n showing: PropTypes.bool,\n value: PropTypes.oneOfType([\n PropTypes.instanceOf(Date),\n PropTypes.number,\n PropTypes.object\n ])\n }).isRequired\n};\n","import inferType from '../infer_type';\nimport { SIMPLE_DATA_TYPES } from '../data_types';\n\n/**\n * Given a series of a simple type (ie, not a function or an observable), converts it into data space\n *\n * @param {*} singleSeries\n * @param {Object} options\n * @return {*}\n */\nexport default function simpleSeriesToDataSpace(singleSeries, options={}) {\n const type = inferType(singleSeries, { useSimpleData: true, data: options.data });\n if (!SIMPLE_DATA_TYPES.includes(type)) {\n throw new Error(`Cannot normalize ${type} (expected a simple type)`);\n }\n\n const inDataSpace = {\n tuples: tuplesToDataSpace,\n values: valuesToDataSpace,\n objects: objectsToDataSpace\n }[type](options.data || singleSeries.simpleData || singleSeries.data, singleSeries, options);\n\n if (singleSeries.square) {\n const square = [];\n let prevY = options.prevY;\n for (let tuple of inDataSpace) {\n if (prevY !== undefined) {\n square.push([tuple[0], prevY]);\n }\n square.push(tuple);\n prevY = tuple[1];\n }\n\n return square;\n }\n\n if (singleSeries.shiftXBy) {\n for (let tuple of inDataSpace) {\n if (typeof tuple[0] === 'string') {\n const originalXValue = tuple[0];\n tuple[0] = new Date(new Date(tuple[0]).valueOf() + singleSeries.shiftXBy);\n if (isNaN(tuple[0])) {\n tuple[0] = options.stateController.enumToNumber(originalXValue, singleSeries);\n }\n } else if (tuple[0] instanceof Date) {\n tuple[0] = new Date(tuple[0].valueOf() + singleSeries.shiftXBy);\n } else if (typeof tuple[0] === 'number') {\n tuple[0] += singleSeries.shiftXBy;\n }\n }\n }\n\n if (singleSeries.xUnixDates) {\n for (let tuple of inDataSpace) {\n if (typeof tuple[0] === 'number') {\n tuple[0] = new Date(tuple[0]*1000);\n }\n }\n }\n\n return inDataSpace;\n}\n\n/**\n * Converts a values array to data space\n *\n * @param {Array<Number|String>} data\n * @param {Object} singleSeries\n * @param {Object} options\n * @param {Number} [options.valueXStart]\n * @param {StateController} options.stateController\n * @return {Array<Array<Number|Date|null>>}\n */\nfunction valuesToDataSpace(data, singleSeries, options) {\n const inDataSpace = [];\n\n for (let i = 0; i < data.length; i++) {\n let yValue = data[i];\n\n if (typeof yValue === 'string') {\n yValue = options.stateController.enumToNumber(yValue, singleSeries);\n }\n\n if (typeof yValue === 'boolean') {\n yValue = +yValue;\n }\n\n inDataSpace.push([i + (options.valueXStart || 0), yValue]);\n }\n\n return inDataSpace;\n}\n\n/**\n * Converts a tuples array to data space\n *\n * @param {Array<Array<Number|Date|null>>} data\n * @param {Object} singleSeries\n * @param {Object} options\n * @param {StateController} options.stateController\n * @return {Array<Array<Number|Date|null>>}\n */\nfunction tuplesToDataSpace(data, singleSeries, options) {\n return [...data.map(([ xValue, yValue]) => {\n if (yValue === undefined) {\n yValue = null;\n }\n\n if (typeof xValue === 'string') {\n const originalXValue = xValue;\n xValue = new Date(xValue);\n\n if (isNaN(xValue)) {\n xValue = options.stateController.enumToNumber(originalXValue, singleSeries, true);\n }\n }\n\n if (typeof yValue === 'string') {\n yValue = options.stateController.enumToNumber(yValue, singleSeries);\n }\n\n if (typeof yValue === 'boolean') {\n yValue = +yValue;\n }\n\n return [xValue, yValue];\n })];\n}\n\nfunction readBinaryFormatValue(view, offset, index) {\n const localOffset = view.getUint32(offset + 2 + Uint32Array.BYTES_PER_ELEMENT*index, true);\n\n if (localOffset === 0) {\n return null;\n }\n\n const type = view.getUint8(localOffset);\n\n if (type === 0) {\n return view.getFloat64(offset + localOffset + 1, true);\n } else if (type === 1 || type === 6) {\n return null;\n } else if (type === 3) {\n return new Date(view.getFloat64(offset + localOffset + 1, true));\n } else {\n throw new Error(`Binary format type ${type} not supported`);\n }\n}\n\n/**\n * Converts an objects array to data space\n *\n * @param {Array<Object>} data\n * @param {Object} series\n * @param {Object} options\n * @param {StateController} options.stateController\n * @return {Array<Array<Number|Date|null>>}\n */\nfunction objectsToDataSpace(data, series, options) {\n if (!series.xKey || typeof series.xKey !== 'string') {\n throw new Error('xKey must be provided in the series');\n }\n\n if (!series.yKey || typeof series.yKey !== 'string') {\n throw new Error('yKey must be provided in the series');\n }\n\n const inDataSpace = [];\n\n for (let point of data) {\n if (point.buffer instanceof ArrayBuffer) {\n const view = new DataView(point.buffer);\n const xIndex = point.channels[series.xKey];\n const yIndex = point.channels[series.yKey];\n\n for (let offset of point.offsets) {\n inDataSpace.push([readBinaryFormatValue(view, offset, xIndex), readBinaryFormatValue(view, offset, yIndex)]);\n }\n } else if (Array.isArray(point[series.yKey])) {\n if (point[series.yKey].length && !Array.isArray(point[series.yKey][0]) && typeof point[series.yKey][0] === 'object') {\n for (let subpoint of point[series.yKey]) {\n let yValue = subpoint[series.yKey];\n if (yValue === undefined) {\n yValue = null;\n }\n\n if (typeof yValue === 'string') {\n yValue = options.stateController.enumToNumber(yValue, series);\n }\n\n if (typeof yValue === 'boolean') {\n yValue = +yValue;\n }\n\n let xValue = subpoint[series.xKey];\n if (typeof xValue === 'string') {\n xValue = new Date(xValue);\n }\n\n inDataSpace.push([xValue, yValue]);\n }\n } else {\n inDataSpace.push(...point[series.yKey]);\n }\n } else {\n let yValue = point[series.yKey];\n if (yValue === undefined) {\n yValue = null;\n }\n\n let xValue = point[series.xKey];\n if (typeof xValue === 'string') {\n xValue = new Date(xValue);\n }\n\n if (typeof yValue === 'string') {\n yValue = options.stateController.enumToNumber(yValue, series);\n }\n\n if (typeof yValue === 'boolean') {\n yValue = +yValue;\n }\n\n inDataSpace.push([xValue, yValue]);\n }\n }\n\n return inDataSpace;\n}\n","function finalizeBounds(bounds, { dates }) {\n const initial = (bounds.minX === null && bounds.maxX === null) || bounds.minY === null || bounds.maxY === null;\n\n for (let key of Object.keys(bounds)) {\n if (typeof bounds[key] !== 'number') {\n bounds[key] = 0;\n }\n }\n\n bounds.initial = initial;\n bounds.dates = dates;\n\n return bounds;\n}\n\nfunction percentileBounds(inDataSpace, bounds, {percentile=100, percentileAsymmetry=0}={}) {\n let dates = false;\n\n bounds.minX = inDataSpace[0][0];\n if (bounds.minX instanceof Date) {\n bounds.minX = bounds.minX.valueOf();\n dates = true;\n }\n\n bounds.maxX = inDataSpace[inDataSpace.length - 1][0];\n if (bounds.maxX instanceof Date) {\n bounds.maxX = bounds.maxX.valueOf();\n dates = true;\n }\n\n const sortedByY = inDataSpace\n .filter(([_x, y]) => typeof y === 'number')\n .sort(([_x1, y1], [_x2, y2]) => y1 - y2);\n\n if (!sortedByY.length) {\n return finalizeBounds(bounds, {dates});\n }\n\n const asymmetry = Math.min(Math.abs(percentileAsymmetry), (100-percentile)/2) * (percentileAsymmetry < 0 ? -1 : 1);\n const inBottomPercentile = (100-percentile)/2 + asymmetry;\n const inTopPercentile = (100-percentile)/2 - asymmetry;\n\n const startIndex = Math.floor((sortedByY.length-1)*inBottomPercentile/100);\n const endIndex = Math.floor((sortedByY.length-1)*(100-inTopPercentile)/100);\n\n bounds.minY = sortedByY[startIndex][1];\n bounds.maxY = sortedByY[endIndex][1];\n\n return finalizeBounds(bounds, {dates});\n}\n\nexport default function calculateDataBounds(inDataSpace, {percentile=100, percentileAsymmetry=0}={}) {\n let bounds = {\n minX: null,\n maxX: null,\n minY: null,\n maxY: null,\n closestSpacing: null\n };\n\n if (percentile !== 100 && inDataSpace.length) {\n return percentileBounds(inDataSpace, bounds, {percentile, percentileAsymmetry});\n }\n\n let dates = false;\n let prevX = null;\n\n for (let [x, y] of inDataSpace) {\n if (x instanceof Date) {\n x = x.valueOf();\n dates = true;\n }\n\n if (typeof bounds.minX !== 'number' || x < bounds.minX) {\n bounds.minX = x;\n }\n\n if (typeof bounds.maxX !== 'number' || x > bounds.maxX) {\n bounds.maxX = x;\n }\n\n if (typeof prevX === 'number' && typeof x === 'number') {\n const spacing = x - prevX;\n if (typeof bounds.closestSpacing !== 'number' || spacing < bounds.closestSpacing) {\n bounds.closestSpacing = spacing;\n }\n }\n prevX = x;\n\n if (typeof y !== 'number') {\n continue;\n }\n\n if (typeof bounds.minY !== 'number' || y < bounds.minY) {\n bounds.minY = y;\n }\n\n if (typeof bounds.maxY !== 'number' || y > bounds.maxY) {\n bounds.maxY = y;\n }\n }\n\n return finalizeBounds(bounds, {dates});\n}\n","export default function mergeBounds(boundsList) {\n const mergedBounds = {\n minX: null,\n maxX: null,\n minY: null,\n maxY: null,\n closestSpacing: null,\n dates: false,\n initial: true\n };\n\n for (let { minX, maxX, minY, maxY, dates, initial, closestSpacing } of boundsList) {\n if (dates) {\n mergedBounds.dates = true;\n }\n\n if (initial) {\n continue;\n }\n mergedBounds.initial = false;\n\n if (mergedBounds.minX === null || minX < mergedBounds.minX) {\n mergedBounds.minX = minX;\n }\n\n if (mergedBounds.maxX === null || maxX > mergedBounds.maxX) {\n mergedBounds.maxX = maxX;\n }\n\n if (mergedBounds.closestSpacing === null || closestSpacing < mergedBounds.closestSpacing) {\n mergedBounds.closestSpacing = closestSpacing;\n }\n\n if (mergedBounds.minY === null || minY < mergedBounds.minY) {\n mergedBounds.minY = minY;\n }\n\n if (mergedBounds.maxY === null || maxY > mergedBounds.maxY) {\n mergedBounds.maxY = maxY;\n }\n }\n\n if (mergedBounds.minX === null) {\n mergedBounds.minX = 0;\n }\n\n if (mergedBounds.maxX === null) {\n mergedBounds.maxX = 0;\n }\n\n if (mergedBounds.closestSpacing === null) {\n mergedBounds.closestSpacing = 1;\n }\n\n if (mergedBounds.minY === null) {\n mergedBounds.minY = 0;\n }\n\n if (mergedBounds.maxY === null) {\n mergedBounds.maxY = 0;\n }\n\n return mergedBounds;\n}\n","/**\n * Expands bounds to give a little y padding\n *\n * @param {Object} bounds\n * @param {?Number} bounds.minY\n * @param {?Number} bounds.maxY\n * @param {?Number} bounds.minX\n * @param {?Number} bounds.maxX\n * @param {Array<Number>} [expandYWith]\n * @param {Number} [extendXForNBars=0]\n * @return {Object}\n */\nexport default function expandBounds(bounds, {expandYWith = [], extendXForNBars=0}) {\n const expandedBounds = Object.assign({}, bounds);\n for (let y of expandYWith) {\n if (y === null || y === undefined) {\n continue;\n }\n\n if (typeof expandedBounds.minY !== 'number' || y < expandedBounds.minY) {\n expandedBounds.minY = y;\n }\n\n if (typeof expandedBounds.maxY !== 'number' || y > expandedBounds.maxY) {\n expandedBounds.maxY = y;\n }\n }\n\n expandedBounds.unscaledMinY = expandedBounds.minY;\n expandedBounds.unscaledMaxY = expandedBounds.maxY;\n\n const range = expandedBounds.maxY - expandedBounds.minY;\n const midpoint = expandedBounds.minY + range/2;\n expandedBounds.minY = midpoint - 1.05*range/2;\n expandedBounds.maxY = midpoint + 1.05*range/2;\n\n if (expandedBounds.minY === expandedBounds.maxY && expandedBounds.minY !== null) {\n if (expandedBounds.minY > 0) {\n expandedBounds.minY *= 0.95;\n expandedBounds.maxY *= 1.05;\n } else if (expandedBounds.minY < 0) {\n expandedBounds.minY *= 1.05;\n expandedBounds.maxY *= 0.95;\n } else {\n expandedBounds.minY -= 1;\n expandedBounds.maxY += 1;\n }\n }\n\n if (extendXForNBars && expandedBounds.minX !== expandedBounds.maxX && expandedBounds.minX !== null && expandedBounds.maxX !== null) {\n // Base expansion factor on expected bar count\n const barWidth = (expandedBounds.maxX - expandedBounds.minX) / extendXForNBars;\n expandedBounds.minX -= barWidth/2;\n expandedBounds.maxX += barWidth/2;\n }\n\n return expandedBounds;\n}\n","/**\n * Finds the closest point to the target\n *\n * @param {Array} data - the data, in data space\n * @param {Number} targetX - the x coordinate to get closest to\n * @param {Object} [searchParams]\n * @param {String} [searchParams.searchType] - whether to search for the closest, one before, or one after\n * @param {Boolean} [searchParams.returnIndex] - whether to return the index or the object itself\n * @param {Number} [startIndex] - where to start the search from\n * @param {Number} [endIndex] - where to end the search\n * @return {Array|Number}\n */\nexport default function binarySearch(data, targetX, searchParams={}, startIndex=0, endIndex=undefined) {\n if (endIndex === undefined) {\n endIndex = data.length - 1;\n }\n\n if (data.length === 0) {\n return searchParams.returnIndex ? -1 : [null, null];\n }\n\n const middleIndex = Math.floor((startIndex + endIndex)/2);\n\n if (targetX === data[middleIndex][0] || (data[middleIndex][0] instanceof Date && data[middleIndex][0].valueOf() === targetX)) {\n if (searchParams.returnIndex) {\n return middleIndex;\n } else {\n return data[middleIndex];\n }\n }\n\n if (startIndex === endIndex) {\n if (data[startIndex][0] < targetX && searchParams.searchType === 'before') {\n return searchParams.returnIndex ? startIndex : data[startIndex];\n } else if (data[startIndex][0] > targetX && searchParams.searchType === 'after') {\n return searchParams.returnIndex ? startIndex : data[startIndex];\n } else {\n return searchParams.returnIndex ? -1 : [null, null];\n }\n }\n\n if (endIndex - 1 === startIndex) {\n let index;\n\n if (searchParams.searchType === 'before') {\n index = startIndex;\n // index = (targetX <= data[startIndex][0]) ? startIndex : endIndex;\n } else if (searchParams.searchType === 'after') {\n index = endIndex;\n // index = (targetX >= data[endIndex][0]) ? endIndex : startIndex;\n } else {\n index = Math.abs(data[startIndex][0] - targetX) > Math.abs(data[endIndex][0] - targetX) ?\n endIndex :\n startIndex;\n }\n\n return searchParams.returnIndex ? index : data[index];\n }\n\n if (targetX > data[middleIndex][0]) {\n return binarySearch(data, targetX, searchParams, middleIndex, endIndex);\n }\n\n if (targetX < data[middleIndex][0]) {\n return binarySearch(data, targetX, searchParams, startIndex, middleIndex);\n }\n}\n","import binarySearch from '../../helpers/binary_search';\n\nfunction validateSelectedSpaceConversion({ data, inSelectedSpace, firstIndex, lastIndex, ignoreDiscontinuities }) { // eslint-disable-line no-unused-vars\n let correct = data.slice(firstIndex + 1, lastIndex);\n if (ignoreDiscontinuities) {\n correct = correct.filter(([_x, y]) => (y !== null && y !== undefined));\n }\n\n if (correct.length !== inSelectedSpace.length) {\n console.log({ // eslint-disable-line no-console\n data,\n attempt: inSelectedSpace.map(([x, y]) => [undateify(x), y]),\n correct: correct.map(([x, y]) => [undateify(x), y]),\n sdl: window.sdl\n });\n window.tacomaDataPaused = true;\n throw new Error('Failed to select via swap');\n }\n\n for (let i = 0; i < correct.length; i++) {\n if (undateify(correct[i][0]) !== undateify(inSelectedSpace[i][0]) || correct[i][1] !== inSelectedSpace[i][1]) {\n console.log({ // eslint-disable-line no-console\n i,\n attempt: inSelectedSpace.map(([x, y]) => [undateify(x), y]),\n correct: correct.map(([x, y]) => [undateify(x), y]),\n correctX: undateify(correct[i][0]),\n correctY: correct[i][1],\n attemptX: undateify(inSelectedSpace[i][0]),\n attemptY: inSelectedSpace[i][1]\n });\n window.tacomaDataPaused = true;\n throw new Error('Failed to select via swap');\n }\n }\n}\n\n/**\n * Converts from data space to selected space\n *\n * @param {Array<Array<Number>>} data\n * @param {{data: Array<Array<Number>>}|*} [swap]\n * @param {Number} minX\n * @param {Number} maxX\n * @param {Boolean} ignoreDiscontinuities\n * @param {Boolean} square\n * @return {{data: Array<Array<Number>>, lastAdded: boolean, firstAdded: boolean, afterIndex: Number, ignoreDiscontinuities: boolean, minX: Number, maxX: Number, beforeIndex: Number}}\n */\nexport default function dataSpaceToSelectedSpace({ data, swap, minX, maxX, ignoreDiscontinuities, square }) {\n if (!data.length || data.length && minX > data[data.length - 1][0] || data.length && maxX < data[0][0]) {\n //let previouslyEmpty = !data.length;\n return {\n data: [\n [minX, null],\n [maxX, null]\n ],\n firstAdded: true,\n lastAdded: true\n //previouslyEmpty\n };\n }\n\n let beforeIndex = binarySearch(data, minX, { searchType: 'before', returnIndex: true }) || 0;\n let afterIndex = binarySearch(data, maxX, { searchType: 'after', returnIndex: true }) || 0;\n if (afterIndex === -1) {\n afterIndex = 0;\n }\n\n while (beforeIndex >= 0 && data[beforeIndex][0] >= minX) {\n beforeIndex --;\n }\n\n while (afterIndex < data.length && data[afterIndex][0] <= maxX) {\n afterIndex ++;\n }\n\n let inSelectedSpace;\n let addToEndOnly = false;\n\n let firstAdded = false;\n let lastAdded = false;\n\n let beginningInterpolationIndex = beforeIndex;\n let endInterpolationIndex = afterIndex;\n if (ignoreDiscontinuities) {\n while (beginningInterpolationIndex >= 0 && data[beginningInterpolationIndex][1] === null) {\n beginningInterpolationIndex --;\n }\n while (endInterpolationIndex < data.length && data[endInterpolationIndex][1] === null) {\n endInterpolationIndex++;\n }\n }\n\n if (swap) {\n inSelectedSpace = swap.data;\n if (swap.lastAdded) {\n inSelectedSpace.pop();\n }\n if (minX === swap.minX) {\n addToEndOnly = true;\n }\n if (beforeIndex !== swap.beforeIndex) {\n addToEndOnly = false;\n if (swap.firstAdded) {\n inSelectedSpace.shift();\n }\n let index = swap.beforeIndex;\n while (index >= 0 && inSelectedSpace.length && inSelectedSpace[0][0] >= minX) {\n if (!ignoreDiscontinuities || data[index][1] || data[index][1] === 0) {\n inSelectedSpace.unshift(data[index]);\n }\n index --;\n }\n while (index < data.length && inSelectedSpace.length && inSelectedSpace[0][0] < minX) {\n inSelectedSpace.shift();\n index ++;\n }\n }\n\n if (ignoreDiscontinuities && !swap.ignoreDiscontinuities) {\n inSelectedSpace = inSelectedSpace.filter(([_x, y]) => (y !== null && y !== undefined));\n }\n\n if (beforeIndex === swap.beforeIndex && swap.firstAdded) {\n firstAdded = true;\n\n let interpolationIndex = beforeIndex + 1;\n if (ignoreDiscontinuities) {\n while (interpolationIndex < data.length && data[interpolationIndex][1] === null) {\n interpolationIndex ++;\n }\n }\n\n if (beginningInterpolationIndex === -1 && inSelectedSpace.length) {\n inSelectedSpace[0] = [minX, null];\n } else {\n if (square && inSelectedSpace.length) {\n inSelectedSpace[0] = [minX, data[beginningInterpolationIndex][1]];\n } else {\n if (inSelectedSpace.length) {\n inSelectedSpace[0] = [minX, interpolate(data, beginningInterpolationIndex, interpolationIndex, minX)];\n }\n }\n }\n if (data[beforeIndex + 1][0] === inSelectedSpace[0][0] && data[beforeIndex + 1][1] === inSelectedSpace[0][1]) {\n firstAdded = false;\n }\n }\n let lastIncluded = swap.afterIndex;\n if (swap.ignoreDiscontinuities && !ignoreDiscontinuities) {\n let nullIndex = beforeIndex + 1;\n let selectedIndex = 0;\n if (firstAdded) {\n selectedIndex ++;\n }\n while (selectedIndex <= inSelectedSpace.length && nullIndex < data.length && nullIndex < afterIndex) {\n if (data[nullIndex][0] <= maxX && data[nullIndex][1] === null && (!inSelectedSpace[selectedIndex] || inSelectedSpace[selectedIndex][0] !== data[nullIndex][0] || inSelectedSpace[selectedIndex][1] !== data[nullIndex][1])) {\n inSelectedSpace.splice(selectedIndex, 0, data[nullIndex]);\n if (nullIndex >= lastIncluded) {\n lastIncluded = nullIndex + 1;\n }\n }\n nullIndex ++;\n selectedIndex ++;\n }\n }\n\n let dataIndex = lastIncluded || 0;\n while (dataIndex < data.length && data[dataIndex][0] <= maxX) {\n if (data[dataIndex][0] >= minX) {\n if (!ignoreDiscontinuities || data[dataIndex][1] || data[dataIndex][1] === 0) {\n inSelectedSpace.push(data[dataIndex]);\n }\n }\n dataIndex ++;\n }\n while (inSelectedSpace.length && inSelectedSpace[inSelectedSpace.length - 1][0] > maxX) {\n inSelectedSpace.pop();\n }\n\n } else {\n inSelectedSpace = data.slice(beforeIndex + 1, afterIndex);\n if (ignoreDiscontinuities) {\n inSelectedSpace = inSelectedSpace.filter(([_x, y]) => (y !== null && y !== undefined));\n }\n }\n\n if (!inSelectedSpace.length) {\n if (square) {\n if (beginningInterpolationIndex < 0) {\n inSelectedSpace = [[minX, null], [maxX, null]];\n } else {\n inSelectedSpace = [[minX, data[beginningInterpolationIndex][1]], [maxX, data[beginningInterpolationIndex][1]]];\n }\n } else {\n inSelectedSpace = [[minX, interpolate(data, beginningInterpolationIndex, endInterpolationIndex, minX)], [maxX, interpolate(data, beginningInterpolationIndex, endInterpolationIndex, maxX)]];\n }\n firstAdded = true;\n lastAdded = true;\n }\n\n if (!addToEndOnly) {\n let interpolationIndex = beforeIndex + 1;\n if (ignoreDiscontinuities) {\n while (interpolationIndex < data.length && data[interpolationIndex][1] === null) {\n interpolationIndex ++;\n }\n }\n\n if (inSelectedSpace.length && inSelectedSpace[0][0] > minX) {\n firstAdded = true;\n if (beginningInterpolationIndex === -1) {\n inSelectedSpace.unshift([minX, null]);\n } else {\n if (square) {\n inSelectedSpace.unshift([minX, data[beginningInterpolationIndex][1]]);\n } else {\n inSelectedSpace.unshift([minX, interpolate(data, beginningInterpolationIndex, interpolationIndex, minX)]);\n }\n }\n }\n }\n\n if (inSelectedSpace.length && inSelectedSpace[inSelectedSpace.length - 1][0] < maxX) {\n lastAdded = true;\n\n let interpolationIndex = afterIndex - 1;\n if (ignoreDiscontinuities) {\n while (interpolationIndex >= 0 && data[interpolationIndex][1] === null) {\n interpolationIndex --;\n }\n }\n\n if (endInterpolationIndex === data.length) {\n inSelectedSpace.push([maxX, null]);\n } else {\n if (square) {\n inSelectedSpace.push([maxX, inSelectedSpace[inSelectedSpace.length - 1][1]]);\n } else {\n inSelectedSpace.push([maxX, interpolate(data, interpolationIndex, endInterpolationIndex, maxX)]);\n }\n }\n }\n\n if (inSelectedSpace.length === 1) {\n let begPoint;\n let endPoint;\n if (square) {\n if (beginningInterpolationIndex < 0) {\n begPoint = [minX, null];\n } else {\n begPoint = [minX, data[beginningInterpolationIndex][1]];\n }\n endPoint = [maxX, inSelectedSpace[0][1]];\n } else {\n begPoint = [minX, interpolate(data, beginningInterpolationIndex, beforeIndex + 1, minX)];\n endPoint = [maxX, interpolate(data, afterIndex - 1, endInterpolationIndex, maxX)];\n }\n inSelectedSpace.unshift(begPoint);\n inSelectedSpace.push(endPoint);\n firstAdded = true;\n lastAdded = true;\n }\n\n return {\n data: inSelectedSpace,\n minX,\n maxX,\n beforeIndex,\n afterIndex,\n firstAdded,\n lastAdded,\n ignoreDiscontinuities\n //previouslyEmpty: false\n };\n}\n\nfunction undateify(potentialDate) {\n if (potentialDate instanceof Date) {\n return potentialDate.valueOf();\n }\n\n return potentialDate;\n}\n\n/**\n * Finds the point at the boundary via interpolation\n *\n * @param {Array<Array<Number>>} data\n * @param {Number} firstIndex\n * @param {Number} secondIndex\n * @param {Number} boundary\n * @return {null|*}\n */\nfunction interpolate(data, firstIndex, secondIndex, boundary) {\n if (firstIndex < 0 || secondIndex < 0) {\n return null;\n }\n\n if (firstIndex >= data.length || secondIndex >= data.length) {\n return null;\n }\n\n if (firstIndex === secondIndex) {\n return data[firstIndex][1];\n }\n\n const [xBefore, yBefore] = data[firstIndex];\n const [xAfter, yAfter] = data[secondIndex];\n\n if (boundary === xBefore && yBefore !== null) {\n return yBefore;\n }\n\n if (boundary === xAfter && yAfter !== null) {\n return yAfter;\n }\n\n if (yBefore === null || yAfter === null) {\n return null;\n }\n\n const percent = (boundary - xBefore)/(xAfter - xBefore);\n if (percent < 0 || percent > 1) {\n return null;\n }\n\n return percent*(yAfter - yBefore) + yBefore;\n}\n","/**\n * Scales y min and max bounds according to linear or log\n *\n * @param {Number} minY\n * @param {Number} maxY\n * @param {'linear'|'log'} scale\n * @return {{minY: Number, maxY: Number}}\n */\nexport default function scaleBounds({ minY, maxY, scale }) {\n if (scale === 'log') {\n maxY = Math.log10(maxY);\n\n if (minY <= 0) {\n if (maxY > 0) {\n minY = -maxY;\n } else {\n minY = 2*maxY;\n }\n } else {\n minY = Math.log10(minY);\n }\n }\n\n return {\n minY,\n maxY\n };\n}\n","let rustApiModule;\nexport const RustAPIPromise = import('../rust/pkg/index.js').then((module) => {\n return module.default().then(() => {\n rustApiModule = module;\n });\n});\n\nexport default function RustAPI() {\n return rustApiModule;\n}\n","import scaleBounds from '../../renderer/scale_bounds';\nimport RustAPI from '../rust_api';\n\n\nfunction selectedSpaceToRenderSpaceInPlace({ data, renderWidth, renderHeight, minX, maxX, minY, maxY, scale }, { nullMask, yValues, minYValues, maxYValues }) {\n let i = 0;\n let prevI = i - 1;\n\n for (let pixelX = 0; pixelX < renderWidth; pixelX++) {\n // find the x value that corresponds to the x pixel\n const x = (pixelX/(renderWidth - 1))*(maxX - minX) + minX;\n\n // set i such that data[i][0] < x <= data[i+1][0]\n let minSeenY = null;\n let maxSeenY = null;\n\n if (i > 0 && i <= data.length && data[i - 1][1] === null) {\n i--;\n }\n\n if (i < data.length - 2 && data[i + 1][0] < x) {\n i++;\n }\n\n for (i; i < data.length - 2 && data[i + 1][0] < x; i++) {\n const curY = data[i][1];\n\n if (curY === null) {\n continue;\n }\n\n if (minSeenY === null || curY < minSeenY) {\n minSeenY = curY;\n }\n\n if (maxSeenY === null || curY > maxSeenY) {\n maxSeenY = curY;\n }\n }\n\n minYValues[pixelX] = minSeenY === null ? 0 : renderHeight*(1 - ((scale === 'log' ? Math.log10(minSeenY) : minSeenY) - minY)/(maxY - minY));\n maxYValues[pixelX] = maxSeenY === null ? 0 : renderHeight*(1 - ((scale === 'log' ? Math.log10(maxSeenY) : maxSeenY) - minY)/(maxY - minY));\n\n // pass any discontinuities along\n if (i >= data.length - 1 || data[i][1] === null || data[i + 1][1] === null) {\n const y = i >= data.length - 1 ? null : data[i][1];\n\n nullMask[pixelX] = ((y === null) << 0) | ((minSeenY === null) << 1) | ((maxSeenY === null) << 2);\n yValues[pixelX] = y === null ? 0 : renderHeight*(1 - ((scale === 'log' ? Math.log10(y) : y) - minY)/(maxY - minY));\n\n i++;\n\n continue;\n }\n\n // interpolate\n const [xBefore, yBefore] = data[i];\n const [xAfter, yAfter] = data[i + 1];\n\n const percent = (x - xBefore) / (xAfter - xBefore);\n let y = percent * (yAfter - yBefore) + yBefore;\n\n // we're at the first point after the direction changed. Don't interpolate\n if (prevI !== i) {\n y = yBefore;\n }\n\n // // two x's with the same value; common in area charts\n // // to avoid this from having gotten skipped over, save in either min or max as appropriate\n // if (i > 0 && data[i - 1][0] === data[i][0]) {\n // // 0: minY a\n // // 1: original a\n // // 2: minY b\n // // 3: original b\n //\n // const [xBeforeOffset, yBeforeOffset] = data[i - 1];\n // const [xAfter, yAfter] = data[i + 1];\n // }\n\n yValues[pixelX] = y === null ? 0 : renderHeight*(1 - ((scale === 'log' ? Math.log10(y) : y) - minY)/(maxY - minY));\n nullMask[pixelX] = ((y === null) << 0) | ((minSeenY === null) << 1) | ((maxSeenY === null) << 2);\n\n prevI = i;\n }\n}\n\n/**\n * Convert from selected space to value space\n *\n * @param data\n * @param {Object} [swap]\n * @param {Number} renderWidth - width, in pixels, of the area in which the graph is rendered\n * @param {Number} renderHeight - height, in pixels, of the area in which the graph is rendered\n * @param {Number} minX - the minimum x value that is rendered\n * @param {Number} maxX - the maximum x value that is rendered\n * @param {Number} minY - the minimum y value that is rendered\n * @param {Number} maxY - the maximum y value that is rendered\n * @param {'log'|'linear'} scale\n * @param {Boolean} [dataChanged] - if true, will not rely on the prior data state from swap being accurate\n * @return {{nullMask: Uint8Array, maxYValues: Float64Array, minYValues: Float64Array, yValues: Float64Array, dataF64: Float64Array, dataNullMask: Uint8Array}}\n */\nexport default function selectedSpaceToRenderSpace({ data, swap, renderWidth, renderHeight, minX, maxX, minY, maxY, scale, dataChanged }) {\n if (swap && swap.yValues.length !== renderWidth) {\n swap = null;\n }\n\n const nullMask = (swap && swap.nullMask) || new Uint8Array(renderWidth);\n nullMask.fill(0);\n const yValues = new Float64Array(renderWidth);\n const minYValues = new Float64Array(renderWidth);\n const maxYValues = new Float64Array(renderWidth);\n\n const scaledBounds = scaleBounds({ minY, maxY, scale});\n minY = scaledBounds.minY;\n maxY = scaledBounds.maxY;\n\n const inParams = { data, renderWidth, renderHeight, minX, maxX, minY, maxY, scale };\n\n let dataF64, dataNullMask;\n\n if (RustAPI()) {\n let copyIndexStart = 0;\n\n const hasSwap = swap && swap.dataNullMask && swap.dataF64;\n const useSwap = !dataChanged && hasSwap && swap.minX === minX && swap.maxX <= maxX && swap.length <= data.length;\n\n if (!useSwap || swap.dataNullMask.length < data.length) {\n const extraSpaceFactor = 1.25;\n dataF64 = new Float64Array(Math.floor(data.length*2*extraSpaceFactor));\n dataNullMask = new Uint8Array(Math.floor(data.length*extraSpaceFactor));\n\n if (useSwap) {\n dataNullMask.set(swap.dataNullMask);\n dataF64.set(swap.dataF64);\n }\n } else {\n dataF64 = swap.dataF64;\n dataNullMask = swap.dataNullMask;\n }\n\n if (useSwap) {\n copyIndexStart = Math.max(swap.length - 1, 0);\n }\n\n for (let i = copyIndexStart; i < data.length; i++) {\n dataF64[2*i] = data[i][0];\n dataF64[2*i + 1] = data[i][1];\n\n if (data[i][1] === null) {\n dataNullMask[i] = 1;\n } else {\n dataNullMask[i] = 0;\n }\n }\n RustAPI().selected_space_to_render_space(data.length, dataF64, dataNullMask, inParams, nullMask, yValues, minYValues, maxYValues);\n } else {\n selectedSpaceToRenderSpaceInPlace(inParams, { nullMask, yValues, minYValues, maxYValues });\n }\n\n return {\n nullMask,\n yValues,\n minYValues,\n maxYValues,\n dataF64,\n dataNullMask,\n minX,\n maxX,\n length: data.length\n };\n}\n","/**\n * Flattens simple data\n * Returns an array of tuples (x value, simple point)\n *\n * @param simpleData\n * @param series\n * @param inDataSpace\n * @return {[]}\n */\nexport default function flattenSimpleData(simpleData, {series, inDataSpace }) {\n const flattened = [];\n let fI = 0;\n\n for (let point of simpleData) {\n const yValue = extractYValue(point, series);\n\n if (series.yKey && Array.isArray(yValue)) {\n for (let subpoint of point[series.yKey]) {\n if (series.ignoreDiscontinuities && typeof subpoint[series.yKey] !== 'number' && !Array.isArray(subpoint)) {\n continue;\n }\n\n const x = inDataSpace[fI++][0];\n\n if (series.square && flattened.length > 0) {\n flattened.push([x, flattened[flattened.length - 1][1]]);\n }\n\n flattened.push([x, subpoint]);\n }\n\n continue;\n }\n\n if (series.ignoreDiscontinuities && (yValue === undefined || yValue === null)) {\n continue;\n }\n\n const x = inDataSpace[fI++][0];\n\n if (series.square && flattened.length > 0) {\n flattened.push([x, flattened[flattened.length - 1][1]]);\n }\n\n flattened.push([x, point]);\n }\n\n if (flattened.length !== inDataSpace.length) {\n console.warn('Flattening didn\\'t give the same length as it has in data space'); // eslint-disable-line no-console\n }\n\n return flattened;\n}\n\nexport function extractYValue(point, series) {\n if (series.yKey) {\n return point[series.yKey];\n }\n\n if (Array.isArray(point)) {\n if (point.length === 1) {\n return point[0];\n } else {\n return point[1];\n }\n }\n\n return point;\n}\n\nexport function extractXValue(point, series) {\n if (series.xKey) {\n return point[series.xKey];\n }\n\n if (Array.isArray(point)) {\n return point[0];\n }\n\n return point;\n}\n","import binarySearch from '../helpers/binary_search';\nimport scaleBounds from '../renderer/scale_bounds';\nimport getColor from '../helpers/colors';\nimport flattenSimpleData, {extractXValue, extractYValue} from '../helpers/flatten_simple_data';\nimport {getBarWidths} from '../renderer/draw_bars';\n\nconst DISTANCE_THRESHOLD = 20;\n\n/**\n * Figures out the tooltip state\n *\n * @param {Boolean} mousePresent\n * @param {Number} mouseX\n * @param {Number} mouseY\n * @param {Object} sizing\n * @param {Array<Object>} series\n * @param {Set} alwaysTooltipped\n * @param {Array<Object>} savedTooltips\n * @param {Boolean} [allTooltipped]\n * @param {Number} closestSpacing\n * @return {{mouseX: *, mouseY: *, elementWidth: number, elementHeight: number, tooltips: any[]}}\n */\nexport default function calculateTooltipState({mousePresent, mouseX, mouseY, sizing, series, alwaysTooltipped, savedTooltips, allTooltipped, closestSpacing }) {\n // filter out saved tooltips for nonexistent series\n savedTooltips = savedTooltips.filter((tooltip) => tooltip.series.axis);\n\n for (let savedTooltip of savedTooltips) {\n moveTooltip({ mouseX, mouseY, sizing}, savedTooltip);\n }\n\n if (!mousePresent) {\n return {\n mouseX,\n mouseY,\n elementWidth: sizing.elementWidth,\n elementHeight: sizing.elementHeight,\n tooltips: [...savedTooltips]\n };\n }\n\n const tooltips = [];\n\n let minDistance = Infinity;\n\n for (let i = 0; i < series.length; i++) {\n const singleSeries = series[i];\n\n if (singleSeries.hidden) {\n continue;\n }\n\n const axis = singleSeries.axis;\n\n const scale = axis.scale;\n const bounds = axis.currentBounds;\n const { minY, maxY } = scaleBounds({...bounds, scale });\n\n const trueX = mouseX/sizing.elementWidth * (bounds.maxX - bounds.minX) + bounds.minX;\n\n let data = singleSeries.inDataSpace;\n if (singleSeries.ignoreDiscontinuities) {\n data = data.filter((tuple) => typeof tuple[1] === 'number');\n }\n\n const closestIndex = binarySearch(data, trueX, { returnIndex: true });\n const closestPoint = data[closestIndex];\n\n if (!closestPoint) {\n continue;\n }\n\n const [x, y] = closestPoint;\n\n if (x === null) {\n continue;\n }\n\n let pixelX = (x - bounds.minX)/(bounds.maxX - bounds.minX) * sizing.elementWidth;\n const pixelY = (1 - ((scale === 'log' ? Math.log10(y) : y) - minY)/(maxY - minY)) * sizing.elementHeight;\n\n if (pixelY > sizing.elementHeight || pixelY < 0) {\n continue;\n }\n\n const ignoreYDistance = alwaysTooltipped.has(singleSeries) || allTooltipped;\n let xDistanceThreshold = DISTANCE_THRESHOLD;\n let yDistanceThreshold = DISTANCE_THRESHOLD;\n let distanceThreshold = DISTANCE_THRESHOLD;\n\n if (singleSeries.rendering === 'bar') {\n const indexInAxis = singleSeries.axis.series.indexOf(singleSeries);\n const axisSeriesCount = singleSeries.axis.series.length;\n\n const { totalBarWidth, barWidth } = getBarWidths({\n closestSpacing,\n bounds,\n sizing,\n axisSeriesCount\n });\n\n // currently, pixelX is the center of all the bars\n // shift it to start at the far left, then shift it to the center of the individual bar\n pixelX -= totalBarWidth/2/sizing.pixelRatio;\n pixelX += (barWidth*(indexInAxis + 0.5))/sizing.pixelRatio;\n\n xDistanceThreshold = barWidth/2/sizing.pixelRatio;\n yDistanceThreshold = 100;\n distanceThreshold = xDistanceThreshold + yDistanceThreshold;\n }\n\n const xDistance = Math.abs(pixelX - mouseX);\n const yDistance = Math.abs(pixelY - mouseY);\n const distance = Math.sqrt((xDistance)**2 + (pixelY - mouseY)**2);\n\n if (xDistance > xDistanceThreshold || (!ignoreYDistance && yDistance > yDistanceThreshold) || (!ignoreYDistance && distance > distanceThreshold)) {\n continue;\n }\n\n let xLabel, yLabel;\n\n const simpleData = singleSeries.simpleData || singleSeries.data;\n\n const enumLike = simpleData.length && !!singleSeries.hasEnum;\n if (singleSeries.xLabel || singleSeries.yLabel || enumLike) {\n let simplePoint;\n\n if (simpleData.length === data.length) {\n simplePoint = simpleData[closestIndex];\n } else {\n const flattenedData = flattenSimpleData(simpleData, { series: singleSeries, inDataSpace: data });\n\n simplePoint = flattenedData[closestIndex][1];\n }\n\n if (singleSeries.xLabel) {\n xLabel = simplePoint[singleSeries.xLabel];\n } else if (singleSeries.hasXEnum) {\n xLabel = extractXValue(simplePoint, singleSeries);\n }\n\n if (singleSeries.yLabel) {\n yLabel = simplePoint[singleSeries.yLabel];\n } else if (enumLike) {\n yLabel = extractYValue(simplePoint, singleSeries);\n }\n }\n\n if (distance < minDistance) {\n minDistance = distance;\n }\n\n let color = getColor(singleSeries.color, i, singleSeries.multigrapherSeriesIndex);\n if (y < 0 && singleSeries.negativeColor) {\n color = singleSeries.negativeColor;\n } else if (y === 0 && singleSeries.zeroLineColor) {\n color = singleSeries.zeroLineColor;\n }\n\n tooltips.push({\n pixelWidth: sizing.elementWidth,\n pixelX: pixelX,\n pixelY: isNaN(pixelY) ? sizing.elementHeight/2 : pixelY,\n x,\n y,\n color,\n distance,\n xDistance,\n index: i,\n series: singleSeries,\n xLabel,\n yLabel,\n fullYPrecision: singleSeries.fullYPrecision,\n ignoreYDistance\n });\n }\n\n const unsavedTooltips = tooltips.filter(({ distance, ignoreYDistance }) => {\n return distance === minDistance || ignoreYDistance;\n }).sort((a, b) => b.distance - a.distance);\n\n return {\n mousePresent,\n mouseX,\n mouseY,\n elementWidth: sizing.elementWidth,\n elementHeight: sizing.elementHeight,\n unsavedTooltipsCount: unsavedTooltips.length,\n tooltips: [...savedTooltips, ...unsavedTooltips]\n };\n}\n\n/**\n * Recalculates the tooltip position, given the new sizing, bounds, etc.\n *\n * @param {Number} mouseX\n * @param {Number} mouseY\n * @param {Object} sizing\n * @param {Object} tooltip - The tooltip object to move\n */\nexport function moveTooltip({ mouseX, mouseY, sizing }, tooltip) {\n const { x, y } = tooltip;\n\n const scale = tooltip.series.axis.scale;\n const bounds = tooltip.series.axis.currentBounds;\n const { minY, maxY } = scaleBounds({...bounds, scale });\n\n const pixelX = (x - bounds.minX)/(bounds.maxX - bounds.minX) * sizing.elementWidth;\n const pixelY = (1 - ((scale === 'log' ? Math.log10(y) : y) - minY)/(maxY - minY)) * sizing.elementHeight;\n\n const distance = Math.sqrt((pixelX - mouseX)**2 + (pixelY - mouseY)**2);\n const xDistance = Math.abs(pixelX - mouseX);\n\n Object.assign(tooltip, {\n pixelWidth: sizing.elementWidth,\n pixelX: pixelX,\n pixelY: isNaN(pixelY) ? sizing.elementHeight/2 : pixelY,\n xDistance,\n distance\n });\n}\n\nexport function toggleTooltipSaved({ currentTooltips, savedTooltips }) {\n if (!currentTooltips.length) {\n return savedTooltips;\n }\n\n const lastTooltip = currentTooltips[currentTooltips.length - 1];\n if (lastTooltip.xDistance > DISTANCE_THRESHOLD || (!lastTooltip.ignoreYDistance && lastTooltip.distance > DISTANCE_THRESHOLD)) {\n return savedTooltips;\n }\n\n const currentTooltipIndex = savedTooltips.findIndex((tooltip) => {\n return tooltip.x === lastTooltip.x && tooltip.y === lastTooltip.y;\n });\n\n if (currentTooltipIndex === -1) {\n return [...savedTooltips, lastTooltip];\n } else {\n return savedTooltips.filter((_, index) => index !== currentTooltipIndex);\n }\n}\n","const BOUND_CALCULATORS = {\n all: () => {},\n lastMinute: (globalBounds) => {\n if (!globalBounds.dates) {\n return;\n }\n\n return {\n minX: Math.max(new Date(globalBounds.maxX).valueOf() - 60*1000, globalBounds.minX)\n };\n },\n last10Minutes: (globalBounds) => {\n if (!globalBounds.dates) {\n return;\n }\n\n return {\n minX: Math.max(new Date(globalBounds.maxX).valueOf() - 10*60*1000, globalBounds.minX)\n };\n },\n lastHour: (globalBounds) => {\n if (!globalBounds.dates) {\n return;\n }\n\n return {\n minX: Math.max(new Date(globalBounds.maxX).valueOf() - 60*60*1000, globalBounds.minX)\n };\n },\n lastDay: (globalBounds) => {\n if (!globalBounds.dates) {\n return;\n }\n\n return {\n minX: Math.max(new Date(globalBounds.maxX).valueOf() - 24*60*60*1000, globalBounds.minX)\n };\n }\n};\n\nexport default BOUND_CALCULATORS;\n","const BUCKETS_PER_PIXEL = 2;\nconst CONDENSE_THRESHOLD = 2;\n\n/**\n * Condenses the dataset down to a lower number of points to make subsequent operations more efficient\n * Will only condense when data length passes a given threshold\n * Note that this works best on datasets that are relatively evenly distributed across the x axis\n *\n * @param {Array<Array>} data\n * @param {{data: [], minX: Number, maxX: Number, length: Number}} swap\n * @param {Number} minX\n * @param maxX\n * @param renderWidth\n * @param dataChanged\n * @return {{data: [], minX: Number, maxX: Number, length: Number}}\n */\nexport default function condenseDataSpace({ data, swap, minX, maxX, renderWidth, dataChanged }) {\n const targetBucketCount = renderWidth*BUCKETS_PER_PIXEL;\n\n const useSwap = !dataChanged && swap && swap.minX === minX && swap.maxX <= maxX && swap.length <= data.length;\n\n let partiallyCondensedData;\n if (useSwap) {\n partiallyCondensedData = swap.data;\n\n if (data.length > swap.length) {\n // always overwrite the last in case it was mangled by the selected space interpolation\n if (data.length > 0 && partiallyCondensedData.length > 0) {\n partiallyCondensedData[partiallyCondensedData.length - 1] = data[swap.length - 1];\n }\n\n partiallyCondensedData = partiallyCondensedData.concat(data.slice(swap.length));\n }\n } else {\n partiallyCondensedData = [...data];\n }\n\n if (partiallyCondensedData.length / targetBucketCount < CONDENSE_THRESHOLD*2) { // * 2 because min and max\n return {\n data: partiallyCondensedData,\n minX,\n maxX,\n length: data.length\n };\n }\n\n const condensedData = [];\n const bucketSize = (maxX - minX)/targetBucketCount;\n let minInBucket = null;\n let maxInBucket = null;\n let currentBucketIndex = 0;\n\n // always add the first point so that x ranges are preserved\n if (data.length) {\n condensedData.push(data[0]);\n }\n\n for (let tuple of partiallyCondensedData) {\n const [x, y] = tuple;\n\n if (y === null) {\n continue;\n }\n\n const bucketIndex = Math.floor((x - minX)/bucketSize);\n\n if (bucketIndex !== currentBucketIndex) {\n if (minInBucket && maxInBucket) {\n if (minInBucket === maxInBucket) {\n if (condensedData[condensedData.length - 1] !== minInBucket) {\n condensedData.push(minInBucket);\n }\n } else if (minInBucket[0] < maxInBucket[0]) {\n condensedData.push(maxInBucket, minInBucket);\n } else {\n condensedData.push(minInBucket, maxInBucket);\n }\n }\n\n minInBucket = null;\n maxInBucket = null;\n currentBucketIndex = bucketIndex;\n }\n\n if (!minInBucket || y < minInBucket[1]) {\n minInBucket = tuple;\n }\n\n if (!maxInBucket || y > maxInBucket[1]) {\n maxInBucket = tuple;\n }\n }\n\n if (minInBucket && maxInBucket) {\n if (minInBucket === maxInBucket) {\n condensedData.push(minInBucket);\n } else if (minInBucket[0] < maxInBucket[0]) {\n condensedData.push(maxInBucket, minInBucket);\n } else {\n condensedData.push(minInBucket, maxInBucket);\n }\n }\n\n // always add the last point so that x ranges are preserved\n if (data.length >= 2 && data[data.length - 1] !== minInBucket && data[data.length - 1] !== maxInBucket) {\n condensedData.push(data[data.length - 1]);\n }\n\n return {\n data: condensedData,\n minX,\n maxX,\n length: data.length\n };\n}\n","/**\n * Gets the proper name for a series\n *\n * @param {Object} singleSeries\n * @param {Number} index\n * @return {string}\n */\nexport default function nameForSeries(singleSeries, index) {\n let name = singleSeries.name || singleSeries.yKey;\n\n if (!name) {\n name = index.toString();\n }\n\n return name;\n}\n","export function selectedSpaceToBackgroundSpace({ data, background, minX, maxX }) {\n if (!background) {\n return null;\n }\n\n const conditions = [];\n for (let [key, color] of Object.entries(background)) {\n if (typeof color === 'object') {\n if (typeof color.evaluator !== 'function') {\n throw new Error('Invalid background declaration: ' + key + ' (evaluator must be a function)');\n }\n\n conditions.push(Object.assign({\n key,\n comparator: 'custom',\n comparedAgainst: null\n }, color));\n continue;\n }\n\n if (key === 'null') {\n conditions.push({\n evaluator: (y) => y === null && color,\n color,\n key,\n comparator: '=',\n comparedAgainst: null\n });\n continue;\n }\n\n const [comparator, value] = key.split(' ');\n if (!comparator || !value || isNaN(parseFloat(value))) {\n throw new Error('Invalid background declaration: ' + key);\n }\n\n const parsedValue = parseFloat(value);\n\n let evaluator;\n if (comparator === '=') {\n evaluator = (y) => typeof y === 'number' && y === parsedValue && color;\n } else if (comparator === '<') {\n evaluator = (y) => typeof y === 'number' && y < parsedValue && color;\n } else if (comparator === '>') {\n evaluator = (y) => typeof y === 'number' && y > parsedValue && color;\n } else if (comparator === '<=') {\n evaluator = (y) => typeof y === 'number' && y <= parsedValue && color;\n } else if (comparator === '>=') {\n evaluator = (y) => typeof y === 'number' && y >= parsedValue && color;\n } else {\n throw new Error('Invalid background declaration: ' + key);\n }\n\n conditions.push({\n evaluator,\n color,\n key,\n comparator,\n comparedAgainst: parsedValue\n });\n }\n\n const inBackgroundSpace = [];\n let currentSection = null;\n\n for (let i = 0; i < data.length; i++) {\n let [x, y] = data[i];\n if (x instanceof Date) {\n x = x.valueOf();\n }\n\n for (let condition of currentSection ? [currentSection.condition, ...conditions] : conditions) {\n const color = condition.evaluator(y);\n\n if (currentSection) {\n if (currentSection.color === color) {\n break;\n }\n\n let interpolatedMaxX = x;\n if (i > 0) {\n let [prevX, prevY] = data[i - 1];\n if (prevX instanceof Date) {\n prevX = prevX.valueOf();\n }\n\n if (currentSection.condition.comparedAgainst === null) {\n interpolatedMaxX = x;\n } else if (y === null) {\n interpolatedMaxX = prevX;\n } else {\n interpolatedMaxX = prevX + (condition.comparedAgainst - prevY)/(y - prevY)*(x - prevX);\n }\n }\n\n inBackgroundSpace.push({\n ...currentSection,\n maxX: interpolatedMaxX,\n maxXt: (interpolatedMaxX - minX)/(maxX - minX)\n });\n currentSection = null;\n }\n\n if (color) {\n let interpolatedMinX = x;\n if (i > 0) {\n let [prevX, prevY] = data[i - 1];\n if (prevX instanceof Date) {\n prevX = prevX.valueOf();\n }\n\n if (condition.comparedAgainst === null) {\n interpolatedMinX = prevX;\n } else if (prevY === null) {\n interpolatedMinX = x;\n } else {\n interpolatedMinX = prevX + (condition.comparedAgainst - prevY)/(y - prevY)*(x - prevX);\n }\n }\n\n currentSection = {\n minX: interpolatedMinX,\n minXt: (interpolatedMinX - minX)/(maxX - minX),\n color,\n condition\n };\n\n break;\n }\n }\n }\n\n if (currentSection) {\n inBackgroundSpace.push({\n ...currentSection,\n maxX: data[data.length - 1][0],\n maxXt: (data[data.length - 1][0] - minX)/(maxX - minX)\n });\n }\n\n return {\n data: inBackgroundSpace\n };\n}\n","import simpleSeriesToDataSpace from './space_conversions/simple_series_to_data_space';\nimport calculateDataBounds from './calculate_data_bounds';\nimport mergeBounds from './merge_bounds';\nimport expandBounds from './expand_bounds';\nimport selectionFromGlobalBounds from './selection_from_global_bounds';\nimport dataSpaceToSelectedSpace from './space_conversions/data_space_to_selected_space';\nimport selectedSpaceToRenderSpace from './space_conversions/selected_space_to_render_space';\nimport Eventable from '../eventable';\nimport boundCalculatorFromSelection from './bound_calculator_from_selection';\nimport calculateTooltipState, {toggleTooltipSaved} from './calculate_tooltip_state';\nimport getDefaultBoundsCalculator from './get_default_bounds_calculator';\nimport inferType from './infer_type';\nimport {SIMPLE_DATA_TYPES} from './data_types';\nimport generatorParamsEqual from '../helpers/generator_params_equal';\nimport findMatchingAxis from './find_matching_axis';\nimport {DPI_INCREASE} from '../renderer/size_canvas';\nimport {averageLoopTimes} from './average_loop_times';\nimport condenseDataSpace from './space_conversions/condense_data_space.js';\nimport calculateAnnotationsState from './calculate_annotations_state.js';\nimport {selectedSpaceToBackgroundSpace} from './space_conversions/selected_space_to_background_space.js';\nimport RustAPI, {RustAPIPromise} from './rust_api';\n\nexport default class StateController extends Eventable {\n\n constructor({ defaultBoundsCalculator, customBoundsSelectors, requireWASM, defaultShowIndividualPoints, defaultShowSidebar, defaultShowAnnotations, defaultShowOptions, syncPool, grapherID, sharedDataCache, sharedSubscriptions, fullscreen }) {\n super();\n\n this._requireWASM = requireWASM;\n if (requireWASM) {\n RustAPIPromise.then(() => {\n this._markDirty();\n });\n }\n\n this._series = [];\n this._seriesFromOriginalSeries = new Map();\n\n this._axes = [\n {\n series: [],\n scale: 'linear',\n side: 'left',\n axisIndex: 0\n }\n ];\n this._highlightedSeries = null;\n\n this._showIndividualPoints = defaultShowIndividualPoints || false;\n this._autoscaleY = true;\n this._percentile = 100;\n this._percentileAsymmetry = 0;\n this._showingOptions = defaultShowOptions;\n this._maxPrecision = false;\n this._showingSidebar = defaultShowSidebar || false;\n this._showingAnnotations = defaultShowAnnotations || false;\n this._grapherID = grapherID;\n this._fullscreen = fullscreen || false;\n\n this._alwaysTooltipped = new Set();\n this._tooltipState = {\n mousePresent: false,\n mouseX: 0,\n mouseY: 0,\n elementWidth: 0,\n elementHeight: 0,\n tooltips: []\n };\n this._contextMenuPosition = {\n x: 0,\n y: 0,\n showing: false,\n value: null\n };\n this._savedTooltips = [];\n this._draggingY = false;\n this._annotations = [];\n this._annotationsState = {\n elementWidth: 0,\n annotations: []\n };\n this._enumMap = {};\n this._hasXEnum = false;\n\n this._timingBuffer = [];\n this._timingIndex = 0;\n this._timingFrameCount = 0;\n\n this._modifiedSeries = new Set();\n this._deferredEmissions = {};\n this._deferredPriorityEmissions = {};\n this.primaryRenderer = null;\n this.rangeGraphRenderer = null;\n\n this._boundsCalculator = getDefaultBoundsCalculator(defaultBoundsCalculator, customBoundsSelectors);\n this._boundsHistory = [this._boundsCalculator];\n this._boundsIndex = 0;\n\n this._dataCache = sharedDataCache || new Map();\n this._subscriptions = sharedSubscriptions || new Map();\n this._subscriptionsShared = !!sharedSubscriptions;\n this._observablesToSeries = new Map();\n this._generators = new Set();\n this._generatorsToSeries = new Map();\n this._generatorCallArgs = new Map();\n this._seriesChangedFromPromises = new Set();\n\n this._syncPool = syncPool;\n if (this._syncPool) {\n this._syncPool.add(this);\n }\n\n this._onDataChange();\n }\n\n dispose() {\n this.emit('dispose', this);\n\n this.clearListeners();\n\n if (!this._subscriptionsShared) {\n for (let listener of this._subscriptions.values()) {\n listener.unsubscribe();\n }\n this._subscriptions.clear();\n }\n\n for (let singleSeries of this._series) {\n this._removeSeries(singleSeries);\n }\n\n if (this._syncPool) {\n this._syncPool.remove(this);\n }\n\n this.disposed = true;\n }\n\n setSeries(series) {\n const userSeries = this._series.filter((singleSeries) => singleSeries.userCreated);\n const propsSeries = this._series.filter((singleSeries) => !singleSeries.userCreated);\n\n if (series.length === propsSeries.length) {\n let anyDifferent = false;\n for (let i = 0; i < series.length; i++) {\n if (series[i] !== this._series[i].originalSeries) {\n anyDifferent = true;\n break;\n }\n }\n\n if (!anyDifferent) {\n return;\n }\n } else {\n this._mustResize = this._mustResize || this._fullscreen;\n }\n\n const newSeriesSet = new Set(series);\n for (let singleSeries of propsSeries) {\n if (!newSeriesSet.has(singleSeries.originalSeries)) {\n this._removeSeries(singleSeries);\n }\n }\n\n this._series.splice(0);\n for (let i = 0; i < series.length; i++) {\n const originalSeries = series[i];\n\n let singleSeries = this._seriesFromOriginalSeries.get(originalSeries);\n if (!singleSeries) {\n singleSeries = {\n ...originalSeries,\n originalSeries\n };\n this._seriesFromOriginalSeries.set(originalSeries, singleSeries);\n\n if (singleSeries.defaultAlwaysTooltipped) {\n this._alwaysTooltipped.add(singleSeries);\n this._tooltipsChanged = true;\n this.deferredEmit('always_tooltipped_changed', this._alwaysTooltipped);\n }\n }\n\n singleSeries.index = i;\n this._series.push(singleSeries);\n this._assignAxisTo(singleSeries);\n\n if (singleSeries.hidden) {\n this._hideSeries(singleSeries);\n }\n }\n\n for (let i = 0; i < userSeries.length; i++) {\n const singleSeries = userSeries[i];\n singleSeries.index = i + series.length;\n this._series.push(singleSeries);\n }\n\n this.deferredEmit('series_changed', this._series);\n\n this._dataChanged = true;\n this._markDirty();\n }\n\n _markDirty() {\n if (this._frameRequested) {\n return;\n }\n\n if (this._requireWASM && !RustAPI) {\n return;\n }\n\n const frameRequestStart = performance.now();\n this._frameRequested = true;\n requestAnimationFrame(() => {\n if (this.disposed) {\n return;\n }\n\n const frameExecutionStart = performance.now();\n\n const dataProcessingStart = performance.now();\n if (this._dataChanged) {\n this._onDataChange();\n this._mustRerender = true;\n this._tooltipsChanged = true;\n this._annotationsChanged = true;\n } else if (this._modifiedSeries.size) {\n this._onDataAdd(this._modifiedSeries);\n this._mustRerender = true;\n this._tooltipsChanged = true;\n this._annotationsChanged = true;\n } else {\n if (this._primarySizeChanged) {\n this._calculatePrimarySizeDependents();\n this._mustRerender = true;\n }\n if (this._rangeGraphSizeChanged) {\n this._calculateRangeGraphSizeDependents();\n this._mustRerender = true;\n }\n }\n const dataProcessingEnd = performance.now();\n\n const renderPipelineStart = performance.now();\n if (this._mustRerender) {\n this._render();\n }\n const renderPipelineEnd = performance.now();\n\n const generatorsStart = performance.now();\n if (this._mustCallGenerators) {\n this._callGenerators();\n }\n const generatorsEnd = performance.now();\n\n const tooltipStart = performance.now();\n if (this._tooltipsChanged) {\n this._recalculateTooltips();\n }\n const tooltipEnd = performance.now();\n\n const contextMenuStart = performance.now();\n if (this._contextMenuChanged) {\n this._recalculateContextMenu();\n }\n const contextMenuEnd = performance.now();\n\n const annotationStart = performance.now();\n if (this._annotationsChanged) {\n this._recalculateAnnotations();\n }\n const annotationEnd = performance.now();\n\n if (this._mustResize) {\n this.primaryRenderer.resizeDebounced();\n this.rangeGraphRenderer && this.rangeGraphRenderer.resizeDebounced();\n }\n\n this._frameRequested = false;\n this._mustRerender = false;\n this._dataChanged = false;\n this._primarySizeChanged = false;\n this._rangeGraphSizeChanged = false;\n this._modifiedSeries.clear();\n this._seriesChangedFromPromises.clear();\n this._tooltipsChanged = false;\n this._contextMenuChanged = false;\n this._annotationsChanged = false;\n this._mustCallGenerators = false;\n this._mustResize = false;\n\n const callbacksStart = performance.now();\n for (let emission of [...Object.values(this._deferredPriorityEmissions), ...Object.values(this._deferredEmissions)]) {\n this.emit(...emission);\n }\n const callbacksEnd = performance.now();\n this._deferredEmissions = {};\n this._deferredPriorityEmissions = {};\n\n const completionTime = performance.now();\n const loopTime = {\n frameExecution: completionTime - frameExecutionStart,\n frameRequestAndExecution: completionTime - frameRequestStart,\n generators: generatorsEnd - generatorsStart,\n dataProcessing: dataProcessingEnd - dataProcessingStart,\n renderPipeline: renderPipelineEnd - renderPipelineStart,\n tooltips: tooltipEnd - tooltipStart,\n contextMenu: contextMenuEnd - contextMenuStart,\n annotations: annotationEnd - annotationStart,\n callbacks: callbacksEnd - callbacksStart\n };\n this.lastLoopTime = loopTime;\n if (this._timingFrameCount) {\n if (this._timingBuffer.length < this._timingFrameCount) {\n this._timingBuffer.push(loopTime);\n } else {\n this._timingBuffer[this._timingIndex % this._timingFrameCount] = loopTime;\n }\n this._timingIndex++;\n }\n this.emit('render_time', completionTime - frameExecutionStart, loopTime);\n });\n }\n\n deferredEmit(...args) {\n this._deferredEmissions[args[0]] = args;\n }\n\n deferredPriorityEmit(...args) {\n this._deferredPriorityEmissions[args[0]] = args;\n }\n\n _seriesToSimpleData(singleSeries) {\n const type = inferType(singleSeries);\n if (SIMPLE_DATA_TYPES.includes(type)) {\n return singleSeries.data;\n }\n\n // get a reference to whatever you already have\n let currentData = this._dataCache.get(singleSeries.data);\n\n if (currentData && this._seriesChangedFromPromises.has(singleSeries.data)) {\n return currentData;\n }\n\n if (!currentData) {\n currentData = [];\n this._dataCache.set(singleSeries.data, currentData);\n singleSeries.simpleData = currentData;\n }\n\n if (type === 'object_observable' || type === 'tuple_observable') {\n let sameDataSet = this._observablesToSeries.get(singleSeries.data);\n if (sameDataSet) {\n const firstSameDataSeries = sameDataSet.values().next().value;\n currentData = firstSameDataSeries.simpleData;\n if (!currentData) {\n throw new Error(`Cannot find simpleData in ${firstSameDataSeries.name || firstSameDataSeries.yKey || firstSameDataSeries.data}`);\n }\n this._dataCache.set(singleSeries.data, currentData);\n singleSeries.simpleData = currentData;\n } else {\n sameDataSet = new Set();\n singleSeries.simpleData = currentData;\n this._observablesToSeries.set(singleSeries.data, sameDataSet);\n }\n\n sameDataSet.add(singleSeries);\n\n this._listenToObservableData({\n observable: singleSeries.data,\n currentData\n });\n }\n\n if (type === 'generator') {\n if (!this._generatorsToSeries.has(singleSeries.data)) {\n this._generatorsToSeries.set(singleSeries.data, new Set());\n }\n\n this._generatorsToSeries.get(singleSeries.data).add(singleSeries);\n\n if (!this._generators.has(singleSeries.data)) {\n this._generators.add(singleSeries.data);\n this._callGenerator(singleSeries.data);\n }\n }\n\n // return whatever you have; it'll fetch more in the background\n return currentData;\n }\n\n _listenToPromise(singleSeries, dataPromise) {\n dataPromise.then((resolved) => {\n this._dataCache.set(singleSeries.data, resolved);\n singleSeries.simpleData = resolved;\n this._seriesChangedFromPromises.add(singleSeries.data);\n this._dataChanged = true;\n this._markDirty();\n });\n }\n\n _listenToObservableData({ observable, currentData }) {\n if (this._subscriptions.has(observable)) { // someone else already listened to it\n return;\n }\n this._subscriptions.set(observable, true);\n\n // listen to the new data\n const listener = observable.observe((point) => {\n if (Array.isArray(point)) {\n for (let datum of point) {\n currentData.push(datum);\n }\n } else {\n currentData.push(point);\n }\n\n this.emit('observable_modified', observable);\n\n this.markObservableModified(observable);\n });\n this._subscriptions.set(observable, listener);\n }\n\n markObservableModified(observable) {\n if (!this._observablesToSeries.has(observable)) {\n return;\n }\n\n for (let singleSeries of this._observablesToSeries.get(observable)) {\n this._modifiedSeries.add(singleSeries);\n }\n this._markDirty();\n }\n\n _unsubscribeFromStaleSeries() {\n const currentSeries = new Set(this._series);\n for (let [observable, seriesSet] of this._observablesToSeries) {\n let stillHasListener = false;\n\n for (let singleSeries of seriesSet) {\n if (currentSeries.has(singleSeries)) {\n stillHasListener = true;\n break;\n }\n }\n\n if (!stillHasListener) {\n this._subscriptions.get(observable).unsubscribe();\n this._subscriptions.delete(observable);\n this._observablesToSeries.delete(observable);\n }\n }\n\n for (let [generator, seriesSet ] of this._generatorsToSeries) {\n let stillHasSeries = false;\n\n for (let singleSeries of seriesSet) {\n if (currentSeries.has(singleSeries)) {\n stillHasSeries = true;\n break;\n }\n }\n\n if (!stillHasSeries) {\n this._generatorsToSeries.delete(generator);\n this._generators.delete(generator);\n this._generatorCallArgs.delete(generator);\n }\n }\n }\n\n async _callGenerator(generator) {\n const parameters = {\n minX: this._selection.minX,\n maxX: this._selection.maxX,\n sizing: this.primaryRenderer.sizing\n };\n\n if (generatorParamsEqual(this._generatorCallArgs.get(generator), parameters)) {\n return;\n }\n this._generatorCallArgs.set(generator, parameters);\n\n // Note: potential race condition if generator is stupid. For now, we'll rely on generator being smart\n // Race condition: a new, faster one runs before completed\n const data = await Promise.resolve(generator(parameters));\n\n // do nothing if the generator returned nothing\n if (!data) {\n return;\n }\n\n // because calling the generator may have taken some time, check that there are still listeners for it\n if (!this._generatorsToSeries.has(generator)) {\n return;\n }\n\n this._dataChanged = true;\n this._markDirty();\n\n if (typeof data.observe === 'function') {\n const currentData = [];\n this._dataCache.set(generator, currentData);\n for (let singleSeries of this._generatorsToSeries.get(generator)) {\n singleSeries.simpleData = currentData;\n }\n\n for (let singleSeries of this._generatorsToSeries.get(generator)) {\n if (!this._observablesToSeries.has(data)) {\n this._observablesToSeries.set(data, new Set());\n }\n\n this._observablesToSeries.get(data).add(singleSeries);\n }\n\n this._listenToObservableData({\n observable: data,\n currentData\n });\n } else {\n this._dataCache.set(generator, data);\n for (let singleSeries of this._generatorsToSeries.get(generator)) {\n singleSeries.simpleData = data;\n }\n }\n }\n\n _callGenerators() {\n for (let generator of this._generators) {\n this._callGenerator(generator);\n }\n }\n\n _recalculateTooltips() {\n if (!this.primaryRenderer || !this.primaryRenderer.sizing) {\n return;\n }\n\n this._tooltipState = calculateTooltipState({\n mousePresent: this._tooltipState.mousePresent,\n mouseX: this._tooltipState.mouseX,\n mouseY: this._tooltipState.mouseY,\n sizing: this.primaryRenderer.sizing,\n series: this._series,\n alwaysTooltipped: this._alwaysTooltipped,\n savedTooltips: this._savedTooltips,\n allTooltipped: this._tooltipAllNext,\n closestSpacing: this._globalBounds.closestSpacing\n });\n this._tooltipAllNext = false;\n this.deferredEmit('tooltip_state_changed', this._tooltipState, this._tooltipStateArg);\n this._tooltipStateArg = null;\n }\n \n _recalculateContextMenu() {\n if (!this.primaryRenderer || !this.primaryRenderer.sizing) {\n return;\n }\n\n const boundingRect = this.primaryRenderer.boundingRect;\n const sizing = this.primaryRenderer.sizing;\n let value = null;\n let newX = null;\n \n for (let series of this._series) {\n const bounds = series.axis.currentBounds;\n \n newX = this._contextMenuPosition.x - boundingRect.left;\n \n // if it's on the right side, move it to the left one width\n if (this._contextMenuPosition.x > (boundingRect.right - sizing.elementWidth) * 2) newX -= 130;\n\n if (series.xKey === 'timestamp' || series.xKey === 'time' || series.xKey === 'date') {\n value = new Date((this._contextMenuPosition.x - boundingRect.left) / sizing.elementWidth * (bounds.maxX - bounds.minX) + bounds.minX);\n } else {\n value = (this._contextMenuPosition.x - boundingRect.left) / sizing.elementWidth * (bounds.maxX - bounds.minX) + bounds.minX;\n }\n }\n this._contextMenuPosition = {\n x: newX,\n y: this._contextMenuPosition.y - boundingRect.top,\n showing: this._contextMenuPosition.showing,\n value: value\n };\n this.deferredEmit('context_menu_position_changed', this._contextMenuPosition);\n }\n\n _recalculateAnnotations() {\n if (!this.primaryRenderer || !this.primaryRenderer.sizing) {\n return;\n }\n\n this._annotationsState = calculateAnnotationsState({\n annotations: this._annotations,\n series: this._series,\n sizing: this.primaryRenderer.sizing,\n selection: this._selection\n });\n this.deferredEmit('annotations_changed', this._annotationsState);\n }\n\n _onDataChange() {\n this._expandYWith = [];\n const dataBoundsList = [];\n\n for (let singleSeries of this._series) {\n if (singleSeries.hidden) {\n continue;\n }\n\n const simpleData = this._seriesToSimpleData(singleSeries);\n singleSeries.inDataSpace = simpleSeriesToDataSpace({\n ...singleSeries,\n data: simpleData\n }, {\n stateController: this\n });\n singleSeries.simpleDataSliceStart = simpleData.length;\n singleSeries.dataBounds = calculateDataBounds(singleSeries.inDataSpace);\n if (singleSeries.rendering === 'bar') {\n singleSeries.dataBounds = expandBounds(singleSeries.dataBounds, { extendXForNBars: singleSeries.inDataSpace.length, expandYWith: singleSeries.expandYWith });\n }\n\n dataBoundsList.push(singleSeries.dataBounds);\n\n if (singleSeries.expandYWith) {\n this._expandYWith.push(singleSeries.expandYWith);\n }\n }\n\n this._unsubscribeFromStaleSeries();\n\n this._dataBounds = mergeBounds(dataBoundsList);\n\n this._recalculateSelection({ disableSwap: true});\n\n for (let singleSeries of this._series) {\n if (singleSeries.hidden) {\n continue;\n }\n\n singleSeries.selectedBounds = calculateDataBounds(singleSeries.inSelectedSpace.data, { percentile: this._percentile, percentileAsymmetry: this._percentileAsymmetry });\n if (singleSeries.hasAreaBottom) {\n singleSeries.selectedBoundsAreaTop = singleSeries.selectedBounds;\n singleSeries.selectedBoundsAreaBottom = calculateDataBounds(singleSeries.inSelectedSpaceAreaBottom.data, { percentile: this._percentile, percentileAsymmetry: this._percentileAsymmetry });\n\n singleSeries.selectedBounds = mergeBounds([\n singleSeries.selectedBoundsAreaTop,\n singleSeries.selectedBoundsAreaBottom\n ]);\n }\n }\n\n this._recalculateAxisBounds();\n\n for (let singleSeries of this._series) {\n if (singleSeries.hidden) {\n continue;\n }\n\n this._calculatePrimarySizeDependents(singleSeries, { dataChanged: true });\n this._calculateRangeGraphSizeDependents(singleSeries, { dataChanged: true });\n }\n }\n\n _onDataAdd(modifiedSeries) {\n const newData = new Map();\n const modifiedAxes = new Set();\n\n const modifiedSeriesAndDependents = new Set();\n for (let singleSeries of modifiedSeries) {\n modifiedSeriesAndDependents.add(singleSeries);\n }\n\n for (let singleSeries of modifiedSeries) {\n modifiedAxes.add(singleSeries.axis);\n\n if (!singleSeries.inDataSpace) {\n throw new Error('inDataSpace must be present for onDataAdd to be called');\n }\n\n const simpleData = this._seriesToSimpleData(singleSeries);\n\n let prevY;\n if (singleSeries.inDataSpace.length) {\n prevY = singleSeries.inDataSpace[singleSeries.inDataSpace.length - 1][1];\n }\n\n const newDataInDataSpace = simpleSeriesToDataSpace(singleSeries, {\n data: simpleData.slice(singleSeries.simpleDataSliceStart || 0),\n valueXStart: singleSeries.inDataSpace.length,\n prevY,\n stateController: this\n });\n newData.set(singleSeries, newDataInDataSpace);\n singleSeries.simpleDataSliceStart = simpleData.length;\n\n if (newDataInDataSpace.length < 32) {\n singleSeries.inDataSpace.push(...newDataInDataSpace);\n } else {\n for (let point of newDataInDataSpace) {\n singleSeries.inDataSpace.push(point);\n }\n }\n\n let newDataBounds = calculateDataBounds(newDataInDataSpace);\n if (singleSeries.rendering === 'bar') {\n newDataBounds = expandBounds(newDataBounds, { extendXForNBars: singleSeries.inDataSpace.length, expandYWith: singleSeries.expandYWith });\n }\n\n singleSeries.dataBounds = mergeBounds([singleSeries.dataBounds, newDataBounds]);\n this._dataBounds = mergeBounds([this._dataBounds, newDataBounds]);\n\n // save these off for debugging only\n singleSeries.newPointCount = newDataInDataSpace.length;\n singleSeries.newDataBounds = newDataBounds;\n }\n\n const previousSelection = this._selection;\n this._recalculateSelection();\n\n for (let singleSeries of modifiedSeries) {\n if (!singleSeries.inSelectedSpace.data.length) { // empty, trivially fast\n singleSeries.selectedBounds = calculateDataBounds(singleSeries.inSelectedSpace.data);\n continue;\n }\n\n const firstX = singleSeries.inSelectedSpace.data[0][0];\n const lastX = singleSeries.inSelectedSpace.data[singleSeries.inSelectedSpace.data.length - 1][0];\n\n const oldBoundSubsetOfNewBounds = previousSelection.minX >= firstX && previousSelection.maxX <= lastX;\n\n if (!oldBoundSubsetOfNewBounds || this._percentile !== 100) {\n // this is significantly slower, but it's too complex to diff the old bounds and new bounds or diff percentiles\n // besides, it not being a subset hopefully means its a lower volume of data\n singleSeries.selectedBounds = calculateDataBounds(singleSeries.inSelectedSpace.data, { percentile: this._percentile, percentileAsymmetry: this._percentileAsymmetry});\n if (singleSeries.hasAreaBottom) {\n singleSeries.selectedBoundsAreaTop = singleSeries.selectedBounds;\n singleSeries.selectedBoundsAreaBottom = calculateDataBounds(singleSeries.inSelectedSpaceAreaBottom.data, { percentile: this._percentile, percentileAsymmetry: this._percentileAsymmetry });\n\n singleSeries.selectedBounds = mergeBounds([\n singleSeries.selectedBoundsAreaTop,\n singleSeries.selectedBoundsAreaBottom\n ]);\n }\n continue;\n }\n\n // note: we could do a binary search here, but there are typically only a few points added each frame, so it isn't worth it\n const newSelectedData = newData.get(singleSeries)\n .filter((tuple) => tuple[0] >= this._selection.minX && tuple[0] <= this._selection.maxX);\n\n singleSeries.newSelectedData = newSelectedData;\n singleSeries.selectedBounds = mergeBounds([singleSeries.selectedBounds, calculateDataBounds(newSelectedData)]);\n }\n\n this._recalculateAxisBounds();\n\n this.deferredPriorityEmit('axis_bounds_changed', this._axes.map(({ currentBounds }) => currentBounds));\n\n for (let axis of modifiedAxes) {\n for (let singleSeries of axis.series) {\n this._calculatePrimarySizeDependents(singleSeries);\n this._calculateRangeGraphSizeDependents(singleSeries);\n }\n }\n }\n\n _recalculateAxisBounds() {\n for (let axis of this._axes) {\n if (this._selection.fixedY || !this._autoscaleY) {\n axis.targetBounds = this._selection;\n if (axis.targetBounds.byAxis) {\n axis.targetBounds = axis.targetBounds.byAxis[axis.axisIndex];\n }\n\n axis.currentBounds = axis.targetBounds;\n continue;\n }\n\n const selectedBoundsList = [];\n const expandYWith = [];\n\n for (let singleSeries of axis.series) {\n selectedBoundsList.push(singleSeries.selectedBounds);\n\n if (singleSeries.expandYWith) {\n expandYWith.push(...singleSeries.expandYWith);\n }\n\n if (singleSeries.rendering === 'bar') {\n expandYWith.push(singleSeries.dataBounds.minY, singleSeries.dataBounds.maxY);\n }\n }\n\n axis.selectedDataBounds = mergeBounds(selectedBoundsList);\n axis.targetBounds = axis.currentBounds = expandBounds(axis.selectedDataBounds, {expandYWith});\n }\n this.deferredPriorityEmit('axis_bounds_changed', this._axes.map(({ currentBounds }) => currentBounds));\n }\n\n /**\n * Recalculates global bounds, selection, and data in selected space (for each series)\n * REQUIRES that this._dataBounds and this._expandYWith are set & up-to-date\n *\n * @private\n */\n _recalculateSelection({disableSwap = false}={}) {\n this._globalBounds = expandBounds(this._dataBounds, {expandYWith: this._expandYWith.flat()});\n this.deferredPriorityEmit('global_bounds_changed', this._globalBounds);\n this._selection = selectionFromGlobalBounds(this._globalBounds, this._boundsCalculator);\n this.deferredPriorityEmit('selection_changed', this._selection);\n\n for (let singleSeries of this._series) {\n if (singleSeries.hidden) {\n continue;\n }\n\n singleSeries.inSelectedSpace = dataSpaceToSelectedSpace({\n data: singleSeries.hasAreaBottom ? singleSeries.inDataSpace.filter((_, i) => i % 2 === 1) : singleSeries.inDataSpace,\n swap: disableSwap ? null : singleSeries.inSelectedSpace,\n minX: this._selection.minX,\n maxX: this._selection.maxX,\n ignoreDiscontinuities: singleSeries.ignoreDiscontinuities,\n square: singleSeries.square\n });\n\n if (singleSeries.hasAreaBottom) {\n singleSeries.inSelectedSpaceAreaBottom = dataSpaceToSelectedSpace({\n data:singleSeries.inDataSpace.filter((_, i) => i % 2 === 0),\n swap: disableSwap ? null : singleSeries.inSelectedSpaceAreaBottom,\n minX: this._selection.minX,\n maxX: this._selection.maxX,\n ignoreDiscontinuities: singleSeries.ignoreDiscontinuities,\n square: singleSeries.square\n });\n }\n }\n }\n\n _render() {\n if (!this.primaryRenderer || !this.primaryRenderer.sizing) {\n return;\n }\n\n this.primaryRenderer.clear();\n if (this.rangeGraphRenderer) {\n this.rangeGraphRenderer.clear();\n }\n\n for (let singleSeries of this._series) {\n if (singleSeries.hidden) {\n continue;\n }\n\n const shadowColor = singleSeries.shadowColor || {\n day: 'white',\n export: 'transparent',\n night: 'black'\n }[this._theme] || 'black';\n\n const shadowBlur = undefined;\n\n this.primaryRenderer.renderBackground(singleSeries.inBackgroundSpacePrimary);\n\n this.primaryRenderer.render(singleSeries, singleSeries.inRenderSpacePrimary, {\n highlighted: this._highlightedSeries === singleSeries.index,\n showIndividualPoints: this._showIndividualPoints,\n shadowColor,\n shadowBlur,\n defaultLineWidth: this._defaultLineWidth,\n globalBounds: this._globalBounds,\n inRenderSpaceAreaBottom: singleSeries.inRenderSpacePrimaryAreaBottom\n });\n\n if (this.rangeGraphRenderer && this.rangeGraphRenderer.sizing) {\n this.rangeGraphRenderer.render(singleSeries, singleSeries.inRenderSpaceRangeGraph, {\n shadowColor: 'transparent',\n shadowBlur: 0,\n width: 1,\n bounds: this._globalBounds,\n globalBounds: this._globalBounds,\n inRenderSpaceAreaBottom: singleSeries.inRenderSpaceRangeGraphAreaBottom\n });\n }\n }\n }\n\n _calculatePrimarySizeDependents(singleSeries, { dataChanged=false } = {}) {\n if (!this.primaryRenderer || !this.primaryRenderer.sizing) {\n return;\n }\n\n if (!singleSeries) {\n for (let s of this._series) {\n this._calculatePrimarySizeDependents(s);\n }\n return;\n }\n\n if (!this._series.includes(singleSeries)) {\n throw new Error('Series no longer exists');\n }\n\n if (singleSeries.hidden) {\n return;\n }\n\n const { currentBounds, scale } = singleSeries.axis;\n const renderWidth = Math.ceil(this.primaryRenderer.sizing.renderWidth/DPI_INCREASE);\n const renderHeight = Math.ceil(this.primaryRenderer.sizing.renderHeight);\n\n const toCondensedSelectedSpaceParams = {\n minX: currentBounds.minX,\n maxX: currentBounds.maxX,\n renderWidth,\n dataChanged\n };\n\n singleSeries.inCondensedSelectedSpacePrimary = condenseDataSpace({\n data: singleSeries.inSelectedSpace.data,\n swap: singleSeries.inCondensedSelectedSpacePrimary,\n ...toCondensedSelectedSpaceParams\n });\n\n const toRenderSpaceParams = {\n minX: currentBounds.minX,\n maxX: currentBounds.maxX,\n minY: currentBounds.minY,\n maxY: currentBounds.maxY,\n renderWidth,\n renderHeight,\n scale,\n dataChanged\n };\n\n singleSeries.inRenderSpacePrimary = selectedSpaceToRenderSpace({\n data: singleSeries.inCondensedSelectedSpacePrimary.data,\n swap: singleSeries.inRenderSpacePrimary,\n ...toRenderSpaceParams\n });\n\n singleSeries.inBackgroundSpacePrimary = selectedSpaceToBackgroundSpace({\n data: singleSeries.inCondensedSelectedSpacePrimary.data,\n background: singleSeries.background,\n swap: singleSeries.inBackgroundSpacePrimary,\n minX: currentBounds.minX,\n maxX: currentBounds.maxX\n });\n\n if (singleSeries.hasAreaBottom) {\n singleSeries.inCondensedSelectedSpacePrimaryAreaBottom = condenseDataSpace({\n data: singleSeries.inSelectedSpaceAreaBottom.data,\n swap: singleSeries.inCondensedSelectedSpacePrimaryAreaBottom,\n ...toCondensedSelectedSpaceParams\n });\n\n singleSeries.inRenderSpacePrimaryAreaBottom = selectedSpaceToRenderSpace({\n data: singleSeries.inCondensedSelectedSpacePrimaryAreaBottom.data,\n swap: singleSeries.inRenderSpacePrimaryAreaBottom,\n ...toRenderSpaceParams\n });\n\n singleSeries.inBackgroundSpacePrimaryAreaBottom = selectedSpaceToBackgroundSpace({\n data: singleSeries.inCondensedSelectedSpacePrimaryAreaBottom.data,\n background: singleSeries.background,\n swap: singleSeries.inBackgroundSpacePrimaryAreaBottom,\n minX: currentBounds.minX,\n maxX: currentBounds.maxX\n });\n }\n }\n\n _calculateRangeGraphSizeDependents(singleSeries, { dataChanged=false } = {}) {\n if (!this.rangeGraphRenderer || !this.rangeGraphRenderer.sizing) {\n return;\n }\n\n if (!singleSeries) {\n for (let s of this._series) {\n this._calculateRangeGraphSizeDependents(s);\n }\n return;\n }\n\n if (!this._series.includes(singleSeries)) {\n throw new Error('Series no longer exists');\n }\n\n if (singleSeries.hidden) {\n return;\n }\n\n const { scale } = singleSeries.axis;\n const globalBounds = this._globalBounds;\n const renderWidth = Math.ceil(this.rangeGraphRenderer.sizing.renderWidth/DPI_INCREASE);\n const renderHeight = Math.ceil(this.rangeGraphRenderer.sizing.renderHeight);\n\n const toSelectedSpaceParams = {\n minX: globalBounds.minX,\n maxX: globalBounds.maxX,\n ignoreDiscontinuities: singleSeries.ignoreDiscontinuities,\n square: singleSeries.square\n };\n\n singleSeries.inSelectedSpaceRangeGraph = dataSpaceToSelectedSpace({\n data: singleSeries.hasAreaBottom ? singleSeries.inDataSpace.filter((_, i) => i % 2 === 1) : singleSeries.inDataSpace,\n swap: singleSeries.inSelectedSpaceRangeGraph,\n ...toSelectedSpaceParams\n });\n\n const toCondensedSelectedSpaceParams = {\n minX: globalBounds.minX,\n maxX: globalBounds.maxX,\n renderWidth,\n dataChanged\n };\n\n singleSeries.inCondensedSelectedSpaceRangeGraph = condenseDataSpace({\n data: singleSeries.inSelectedSpaceRangeGraph.data,\n swap: singleSeries.inCondensedSelectedSpaceRangeGraph\n });\n\n const toRenderSpaceParams = {\n minX: globalBounds.minX,\n maxX: globalBounds.maxX,\n minY: globalBounds.minY,\n maxY: globalBounds.maxY,\n renderWidth,\n renderHeight,\n scale,\n dataChanged\n };\n\n singleSeries.inRenderSpaceRangeGraph = selectedSpaceToRenderSpace({\n data: singleSeries.inCondensedSelectedSpaceRangeGraph.data,\n swap: singleSeries.inRenderSpaceRangeGraph,\n ...toRenderSpaceParams\n });\n\n if (singleSeries.hasAreaBottom) {\n singleSeries.inSelectedSpaceRangeGraphAreaBottom = dataSpaceToSelectedSpace({\n data: singleSeries.inDataSpace.filter((_, i) => i % 2 === 0), // take the odd points for area bottom\n swap: singleSeries.inSelectedSpaceRangeGraphAreaBottom,\n ...toSelectedSpaceParams\n });\n\n singleSeries.inCondensedSelectedSpaceRangeGraphAreaBottom = condenseDataSpace({\n data: singleSeries.inSelectedSpaceRangeGraphAreaBottom.data,\n swap: singleSeries.inCondensedSelectedSpaceRangeGraphAreaBottom,\n ...toCondensedSelectedSpaceParams\n });\n\n singleSeries.inRenderSpaceRangeGraphAreaBottom = selectedSpaceToRenderSpace({\n data: singleSeries.inCondensedSelectedSpaceRangeGraphAreaBottom.data,\n swap: singleSeries.inRenderSpaceRangeGraphAreaBottom,\n ...toRenderSpaceParams\n });\n }\n }\n\n _createAxis({ side }) {\n const axis = {\n series: [],\n scale: 'linear',\n side,\n axisIndex: this._axes.length\n };\n this._axes.push(axis);\n return axis;\n }\n\n _moveAxis(singleSeries, axisIndex) {\n if (!this._series.includes(singleSeries)) {\n throw new Error('Series no longer exists');\n }\n\n let newAxis;\n if (axisIndex === 'new-left' || axisIndex === 'new-right') {\n newAxis = this._createAxis({ side: axisIndex.split('-')[1] });\n } else {\n newAxis = this._axes[parseInt(axisIndex)];\n }\n\n if (singleSeries.axis === newAxis) {\n return;\n }\n\n const oldAxis = singleSeries.axis;\n const oldIndex = oldAxis.series.indexOf(singleSeries);\n if (oldIndex === -1) {\n throw new Error('Series not present in axis');\n }\n oldAxis.series.splice(oldIndex, 1);\n\n newAxis.series.push(singleSeries);\n singleSeries.axis = newAxis;\n\n this._dataChanged = true;\n this.deferredEmit('axes_changed', this._axes);\n this.deferredEmit('left_axes_changed', this.leftAxes);\n this.deferredEmit('right_axes_changed', this.rightAxes);\n this.deferredEmit('exported_axes_changed', this.exportedAxes);\n this._markDirty();\n }\n\n _assignAxisTo(singleSeries) {\n if (singleSeries.axis && typeof singleSeries.axis === 'object') {\n return;\n }\n\n let axis;\n\n if (singleSeries.axisIndex) {\n const { axisIndex } = singleSeries;\n\n if (axisIndex === 'new-left' || axisIndex === 'new-right') {\n axis = this._createAxis({ side: axisIndex.split('-')[1] });\n } else {\n axis = this._axes[parseInt(axisIndex)];\n }\n } else if (singleSeries.axis) {\n singleSeries.originalAxis = singleSeries.axis;\n let [side, number] = singleSeries.axis.split('-');\n axis = findMatchingAxis({ axes: this._axes, side, number });\n\n if (!axis) {\n axis = this._createAxis({\n side\n });\n }\n } else {\n axis = this._axes[0];\n }\n\n axis.series.push(singleSeries);\n singleSeries.axis = axis;\n\n this.deferredEmit('axes_changed', this._axes);\n this.deferredEmit('exported_axes_changed', this.exportedAxes);\n\n if (singleSeries.axis.side === 'left') {\n this.deferredEmit('left_axes_changed', this.leftAxes);\n } else {\n this.deferredEmit('right_axes_changed', this.rightAxes);\n }\n }\n\n _removeSeries(singleSeries) {\n this._seriesFromOriginalSeries.delete(singleSeries.originalSeries);\n\n const { axis, data } = singleSeries;\n axis.series.splice(axis.series.indexOf(singleSeries), 1);\n const sameDataSet = this._observablesToSeries.get(data);\n if (sameDataSet) {\n sameDataSet.delete(singleSeries);\n if (sameDataSet.size === 0) {\n this._observablesToSeries.delete(data);\n }\n }\n\n if (this._generatorsToSeries.has(data)) {\n this._generatorsToSeries.get(data).delete(singleSeries);\n if (this._generatorsToSeries.get(data).size === 0) {\n this._generatorsToSeries.delete(data);\n this._generators.delete(data);\n }\n }\n\n this._alwaysTooltipped.delete(singleSeries);\n\n singleSeries.axis = singleSeries.originalAxis;\n delete singleSeries.originalAxis;\n delete singleSeries.inDataSpace;\n delete singleSeries.inSelectedSpace;\n delete singleSeries.inValueSpacePrimary;\n delete singleSeries.inValueSpaceRangeGraph;\n delete singleSeries.inRenderSpacePrimary;\n delete singleSeries.inRenderSpaceRangeGraph;\n delete singleSeries.newPointCount;\n delete singleSeries.newDataBounds;\n delete singleSeries.simpleDataSliceStart;\n\n this.deferredEmit('axes_changed', this._axes);\n this.deferredEmit('exported_axes_changed', this.exportedAxes);\n\n if (axis.side === 'left') {\n this.deferredEmit('left_axes_changed', this.leftAxes);\n } else {\n this.deferredEmit('right_axes_changed', this.rightAxes);\n }\n }\n\n _hideSeries(singleSeries) {\n const { axis } = singleSeries;\n const indexInAxis = axis.series.indexOf(singleSeries);\n singleSeries.indexInAxis = indexInAxis;\n axis.series.splice(indexInAxis, 1);\n\n this.deferredEmit('axes_changed', this._axes);\n\n if (axis.side === 'left') {\n this.deferredEmit('left_axes_changed', this.leftAxes);\n } else {\n this.deferredEmit('right_axes_changed', this.rightAxes);\n }\n }\n\n _showSeries(singleSeries) {\n const { axis } = singleSeries;\n axis.series.splice(singleSeries.indexInAxis, 0, singleSeries);\n\n this.deferredEmit('axes_changed', this._axes);\n\n if (axis.side === 'left') {\n this.deferredEmit('left_axes_changed', this.leftAxes);\n } else {\n this.deferredEmit('right_axes_changed', this.rightAxes);\n }\n }\n\n /*\n * Getters\n *******************\n */\n\n get boundCalculator() {\n return this._boundsCalculator;\n }\n\n get axes() {\n return this._axes;\n }\n\n get leftAxes() {\n const leftAxes = this._axes.filter(({ side, series }) => side === 'left' && series.length > 0).reverse();\n\n if (leftAxes.length === 0 && this.rightAxes.length === 0) {\n leftAxes.push(this._axes[0]);\n }\n\n return leftAxes;\n }\n\n get rightAxes() {\n return this._axes.filter(({ side, series }) => side === 'right' && series.length > 0 );\n }\n\n get bounds() {\n return this._axes.map(({ targetBounds }) => targetBounds);\n }\n\n get selection() {\n return this._selection;\n }\n\n get globalBounds() {\n return this._globalBounds;\n }\n\n get series() {\n return this._series;\n }\n\n get highlightedSeries() {\n return this._highlightedSeries;\n }\n\n get showIndividualPoints() {\n return this._showIndividualPoints;\n }\n\n get autoscaleY() {\n return this._autoscaleY;\n }\n\n get boundHistory() {\n return {\n hasNextBounds: this._boundsIndex < this._boundsHistory.length - 1,\n hasPreviousBounds: this._boundsIndex > 0\n };\n }\n\n get tooltipState() {\n return this._tooltipState;\n }\n \n get contextMenuState() {\n return this._contextMenuPosition;\n }\n\n get alwaysTooltipped() {\n return this._alwaysTooltipped;\n }\n\n get draggingY() {\n return this._draggingY;\n }\n\n get averageLoopTime() {\n return averageLoopTimes(this._timingBuffer);\n }\n\n get exportedAxes() {\n const axisToName = new Map();\n let leftCount = 0;\n let rightCount = 0;\n\n for (let axis of this._axes) {\n let name;\n if (axis.side === 'left') {\n name = `left-${leftCount}`;\n leftCount++;\n } else {\n name = `right-${rightCount}`;\n rightCount++;\n }\n\n for (let singleSeries of axis.series) {\n axisToName.set(singleSeries, name);\n }\n }\n\n return this.series.map((singleSeries) => {\n return {\n ...singleSeries.originalSeries,\n axis: axisToName.get(singleSeries)\n };\n });\n }\n\n get percentile() {\n return this._percentile;\n }\n\n get percentileAsymmetry() {\n return this._percentileAsymmetry;\n }\n\n get showingOptions() {\n return this._showingOptions;\n }\n\n get maxPrecision() {\n return this._maxPrecision;\n }\n\n get showingSidebar() {\n return this._showingSidebar;\n }\n\n get showingAnnotations() {\n return this._showingAnnotations;\n }\n\n get userCreatedSeries() {\n return this._series.filter((singleSeries) => singleSeries.userCreated);\n }\n\n get grapherID() {\n return this._grapherID;\n }\n\n get annotationState() {\n return this._annotationsState;\n }\n\n get sizing() {\n return this.primaryRenderer && this.primaryRenderer.sizing;\n }\n\n get theme() {\n return this._theme;\n }\n\n get exportMode() {\n return this._exportMode;\n }\n\n get enumMap() {\n return this._enumMap;\n }\n\n get hasXEnum() {\n return this._hasXEnum;\n }\n\n /*\n * Setters / ways to mutate the state that aren't the underlying data changing\n ***********************************************************************************\n */\n\n markSizeChanged(renderer) {\n if (renderer === this.primaryRenderer) {\n this.deferredEmit('primary_size_change', this.primaryRenderer.sizing);\n this.deferredEmit('primary_bounding_rect_change', this.primaryRenderer.boundingRect);\n this._primarySizeChanged = true;\n } else if (renderer === this.rangeGraphRenderer) {\n this.deferredEmit('range_graph_size_change', this.rangeGraphRenderer.sizing);\n this.deferredEmit('range_graph_bounding_rect_change', this.rangeGraphRenderer.boundingRect);\n this._rangeGraphSizeChanged = true;\n }\n\n this._mustRerender = true;\n this._tooltipsChanged = true;\n this._annotationsChanged = true;\n this._mustCallGenerators = true;\n this._markDirty();\n }\n\n set theme(value) {\n this._theme = value;\n this._mustRerender = true;\n this.deferredEmit('theme_change', this._theme);\n this._markDirty();\n }\n\n set exportMode(value) {\n this._exportMode = value;\n\n if (value) {\n this._nonExportTheme = this.theme;\n this.theme = 'export';\n } else {\n this.theme = this._nonExportTheme;\n }\n\n this.deferredEmit('export_mode_change', this._exportMode);\n this._markDirty();\n }\n\n set defaultLineWidth(value) {\n this._defaultLineWidth = value;\n this._mustRerender = true;\n this._markDirty();\n }\n\n set boundCalculator(boundingFunction) {\n if (!boundingFunction) {\n return;\n }\n\n if (boundingFunction === this._boundsCalculator) {\n return;\n }\n\n if (boundingFunction.debounceHistory) {\n clearTimeout(this._boundingCalculatorDebouncer);\n this._boundingCalculatorDebouncer = setTimeout(() => {\n this._addBoundCalculatorToHistory(boundingFunction);\n }, 250);\n } else {\n this._addBoundCalculatorToHistory(boundingFunction);\n }\n\n this._boundsCalculator = boundingFunction;\n this.deferredEmit('bound_calculator_changed', this._boundsCalculator);\n this._dataChanged = true;\n this._mustCallGenerators = true;\n this._markDirty();\n }\n\n set customBoundsSelectors(boundsSelectors) {\n this._customBoundsSelectors = this._customBoundsSelectors || {};\n\n const indexedCustomBoundSelectors = {};\n\n for (let { label, calculator } of boundsSelectors) {\n indexedCustomBoundSelectors[label] = calculator;\n\n if (this._boundsCalculator === this._customBoundsSelectors[label] && this._boundsCalculator !== calculator) {\n this.boundCalculator = calculator;\n }\n }\n\n this._customBoundsSelectors = indexedCustomBoundSelectors;\n }\n\n _addBoundCalculatorToHistory(boundingFunction) {\n this._boundsIndex++;\n this._boundsHistory = this._boundsHistory.slice(0, this._boundsIndex);\n this._boundsHistory.push(boundingFunction);\n this.emit('bound_history_changed', this.boundHistory);\n }\n\n registerSeriesClick(selectedSeriesIndex) {\n this.emit('series_click', this._series[selectedSeriesIndex], selectedSeriesIndex);\n }\n\n setHighlightedSeries(highlightedSeries) {\n this._highlightedSeries = highlightedSeries;\n this.deferredEmit('highlighted_series_changed', highlightedSeries);\n this._mustRerender = true;\n this._markDirty();\n }\n\n toggleIndividualPoints() {\n this._showIndividualPoints = !this._showIndividualPoints;\n this.deferredEmit('show_individual_points_changed', this._showIndividualPoints);\n this._mustRerender = true;\n this._markDirty();\n }\n\n toggleYAutoscaling() {\n this._autoscaleY = !this._autoscaleY;\n this.deferredEmit('autoscale_y_changed', this._autoscaleY);\n this._markDirty();\n }\n\n toggleExportMode() {\n this.exportMode = !this._exportMode;\n }\n\n setBoundsFromSelection(pixelSelection) {\n this.boundCalculator = boundCalculatorFromSelection(pixelSelection, {\n elementWidth: this.primaryRenderer.sizing.elementWidth,\n elementHeight: this.primaryRenderer.sizing.elementHeight,\n selection: this._selection,\n axes: this._axes\n });\n }\n\n nextBounds() {\n this._boundsIndex++;\n this._boundsCalculator = this._boundsHistory[this._boundsIndex];\n this.deferredEmit('bound_calculator_changed', this._boundsCalculator);\n this.deferredEmit('bound_history_changed', this.boundHistory);\n this._dataChanged = true;\n this._markDirty();\n }\n\n previousBounds() {\n this._boundsIndex--;\n this._boundsCalculator = this._boundsHistory[this._boundsIndex];\n this.deferredEmit('bound_calculator_changed', this._boundsCalculator);\n this.deferredEmit('bound_history_changed', this.boundHistory);\n this._dataChanged = true;\n this._markDirty();\n }\n\n setLabel({ axisIndex, label }) {\n this._axes[axisIndex].label = label;\n this.deferredEmit('axes_changed', [...this._axes]);\n this._markDirty();\n }\n\n toggleScale({ axisIndex }) {\n const oldScale = this._axes[axisIndex].scale;\n this._axes[axisIndex].scale = oldScale === 'log' ? 'linear' : 'log';\n\n this._dataChanged = true;\n this.deferredEmit('axes_changed', [...this._axes]);\n this._markDirty();\n }\n\n recalculateTooltips() {\n this.primaryRenderer.recalculatePosition();\n this.setTooltipMousePosition({\n clientX: this._tooltipClientX,\n clientY: this._tooltipClientY,\n shiftKey: this.shiftKeyPressedOnMove,\n tooltipAllNext: this._tooltipAllNext,\n tooltipStateArg: this._tooltipStateArg\n });\n }\n\n setTooltipMousePosition({ clientX, clientY, shiftKey, mouseX, mouseY, tooltipAllNext, tooltipStateArg }) {\n const sizing = this.primaryRenderer.sizing;\n if (!sizing) {\n return;\n }\n\n if (typeof clientX === 'number') {\n this._tooltipClientX = clientX;\n\n if (clientX < sizing.boundingRect.left || clientX > sizing.boundingRect.right) {\n this.showOnlySavedTooltips();\n return;\n }\n } else if (typeof mouseY !== 'number') {\n return;\n }\n\n if (typeof clientY === 'number') {\n this._tooltipClientY = clientY;\n\n if (clientY < sizing.boundingRect.top || clientY > sizing.boundingRect.bottom) {\n this.showOnlySavedTooltips();\n return;\n }\n } else if (typeof mouseY !== 'number') {\n return;\n }\n\n const newMouseX = mouseX || (clientX - sizing.boundingRect.left);\n const newMouseY = mouseY || (clientY - sizing.boundingRect.top);\n if (this._tooltipState.mousePresent && newMouseX === this._tooltipState.mouseX && newMouseY === this._tooltipState.mouseY) {\n return;\n }\n\n this._tooltipsChanged = true;\n this._tooltipState.mousePresent = true;\n this._tooltipState.mouseX = newMouseX;\n this._tooltipState.mouseY = newMouseY;\n this.shiftKeyPressedOnMove = shiftKey;\n this._tooltipAllNext = tooltipAllNext;\n this._tooltipStateArg = tooltipStateArg;\n this._markDirty();\n }\n \n setContextMenuMousePosition({ clientX, clientY }) {\n this._contextMenuPosition = { x: clientX, y: clientY, showing: !this._contextMenuPosition.showing };\n this._contextMenuChanged = true;\n this._markDirty();\n }\n\n toggleAlwaysTooltipped(singleSeries, shiftKey) {\n if (this._alwaysTooltipped.has(singleSeries)) {\n if (shiftKey) {\n this._alwaysTooltipped.clear();\n } else {\n this._alwaysTooltipped.delete(singleSeries);\n }\n } else {\n if (shiftKey) {\n for (let series of this._series) {\n this._alwaysTooltipped.add(series);\n }\n } else {\n this._alwaysTooltipped.add(singleSeries);\n }\n }\n\n this._tooltipsChanged = true;\n this.deferredEmit('always_tooltipped_changed', this._alwaysTooltipped);\n this._markDirty();\n }\n\n showOnlySavedTooltips(tooltipStateArg) {\n if (!this._tooltipState.mousePresent) {\n return;\n }\n\n this._tooltipsChanged = true;\n this._tooltipState.mousePresent = false;\n this._tooltipStateArg = tooltipStateArg;\n this._markDirty();\n }\n\n registerClick({ clientX }) {\n if (!this._listeners['series_click']) {\n return;\n }\n\n const boundingRect = this.primaryRenderer.boundingRect;\n const sizing = this.primaryRenderer.sizing;\n\n for (let series of this._series) {\n const bounds = series.axis.currentBounds;\n\n const x = (clientX - boundingRect.left) / sizing.elementWidth * (bounds.maxX - bounds.minX) + bounds.minX;\n this.emit('series_click', { x, series });\n }\n }\n\n toggleTooltipSaved() {\n const oldSavedTooltips = this._savedTooltips;\n this._savedTooltips = toggleTooltipSaved({\n currentTooltips: this._tooltipState.tooltips,\n savedTooltips: this._savedTooltips\n });\n this._tooltipsChanged = this._savedTooltips !== oldSavedTooltips;\n this._markDirty();\n }\n\n clearSavedTooltips() {\n if (this._savedTooltips.length === 0) {\n return;\n }\n\n this._savedTooltips = [];\n this._tooltipsChanged = true;\n this._markDirty();\n }\n\n markDragStart() {\n if (this._draggingY) {\n return;\n }\n\n this._draggingY = true;\n this.deferredEmit('dragging_y_changed', this._draggingY);\n this._markDirty();\n }\n\n finalizeDrag(draggedSeries, axisIndex, grapherID) {\n if (!this._draggingY) {\n return;\n }\n\n this._draggingY = false;\n this.deferredEmit('dragging_y_changed', this._draggingY);\n\n const hasAxis = axisIndex && axisIndex !== 0;\n const sameGrapherID = grapherID === this._grapherID;\n\n if (hasAxis && sameGrapherID) {\n this._moveAxis(draggedSeries, axisIndex);\n this.deferredEmit('dragging_y_finalized', { draggedSeries, axisIndex, grapherID });\n } else if (grapherID) {\n this.deferredEmit('dragging_y_finalized', { draggedSeries, axisIndex, grapherID });\n }\n\n this._markDirty();\n }\n\n set timingFrameCount(value) {\n if (typeof value !== 'number') {\n return;\n }\n\n this._timingBuffer = [];\n this._timingIndex = 0;\n this._timingFrameCount = value;\n }\n\n set percentile(value) {\n if (value === undefined) {\n return;\n }\n\n this.deferredEmit('percentile_changed', value);\n\n if (value === '') {\n value = 100;\n }\n\n value = parseFloat(value);\n if (!isNaN(value) && value <= 100 && value >= 0) {\n this._percentile = value;\n this._dataChanged = true;\n }\n\n this._markDirty();\n }\n\n set percentileAsymmetry(value) {\n if (value === undefined) {\n return;\n }\n\n this.deferredEmit('percentile_asymmetry_changed', value);\n\n if (value === '') {\n value = 0;\n }\n\n value = parseFloat(value);\n if (!isNaN(value) && value <= 50 && value >= -50) {\n this._percentileAsymmetry = value;\n this._dataChanged = true;\n }\n\n this._markDirty();\n }\n\n set showingOptions(value) {\n if (value === undefined) {\n return;\n }\n\n this._showingOptions = value;\n this.deferredEmit('showing_options_changed', value);\n this._markDirty();\n }\n\n toggleShowingOptions() {\n this.showingOptions = !this.showingOptions;\n }\n\n toggleMaxPrecision() {\n this._maxPrecision = !this._maxPrecision;\n this.deferredEmit('max_precision_changed', this._maxPrecision);\n this._markDirty();\n }\n\n toggleShowingAnnotations() {\n this._showingAnnotations = !this._showingAnnotations;\n this.deferredEmit('showing_annotations_changed', this._showingAnnotations);\n this._markDirty();\n }\n\n toggleShowingSidebar() {\n this._showingSidebar = !this._showingSidebar;\n this.deferredEmit('showing_sidebar_changed', this._showingSidebar);\n this._markDirty();\n }\n\n setShowing(singleSeries, showing) {\n singleSeries.hidden = !showing;\n this._series = [...this._series];\n\n if (singleSeries.hidden) {\n this._hideSeries(singleSeries);\n } else {\n this._showSeries(singleSeries);\n }\n\n this.deferredEmit('series_changed', this._series, { skipResize: true });\n this._dataChanged = true;\n this._markDirty();\n }\n\n set annotations(value) {\n this._annotations = value || [];\n this._annotationsChanged = true;\n this._markDirty();\n }\n\n /**\n * Converts an enum to a number, mutating saved state if necessary to track that\n *\n * @param {String} value\n * @param {Object} singleSeries\n * @param {Boolean} [isX]\n * @return {Number}\n */\n enumToNumber(value, singleSeries, isX) {\n const existingIndex = this._enumMap[value];\n if (typeof existingIndex === 'number') {\n return existingIndex;\n }\n\n const indexToSet = Object.keys(this._enumMap).length;\n this._enumMap[value] = indexToSet;\n\n // safely handle reference changes\n this._series[singleSeries.index].hasEnum = true;\n if (isX) {\n this._series[singleSeries.index].hasXEnum = true;\n this._hasXEnum = true;\n this.deferredEmit('has_x_enum_change', this._hasXEnum);\n this.deferredEmit('x_enum_map_change', this._enumMap);\n }\n\n this.deferredEmit('enum_map_change', this._enumMap);\n\n return indexToSet;\n }\n\n triggerResize() {\n this._mustResize = true;\n this._markDirty();\n }\n}\n","import BOUND_CALCULATORS from './bound_calculators';\n\nexport default function getDefaultBoundsCalculator(givenLabel, customCalculators) {\n if (BOUND_CALCULATORS[givenLabel]) {\n return BOUND_CALCULATORS[givenLabel];\n }\n\n for (let { label, calculator } of customCalculators) {\n if (givenLabel === label) {\n return calculator;\n }\n }\n\n return BOUND_CALCULATORS.all;\n}\n","export default function generatorParamsEqual(a, b) {\n if (a === undefined || b === undefined) {\n return a === b;\n }\n\n return (a.minX === b.minX) &&\n (a.maxX === b.maxX) &&\n (a.sizing.elementWidth === b.sizing.elementWidth) &&\n (a.sizing.renderWidth === b.sizing.renderWidth);\n}\n","import nameForSeries from '../helpers/name_for_series.js';\n\nexport default function calculateAnnotationsState({ annotations, series, sizing, selection }) {\n const shownSeries = new Set(series.map((singleSeries, i) => {\n return {\n name: nameForSeries(singleSeries, i),\n hidden: singleSeries.hidden\n };\n }).filter(({ hidden }) => !hidden).map(({ name }) => name));\n\n const { elementWidth } = sizing;\n const { minX, maxX } = selection;\n\n const renderableAnnotations = annotations.filter((annotation) => {\n if (!annotation.series) {\n return true;\n }\n\n for (let seriesName of annotation.series) {\n if (shownSeries.has(seriesName)) {\n return true;\n }\n }\n\n return false;\n }).map((annotation) => {\n let xAsNumber = annotation.x;\n if (typeof xAsNumber === 'string') {\n xAsNumber = new Date(xAsNumber).valueOf();\n } else if (xAsNumber instanceof Date) {\n xAsNumber = xAsNumber.valueOf();\n }\n\n let xEndAsNumber = annotation.xEnd || xAsNumber;\n if (typeof xEndAsNumber === 'string') {\n xEndAsNumber = new Date(xEndAsNumber).valueOf();\n } else if (xEndAsNumber instanceof Date) {\n xEndAsNumber = xEndAsNumber.valueOf();\n }\n\n const xStart = Math.min(xAsNumber, xEndAsNumber);\n const xEnd = Math.max(xAsNumber, xEndAsNumber);\n\n const pixelX = (xStart - minX)/(maxX - minX) * elementWidth;\n const pixelEnd = (xEnd - minX)/(maxX - minX) * elementWidth;\n const width = Math.max(pixelEnd - pixelX, 1);\n\n return {\n ...annotation,\n pixelX,\n width\n };\n });\n\n return {\n annotations: renderableAnnotations,\n elementWidth\n };\n}\n","export default function selectionFromGlobalBounds(globalBounds, boundsCalculator) {\n const targetBounds = Object.assign({}, globalBounds, boundsCalculator(globalBounds));\n\n if (targetBounds.maxX instanceof Date) {\n targetBounds.maxX = targetBounds.maxX.valueOf();\n }\n\n if (targetBounds.minX instanceof Date) {\n targetBounds.minX = targetBounds.minX.valueOf();\n }\n\n if (targetBounds.maxX < targetBounds.minX) {\n targetBounds.maxX = targetBounds.minX;\n }\n\n if (targetBounds.minX < globalBounds.minX) {\n targetBounds.minX = globalBounds.minX;\n }\n\n if (targetBounds.maxX > globalBounds.maxX) {\n targetBounds.maxX = globalBounds.maxX;\n }\n\n return targetBounds;\n}\n","/**\n *\n * @param {Array<Object>} axes\n * @param {'left'|'right'} [side]\n * @param {String|Number} [number]\n * @return {Object|undefined}\n */\nexport default function findMatchingAxis({ axes, side, number }) {\n if (number) {\n number = parseInt(number) || 0;\n } else {\n number = 0;\n }\n\n let axis;\n let seen = 0;\n for (let candidateAxis of axes) {\n if (candidateAxis.side !== side) {\n continue;\n }\n\n if (seen === number) {\n axis = candidateAxis;\n break;\n }\n\n seen++;\n }\n\n return axis;\n}\n","export function averageLoopTimes(loopTimes) {\n const result = {};\n\n for (let loopTime of loopTimes) {\n for (let [key, value] of Object.entries(loopTime)) {\n result[key] = (result[key] || 0) + value;\n }\n }\n\n for (let [key, value] of Object.entries(result)) {\n result[key] = value/loopTimes.length;\n }\n\n return result;\n}\n","import scaleBounds from '../renderer/scale_bounds';\n\nexport default function boundCalculatorFromSelection({ minPixelX, maxPixelX, minPixelY, maxPixelY}, { elementWidth, elementHeight, selection, axes }) {\n if (Math.abs(maxPixelX - minPixelX) < 1 || Math.abs(maxPixelY - minPixelY) < 1) {\n return;\n }\n\n const minX = (minPixelX/elementWidth)*(selection.maxX - selection.minX) + selection.minX;\n const maxX = (maxPixelX/elementWidth)*(selection.maxX - selection.minX) + selection.minX;\n\n const byAxis = [];\n for (let { currentBounds, scale } of axes) {\n const scaledBounds = scaleBounds({ ...currentBounds, scale });\n let maxY = (1 - minPixelY/elementHeight)*(scaledBounds.maxY - scaledBounds.minY) + scaledBounds.minY;\n let minY = (1 - maxPixelY/elementHeight)*(scaledBounds.maxY - scaledBounds.minY) + scaledBounds.minY;\n\n if (scale === 'log') {\n minY = Math.pow(10, minY);\n maxY = Math.pow(10, maxY);\n }\n byAxis.push({\n minX,\n maxX,\n minY,\n maxY\n });\n }\n\n return () => {\n return {\n minX,\n maxX,\n byAxis\n };\n };\n}\n","import { useState, useEffect } from 'react';\n\nexport function useEvent(eventSource, eventName, initialState=null, watch=[]) {\n if (typeof initialState === 'function') {\n const originalInitialState = initialState;\n initialState = () => originalInitialState;\n }\n\n const [value, setValue] = useState(initialState);\n\n useEffect(() => {\n const listener = (updatedValue) => {\n if (typeof updatedValue === 'function') {\n const originalUpdatedValue = updatedValue;\n updatedValue = () => originalUpdatedValue;\n }\n setValue(updatedValue);\n };\n\n eventSource.on(eventName, listener);\n return () => {\n eventSource.off(eventName, listener);\n };\n }, [...watch, setValue, eventSource]);\n\n return value;\n}\n\nexport function usePrimarySize(stateController) {\n return useEvent(stateController, 'primary_size_change', stateController.primaryRenderer ? stateController.primaryRenderer.sizing : {\n elementWidth: 0,\n elementHeight: 0,\n renderWidth: 0,\n renderHeight: 0\n });\n}\n\nexport function useAxes(stateController) {\n return useEvent(stateController, 'axes_changed', stateController.axes);\n}\n\nexport function useSeries(stateController) {\n return useEvent(stateController, 'series_changed', stateController.series);\n}\n\nexport function useHighlightedSeries(stateController) {\n return useEvent(stateController, 'highlighted_series_changed', stateController.highlightedSeries);\n}\n\nexport function useRightAxisCount(stateController) {\n return useRightAxes(stateController).length;\n}\n\nexport function useLeftAxisCount(stateController) {\n return useLeftAxes(stateController).length;\n}\n\nexport function useRightAxes(stateController) {\n return useEvent(stateController, 'right_axes_changed', stateController.rightAxes);\n}\n\nexport function useLeftAxes(stateController) {\n return useEvent(stateController, 'left_axes_changed', stateController.leftAxes);\n}\n\nexport function useSelection(stateController) {\n return useEvent(stateController, 'selection_changed', stateController.selection);\n}\n\nexport function useGlobalBounds(stateController) {\n return useEvent(stateController, 'global_bounds_changed', stateController.globalBounds);\n}\n\nexport function useAxisBounds(stateController) {\n return useEvent(stateController, 'axis_bounds_changed', stateController.axes.map(({ currentBounds }) => currentBounds));\n}\n\nexport function useBoundCalculator(stateController) {\n return useEvent(stateController, 'bound_calculator_changed', stateController.boundCalculator);\n}\n\nexport function useShowIndividualPoints(stateController) {\n return useEvent(stateController, 'show_individual_points_changed', stateController.showIndividualPoints);\n}\n\nexport function useAutoscaleY(stateController) {\n return useEvent(stateController, 'autoscale_y_changed', stateController.autoscaleY);\n}\n\nexport function useBoundHistory(stateController) {\n return useEvent(stateController, 'bound_history_changed', stateController.boundHistory);\n}\n\nexport function useAlwaysTooltipped(stateController) {\n return useEvent(stateController, 'always_tooltipped_changed', stateController.alwaysTooltipped);\n}\n\nexport function useTooltipState(stateController) {\n return useEvent(stateController, 'tooltip_state_changed', stateController.tooltipState);\n}\n\nexport function useContextMenu(stateController) {\n return useEvent(stateController, 'context_menu_position_changed', stateController.contextMenuState);\n}\n\nexport function useDraggingY(stateController) {\n return useEvent(stateController, 'dragging_y_changed', stateController.draggingY);\n}\n\nexport function usePercentile(stateController) {\n return useEvent(stateController, 'percentile_changed', stateController.percentile);\n}\n\nexport function useShowingOptions(stateController) {\n return useEvent(stateController, 'showing_options_changed', stateController.showingOptions);\n}\n\nexport function useMaxPrecision(stateController) {\n return useEvent(stateController, 'max_precision_changed', stateController.maxPrecision);\n}\n\nexport function usePercentileAsymmetry(stateController) {\n return useEvent(stateController, 'percentile_asymmetry_changed', stateController.percentileAsymmetry);\n}\n\nexport function useShowingSidebar(stateController) {\n return useEvent(stateController, 'showing_sidebar_changed', stateController.showingSidebar);\n}\n\nexport function useShowingAnnotations(stateController) {\n return useEvent(stateController, 'showing_annotations_changed', stateController.showingAnnotations);\n}\n\nexport function useMultiSeries(multigraphStateController) {\n return useEvent(multigraphStateController, 'multi_series_changed', multigraphStateController.multiSeries);\n}\n\nexport function useAnnotationState(stateController) {\n return useEvent(stateController, 'annotations_changed', stateController.annotationState);\n}\n\nexport function useSizing(stateController) {\n return useEvent(stateController, 'primary_size_change', stateController.sizing);\n}\n\nexport function useTheme(stateController) {\n return useEvent(stateController, 'theme_change', stateController.theme);\n}\n\nexport function useExportMode(stateController) {\n return useEvent(stateController, 'export_mode_change', stateController.exportMode);\n}\n\nexport function useHasXEnum(stateController) {\n return useEvent(stateController, 'has_x_enum_change', stateController.hasXEnum);\n}\n\nexport function useEnumMap(stateController) {\n return useEvent(stateController, 'enum_map_change', stateController.enumMap);\n}\n\nexport function useXEnumMap(stateController) {\n return useEvent(stateController, 'x_enum_map_change', stateController.enumMap);\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nexport default class Annotations extends React.PureComponent {\n\n render() {\n const { bodyHeight, annotationState } = this.props;\n const { annotations, elementWidth } = annotationState;\n\n return (\n <div className=\"grapher-annotations\">\n {\n annotations.map(({ pixelX, width, content, lineOnly }, i) => {\n if (lineOnly) {\n return (\n <div key={i} className=\"grapher-annotation\" style={{ left: pixelX }}>\n <div\n className=\"annotation-marker\"\n style={{ width: width, height: bodyHeight }}\n />\n </div>\n );\n }\n\n const textStyle = {\n top: 21*i\n };\n\n if (elementWidth - pixelX < content.length*5.5) {\n textStyle.left = pixelX - elementWidth;\n } else {\n textStyle.left = 0;\n }\n\n return (\n <div key={i} className=\"grapher-annotation\" style={{ left: pixelX }}>\n <div\n className=\"annotation-marker\"\n style={{ width: width, height: bodyHeight }}\n />\n\n <div className=\"annotation-text\" style={textStyle}>\n {content}\n </div>\n </div>\n );\n })\n }\n </div>\n );\n }\n\n}\n\nAnnotations.propTypes = {\n annotationState: PropTypes.shape({\n annotations: PropTypes.arrayOf(PropTypes.object).isRequired,\n elementWidth: PropTypes.number.isRequired\n }),\n bodyHeight: PropTypes.number,\n lineOnly: PropTypes.bool\n};\n","import React from 'react';\nimport CustomPropTypes from '../helpers/custom_prop_types.js';\nimport PropTypes from 'prop-types';\nimport StateController from '../state/state_controller.js';\nimport {LINE_COLORS} from '../helpers/colors.js';\nimport {useAxisBounds, useSizing} from '../state/hooks.js';\n\nexport default React.memo(DraggablePoints);\n\nfunction DraggablePoints({ stateController, draggablePoints, onPointDrag, onDraggablePointsDoubleClick }) {\n const bounds = useAxisBounds(stateController)[0];\n const sizing = useSizing(stateController);\n\n if (!sizing) {\n return null;\n }\n\n const onPointlessDoubleClick = onDraggablePointsDoubleClick && ((event) => {\n const newXT = (event.clientX - sizing.boundingRect.left)/sizing.elementWidth;\n const newYT = 1 - (event.clientY - sizing.boundingRect.top)/sizing.elementHeight;\n\n onDraggablePointsDoubleClick(event, {\n x: newXT*(bounds.maxX - bounds.minX) + bounds.minX,\n y: newYT*(bounds.maxY - bounds.minY) + bounds.minY\n });\n });\n\n return (\n <div className=\"grapher-draggable-points\" onDoubleClick={onPointlessDoubleClick}>\n <svg width={sizing.elementWidth} height={sizing.elementHeight}>\n {\n draggablePoints.map((point, index) => {\n const xT = (point.x - bounds.minX)/(bounds.maxX - bounds.minX);\n const yT = (1 - (point.y - bounds.minY)/(bounds.maxY - bounds.minY));\n\n if (xT < 0 || xT > 1 || yT < 0 || yT > 1) {\n return null;\n }\n\n const pixelX = xT * sizing.elementWidth;\n const pixelY = yT * sizing.elementHeight;\n\n const radius = point.radius || 5;\n const fillColor = point.fillColor || LINE_COLORS[0];\n const strokeColor = point.strokeColor || 'white';\n const strokeWidth = point.strokeWidth || 1;\n\n const onMouseDown = (event) => {\n event.stopPropagation();\n\n if (!onPointDrag) {\n return;\n }\n\n const xOffset = pixelX - event.clientX;\n const yOffset = pixelY - event.clientY;\n\n const onMouseMove = (moveEvent) => {\n const newXT = (moveEvent.clientX + xOffset)/sizing.elementWidth;\n const newYT = 1 - (moveEvent.clientY + yOffset)/sizing.elementHeight;\n\n onPointDrag({\n index,\n point,\n x: newXT*(bounds.maxX - bounds.minX) + bounds.minX,\n y: newYT*(bounds.maxY - bounds.minY) + bounds.minY\n }, moveEvent);\n };\n\n const onMouseUp = () => {\n window.removeEventListener('mousemove', onMouseMove);\n window.removeEventListener('mouseup', onMouseUp);\n };\n\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('mouseup', onMouseUp);\n };\n\n const onClick = point.onClick && ((event) => {\n point.onClick(event, point);\n });\n\n const onDoubleClick = point.onDoubleClick && ((event) => {\n event.stopPropagation();\n point.onDoubleClick(event, point);\n });\n\n return (\n <circle\n key={index}\n cx={pixelX}\n cy={pixelY}\n r={radius}\n fill={fillColor}\n stroke={strokeColor}\n strokeWidth={strokeWidth}\n onMouseDown={onMouseDown}\n onClick={onClick}\n onDoubleClick={onDoubleClick}\n />\n );\n })\n }\n </svg>\n </div>\n );\n}\n\nDraggablePoints.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n draggablePoints: CustomPropTypes.DraggablePoints.isRequired,\n onPointDrag: PropTypes.func,\n onDraggablePointsDoubleClick: PropTypes.func\n};\n","import React from 'react';\nimport CustomPropTypes from '../helpers/custom_prop_types.js';\nimport PropTypes from 'prop-types';\nimport StateController from '../state/state_controller.js';\nimport {useAxisBounds, useSizing} from '../state/hooks.js';\n\nexport default React.memo(VerticalLines);\n\nfunction VerticalLines({ stateController, verticalLines, isRangeGraph, bounds, elementWidth, elementHeight }) {\n bounds = bounds || useAxisBounds(stateController)[0];\n const sizing = useSizing(stateController);\n\n if (!sizing) {\n return null;\n }\n\n const relevantVerticalLines = verticalLines.filter(line => {\n if (isRangeGraph && !line.onRangeGraph) {\n return false;\n }\n\n if (line.onRangeGraphOnly && !isRangeGraph) {\n return false;\n }\n\n return true;\n });\n\n if (relevantVerticalLines.length === 0) {\n return null;\n }\n\n return (\n <div className=\"grapher-vertical-lines\">\n <svg width={elementWidth || sizing.elementWidth} height={elementHeight || sizing.elementHeight}>\n {\n relevantVerticalLines.map((line, index) => {\n if (isRangeGraph && typeof line.onRangeGraph === 'object') {\n line = {\n ...line,\n ...line.onRangeGraph\n };\n }\n\n const xT = (line.x - bounds.minX)/(bounds.maxX - bounds.minX);\n\n if (xT < 0 || xT > 1) {\n return null;\n }\n\n const pixelX = xT * (elementWidth || sizing.elementWidth);\n if (typeof line.minPixelX === 'number' && pixelX < line.minPixelX) {\n return null;\n }\n\n if (typeof line.maxPixelX === 'number' && pixelX > line.maxPixelX) {\n return null;\n }\n\n const lineStyle = {\n stroke: line.color,\n strokeWidth: line.width,\n ...(line.style || {})\n };\n\n const markerStyle = {\n fill: line.color,\n ...(line.markerStyle || {})\n };\n\n const textStyle = {\n ...{\n fontSize: '12px',\n fill: line.color,\n stroke: 'none',\n textAnchor: 'middle',\n dominantBaseline: 'hanging'\n },\n ...(line.textStyle || {})\n };\n\n let lineTop = 0;\n if (typeof line.lineTop === 'number') {\n lineTop = line.lineTop;\n } else if (line.text) {\n lineTop = 18;\n }\n\n let textTop = 5;\n if (typeof line.textTop === 'number') {\n textTop = line.textTop;\n }\n\n return (\n <React.Fragment key={index}>\n <line\n x1={pixelX}\n y1={lineTop}\n x2={pixelX}\n y2={(elementHeight || sizing.elementHeight)}\n style={lineStyle}\n />\n\n {\n line.markTop &&\n <polygon\n points={`${pixelX - 3},0 ${pixelX + 3},0 ${pixelX},3`}\n style={markerStyle}\n />\n }\n\n {\n line.text &&\n <text\n x={pixelX}\n y={textTop}\n style={textStyle}\n >\n {line.text}\n </text>\n }\n </React.Fragment>\n );\n })\n }\n </svg>\n </div>\n );\n}\n\nVerticalLines.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n verticalLines: CustomPropTypes.VerticalLines.isRequired,\n isRangeGraph: PropTypes.bool,\n bounds: PropTypes.object,\n elementWidth: PropTypes.number,\n elementHeight: PropTypes.number\n};\n","import React, { useCallback, useState, useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport CustomPropTypes from '../helpers/custom_prop_types';\nimport GraphBodyRenderer from '../renderer/graph_body_renderer';\nimport Tooltip from './tooltip';\nimport ContextMenu from './context_menu';\nimport StateController from '../state/state_controller';\nimport {\n useAnnotationState,\n useAutoscaleY,\n useAxes,\n useMaxPrecision,\n useShowingAnnotations,\n useTooltipState,\n useContextMenu\n} from '../state/hooks';\nimport Annotations from './annotations.js';\nimport DraggablePoints from './draggable_points.js';\nimport VerticalLines from './vertical_lines.js';\n\nexport default React.memo(GraphBody);\n\nfunction GraphBody({ stateController, webgl, bodyHeight, boundsSelectionEnabled, showTooltips, tooltipOptions, checkIntersection, draggablePoints, onPointDrag, onDraggablePointsDoubleClick, verticalLines, clockStyle, timeZone }) {\n const canvasEl = useCallback((el) => {\n if (stateController.primaryRenderer) {\n stateController.primaryRenderer.dispose();\n }\n\n if (!el) {\n return;\n }\n\n const renderer = new GraphBodyRenderer({\n stateController: stateController,\n canvasElement: el,\n webgl,\n checkIntersection\n });\n\n stateController.primaryRenderer = renderer;\n renderer.resize();\n }, [webgl, stateController]);\n\n\n const [boundsSelection, setBoundsSelection] = useState({\n showing: false,\n start: {},\n style: {}\n });\n\n const autoscaleY = useAutoscaleY(stateController);\n\n const axisCount = useAxes(stateController).length;\n\n const tooltip = useTooltipState(stateController);\n const maxPrecision = useMaxPrecision(stateController);\n const showAnnotations = useShowingAnnotations(stateController);\n const annotationState = useAnnotationState(stateController);\n const contextMenu = useContextMenu(stateController);\n\n const onMouseDown = (event) => {\n if (!boundsSelectionEnabled) {\n return;\n }\n\n let currentNode = event.target;\n for (let i = 0; i < 10 && currentNode; i++) {\n if (currentNode.classList.contains('grapher-tooltip')) {\n return;\n }\n currentNode = currentNode.parentNode;\n }\n\n const boundingRect = stateController.primaryRenderer.boundingRect;\n\n const start = {\n x: event.clientX - boundingRect.left,\n y: event.clientY - boundingRect.top\n };\n\n\n setBoundsSelection({\n showing: true,\n start,\n style: {\n left: start.x,\n top: start.y,\n width: 0,\n height: 0\n }\n });\n\n const onMouseUp = (event) => {\n window.removeEventListener('mouseup', onMouseUp);\n\n if (!boundsSelectionEnabled) {\n return;\n }\n\n const x = event.clientX - boundingRect.left;\n const y = event.clientY - boundingRect.top;\n\n stateController.setBoundsFromSelection({\n minPixelX: Math.min(x, start.x),\n maxPixelX: Math.max(x, start.x),\n minPixelY: Math.min(y, start.y),\n maxPixelY: Math.max(y, start.y)\n });\n\n setBoundsSelection({\n showing: false,\n style: {}\n });\n };\n\n window.addEventListener('mouseup', onMouseUp);\n };\n\n const onMouseMove = (event) => {\n if (boundsSelection.showing) {\n const boundingRect = stateController.primaryRenderer.boundingRect;\n const x = event.clientX - boundingRect.left;\n const y = event.clientY - boundingRect.top;\n\n setBoundsSelection(({ start }) => {\n return {\n showing: true,\n start,\n style: {\n left: Math.min(x, start.x),\n top: autoscaleY ? 0 : Math.min(y, start.y),\n width: Math.abs(x - start.x),\n height: autoscaleY ? boundingRect.height : Math.abs(y - start.y)\n }\n };\n });\n }\n };\n\n useEffect(() => {\n const onScroll = () => {\n if (!showTooltips) {\n return;\n }\n\n stateController.recalculateTooltips();\n };\n\n const onGlobalMouseMove = (event) => {\n if (!showTooltips) {\n return;\n }\n\n stateController.setTooltipMousePosition({\n clientX: event.clientX,\n clientY: event.clientY,\n shiftKey: event.shiftKey\n });\n };\n\n window.addEventListener('scroll', onScroll, { passive: true });\n window.addEventListener('mousemove', onGlobalMouseMove, { passive: true });\n\n return () => {\n window.removeEventListener('scroll', onScroll);\n window.removeEventListener('mousemove', onGlobalMouseMove);\n };\n }, []);\n\n const onMouseLeave = () => {\n stateController.setContextMenuMousePosition({\n showing: false\n });\n };\n\n const onClick = (event) => {\n stateController.registerClick({\n clientX: event.clientX,\n clientY: event.clientY\n });\n\n if (tooltipOptions && tooltipOptions.savingDisabled) {\n stateController.clearSavedTooltips();\n return;\n }\n\n // if it's NOT a child of 'grapher-context-menu', close the context menu\n if (!event.target.closest('.grapher-context-menu')) {\n stateController.setContextMenuMousePosition({\n showing: false\n });\n }\n\n if (!window.getSelection || window.getSelection().type !== 'Range') {\n stateController.toggleTooltipSaved();\n }\n };\n const onDoubleClick = () => {\n stateController.clearSavedTooltips();\n };\n \n const onContextMenu = (event) => {\n event.preventDefault();\n stateController.setContextMenuMousePosition({\n clientX: event.clientX,\n clientY: event.clientY,\n showing: true\n });\n };\n\n return (\n <div className=\"graph-body graph-body-primary\"\n onMouseMove={onMouseMove}\n onMouseLeave={onMouseLeave}\n onMouseDown={onMouseDown}\n onClick={onClick}\n onDoubleClick={onDoubleClick}\n onContextMenu={onContextMenu}\n style={typeof bodyHeight === 'number' ? { height: bodyHeight } : undefined}\n >\n <canvas ref={canvasEl} />\n\n {\n showTooltips &&\n <Tooltip\n axisCount={axisCount}\n maxPrecision={maxPrecision}\n clockStyle={clockStyle}\n timeZone={timeZone}\n {...(tooltipOptions || {})}\n {...tooltip}\n />\n }\n\n {\n contextMenu.showing &&\n <ContextMenu\n contextMenu={contextMenu}\n />\n }\n\n {\n showAnnotations &&\n <Annotations\n bodyHeight={bodyHeight}\n annotationState={annotationState}\n />\n }\n\n {\n verticalLines &&\n <VerticalLines\n stateController={stateController}\n verticalLines={verticalLines}\n />\n }\n\n {\n draggablePoints &&\n <DraggablePoints\n stateController={stateController}\n draggablePoints={draggablePoints}\n onPointDrag={onPointDrag}\n onDraggablePointsDoubleClick={onDraggablePointsDoubleClick}\n />\n }\n\n {\n boundsSelectionEnabled && boundsSelection.showing &&\n <div className=\"bounds-selection\"\n style={boundsSelection.style}\n />\n }\n </div>\n );\n}\n\nGraphBody.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n webgl: PropTypes.bool,\n checkIntersection: PropTypes.bool,\n bodyHeight: PropTypes.number,\n boundsSelectionEnabled: PropTypes.bool.isRequired,\n showTooltips: PropTypes.bool.isRequired,\n tooltipOptions: CustomPropTypes.TooltipOptions,\n verticalLines: CustomPropTypes.VerticalLines,\n draggablePoints: CustomPropTypes.DraggablePoints,\n onPointDrag: PropTypes.func,\n onDraggablePointsDoubleClick: PropTypes.func,\n clockStyle: PropTypes.oneOf(['12h', '24h']),\n timeZone: PropTypes.string\n};\n","\n import API from \"!../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../node_modules/css-loader/dist/cjs.js!../node_modules/sass-loader/dist/cjs.js!./grapher.scss\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../node_modules/css-loader/dist/cjs.js!../node_modules/sass-loader/dist/cjs.js!./grapher.scss\";\n export default content && content.locals ? content.locals : undefined;\n","import {startOfDayInTimezone} from './format';\n\nfunction placeTick(trueValue, {scale, min, max, inverted, totalSize, precision, formatter, dates, justTime, justDate, formatOptions={} }, opts={}) {\n let scaledValue = trueValue;\n\n if (scale === 'log') {\n scaledValue = 10**trueValue;\n }\n\n let percent = (trueValue - min)/(max - min);\n if (inverted) {\n percent = 1.0 - percent;\n }\n\n let pixelValue = percent * totalSize;\n if (isNaN(pixelValue)) {\n pixelValue = 0;\n }\n\n return {\n pixelValue,\n trueValue: scaledValue,\n label: formatter(scaledValue, { ...formatOptions, precision, log: scale === 'log', dates, justTime, justDate }),\n size: 'major',\n ...opts\n };\n}\n\nfunction placeTickByPixel(pixelValue, {scale, min, max, inverted, totalSize, precision, formatter, dates, justTime, justDate, formatOptions={} }, opts={}) {\n let percent = pixelValue/totalSize;\n if (inverted) {\n percent = 1.0 - percent;\n }\n\n let trueValue = percent * (max - min) + min;\n\n if (scale === 'log') {\n trueValue = Math.pow(10, trueValue);\n }\n\n return {\n pixelValue,\n trueValue,\n label: formatter(trueValue, { ...formatOptions, precision, log: scale === 'log', dates, justTime, justDate }),\n size: 'major',\n ...opts\n };\n}\n\nfunction roundToEvenNumber(value, tickSpacing) {\n return Math.round(value/tickSpacing)*tickSpacing;\n}\n\nfunction getEvenTickSpacing(span, desiredCount) {\n const subspan = span/desiredCount;\n\n const precision = -Math.log10(Math.abs(subspan)) + 1;\n const multiplier = (precision - Math.floor(precision)) > 0.5 ? 2 : 1;\n\n const roundTo = 10**Math.floor(precision) * multiplier;\n\n return Math.round(subspan * roundTo)/roundTo;\n}\n\nfunction roundToDivisor(value, divisor) {\n if (value <= 1) {\n return 1;\n }\n\n if (divisor === 1) {\n return Math.round(value);\n }\n\n if (value >= divisor) {\n return Math.round(value/divisor)*divisor;\n }\n\n let divisors;\n if (divisor === 24) {\n divisors = [1, 2, 6, 12, 24];\n } else if (divisor === 60) {\n divisors = [1, 2, 5, 10, 15, 30, 60];\n } else {\n throw new Error('Invalid divisor');\n }\n\n let bestDelta = Infinity;\n let bestDivisor = 1;\n for (let i = 0; i < divisors.length; i++) {\n const delta = Math.abs(divisors[i] - value);\n if (delta < bestDelta) {\n bestDivisor = divisors[i];\n bestDelta = delta;\n }\n }\n\n return bestDivisor;\n}\n\nfunction getEvenDateTickSpacing(span, desiredCount, unitOverride) {\n const subspan = span / desiredCount;\n\n if (subspan < 60*1000 && (!unitOverride || unitOverride === 'second')) {\n return {\n amount: roundToDivisor(subspan/1000, 60),\n unit: 's'\n };\n }\n\n if (subspan < 60*60*1000 && (!unitOverride || unitOverride === 'minute')) {\n return {\n amount: roundToDivisor(subspan/(60*1000), 60),\n unit: 'm'\n };\n }\n\n if (subspan < 24*60*60*1000 && (!unitOverride || unitOverride === 'hour')) {\n return {\n amount: roundToDivisor(subspan/(60*60*1000), 24),\n unit: 'h'\n };\n }\n\n if (unitOverride === 'day' || (subspan < 30*24*60*60*1000 && !unitOverride)) {\n return {\n amount: roundToDivisor(subspan/(24*60*60*1000), 1),\n unit: 'd'\n };\n }\n\n if (subspan > 30*24*60*60*1000 && (!unitOverride || unitOverride === 'month')) {\n return {\n amount: roundToDivisor(subspan/30*24*60*60*1000, 1),\n unit: 'month'\n };\n }\n\n if (unitOverride === 'year') {\n return {\n amount: roundToDivisor(subspan/365*24*60*60*1000, 1),\n unit: 'year'\n };\n }\n\n return {\n unit: 'm',\n amount: 60\n };\n}\n\nfunction placeNumbersGrid({ min, max, precision, expectedLabelSize, labelPadding, totalSize, scale='linear', formatter, inverted=false, formatOptions }) {\n const paddedLabelSize = expectedLabelSize + 2*labelPadding;\n\n const ticks = [];\n const placementParams = {scale, min, max, inverted, totalSize, precision, formatter, formatOptions, dates: false };\n\n const labelCount = Math.floor((totalSize - expectedLabelSize*2)/paddedLabelSize);\n const tickSpacing = getEvenTickSpacing(max - min, labelCount);\n if (tickSpacing > 0) {\n for (let value = roundToEvenNumber(min, tickSpacing); value < max; value += tickSpacing) {\n ticks.push(placeTick(value, placementParams));\n }\n }\n\n if (ticks.length) {\n if (inverted && ticks[ticks.length - 1].pixelValue > labelPadding) {\n ticks.push(placeTickByPixel(expectedLabelSize / 2, placementParams));\n }\n }\n\n return ticks.filter(({ pixelValue }) => pixelValue <= totalSize && pixelValue >= 0);\n}\n\nfunction placeDatesGrid({ min, max, precision, expectedLabelSize, labelPadding, totalSize, skipFirst=false, skipLast=false, scale='linear', formatter, inverted=false, formatOptions }) {\n const paddedLabelSize = expectedLabelSize + 2*labelPadding;\n\n const ticks = [];\n const placementParams = {scale, min, max, inverted, totalSize, precision, formatter, formatOptions, dates: true };\n\n const { amount, unit } = getEvenDateTickSpacing(max - min, totalSize/paddedLabelSize, formatOptions.unitOverride);\n\n const justDate = unit === 'month';\n\n if (!skipFirst) {\n ticks.push(placeTickByPixel(0, {...placementParams, justDate}, {position: 'first'}));\n }\n\n let currentDate = new Date(min);\n\n if (unit === 'h') {\n currentDate.setMinutes(0, 0, 0);\n } else if (unit === 'm') {\n currentDate.setSeconds(0, 0);\n } else if (unit === 's') {\n currentDate.setMilliseconds(0);\n } else if (unit === 'month') {\n currentDate = startOfDayInTimezone(currentDate, formatOptions.timeZone);\n currentDate.setDate(1);\n } else if (unit === 'd') {\n currentDate = startOfDayInTimezone(currentDate, formatOptions.timeZone);\n }\n\n let lastDateString = formatter(currentDate, {...formatOptions, ...placementParams, justDate: true });\n while (currentDate < max) {\n let delta = 24*60*60*1000;\n\n if (unit === 'h') {\n delta = (amount - currentDate.getHours() % amount)*60*60*1000;\n } else if (unit === 'm') {\n delta = (amount - currentDate.getMinutes() % amount)*60*1000;\n } else if (unit === 's') {\n delta = (amount - currentDate.getSeconds() % amount)*1000;\n } else if (unit === 'month') {\n delta = 0;\n if (currentDate.getMonth() === 11) {\n currentDate = new Date(currentDate.getFullYear() + 1, 0, 1);\n } else {\n currentDate = new Date(currentDate.getFullYear(), currentDate.getMonth() + 1, 1);\n }\n } else if (unit === 'year') {\n currentDate = new Date(currentDate.getFullYear() + 1, 0, 0);\n }\n\n currentDate = new Date(currentDate.valueOf() + delta);\n\n const justTime = formatter(currentDate, {...formatOptions, ...placementParams, justDate: true }) === lastDateString;\n\n const tick = placeTick(currentDate, {...placementParams, justTime, justDate});\n\n if (ticks.length && (tick.pixelValue - ticks[ticks.length - 1].pixelValue) < (expectedLabelSize + (labelPadding || 0))) {\n continue;\n }\n\n if (tick.pixelValue + expectedLabelSize/2 >= totalSize) {\n continue;\n }\n\n ticks.push(tick);\n lastDateString = formatter(currentDate, {...formatOptions, ...placementParams, justDate: true });\n }\n\n const justTime = lastDateString === formatter(max, {...formatOptions, ...placementParams, justDate: true });\n\n if (!skipLast && ticks[ticks.length - 1].pixelValue + expectedLabelSize < totalSize) {\n ticks.push(placeTickByPixel(totalSize, {...placementParams, justTime, justDate}, {position: 'last'}));\n }\n\n return ticks.filter(({ pixelValue }) => pixelValue <= totalSize && pixelValue >= 0);\n}\n\nexport default function placeGrid(opts) {\n if (opts.dates) {\n return placeDatesGrid(opts);\n } else {\n return placeNumbersGrid(opts);\n }\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport {calculatePrecision, calculateTimePrecision, formatX} from '../helpers/format';\nimport placeGrid from '../helpers/place_grid';\nimport {useEnumMap, useHasXEnum, usePrimarySize, useSelection} from '../state/hooks';\nimport StateController from '../state/state_controller';\n\nexport default React.memo(XAxis);\n\nfunction XAxis({ showAxes, showGrid, stateController, bigLabels, xTickUnit, clockStyle, timeZone, integersOnly, formatXAxisLabel }) {\n if (!showAxes && !showGrid) {\n return null;\n }\n\n const { elementWidth, elementHeight } = usePrimarySize(stateController);\n const {minX, maxX, dates} = useSelection(stateController);\n const hasXEnum = useHasXEnum(stateController);\n const enumMap = useEnumMap(stateController);\n\n let precision;\n if (dates) {\n precision = calculateTimePrecision(minX, maxX);\n } else {\n precision = calculatePrecision(maxX - minX);\n }\n\n let inverseEnumMap = null;\n if (hasXEnum) {\n inverseEnumMap = {};\n for (const [key, value] of Object.entries(enumMap)) {\n inverseEnumMap[value] = key;\n }\n }\n\n const formatOptions = {\n unitOverride: xTickUnit,\n clockStyle,\n timeZone,\n integersOnly,\n inverseEnumMap,\n formatter: formatXAxisLabel\n };\n\n const minLabel = formatX(minX, {...formatOptions, dates, precision }).toString();\n const maxLabel = formatX(maxX, {...formatOptions, dates, precision }).toString();\n\n let expectedLabelWidth = Math.max(minLabel.length, maxLabel.length) * 4;\n if (bigLabels) {\n expectedLabelWidth *= 2;\n }\n\n const labelPadding = 30; // space in between labels in the expected case\n\n const ticks = placeGrid({\n min: minX,\n max: maxX,\n totalSize: elementWidth,\n precision,\n dates,\n formatter: formatXAxisLabel || formatX,\n expectedLabelSize: expectedLabelWidth,\n labelPadding,\n formatOptions\n });\n\n const xAxisHeight = 20;\n\n return (\n <svg className=\"axis x-axis\" style={showAxes ? undefined : {marginBottom: -20}}>\n {\n showAxes &&\n <path d={`M-1,0 H${elementWidth}`} className=\"axis-line\" />\n }\n {\n showAxes &&\n <path d={`M-2,1 H${elementWidth + 1}`} className=\"axis-line-shadow\" />\n }\n\n {\n ticks.map(({ pixelValue, label, size, position, skipGrid }, i) => {\n if (isNaN(pixelValue)) {\n return null;\n }\n\n const classes = ['axis-item', `axis-item-${size}`, `axis-item-${position}`];\n if (bigLabels) {\n classes.push('axis-item-big-labels');\n }\n\n return (\n <g key={i} className={classes.join(' ')}>\n {\n showAxes &&\n <path d={`M${pixelValue},1 v6`} className=\"axis-tick\" />\n }\n\n {\n showGrid && !skipGrid &&\n <path d={`M${pixelValue},0 v-${elementHeight}`} />\n }\n\n {\n showAxes &&\n <text x={pixelValue} y={xAxisHeight - 5}>\n {label}\n </text>\n }\n </g>\n );\n })\n }\n </svg>\n );\n}\n\nXAxis.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n showAxes: PropTypes.bool.isRequired,\n showGrid: PropTypes.bool.isRequired,\n bigLabels: PropTypes.bool,\n xTickUnit: PropTypes.oneOf(['year']),\n clockStyle: PropTypes.oneOf(['12h', '24h']),\n timeZone: PropTypes.string,\n integersOnly: PropTypes.bool,\n formatXAxisLabel: PropTypes.func\n};\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport {calculatePrecision, formatY} from '../helpers/format';\nimport {Y_AXIS_WIDTH, BIG_Y_AXIS_LABEL_OFFSET} from '../helpers/axis_sizes';\nimport scaleBounds from '../renderer/scale_bounds';\nimport getColor from '../helpers/colors';\nimport placeGrid from '../helpers/place_grid';\nimport {useAxes, useAxisBounds, useHighlightedSeries, usePrimarySize} from '../state/hooks';\nimport StateController from '../state/state_controller';\nimport CustomPropTypes from '../helpers/custom_prop_types';\n\nexport default React.memo(YAxis);\n\nfunction YAxis({ stateController, showAxes, showGrid, showSeriesKey, axis, sideIndex, bodyHeight, theme, grapherID, dragPositionYOffset=0, bigLabels, showAxisColors }) {\n if (!showAxes && !showGrid) {\n return null;\n }\n\n const { side, scale, axisIndex, label } = useAxes(stateController)[axis.axisIndex];\n\n const { elementWidth, elementHeight } = usePrimarySize(stateController);\n let { minY, maxY } = useAxisBounds(stateController)[axisIndex];\n\n const scaledBounds = scaleBounds({ minY, maxY, scale});\n minY = scaledBounds.minY;\n maxY = scaledBounds.maxY;\n\n const ticks = placeGrid({\n min: minY,\n max: maxY,\n totalSize: elementHeight,\n scale,\n precision: calculatePrecision(maxY - minY),\n formatter: formatY,\n inverted: true,\n expectedLabelSize: bigLabels ? 20 : 10,\n labelPadding: 30\n });\n\n const colorBoxSize = 10;\n const colorBoxPadding = 4;\n\n let sidePadding = 5;\n\n if (scale === 'log') {\n sidePadding = 2;\n }\n\n const highlightedSeries = useHighlightedSeries(stateController);\n\n const [draggedSeries, setDraggedSeries] = useState(null);\n const [dragDelta, setDragDelta] = useState({ dx: 0, dy: 0 });\n\n const startDrag = (event, singleSeries) => {\n let startX = event.clientX;\n let startY = event.clientY;\n\n if (side === 'left') {\n startX += Y_AXIS_WIDTH;\n }\n\n if (side === 'right') {\n startX -= Y_AXIS_WIDTH;\n }\n\n setDragDelta({\n dx: 0,\n dy: 0\n });\n\n const onMouseMove = (moveEvent) => {\n setDragDelta({\n dx: moveEvent.clientX - startX,\n dy: moveEvent.clientY - startY\n });\n };\n\n const onMouseUp = (mouseUpEvent) => {\n window.removeEventListener('mousemove', onMouseMove);\n window.removeEventListener('mouseup', onMouseUp);\n\n let target = mouseUpEvent.target;\n while (target && !(target.dataset || {}).axisIndex) {\n target = target.parentNode;\n }\n\n setDraggedSeries(null);\n stateController.finalizeDrag(singleSeries, target && (target.dataset || {}).axisIndex, target && (target.dataset || {}).grapherId);\n };\n\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('mouseup', onMouseUp);\n\n setDraggedSeries(singleSeries);\n stateController.markDragStart();\n };\n\n const highlightedOpacity = theme === 'day' ? 1.0 : 0.5;\n const unhighlightedOpacity = theme === 'day' ? 0.8 : 0.3;\n\n return (\n <svg className={`axis y-axis y-axis-${side}`}\n data-axis-index={axisIndex}\n data-grapher-id={grapherID}\n style={{\n width: Y_AXIS_WIDTH,\n marginLeft: showAxes ? undefined : -Y_AXIS_WIDTH,\n height: typeof bodyHeight === 'number' ? bodyHeight : undefined\n }}\n >\n {\n showAxes &&\n showAxisColors &&\n axis.series.map((singleSeries, i) => {\n const height = elementHeight/axis.series.length;\n\n return (\n <rect\n x={side === 'left' ? 0 : 2}\n y={i*height}\n width={Y_AXIS_WIDTH - 2}\n height={height}\n key={singleSeries.index}\n fill={getColor(singleSeries.color, singleSeries.index, singleSeries.multigrapherSeriesIndex)}\n opacity={singleSeries.index === highlightedSeries ? highlightedOpacity : unhighlightedOpacity}\n data-element-height={elementHeight}\n data-series-length={axis.series.length}\n />\n );\n })\n }\n\n {\n showAxes &&\n <path d={`M${side === 'left' ? Y_AXIS_WIDTH-1 : 1},3 V${elementHeight}`} className=\"axis-line\" />\n }\n\n {\n showAxes &&\n <path d={`M${side === 'left' ? Y_AXIS_WIDTH-2 : 0},3 V${elementHeight + 1}`} className=\"axis-line-shadow\" />\n }\n\n {\n ticks.map(({ pixelValue, label, size, skipGrid }, i) => {\n const edge = side === 'left' ? (sideIndex + 1) * Y_AXIS_WIDTH : -sideIndex*Y_AXIS_WIDTH;\n const length = (side === 'left' ? 1 : - 1) * (elementWidth+1);\n\n const classes = ['axis-item', `axis-item-${size}`];\n if (bigLabels) {\n classes.push('axis-item-big-labels');\n }\n\n return (\n <g key={i} className={classes.join(' ')}>\n {\n showGrid &&\n !skipGrid &&\n <path d={`M${edge},${pixelValue} h${length}`} />\n }\n\n {\n showGrid &&\n !skipGrid &&\n sideIndex > 0 &&\n <path\n d={`M${side === 'left' ? Y_AXIS_WIDTH : 0},${pixelValue} h${(side === 'left' ? 1 : -1) * sideIndex * Y_AXIS_WIDTH}`}\n strokeDasharray={'2,2'}\n />\n }\n\n {\n showAxes &&\n <text x={side === 'left' ? Y_AXIS_WIDTH-sidePadding : sidePadding} y={pixelValue}>\n {label}\n </text>\n }\n </g>\n );\n })\n }\n\n {\n showSeriesKey && showAxes &&\n axis.series.map((singleSeries, i) => {\n\n let x = (Y_AXIS_WIDTH - colorBoxSize - colorBoxPadding) + (i % 2 - 1)*(colorBoxSize + colorBoxPadding);\n let y = -(colorBoxPadding + colorBoxSize) * Math.ceil(axis.series.length / 2) + (colorBoxSize + colorBoxPadding) * Math.floor(i / 2);\n\n if (singleSeries === draggedSeries) {\n x += dragDelta.dx;\n y += dragDelta.dy - dragPositionYOffset;\n }\n\n return (\n <rect\n className=\"series-color-box\"\n onMouseDown={(event) => startDrag(event, singleSeries)}\n x={x}\n y={y}\n width={colorBoxSize}\n height={colorBoxSize}\n key={singleSeries.index}\n fill={getColor(singleSeries.color, singleSeries.index, singleSeries.multigrapherSeriesIndex)}\n onMouseOver={() => stateController.setHighlightedSeries(singleSeries.index)}\n onMouseOut={() => stateController.setHighlightedSeries(null)}\n />\n );\n })\n }\n\n {\n showAxes && !!label &&\n <text\n className={`y-axis-label${bigLabels ? ' y-axis-big-label' : ''}`}\n x={side === 'left' ? 10 : Y_AXIS_WIDTH - 10}\n y={elementHeight/2 + (side === 'left' ? -1 : 1)*(axisIndex + 1)*(bigLabels ? BIG_Y_AXIS_LABEL_OFFSET : 0)}\n transform={`rotate(${side === 'left' ? -90 : 90}, ${side === 'left' ? 10 : Y_AXIS_WIDTH - 10}, ${elementHeight/2})`}\n >\n {label}\n </text>\n }\n </svg>\n );\n}\n\nYAxis.propTypes = {\n stateController: PropTypes.instanceOf(StateController),\n showAxes: PropTypes.bool.isRequired,\n showGrid: PropTypes.bool.isRequired,\n showAxisColors: PropTypes.bool.isRequired,\n showSeriesKey: PropTypes.bool.isRequired,\n axis: CustomPropTypes.Axis.isRequired,\n sideIndex: PropTypes.number.isRequired,\n bodyHeight: PropTypes.number,\n theme: PropTypes.string,\n grapherID: PropTypes.string,\n dragPositionYOffset: PropTypes.number,\n bigLabels: PropTypes.bool\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nexport default React.memo(RangeSelectionButtonBase);\n\nfunction RangeSelectionButtonBase({ selected, disabled, className, onClick, children, description }) {\n const classes = [\n 'range-button'\n ];\n\n if (selected) {\n classes.push('range-button-selected');\n }\n\n if (disabled) {\n classes.push('range-button-disabled');\n }\n\n if (className) {\n classes.push(className);\n }\n\n if (description) {\n classes.push('option-tooltip');\n }\n\n return (\n <div\n className={classes.join(' ')}\n onClick={onClick && ((event) => disabled || onClick(event))}\n >\n {children}\n\n {\n description &&\n <div className=\"option-tooltip-text\">\n {description}\n </div>\n }\n </div>\n );\n}\n\nRangeSelectionButtonBase.propTypes = {\n selected: PropTypes.bool.isRequired,\n onClick: PropTypes.func,\n children: PropTypes.node.isRequired,\n disabled: PropTypes.bool,\n className: PropTypes.string,\n description: PropTypes.string\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport RangeSelectionButtonBase from './range_selection_button_base';\nimport StateController from '../state/state_controller';\n\nexport default React.memo(RangeSelectionButton);\n\nfunction RangeSelectionButton({ stateController, currentBoundCalculator, boundCalculator, children, disabled }) {\n return (\n <RangeSelectionButtonBase\n selected={currentBoundCalculator === boundCalculator}\n onClick={() => stateController.boundCalculator = boundCalculator}\n disabled={disabled}\n >\n {children}\n </RangeSelectionButtonBase>\n );\n}\n\nRangeSelectionButton.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n boundCalculator: PropTypes.func.isRequired,\n currentBoundCalculator: PropTypes.func.isRequired,\n children: PropTypes.node.isRequired,\n disabled: PropTypes.bool\n};\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport RangeSelectionButtonBase from './range_selection_button_base';\nimport StateController from '../state/state_controller';\nimport {usePercentile, usePercentileAsymmetry} from '../state/hooks';\n\nexport default React.memo(PercentileButton);\n\nfunction PercentileButton({ stateController }) {\n const percentile = usePercentile(stateController);\n const percentileAsymmetry = usePercentileAsymmetry(stateController);\n const [showing, setShowing] = useState(false);\n\n return ([\n showing ? <RangeSelectionButtonBase\n key=\"asymmetry button\"\n className=\"percentile-button\"\n selected={true}\n description=\"Percentile asymmetry\"\n >\n <input\n onClick={(e) => e.stopPropagation()}\n value={percentileAsymmetry}\n onChange={(e) => stateController.percentileAsymmetry = e.target.value}\n onKeyUp={(e) => e.keyCode === 13 && setShowing(false)}\n type=\"number\"\n min={-50}\n max={50}\n />\n\n <div className=\"icon-container icon-container-square\">\n <svg focusable=\"false\" viewBox=\"0 0 512 512\">\n <path fill=\"currentColor\" d=\"M240 96h64a16 16 0 0 0 16-16V48a16 16 0 0 0-16-16h-64a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16zm0 128h128a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16H240a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16zm256 192H240a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h256a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm-256-64h192a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16H240a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16zM16 160h48v304a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16V160h48c14.21 0 21.39-17.24 11.31-27.31l-80-96a16 16 0 0 0-22.62 0l-80 96C-5.35 142.74 1.78 160 16 160z\" />\n </svg>\n </div>\n </RangeSelectionButtonBase>: null,\n\n <RangeSelectionButtonBase\n key=\"main-button\"\n className=\"percentile-button\"\n selected={showing || parseFloat(percentile) !== 100}\n onClick={() => setShowing(!showing)}\n description=\"Edit percentile\"\n >\n {\n showing &&\n <div>\n <input\n onClick={(e) => e.stopPropagation()}\n autoFocus={true}\n value={percentile}\n onChange={(e) => stateController.percentile = e.target.value}\n onKeyUp={(e) => e.keyCode === 13 && setShowing(false)}\n type=\"number\"\n min={0}\n max={100}\n />\n </div>\n }\n\n <div className=\"icon-container icon-container-narrow\">\n <svg focusable=\"false\" viewBox=\"0 0 448 512\">\n <path fill=\"currentColor\" d=\"M112 224c61.9 0 112-50.1 112-112S173.9 0 112 0 0 50.1 0 112s50.1 112 112 112zm0-160c26.5 0 48 21.5 48 48s-21.5 48-48 48-48-21.5-48-48 21.5-48 48-48zm224 224c-61.9 0-112 50.1-112 112s50.1 112 112 112 112-50.1 112-112-50.1-112-112-112zm0 160c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48zM392.3.2l31.6-.1c19.4-.1 30.9 21.8 19.7 37.8L77.4 501.6a23.95 23.95 0 0 1-19.6 10.2l-33.4.1c-19.5 0-30.9-21.9-19.7-37.8l368-463.7C377.2 4 384.5.2 392.3.2z\" />\n </svg>\n </div>\n </RangeSelectionButtonBase>\n ]);\n}\n\nPercentileButton.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired\n};\n","import React from 'react';\nimport PercentileButton from './percentile_button';\nimport RangeSelectionButtonBase from './range_selection_button_base';\nimport {\n useAutoscaleY,\n useMaxPrecision,\n useShowIndividualPoints, useShowingAnnotations,\n useShowingSidebar, useTheme\n} from '../state/hooks';\nimport PropTypes from 'prop-types';\nimport StateController from '../state/state_controller';\n\nexport default React.memo(Options);\n\nfunction Options({stateController, sidebarEnabled}) {\n\n const showIndividualPoints = useShowIndividualPoints(stateController);\n const autoscaleY = useAutoscaleY(stateController);\n const maxPrecision = useMaxPrecision(stateController);\n const showingSidebar = useShowingSidebar(stateController);\n const showingAnnotations = useShowingAnnotations(stateController);\n const theme = useTheme(stateController);\n\n return (\n <div className=\"options-bar\">\n {\n sidebarEnabled &&\n <RangeSelectionButtonBase\n selected={showingSidebar}\n onClick={() => stateController.toggleShowingSidebar()}\n description=\"Show sidebar\"\n >\n <div className=\"icon-container icon-container-square\">\n <svg focusable=\"false\" viewBox=\"0 0 512 512\">\n <path fill=\"currentColor\"\n d=\"M464 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V80c0-26.51-21.49-48-48-48zM224 416H64V160h160v256zm224 0H288V160h160v256z\"/>\n </svg>\n </div>\n </RangeSelectionButtonBase>\n }\n\n <RangeSelectionButtonBase\n selected={theme === 'export'}\n onClick={() => stateController.toggleExportMode()}\n description=\"Export mode\"\n >\n <div className=\"icon-container icon-container-square\">\n <svg focusable=\"false\" viewBox=\"0 0 512 512\">\n <path fill=\"currentColor\"\n d=\"M167.02 309.34c-40.12 2.58-76.53 17.86-97.19 72.3-2.35 6.21-8 9.98-14.59 9.98-11.11 0-45.46-27.67-55.25-34.35C0 439.62 37.93 512 128 512c75.86 0 128-43.77 128-120.19 0-3.11-.65-6.08-.97-9.13l-88.01-73.34zM457.89 0c-15.16 0-29.37 6.71-40.21 16.45C213.27 199.05 192 203.34 192 257.09c0 13.7 3.25 26.76 8.73 38.7l63.82 53.18c7.21 1.8 14.64 3.03 22.39 3.03 62.11 0 98.11-45.47 211.16-256.46 7.38-14.35 13.9-29.85 13.9-45.99C512 20.64 486 0 457.89 0z\" />\n </svg>\n </div>\n </RangeSelectionButtonBase>\n\n <RangeSelectionButtonBase\n selected={showingAnnotations}\n onClick={() => stateController.toggleShowingAnnotations()}\n description=\"Show annotations\"\n >\n <div className=\"icon-container icon-container-448\">\n <svg focusable=\"false\" viewBox=\"0 0 448 512\">\n <path fill=\"currentColor\" d=\"M432 416h-23.41L277.88 53.69A32 32 0 0 0 247.58 32h-47.16a32 32 0 0 0-30.3 21.69L39.41 416H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h128a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16h-19.58l23.3-64h152.56l23.3 64H304a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h128a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zM176.85 272L224 142.51 271.15 272z\" />\n </svg>\n </div>\n </RangeSelectionButtonBase>\n\n <PercentileButton stateController={stateController} />\n\n <RangeSelectionButtonBase\n selected={maxPrecision}\n onClick={() => stateController.toggleMaxPrecision()}\n description=\"Max precision\"\n >\n <div className=\"icon-container icon-container-square\">\n <svg focusable=\"false\" viewBox=\"0 0 512 512\">\n <path fill=\"currentColor\" d=\"M478.21 334.093L336 256l142.21-78.093c11.795-6.477 15.961-21.384 9.232-33.037l-19.48-33.741c-6.728-11.653-21.72-15.499-33.227-8.523L296 186.718l3.475-162.204C299.763 11.061 288.937 0 275.48 0h-38.96c-13.456 0-24.283 11.061-23.994 24.514L216 186.718 77.265 102.607c-11.506-6.976-26.499-3.13-33.227 8.523l-19.48 33.741c-6.728 11.653-2.562 26.56 9.233 33.037L176 256 33.79 334.093c-11.795 6.477-15.961 21.384-9.232 33.037l19.48 33.741c6.728 11.653 21.721 15.499 33.227 8.523L216 325.282l-3.475 162.204C212.237 500.939 223.064 512 236.52 512h38.961c13.456 0 24.283-11.061 23.995-24.514L296 325.282l138.735 84.111c11.506 6.976 26.499 3.13 33.227-8.523l19.48-33.741c6.728-11.653 2.563-26.559-9.232-33.036z\" />\n </svg>\n </div>\n </RangeSelectionButtonBase>\n\n <RangeSelectionButtonBase\n selected={autoscaleY}\n onClick={() => stateController.toggleYAutoscaling()}\n description=\"Autoscale y axis\"\n >\n <div className=\"icon-container\">\n <svg focusable=\"false\" viewBox=\"0 0 256 512\">\n <path fill=\"currentColor\" d=\"M168 416c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h88v-64h-88c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h88v-64h-88c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h88v-64h-88c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h88V32c0-17.67-14.33-32-32-32H32C14.33 0 0 14.33 0 32v448c0 17.67 14.33 32 32 32h192c17.67 0 32-14.33 32-32v-64h-88z\"/>\n </svg>\n </div>\n </RangeSelectionButtonBase>\n\n <RangeSelectionButtonBase\n selected={showIndividualPoints}\n onClick={() => stateController.toggleIndividualPoints()}\n description=\"Show individual points\"\n >\n <div className=\"icon-container icon-container-narrow\">\n <svg focusable=\"false\" viewBox=\"0 0 192 512\">\n <path fill=\"currentColor\" d=\"M96 184c39.8 0 72 32.2 72 72s-32.2 72-72 72-72-32.2-72-72 32.2-72 72-72zM24 80c0 39.8 32.2 72 72 72s72-32.2 72-72S135.8 8 96 8 24 40.2 24 80zm0 352c0 39.8 32.2 72 72 72s72-32.2 72-72-32.2-72-72-72-72 32.2-72 72z\" />\n </svg>\n </div>\n </RangeSelectionButtonBase>\n </div>\n );\n}\n\nOptions.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n sidebarEnabled: PropTypes.bool\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport RangeSelectionButton from './range_selection_button';\nimport RangeSelectionButtonBase from './range_selection_button_base';\nimport {Y_AXIS_WIDTH} from '../helpers/axis_sizes';\nimport CustomPropTypes from '../helpers/custom_prop_types';\nimport StateController from '../state/state_controller';\nimport {\n useBoundCalculator, useBoundHistory,\n useGlobalBounds,\n useLeftAxisCount,\n useRightAxisCount,\n useShowingOptions\n} from '../state/hooks';\nimport BOUND_CALCULATORS from '../state/bound_calculators';\nimport Options from './options';\n\nexport default React.memo(RangeSelection);\n\nfunction RangeSelection({stateController, customBoundsSelectors, customBoundsSelectorsOnly, sidebarEnabled}) {\n const rightAxisCount = useRightAxisCount(stateController);\n const leftAxisCount = useLeftAxisCount(stateController);\n const showingOptions = useShowingOptions(stateController);\n\n let marginRight = Y_AXIS_WIDTH*rightAxisCount;\n if (rightAxisCount > 0) {\n marginRight += 5;\n }\n\n let marginLeft = Y_AXIS_WIDTH*leftAxisCount;\n if (leftAxisCount > 0) {\n marginLeft += 5;\n }\n\n const { dates } = useGlobalBounds(stateController);\n\n const currentBoundCalculator = useBoundCalculator(stateController);\n const { hasPreviousBounds, hasNextBounds } = useBoundHistory(stateController);\n\n const customBoundSelectorNames = new Set(customBoundsSelectors.map(({ label }) => label));\n\n return (\n <div className={`range-selection${dates ? '' : ' range-not-dates'}`} style={{ marginRight, marginLeft }}>\n <div className=\"range-buttons\">\n {\n showingOptions &&\n <Options\n stateController={stateController}\n sidebarEnabled={sidebarEnabled}\n />\n }\n\n <RangeSelectionButtonBase\n className=\"showing-options-button\"\n selected={showingOptions}\n onClick={() => stateController.toggleShowingOptions()}\n description=\"Show additional options\"\n >\n <div className=\"icon-container icon-container-square\">\n <svg focusable=\"false\" viewBox=\"0 0 512 512\">\n <path fill=\"currentColor\" d=\"M487.4 315.7l-42.6-24.6c4.3-23.2 4.3-47 0-70.2l42.6-24.6c4.9-2.8 7.1-8.6 5.5-14-11.1-35.6-30-67.8-54.7-94.6-3.8-4.1-10-5.1-14.8-2.3L380.8 110c-17.9-15.4-38.5-27.3-60.8-35.1V25.8c0-5.6-3.9-10.5-9.4-11.7-36.7-8.2-74.3-7.8-109.2 0-5.5 1.2-9.4 6.1-9.4 11.7V75c-22.2 7.9-42.8 19.8-60.8 35.1L88.7 85.5c-4.9-2.8-11-1.9-14.8 2.3-24.7 26.7-43.6 58.9-54.7 94.6-1.7 5.4.6 11.2 5.5 14L67.3 221c-4.3 23.2-4.3 47 0 70.2l-42.6 24.6c-4.9 2.8-7.1 8.6-5.5 14 11.1 35.6 30 67.8 54.7 94.6 3.8 4.1 10 5.1 14.8 2.3l42.6-24.6c17.9 15.4 38.5 27.3 60.8 35.1v49.2c0 5.6 3.9 10.5 9.4 11.7 36.7 8.2 74.3 7.8 109.2 0 5.5-1.2 9.4-6.1 9.4-11.7v-49.2c22.2-7.9 42.8-19.8 60.8-35.1l42.6 24.6c4.9 2.8 11 1.9 14.8-2.3 24.7-26.7 43.6-58.9 54.7-94.6 1.5-5.5-.7-11.3-5.6-14.1zM256 336c-44.1 0-80-35.9-80-80s35.9-80 80-80 80 35.9 80 80-35.9 80-80 80z\" />\n </svg>\n </div>\n </RangeSelectionButtonBase>\n \n <RangeSelectionButtonBase\n className=\"range-selection-history\"\n selected={false}\n onClick={() => stateController.previousBounds()}\n disabled={!hasPreviousBounds}\n >\n <div className=\"icon-container\">\n <svg focusable=\"false\" viewBox=\"0 0 256 512\">\n <path fill=\"currentColor\" d=\"M31.7 239l136-136c9.4-9.4 24.6-9.4 33.9 0l22.6 22.6c9.4 9.4 9.4 24.6 0 33.9L127.9 256l96.4 96.4c9.4 9.4 9.4 24.6 0 33.9L201.7 409c-9.4 9.4-24.6 9.4-33.9 0l-136-136c-9.5-9.4-9.5-24.6-.1-34z\" />\n </svg>\n </div>\n </RangeSelectionButtonBase>\n \n <RangeSelectionButtonBase\n className=\"range-selection-history\"\n selected={false}\n onClick={() => stateController.nextBounds()}\n disabled={!hasNextBounds}\n >\n <div className=\"icon-container\">\n <svg focusable=\"false\" viewBox=\"0 0 256 512\">\n <path fill=\"currentColor\" d=\"M224.3 273l-136 136c-9.4 9.4-24.6 9.4-33.9 0l-22.6-22.6c-9.4-9.4-9.4-24.6 0-33.9l96.4-96.4-96.4-96.4c-9.4-9.4-9.4-24.6 0-33.9L54.3 103c9.4-9.4 24.6-9.4 33.9 0l136 136c9.5 9.4 9.5 24.6.1 34z\"/>\n </svg>\n </div>\n </RangeSelectionButtonBase>\n\n {\n customBoundsSelectors.map(({label, calculator, datesOnly}, i) => {\n return (\n <RangeSelectionButton\n key={i}\n stateController={stateController}\n currentBoundCalculator={currentBoundCalculator}\n boundCalculator={calculator}\n disabled={datesOnly && !dates}\n >\n {label}\n </RangeSelectionButton>\n );\n })\n }\n\n {\n !customBoundSelectorNames.has('1m') && !customBoundsSelectorsOnly &&\n <RangeSelectionButton\n stateController={stateController}\n currentBoundCalculator={currentBoundCalculator}\n boundCalculator={BOUND_CALCULATORS.lastMinute}\n disabled={!dates}\n >\n 1m\n </RangeSelectionButton>\n }\n\n {\n !customBoundSelectorNames.has('10m') && !customBoundsSelectorsOnly &&\n <RangeSelectionButton\n stateController={stateController}\n currentBoundCalculator={currentBoundCalculator}\n boundCalculator={BOUND_CALCULATORS.last10Minutes}\n disabled={!dates}\n >\n 10m\n </RangeSelectionButton>\n }\n\n {\n !customBoundSelectorNames.has('1h') && !customBoundsSelectorsOnly &&\n <RangeSelectionButton\n stateController={stateController}\n currentBoundCalculator={currentBoundCalculator}\n boundCalculator={BOUND_CALCULATORS.lastHour}\n disabled={!dates}\n >\n 1h\n </RangeSelectionButton>\n }\n\n {\n !customBoundSelectorNames.has('1d') && !customBoundsSelectorsOnly &&\n <RangeSelectionButton\n stateController={stateController}\n currentBoundCalculator={currentBoundCalculator}\n boundCalculator={BOUND_CALCULATORS.lastDay}\n disabled={!dates}\n >\n 1d\n </RangeSelectionButton>\n }\n\n <RangeSelectionButton\n stateController={stateController}\n currentBoundCalculator={currentBoundCalculator}\n boundCalculator={BOUND_CALCULATORS.all}\n disabled={false}\n >\n All\n </RangeSelectionButton>\n </div>\n </div>\n );\n\n}\n\nRangeSelection.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n customBoundsSelectors: CustomPropTypes.CustomBoundsSelectors.isRequired,\n customBoundsSelectorsOnly: PropTypes.bool,\n sidebarEnabled: PropTypes.bool\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport GraphBodyRenderer from '../renderer/graph_body_renderer';\nimport StateController from '../state/state_controller';\nimport placeGrid from '../helpers/place_grid';\nimport {formatX} from '../helpers/format';\nimport VerticalLines from './vertical_lines';\nimport CustomPropTypes from '../helpers/custom_prop_types';\n\nexport default class RangeGraph extends React.PureComponent {\n\n constructor(props) {\n super(props);\n\n this.state = {\n elementWidth: 0,\n elementHeight: 0,\n selectionBounds: {\n minX: 0,\n maxX: 0\n },\n globalBounds: {\n minX: 0,\n maxX: 0\n }\n };\n\n this.onMouseMove = this.onMouseMove.bind(this);\n this.stopDragging = this.stopDragging.bind(this);\n this.startScroll = this.startScroll.bind(this);\n this.startLeftDrag = this.startLeftDrag.bind(this);\n this.startRightDrag = this.startRightDrag.bind(this);\n }\n\n componentDidMount() {\n this._renderer = new GraphBodyRenderer({\n stateController: this.props.stateController,\n canvasElement: this.el,\n webgl: this.props.webgl,\n checkIntersection: this.props.checkIntersection\n });\n this.props.stateController.rangeGraphRenderer = this._renderer;\n\n this._renderer.on('size_changed', (sizing) => {\n this.setState(sizing);\n });\n\n this.setState({\n selectionBounds: this.props.stateController._selection,\n globalBounds: this.props.stateController._globalBounds\n });\n\n this.props.stateController.on('selection_changed', (selectionBounds) =>{\n this.setState({ selectionBounds });\n });\n\n this.props.stateController.on('global_bounds_changed', (globalBounds) =>{\n this.setState({ globalBounds: globalBounds });\n });\n }\n\n componentDidUpdate(prevProps) {\n if (prevProps.draggingY !== this.props.draggingY) {\n this._renderer.resize();\n }\n }\n\n componentWillUnmount() {\n this._renderer.dispose();\n this._renderer = null;\n }\n\n onMouseMove(event) {\n if (!this._dragType) {\n return;\n }\n\n let boundCalculator;\n const leftX = this.el.getBoundingClientRect().left;\n\n this.setState(({selectionBounds, globalBounds, elementWidth}) => {\n const pixelX = event.clientX - leftX;\n let percentage = pixelX/elementWidth;\n\n percentage = Math.max(percentage, 0);\n percentage = Math.min(percentage, 1);\n\n let trueX = percentage * (globalBounds.maxX - globalBounds.minX) + globalBounds.minX;\n\n if (this._dragType === 'scroll') {\n const range = selectionBounds.maxX - selectionBounds.minX;\n let minX = trueX - range*this._scrollAnchorPercentage;\n let maxX = trueX + range*(1-this._scrollAnchorPercentage);\n\n if (minX < globalBounds.minX) {\n minX = globalBounds.minX;\n maxX = minX + range;\n }\n\n if (maxX > globalBounds.maxX) {\n maxX = globalBounds.maxX;\n minX = maxX - range;\n }\n\n boundCalculator = () => {\n return {minX, maxX};\n };\n\n return {\n selectionBounds: Object.assign({}, selectionBounds, {\n minX, maxX\n })\n };\n } else if (this._dragType === 'left') {\n if (trueX > selectionBounds.maxX) {\n trueX = selectionBounds.maxX;\n }\n\n const boundToRight = globalBounds.maxX === selectionBounds.maxX;\n\n boundCalculator = () => {\n if (boundToRight) {\n return {\n minX: trueX\n };\n } else {\n return {\n minX: trueX,\n maxX: selectionBounds.maxX\n };\n }\n };\n\n return {\n selectionBounds: Object.assign({}, selectionBounds, {\n minX: trueX\n })\n };\n } else if (this._dragType === 'right') {\n if (trueX < selectionBounds.minX) {\n trueX = selectionBounds.minX;\n }\n\n const boundToLeft = globalBounds.minX === selectionBounds.minX;\n\n boundCalculator = () => {\n if (boundToLeft) {\n return {\n maxX: trueX\n };\n } else {\n return {\n minX: selectionBounds.minX,\n maxX: trueX\n };\n }\n };\n\n return {\n selectionBounds: Object.assign({}, selectionBounds, {\n maxX: trueX\n })\n };\n }\n }, () => {\n if (!boundCalculator) {\n return;\n }\n\n boundCalculator.debounceHistory = true;\n this.props.stateController.boundCalculator = boundCalculator;\n });\n }\n\n addListeners() {\n window.addEventListener('mousemove', this.onMouseMove);\n window.addEventListener('mouseup', this.stopDragging);\n }\n\n stopDragging() {\n this._dragType = null;\n window.removeEventListener('mousemove', this.onMouseMove);\n window.removeEventListener('mouseup', this.stopDragging);\n }\n\n startScroll(event) {\n this._dragType = 'scroll';\n\n const {selectionBounds, globalBounds, elementWidth} = this.state;\n const leftX = this.el.getBoundingClientRect().left;\n\n const pixelStartX = event.clientX - leftX;\n const pixelMinX = (selectionBounds.minX - globalBounds.minX)/(globalBounds.maxX - globalBounds.minX) * elementWidth || 0;\n const pixelMaxX = (selectionBounds.maxX - globalBounds.minX)/(globalBounds.maxX - globalBounds.minX) * elementWidth || 0;\n\n this._scrollAnchorPercentage = (pixelStartX-pixelMinX)/(pixelMaxX - pixelMinX);\n this.addListeners();\n }\n\n startLeftDrag() {\n this._dragType = 'left';\n this.addListeners();\n }\n\n startRightDrag() {\n this._dragType = 'right';\n this.addListeners();\n }\n\n render() {\n const { globalBounds, selectionBounds, elementWidth, elementHeight } = this.state;\n\n let pixelMinX = Math.min(Math.max((selectionBounds.minX - globalBounds.minX)/(globalBounds.maxX - globalBounds.minX), 0), 1) * elementWidth || 0;\n let pixelMaxX = Math.min(Math.max((selectionBounds.maxX - globalBounds.minX)/(globalBounds.maxX - globalBounds.minX), 0), 1) * elementWidth || 0;\n\n if (isNaN(pixelMinX) || !isFinite(pixelMinX) || selectionBounds.maxX < selectionBounds.minX) {\n pixelMinX = 0;\n }\n\n if (isNaN(pixelMaxX) || !isFinite(pixelMaxX) || selectionBounds.maxX < selectionBounds.minX) {\n pixelMaxX = 0;\n }\n\n const barSize = 14;\n let ticks;\n\n if (selectionBounds.dates && this.props.markDates) {\n ticks = placeGrid({\n min: globalBounds.minX,\n max: globalBounds.maxX,\n totalSize: elementWidth,\n precision: 'day',\n dates: selectionBounds.dates,\n formatter: formatX,\n expectedLabelSize: 30,\n labelPadding: 5,\n formatOptions: {\n justMonthAndDay: true,\n unitOverride: 'day',\n timeZone: this.props.timeZone\n },\n skipFirst: true,\n skipLast: true\n });\n }\n\n return (\n <div className=\"range-selection-graph\">\n <div className=\"graph-body graph-body-secondary\">\n <canvas ref={(el) => this.el = el} />\n\n <svg>\n <g>\n <rect\n x={0}\n y={elementHeight}\n width={elementWidth}\n height={barSize}\n className=\"selection-bar-track\"\n />\n\n {\n ticks && ticks.map(({ pixelValue, label, size, position }, i) => {\n if (isNaN(pixelValue)) {\n return null;\n }\n\n const classes = ['axis-item', `axis-item-${size}`, `axis-item-${position}`];\n\n return (\n <g key={i} className={classes.join(' ')}>\n <path d={`M${pixelValue},0 v${elementHeight}`} />\n\n <text x={pixelValue + 3} y={elementHeight}>\n {label}\n </text>\n </g>\n );\n })\n }\n\n <rect\n x={pixelMinX}\n y={elementHeight}\n width={pixelMaxX - pixelMinX}\n height={barSize}\n className=\"selection-bar\"\n onMouseDown={this.startScroll}\n />\n\n <path\n d=\"M -3 3.5 L -3 9.333333333333334 M 0 3.5 L 0 9.333333333333334 M 3 3.5 L 3 9.333333333333334\"\n className=\"selection-bar-rifles\"\n transform={`translate(${pixelMinX + (pixelMaxX - pixelMinX)/2},${elementHeight})`}\n onMouseDown={this.startScroll}\n />\n </g>\n\n <g>\n <rect\n x={pixelMinX}\n y={0}\n width={pixelMaxX - pixelMinX}\n height={elementHeight}\n className=\"target-selection\"\n onMouseDown={this.startScroll}\n />\n\n <rect\n x={pixelMinX}\n y={0}\n width={pixelMaxX - pixelMinX}\n height={elementHeight + barSize}\n className=\"target-selection-outline\"\n />\n </g>\n\n <g>\n <path\n d=\"M -4.5 0.5 L 3.5 0.5 L 3.5 15.5 L -4.5 15.5 L -4.5 0.5 M -1.5 4 L -1.5 12 M 0.5 4 L 0.5 12\"\n className=\"selection-bar-handle\"\n transform={`translate(${pixelMinX},${(elementHeight - 15)/2})`}\n onMouseDown={this.startLeftDrag}\n />\n </g>\n\n <g>\n <path\n d=\"M -4.5 0.5 L 3.5 0.5 L 3.5 15.5 L -4.5 15.5 L -4.5 0.5 M -1.5 4 L -1.5 12 M 0.5 4 L 0.5 12\"\n className=\"selection-bar-handle\"\n transform={`translate(${pixelMaxX},${(elementHeight - 15)/2})`}\n onMouseDown={this.startRightDrag}\n />\n </g>\n </svg>\n\n {\n this.props.verticalLines &&\n <VerticalLines\n stateController={this.props.stateController}\n verticalLines={this.props.verticalLines}\n isRangeGraph={true}\n bounds={globalBounds}\n elementHeight={elementHeight}\n elementWidth={elementWidth}\n />\n }\n </div>\n </div>\n );\n }\n\n}\n\nRangeGraph.defaultProps = {\n width: 3,\n shadowColor: 'transparent'\n};\n\nRangeGraph.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n webgl: PropTypes.bool,\n draggingY: PropTypes.bool,\n checkIntersection: PropTypes.bool,\n markDates: PropTypes.bool,\n timeZone: PropTypes.string,\n verticalLines: CustomPropTypes.VerticalLines\n};\n","import React from 'react';\nimport getColor from '../helpers/colors';\nimport CustomPropTypes from '../helpers/custom_prop_types';\nimport PropTypes from 'prop-types';\nimport StateController from '../state/state_controller';\nimport nameForSeries from '../helpers/name_for_series.js';\n\nexport default React.memo(SeriesKeyItem);\n\nfunction SeriesKeyItem({ series, i, style, onMouseDown, theme, stateController, highlighted }) {\n const color = getColor(series.color, i, series.multigrapherSeriesIndex);\n\n if (theme === 'day') {\n style = Object.assign({}, style, {\n backgroundColor: color\n });\n } else {\n style = Object.assign({}, style, {\n color\n });\n }\n\n const classes = ['series-key-item'];\n if (highlighted) {\n classes.push('series-key-item-highlighted');\n }\n\n const name = nameForSeries(series, i);\n\n return (\n <div\n className={classes.join(' ')}\n style={style}\n onMouseDown={onMouseDown}\n onMouseOver={() => stateController.setHighlightedSeries(i)}\n onMouseOut={() => stateController.setHighlightedSeries(null)}\n onClick={() => stateController.registerSeriesClick(i)}\n >\n {name}\n </div>\n );\n}\n\nSeriesKeyItem.propTypes = {\n series: CustomPropTypes.SingleSeries.isRequired,\n stateController: PropTypes.instanceOf(StateController),\n i: PropTypes.number.isRequired,\n style: PropTypes.object,\n onMouseDown: PropTypes.func,\n theme: PropTypes.string.isRequired,\n highlighted: PropTypes.bool\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport StateController from '../state/state_controller';\n\nexport default class SeriesKeyAxisContainer extends React.PureComponent {\n\n constructor(props) {\n super(props);\n\n this.state = {\n showingLabelInput: false\n };\n\n this.toggleLabelInputShowing = this.toggleLabelInputShowing.bind(this);\n }\n\n toggleLabelInputShowing() {\n this.setState(({ showingLabelInput }) => {\n return {\n showingLabelInput: !showingLabelInput\n };\n });\n }\n\n render() {\n const {children, stateController, axisIndex, scale, label, grapherID} = this.props;\n\n const { showingLabelInput } = this.state;\n\n return (\n <div\n className={`series-key-axis-container${showingLabelInput ? ' series-key-axis-container-showing-label' : ''}`}\n data-axis-index={axisIndex}\n data-grapher-id={grapherID}\n >\n <div className=\"scale-label\" onClick={() => stateController.toggleScale({axisIndex})}>\n {scale.slice(0, showingLabelInput ? 6 : 3)}\n </div>\n\n <div className=\"series-key-axis-container-body\">\n <div>\n {children}\n\n <svg className=\"label-input-toggler\" viewBox=\"0 0 512 512\" onClick={this.toggleLabelInputShowing}>\n <path\n d=\"M0 252.118V48C0 21.49 21.49 0 48 0h204.118a48 48 0 0 1 33.941 14.059l211.882 211.882c18.745 18.745 18.745 49.137 0 67.882L293.823 497.941c-18.745 18.745-49.137 18.745-67.882 0L14.059 286.059A48 48 0 0 1 0 252.118zM112 64c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48-21.49-48-48-48z\"/>\n </svg>\n </div>\n\n <div className=\"series-key-axis-label-container\">\n <input\n onChange={(event) => stateController.setLabel({axisIndex, label: event.target.value})}\n placeholder=\"Enter label\"\n value={label || ''}\n />\n </div>\n </div>\n </div>\n );\n }\n}\n\nSeriesKeyAxisContainer.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n children: PropTypes.node.isRequired,\n axisIndex: PropTypes.number.isRequired,\n scale: PropTypes.string.isRequired,\n label: PropTypes.string,\n grapherID: PropTypes.string\n};\n","import React, { useState, useEffect, useRef } from 'react';\nimport PropTypes from 'prop-types';\nimport {Y_AXIS_WIDTH} from '../helpers/axis_sizes';\nimport StateController from '../state/state_controller';\nimport {\n useAlwaysTooltipped,\n useAxes,\n useHighlightedSeries,\n useLeftAxisCount,\n usePrimarySize,\n useRightAxisCount,\n useSeries, useShowingOptions\n} from '../state/hooks';\nimport SeriesKeyItem from './series_key_item';\nimport SeriesKeyAxisContainer from './series_key_axis_container';\n\nfunction calculateStyles({stateController, keyWidth}) {\n const rightAxisCount = useRightAxisCount(stateController);\n const leftAxisCount = useLeftAxisCount(stateController);\n const showingOptions = useShowingOptions(stateController);\n\n let marginRight = Y_AXIS_WIDTH*rightAxisCount;\n if (rightAxisCount > 0) {\n marginRight += 5;\n }\n\n marginRight += 250;\n\n if (showingOptions) {\n marginRight += 70;\n }\n\n let marginLeft = Y_AXIS_WIDTH*leftAxisCount;\n\n if (leftAxisCount > 0) {\n marginLeft += 5;\n }\n\n marginLeft = Math.max(marginRight, marginLeft);\n marginRight = Math.max(marginRight, marginLeft);\n\n let marginBottom;\n\n const { elementWidth } = usePrimarySize(stateController);\n\n const shouldBreak = elementWidth - marginLeft - marginRight < keyWidth;\n\n if (shouldBreak) {\n marginLeft = 0;\n marginRight = 0;\n marginBottom = 10;\n }\n\n return { marginRight, marginLeft, marginBottom };\n}\n\nexport default React.memo(SeriesKey);\n\nfunction SeriesKey({ stateController, theme, draggingY, grapherID, dragPositionYOffset=0 }) {\n const series = useSeries(stateController);\n const [draggedSeries, setDraggedSeries] = useState(null);\n const [dragPosition, setDragPosition] = useState({\n x: 0,\n y: 0\n });\n\n const highlightedSeries = useHighlightedSeries(stateController);\n\n const keyRef = useRef(null);\n const [keyWidth, setKeyWidth] = useState(series.map(({ name, yKey }, i) => (name || yKey || i).toString().length).reduce((a, b) => a + b, 0) * 5);\n\n let sizeCalculationHandle;\n useEffect(() => {\n if (keyRef.current) {\n cancelAnimationFrame(sizeCalculationHandle);\n\n sizeCalculationHandle = requestAnimationFrame(() => {\n if (!keyRef.current) { // has become invalid in the last frame\n return;\n }\n\n const width = [...keyRef.current.querySelectorAll('.series-key-axis-container')]\n .map((el) => el.clientWidth)\n .reduce((a, b) => a + b, 0);\n setKeyWidth(width);\n });\n }\n }, [series, keyRef.current]);\n\n const style = calculateStyles({ stateController, keyWidth });\n\n const axes = useAxes(stateController);\n const alwaysTooltipped = useAlwaysTooltipped(stateController);\n\n const startDragging = (event, singleSeries) => {\n let seriesKeyEl = event.target;\n while (seriesKeyEl && seriesKeyEl.className !== 'series-key') {\n seriesKeyEl = seriesKeyEl.parentNode;\n }\n const targetLeft = event.target.getBoundingClientRect().left;\n let seriesKeyLeft = seriesKeyEl.getBoundingClientRect().left;\n let seriesKeyMarginLeft = seriesKeyEl.style.marginLeft;\n\n const startX = event.clientX;\n const startY = event.clientY;\n const clientStartX = event.clientX;\n const clientStartY = event.clientY;\n\n setDraggedSeries(singleSeries);\n setDragPosition({\n x: event.clientX - startX + (targetLeft - seriesKeyLeft) - 2,\n y: event.clientY - startY + 1\n });\n\n const onMouseMove = (moveEvent) => {\n if (seriesKeyEl.style.marginLeft !== seriesKeyMarginLeft) {\n seriesKeyLeft = seriesKeyEl.getBoundingClientRect().left;\n seriesKeyMarginLeft = seriesKeyEl.style.marginLeft;\n }\n\n setDragPosition({\n x: moveEvent.clientX - startX + (targetLeft - seriesKeyLeft) - 2,\n y: moveEvent.clientY - startY + 1\n });\n };\n\n const onMouseUp = (mouseUpEvent) => {\n window.removeEventListener('mousemove', onMouseMove);\n window.removeEventListener('mouseup', onMouseUp);\n\n let target = mouseUpEvent.target;\n while (target && !(target.dataset || {}).axisIndex && !(target.dataset || {}).grapherId) {\n target = target.parentNode;\n }\n\n setDraggedSeries(null);\n stateController.finalizeDrag(singleSeries, target && (target.dataset || {}).axisIndex, target && (target.dataset || {}).grapherId);\n\n if (mouseUpEvent.clientX === clientStartX && mouseUpEvent.clientY === clientStartY) {\n stateController.toggleAlwaysTooltipped(singleSeries, mouseUpEvent.shiftKey);\n }\n };\n\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('mouseup', onMouseUp);\n\n stateController.markDragStart();\n };\n\n return (\n <div className=\"series-key\" style={style} ref={keyRef}>\n {\n draggingY &&\n <div\n className=\"series-key-axis-container\"\n data-axis-index=\"new-left\"\n data-grapher-id={grapherID}\n />\n }\n\n {\n axes.map((axis, i) => {\n if (!axis.series.length && axes.length > 1) {\n return null;\n }\n\n return (\n <SeriesKeyAxisContainer\n key={i}\n label={axis.label}\n axisIndex={axis.axisIndex}\n scale={axis.scale}\n stateController={stateController}\n grapherID={grapherID}\n >\n {\n axis.series.map((singleSeries) => {\n if (singleSeries.hideFromKey) {\n return null;\n }\n\n return (\n <SeriesKeyItem\n key={singleSeries.index}\n series={singleSeries}\n i={singleSeries.index}\n onMouseDown={(event, toggleTooltipped) => startDragging(event, singleSeries, toggleTooltipped)}\n theme={theme}\n stateController={stateController}\n highlighted={highlightedSeries === singleSeries.index || alwaysTooltipped.has(singleSeries)}\n />\n );\n })\n }\n </SeriesKeyAxisContainer>\n );\n })\n }\n\n {\n draggingY &&\n <div\n className=\"series-key-axis-container\"\n data-axis-index=\"new-right\"\n data-grapher-id={grapherID}\n />\n }\n\n {\n draggedSeries &&\n <SeriesKeyItem\n style={{\n left: dragPosition.x,\n top: dragPosition.y - dragPositionYOffset,\n position: 'absolute',\n pointerEvents: 'none',\n zIndex: 1\n }}\n series={draggedSeries}\n i={draggedSeries.index}\n theme={theme}\n stateController={stateController}\n />\n }\n </div>\n );\n}\n\nSeriesKey.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n theme: PropTypes.string.isRequired,\n draggingY: PropTypes.bool.isRequired,\n grapherID: PropTypes.string,\n dragPositionYOffset: PropTypes.number\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nexport default React.memo(GraphTitle);\n\nfunction GraphTitle({ title }) {\n return (\n <div className=\"grapher-title\">\n {title}\n </div>\n );\n}\n\nGraphTitle.propTypes = {\n title: PropTypes.string.isRequired\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport StateController from '../state/state_controller';\nimport {useSeries} from '../state/hooks';\nimport CustomPropTypes from '../helpers/custom_prop_types';\nimport getColor from '../helpers/colors';\n\nclass SeriesToggle extends React.PureComponent {\n\n constructor(props) {\n super(props);\n\n this.onChange = this.onChange.bind(this);\n }\n\n // NOTE: event listeners here do not follow React best practices, because when handled through React\n // there were ~500ms of latency when toggling the checkbox. It's unclear why\n onChange(event) {\n setTimeout(() => {\n this.props.stateController.setShowing(this.props.singleSeries, event.target.checked);\n });\n }\n\n render() {\n const { singleSeries } = this.props;\n const color = getColor(singleSeries.color, singleSeries.index, singleSeries.multigrapherSeriesIndex);\n\n let name = singleSeries.name || singleSeries.yKey;\n\n if (!name) {\n name = singleSeries.index;\n }\n\n return (\n <div className=\"series-toggle\">\n <label>\n <input\n type=\"checkbox\"\n defaultChecked={!singleSeries.hidden}\n ref={(el) => el && el.addEventListener('change', this.onChange)}\n />\n <span className=\"checkmark\" style={{ background: color, borderColor: color }} />\n\n {name}\n </label>\n </div>\n );\n }\n}\n\nSeriesToggle.propTypes = {\n singleSeries: CustomPropTypes.SingleSeries.isRequired,\n stateController: PropTypes.instanceOf(StateController).isRequired\n};\n\nexport default function Sidebar({ stateController }) {\n const series = useSeries(stateController);\n\n return (\n <div className=\"grapher-sidebar\">\n {\n series.map((singleSeries, i) =>\n <SeriesToggle\n key={i}\n singleSeries={singleSeries}\n stateController={stateController}\n />\n )\n }\n </div>\n );\n}\n\nSidebar.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired\n};\n","import React, { useEffect, useMemo } from 'react';\nimport PropTypes from 'prop-types';\nimport CustomPropTypes from './helpers/custom_prop_types';\nimport GraphBody from './components/graph_body';\nimport './grapher.scss';\nimport XAxis from './components/x_axis';\nimport YAxis from './components/y_axis';\nimport RangeSelection from './components/range_selection';\nimport RangeGraph from './components/range_graph';\nimport SeriesKey from './components/series_key';\nimport {Y_AXIS_WIDTH} from './helpers/axis_sizes';\nimport GraphTitle from './components/graph_title';\nimport {LINE_COLORS} from './helpers/colors';\nimport StateController from './state/state_controller';\nimport {useDraggingY, useLeftAxes, useRightAxes, useShowingSidebar, useTheme} from './state/hooks';\nimport Sidebar from './components/sidebar';\nimport SyncPool from './state/sync_pool.js';\nimport BOUND_CALCULATORS from './state/bound_calculators.js';\n\nfunction calculateClassNamesAndStyles(props, { draggingY, theme }) {\n const { fullscreen, height, width } = props;\n\n const classNames = [\n 'grapher',\n `grapher-${theme}`\n ];\n\n const styles = {};\n\n if (draggingY) {\n classNames.push('grapher-dragging-y');\n }\n\n if (fullscreen) {\n classNames.push('grapher-fullscreen');\n classNames.push('grapher-fixed-height');\n } else if (height) {\n classNames.push('grapher-fixed-height');\n if (typeof height === 'number') {\n styles.height = height - 20;\n } else {\n styles.height = `calc(${height} - 20px)`;\n }\n }\n\n if (width) {\n styles.width = width;\n }\n\n return {\n styles,\n classNames\n };\n}\n\nexport default React.memo(Grapher);\n\nconst grapherDefaultProps = {\n theme: 'night',\n showAxes: true,\n showRangeGraph: true,\n showRangeSelectors: true,\n showSeriesKey: true,\n showTooltips: true,\n boundsSelectionEnabled: true,\n customBoundsSelectors: [],\n sidebarEnabled: false,\n defaultShowAnnotations: true,\n defaultShowOptions: true\n};\n\nfunction Grapher(props) {\n props = {...grapherDefaultProps, ...props};\n\n const stateController = useMemo(() => new StateController({\n grapherID: props.id,\n ...props,\n ...props.stateControllerInitialization\n }), []);\n\n useEffect(() => {\n if (process.env.NODE_ENV === 'development') {\n window.stateController = stateController;\n }\n\n return () => {\n stateController.dispose();\n };\n }, [stateController]);\n\n useEffect(() => {\n props.exportStateController && props.exportStateController(stateController);\n }, [stateController, props.exportStateController]);\n\n useEffect(() => {\n stateController.timingFrameCount = props.timingFrameCount;\n }, [stateController, props.timingFrameCount]);\n\n useEffect(() => {\n props.onRenderTime && stateController.on('render_time', props.onRenderTime);\n\n return () => {\n props.onRenderTime && stateController.off('render_time', props.onRenderTime);\n };\n }, [stateController, props.onRenderTime]);\n\n useEffect(() => {\n stateController.setSeries(props.series);\n }, [stateController, props.series]);\n\n useEffect(() => {\n stateController.theme = props.theme;\n }, [stateController, props.theme]);\n\n const theme = useTheme(stateController);\n const bigLabels = props.bigLabels || theme === 'export';\n\n const defaultLineWidth = props.defaultLineWidth || (theme === 'export' ? 3 : undefined);\n useEffect(() => {\n stateController.defaultLineWidth = defaultLineWidth;\n }, [stateController, defaultLineWidth]);\n\n useEffect(() => {\n stateController.percentile = props.percentile;\n }, [stateController, props.percentile]);\n\n useEffect(() => {\n stateController.customBoundsSelectors = props.customBoundsSelectors;\n }, [stateController, props.customBoundsSelectors]);\n\n useEffect(() => {\n stateController.annotations = props.annotations;\n }, [stateController, props.annotations]);\n\n useEffect(() => {\n if (!props.onAxisChange) {\n return () => {};\n }\n\n stateController.on('exported_axes_changed', props.onAxisChange);\n return () => {\n stateController.off('exported_axes_changed', props.onAxisChange);\n };\n }, [stateController, props.onAxisChange]);\n\n useEffect(() => {\n stateController.primaryRenderer.resize();\n }, [props.height]);\n\n const draggingY = useDraggingY(stateController);\n\n const {styles, classNames} = calculateClassNamesAndStyles(props, { draggingY, theme });\n\n const rightAxes = useRightAxes(stateController);\n const leftAxes = useLeftAxes(stateController);\n const showingSidebar = useShowingSidebar(stateController);\n\n const showAxisColors = typeof props.showAxisColors === 'boolean' ? props.showAxisColors : (theme !== 'export');\n const showGrid = typeof props.showGrid === 'boolean' ? props.showGrid : (theme !== 'export');\n\n const commonYAxisProps = {\n stateController,\n showAxes: props.showAxes,\n showGrid,\n showSeriesKey: props.showSeriesKey,\n bodyHeight: props.bodyHeight,\n theme,\n grapherID: props.id,\n dragPositionYOffset: props.dragPositionYOffset,\n showAxisColors,\n bigLabels\n };\n\n return (\n <div className={classNames.join(' ')} style={styles} data-grapher-id={props.id}>\n {\n props.title &&\n <GraphTitle title={props.title} />\n }\n\n <div className=\"grapher-primary-container-outer\">\n {\n showingSidebar &&\n <Sidebar stateController={stateController} />\n }\n\n <div className=\"grapher-primary-container-body\">\n {\n props.showSeriesKey &&\n <SeriesKey\n stateController={stateController}\n draggingY={draggingY}\n theme={props.theme}\n grapherID={props.id}\n dragPositionYOffset={props.dragPositionYOffset}\n />\n }\n\n {\n props.showRangeSelectors &&\n <RangeSelection\n stateController={stateController}\n customBoundsSelectors={props.customBoundsSelectors}\n customBoundsSelectorsOnly={props.customBoundsSelectorsOnly}\n sidebarEnabled={props.sidebarEnabled}\n />\n }\n\n <div className=\"grapher-main-row\">\n {\n draggingY &&\n <div\n className=\"axis y-axis\"\n data-axis-index=\"new-left\"\n data-grapher-id={props.id}\n style={{\n width: Y_AXIS_WIDTH,\n height: typeof props.bodyHeight === 'number' ? props.bodyHeight : undefined\n }}\n />\n }\n\n {\n leftAxes.map((axis, i) => {\n return <YAxis\n key={i}\n axis={axis}\n sideIndex={leftAxes.length - i - 1}\n {...commonYAxisProps}\n />;\n })\n }\n\n <div className=\"central-container\">\n <GraphBody\n stateController={stateController}\n webgl={props.webgl}\n bodyHeight={props.bodyHeight}\n boundsSelectionEnabled={props.boundsSelectionEnabled}\n showTooltips={props.showTooltips}\n tooltipOptions={props.tooltipOptions}\n checkIntersection={props.checkIntersection}\n draggablePoints={props.draggablePoints}\n onPointDrag={props.onPointDrag}\n onDraggablePointsDoubleClick={props.onDraggablePointsDoubleClick}\n verticalLines={props.verticalLines}\n clockStyle={props.clockStyle}\n timeZone={props.timeZone}\n />\n\n <XAxis\n showGrid={showGrid}\n showAxes={props.showAxes}\n stateController={stateController}\n bigLabels={bigLabels}\n xTickUnit={props.xTickUnit}\n clockStyle={props.clockStyle}\n timeZone={props.timeZone}\n integersOnly={props.xAxisIntegersOnly}\n formatXAxisLabel={props.formatXAxisLabel}\n />\n\n {\n props.showRangeGraph &&\n <div className=\"range-graph-container\">\n <RangeGraph\n stateController={stateController}\n webgl={props.webgl}\n checkIntersection={props.checkIntersection}\n markDates={props.markRangeGraphDates}\n timeZone={props.timeZone}\n verticalLines={props.verticalLines}\n />\n </div>\n }\n </div>\n\n {\n rightAxes.map((axis, i) => {\n return <YAxis\n key={i}\n axis={axis}\n sideIndex={i}\n {...commonYAxisProps}\n />;\n })\n }\n\n {\n draggingY &&\n <div\n className=\"axis y-axis\"\n data-axis-index=\"new-right\"\n data-grapher-id={props.id}\n style={{\n width: Y_AXIS_WIDTH,\n height: typeof props.bodyHeight === 'number' ? props.bodyHeight : undefined\n }}\n />\n }\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nGrapher.propTypes = {\n series: CustomPropTypes.Series.isRequired,\n webgl: PropTypes.bool,\n requireWASM: PropTypes.bool,\n checkIntersection: PropTypes.bool,\n\n onAxisChange: PropTypes.func,\n onRenderTime: PropTypes.func,\n exportStateController: PropTypes.func,\n timingFrameCount: PropTypes.number,\n\n stateControllerInitialization: PropTypes.object,\n syncPool: PropTypes.instanceOf(SyncPool),\n id: PropTypes.string,\n dragPositionYOffset: PropTypes.number,\n\n theme: PropTypes.oneOf(['day', 'night', 'export']),\n title: PropTypes.string,\n fullscreen: PropTypes.bool,\n bodyHeight: PropTypes.number,\n height: PropTypes.number,\n width: PropTypes.number,\n\n showAxes: PropTypes.bool,\n showRangeGraph: PropTypes.bool,\n showRangeSelectors: PropTypes.bool,\n showSeriesKey: PropTypes.bool,\n showTooltips: PropTypes.bool,\n showGrid: PropTypes.bool,\n showAxisColors: PropTypes.bool,\n bigLabels: PropTypes.bool,\n xTickUnit: PropTypes.oneOf(['year']),\n formatXAxisLabel: PropTypes.func,\n xAxisIntegersOnly: PropTypes.bool,\n clockStyle: PropTypes.oneOf(['12h', '24h']),\n timeZone: PropTypes.string, // local, utc, or a full timezone string\n markRangeGraphDates: PropTypes.bool,\n\n boundsSelectionEnabled: PropTypes.bool,\n sidebarEnabled: PropTypes.bool,\n\n percentile: PropTypes.number,\n defaultShowOptions: PropTypes.bool,\n defaultShowIndividualPoints: PropTypes.bool,\n defaultShowSidebar: PropTypes.bool,\n defaultShowAnnotations: PropTypes.bool,\n defaultLineWidth: PropTypes.number,\n\n tooltipOptions: CustomPropTypes.TooltipOptions,\n\n customBoundsSelectors: CustomPropTypes.CustomBoundsSelectors,\n customBoundsSelectorsOnly: PropTypes.bool,\n defaultBoundsCalculator: PropTypes.string,\n\n annotations: CustomPropTypes.Annotations,\n draggablePoints: CustomPropTypes.DraggablePoints,\n onPointDrag: PropTypes.func,\n onDraggablePointsDoubleClick: PropTypes.func,\n verticalLines: CustomPropTypes.VerticalLines\n};\n\nexport const AVAILABLE_COLORS = LINE_COLORS;\nexport const BUILT_IN_BOUND_CALCULATORS = BOUND_CALCULATORS;\n","export default class SyncPool {\n\n /**\n *\n * @param {Boolean} syncBounds\n * @param {Boolean|'onShift'} syncTooltips\n * @param {Boolean} syncDragState\n */\n constructor({ syncBounds=true, syncTooltips=true, syncDragState=false } = {}) {\n this._stateControllers = new Set();\n this._syncBounds = syncBounds;\n this._syncTooltips = syncTooltips;\n this._syncDragState = syncDragState;\n }\n\n add(stateController) {\n this._stateControllers.add(stateController);\n\n if (this._syncBounds) {\n this.syncBounds(stateController);\n }\n\n if (this._syncTooltips) {\n this.syncTooltips(stateController);\n }\n\n if (this._syncDragState) {\n this.syncDragState(stateController);\n }\n }\n\n remove(stateController) {\n this._stateControllers.delete(stateController);\n\n // TODO: remove listeners\n // (though since this is currently only called by stateController dispose, it probably doesn't matter)\n }\n\n syncDragState(stateController) {\n stateController.on('dragging_y_changed', (draggingY) => {\n for (let otherStateController of this._stateControllers) {\n if (stateController === otherStateController) {\n continue;\n }\n\n if (draggingY) {\n otherStateController.markDragStart();\n } else {\n otherStateController.finalizeDrag(null, null);\n }\n }\n });\n }\n\n syncBounds(stateController) {\n stateController.on('bound_calculator_changed', (boundCalculator) => {\n for (let otherStateController of this._stateControllers) {\n if (stateController === otherStateController) {\n continue;\n }\n\n otherStateController.boundCalculator = boundCalculator;\n }\n });\n }\n\n syncTooltips(stateController) {\n stateController.on('tooltip_state_changed', (tooltipState, stateArg) => {\n if (this._tooltipIgnoreState === stateArg) { // avoid cascading changes\n return;\n }\n\n const shouldHideTooltips = tooltipState.unsavedTooltipsCount === 0 ||\n !tooltipState.mousePresent ||\n (this._syncTooltips === 'onShift' && !stateController.shiftKeyPressedOnMove);\n\n if (shouldHideTooltips) {\n this._tooltipIgnoreState = Math.random();\n }\n\n for (let otherStateController of this._stateControllers) {\n if (stateController === otherStateController) {\n continue;\n }\n\n if (shouldHideTooltips) {\n otherStateController.showOnlySavedTooltips(this._tooltipIgnoreState);\n continue;\n }\n\n otherStateController.setTooltipMousePosition({\n mouseX: tooltipState.mouseX,\n mouseY: tooltipState.mouseY,\n tooltipAllNext: true,\n tooltipStateArg: this._tooltipIgnoreState\n });\n }\n });\n }\n\n}\n"],"names":["root","factory","exports","module","require","define","amd","globalThis","__WEBPACK_EXTERNAL_MODULE__155__","inProgress","dataWebpackPrefix","___CSS_LOADER_EXPORT___","push","id","cssWithMappingToString","list","toString","this","map","item","content","needLayer","concat","length","join","i","modules","media","dedupe","supports","layer","undefined","alreadyImportedModules","k","_k","cssMapping","btoa","base64","unescape","encodeURIComponent","JSON","stringify","data","sourceMapping","ReactPropTypesSecret","emptyFunction","emptyFunctionWithReset","resetWarningCache","shim","props","propName","componentName","location","propFullName","secret","err","Error","name","getShim","isRequired","ReactPropTypes","array","bigint","bool","func","number","object","string","symbol","any","arrayOf","element","elementType","instanceOf","node","objectOf","oneOf","oneOfType","shape","exact","checkPropTypes","PropTypes","stylesInDOM","getIndexByIdentifier","identifier","result","modulesToDom","options","idCountMap","identifiers","base","count","indexByIdentifier","obj","css","sourceMap","references","updater","addElementStyle","byIndex","splice","api","domAPI","update","newObj","remove","lastIdentifiers","newList","index","newLastIdentifiers","_i","_index","memo","insert","style","target","styleTarget","document","querySelector","window","HTMLIFrameElement","contentDocument","head","e","getTarget","appendChild","createElement","setAttributes","attributes","styleElement","nonce","setAttribute","insertStyleElement","styleTagTransform","apply","parentNode","removeChild","removeStyleElement","styleSheet","cssText","firstChild","createTextNode","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","m","n","getter","__esModule","d","a","definition","key","o","Object","defineProperty","enumerable","get","f","chunkId","Promise","all","keys","reduce","promises","u","prop","prototype","hasOwnProperty","call","l","url","done","script","needAttach","scripts","getElementsByTagName","s","getAttribute","charset","timeout","nc","src","onScriptComplete","prev","event","onerror","onload","clearTimeout","doneFns","forEach","fn","setTimeout","bind","type","r","Symbol","toStringTag","value","p","b","baseURI","self","href","installedChunks","j","installedChunkData","promise","resolve","reject","error","errorType","realSrc","message","request","webpackJsonpCallback","parentChunkLoadingFunction","chunkIds","moreModules","runtime","some","chunkLoadingGlobal","SIMPLE_DATA_TYPES","DATA_TYPES","Data","SingleSeries","xKey","yKey","xUnixDates","color","xLabel","yLabel","ignoreDiscontinuities","dashed","dashPattern","width","rangeSelectorWidth","axis","expandYWith","defaultAlwaysTooltipped","square","shiftXBy","graph","background","hideFromKey","showIndividualPoints","rendering","negativeColor","gradient","zeroLineWidth","zeroLineColor","zeroLineY","pointRadius","tooltipWidth","hasAreaBottom","shadowColor","rangeKey","Series","Axis","axisIndex","series","side","scale","label","Axes","CustomBoundsSelector","calculator","datesOnly","CustomBoundsSelectors","TooltipOptionsRaw","includeSeriesLabel","includeXLabel","includeYLabel","includeXValue","includeYValue","floating","alwaysFixedPosition","floatPosition","floatDelta","savingDisabled","customTooltip","combineTooltips","TooltipOptions","Annotation","x","Date","xEnd","Annotations","DraggablePoint","y","radius","fillColor","strokeColor","strokeWidth","onClick","onDoubleClick","DraggablePoints","VerticalLine","lineTop","markTop","markerStyle","text","textTop","textStyle","minPixelX","maxPixelX","onRangeGraph","onRangeGraphOnly","VerticalLines","async","sizeCanvas","canvas","context","reset","height","requestAnimationFrame","boundingRect","getBoundingClientRect","pixelRatio","devicePixelRatio","webkitBackingStorePixelRatio","mozBackingStorePixelRatio","msBackingStorePixelRatio","oBackingStorePixelRatio","backingStorePixelRatio","elementWidth","elementHeight","renderWidth","renderHeight","LINE_COLORS","getColor","seriesColor","multigrapherSeriesIndex","colorToVector","startsWith","parts","split","part","parseFloat","match","test","parseInt","substr","pathsFrom","dataInRenderSpace","splitAtY","paths","currentPath","previouslyDiscontinuous","nullMask","maxYValues","minYValues","yValues","minY","maxY","prevY","RustAPI","extractVerticesFromPaths","pointNumber","path","positions","Float32Array","prevPositions","vertices","indices","Uint32Array","verticesPattern","set","vertexPointer","sourceLength","copyWithin","pointI","prevX","createGLProgram","gl","vertShaderSource","fragShaderSource","vertexShader","createShader","VERTEX_SHADER","shaderSource","compileShader","getShaderParameter","COMPILE_STATUS","console","getShaderInfoLog","fragmentShader","FRAGMENT_SHADER","program","createProgram","attachShader","linkProgram","validateProgram","getProgramParameter","LINK_STATUS","getProgramInfoLog","then","LineProgram","constructor","_gl","_program","lineVert","lineFrag","_circleProgram","circleVert","circleFrag","_positionBuffer","createBuffer","_prevPositionBuffer","_vertexBuffer","_indexBuffer","_individualPointBuffer","getExtension","dispose","clear","drawingBufferWidth","drawingBufferHeight","clearColor","DEPTH_BUFFER_BIT","COLOR_BUFFER_BIT","viewport","draw","parameters","useProgram","thickness","highlighted","shadowBlur","get_point_number","extract_vertices","extractVertices","positionIndex","getAttribLocation","prevPositionIndex","vertexIndex","enableVertexAttribArray","bindBuffer","ARRAY_BUFFER","bufferData","STATIC_DRAW","vertexAttribPointer","FLOAT","uniform1f","getUniformLocation","Math","max","uniform4f","ELEMENT_ARRAY_BUFFER","drawElements","TRIANGLES","UNSIGNED_INT","individualPoints","getIndividualPoints","flat","drawArrays","POINTS","Eventable","_listeners","clearListeners","on","eventName","Set","add","off","delete","size","emit","args","arguments","BackgroundProgram","backgroundVert","backgroundFrag","minXt","maxXt","positionLocation","enable","BLEND","blendFunc","SRC_ALPHA","ONE_MINUS_SRC_ALPHA","drawZeroLine","sizing","zeroColor","zeroWidth","strokeStyle","lineWidth","beginPath","moveTo","lineTo","stroke","getBarWidths","closestSpacing","bounds","axisSeriesCount","fullBarWidth","maxX","minX","totalBarWidth","barWidth","barSpacing","inferType","useSimpleData","simpleData","Array","isArray","observe","GraphBodyRenderer","stateController","canvasElement","webgl","checkIntersection","super","_stateController","_checkIntersection","_canvas","_webgl","_context","getContext","_lineProgram","alert","_context2d","_initialized","_initializeCanvas","_boundResize","resize","_cachedAxisCount","_onAxisChange","axes","filter","_resizeObserver","disconnect","_intersectionObserver","clearRect","render","singleSeries","inRenderSpace","defaultLineWidth","globalBounds","inRenderSpaceAreaBottom","useDataSpace","currentBounds","inSelectedSpace","inDataSpace","_sizing","commonCPUParams","flush","zero","hasNegatives","find","tuple","indexInAxis","fillStyle","barBottom","fillRect","drawBars","indexOf","globalGradient","createLinearGradient","addColorStop","areaBottom","areaPaths","areaBottomPaths","linePaths","pathI","areaBottomPath","firstX","_startY","lastX","_lastY","fill","positive","arc","PI","drawArea","drawParams","getRanges","range","min","pixelX","pixelMinY","pixelMaxY","setLineDash","ranges","horizontalBarWidth","drawLine","renderBackground","inBackgroundSpace","_backgroundProgram","drawBackground","markSizeChanged","ResizeObserver","first","disabled","IntersectionObserver","entries","_intersectionTimeout","isIntersecting","threshold","sizingPromise","resizeDebounced","_resizeTimeout","recalculatePosition","calculatePrecision","log10","abs","roundToPrecision","precision","isNaN","rounded","toFixed","ceil","stripped","includes","replace","DATE_TIME_FORMATTERS","timezoneToOffsetMS","timeZone","sampleDate","datetimeFormatter","properTimeZone","Intl","DateTimeFormat","resolvedOptions","timeZoneName","offsetPart","formatToParts","hours","minutes","slice","startOfDayInTimezone","date","timezone","startOfDay","setHours","offset","setUTCHours","valueOf","formatX","dates","justTime","justDate","justMonthAndDay","clockStyle","unitOverride","integersOnly","inverseEnumMap","time","utc","toLowerCase","localOffset","year","getUTCFullYear","getFullYear","month","getUTCMonth","getMonth","day","getUTCDate","getDate","toLocaleDateString","getUTCHours","getHours","getUTCMinutes","getMinutes","seconds","getUTCSeconds","getSeconds","milliseconds","getUTCMilliseconds","getMilliseconds","timeString","padStart","formatTime","round","formatY","log","Y_AXIS_WIDTH","getYLabelContent","fullYPrecision","TooltipLabel","axisLabel","textLeft","formatXOptions","React","propTypes","CustomPropTypes","Tooltip","halfHeight","passThroughProps","preparedTooltips","tooltips","tooltip","pixelY","fixedPosition","multiplier","caretSize","isFinite","transform","commonLabelProps","maxPrecision","baseLeft","yTranslation","axisCount","caretPadding","Boolean","CustomTooltipComponent","groupedTooltips","combinationThreshold","added","group","totalHeight","maxWidth","sort","className","_extends","top","left","defaultProps","mouseX","mouseY","ContextMenu","setTextRef","ref","textRef","contextMenu","showing","createRange","selection","getSelection","removeAllRanges","selectNodeContents","addRange","focus","formatDateTime","dateTimeStr","datePart","timePart","formattedDate","period","toLocaleString","displayValue","autoFocus","simpleSeriesToDataSpace","tuples","tuplesToDataSpace","values","valuesToDataSpace","objects","objectsToDataSpace","originalXValue","enumToNumber","yValue","valueXStart","xValue","readBinaryFormatValue","view","getUint32","BYTES_PER_ELEMENT","getUint8","getFloat64","point","buffer","ArrayBuffer","DataView","xIndex","channels","yIndex","offsets","subpoint","finalizeBounds","initial","calculateDataBounds","percentile","percentileAsymmetry","sortedByY","_x","_x1","y1","_x2","y2","asymmetry","inBottomPercentile","inTopPercentile","startIndex","floor","endIndex","percentileBounds","spacing","mergeBounds","boundsList","mergedBounds","expandBounds","extendXForNBars","expandedBounds","assign","unscaledMinY","unscaledMaxY","midpoint","binarySearch","targetX","searchParams","returnIndex","middleIndex","searchType","dataSpaceToSelectedSpace","swap","firstAdded","lastAdded","beforeIndex","afterIndex","addToEndOnly","beginningInterpolationIndex","endInterpolationIndex","pop","shift","unshift","interpolationIndex","interpolate","lastIncluded","nullIndex","selectedIndex","dataIndex","begPoint","endPoint","firstIndex","secondIndex","boundary","xBefore","yBefore","xAfter","yAfter","percent","scaleBounds","rustApiModule","RustAPIPromise","default","selectedSpaceToRenderSpace","dataChanged","Uint8Array","Float64Array","scaledBounds","inParams","dataF64","dataNullMask","copyIndexStart","hasSwap","useSwap","extraSpaceFactor","selected_space_to_render_space","prevI","minSeenY","maxSeenY","curY","selectedSpaceToRenderSpaceInPlace","flattenSimpleData","flattened","fI","extractYValue","warn","extractXValue","moveTooltip","distance","sqrt","xDistance","pixelWidth","lastMinute","last10Minutes","lastHour","lastDay","condenseDataSpace","targetBucketCount","partiallyCondensedData","CONDENSE_THRESHOLD","condensedData","bucketSize","minInBucket","maxInBucket","currentBucketIndex","bucketIndex","nameForSeries","selectedSpaceToBackgroundSpace","conditions","evaluator","comparator","comparedAgainst","parsedValue","currentSection","condition","interpolatedMaxX","interpolatedMinX","StateController","defaultBoundsCalculator","customBoundsSelectors","requireWASM","defaultShowIndividualPoints","defaultShowSidebar","defaultShowAnnotations","defaultShowOptions","syncPool","grapherID","sharedDataCache","sharedSubscriptions","fullscreen","_requireWASM","_markDirty","_series","_seriesFromOriginalSeries","Map","_axes","_highlightedSeries","_showIndividualPoints","_autoscaleY","_percentile","_percentileAsymmetry","_showingOptions","_maxPrecision","_showingSidebar","_showingAnnotations","_grapherID","_fullscreen","_alwaysTooltipped","_tooltipState","mousePresent","_contextMenuPosition","_savedTooltips","_draggingY","_annotations","_annotationsState","annotations","_enumMap","_hasXEnum","_timingBuffer","_timingIndex","_timingFrameCount","_modifiedSeries","_deferredEmissions","_deferredPriorityEmissions","primaryRenderer","rangeGraphRenderer","_boundsCalculator","givenLabel","customCalculators","BOUND_CALCULATORS","getDefaultBoundsCalculator","_boundsHistory","_boundsIndex","_dataCache","_subscriptions","_subscriptionsShared","_observablesToSeries","_generators","_generatorsToSeries","_generatorCallArgs","_seriesChangedFromPromises","_syncPool","_onDataChange","listener","unsubscribe","_removeSeries","disposed","setSeries","userSeries","userCreated","propsSeries","anyDifferent","originalSeries","_mustResize","newSeriesSet","has","_tooltipsChanged","deferredEmit","_assignAxisTo","hidden","_hideSeries","_dataChanged","_frameRequested","frameRequestStart","performance","now","frameExecutionStart","dataProcessingStart","_mustRerender","_annotationsChanged","_onDataAdd","_primarySizeChanged","_calculatePrimarySizeDependents","_rangeGraphSizeChanged","_calculateRangeGraphSizeDependents","dataProcessingEnd","renderPipelineStart","_render","renderPipelineEnd","generatorsStart","_mustCallGenerators","_callGenerators","generatorsEnd","tooltipStart","_recalculateTooltips","tooltipEnd","contextMenuStart","_contextMenuChanged","_recalculateContextMenu","contextMenuEnd","annotationStart","_recalculateAnnotations","annotationEnd","callbacksStart","emission","callbacksEnd","completionTime","loopTime","frameExecution","frameRequestAndExecution","generators","dataProcessing","renderPipeline","callbacks","lastLoopTime","deferredPriorityEmit","_seriesToSimpleData","currentData","sameDataSet","firstSameDataSeries","next","_listenToObservableData","observable","_callGenerator","_listenToPromise","dataPromise","resolved","datum","markObservableModified","_unsubscribeFromStaleSeries","currentSeries","seriesSet","stillHasListener","generator","stillHasSeries","_selection","alwaysTooltipped","savedTooltips","allTooltipped","savedTooltip","minDistance","Infinity","trueX","closestIndex","closestPoint","ignoreYDistance","xDistanceThreshold","yDistanceThreshold","distanceThreshold","yDistance","enumLike","hasEnum","simplePoint","hasXEnum","unsavedTooltips","unsavedTooltipsCount","calculateTooltipState","_tooltipAllNext","_globalBounds","_tooltipStateArg","newX","right","shownSeries","annotation","seriesName","xAsNumber","xEndAsNumber","xStart","pixelEnd","calculateAnnotationsState","_expandYWith","dataBoundsList","simpleDataSliceStart","dataBounds","_dataBounds","_recalculateSelection","disableSwap","selectedBounds","selectedBoundsAreaTop","selectedBoundsAreaBottom","inSelectedSpaceAreaBottom","_recalculateAxisBounds","modifiedSeries","newData","modifiedAxes","modifiedSeriesAndDependents","newDataInDataSpace","newDataBounds","newPointCount","previousSelection","newSelectedData","fixedY","targetBounds","byAxis","selectedBoundsList","selectedDataBounds","boundsCalculator","selectionFromGlobalBounds","_","export","night","_theme","inBackgroundSpacePrimary","inRenderSpacePrimary","_defaultLineWidth","inRenderSpacePrimaryAreaBottom","inRenderSpaceRangeGraph","inRenderSpaceRangeGraphAreaBottom","toCondensedSelectedSpaceParams","inCondensedSelectedSpacePrimary","toRenderSpaceParams","inCondensedSelectedSpacePrimaryAreaBottom","inBackgroundSpacePrimaryAreaBottom","toSelectedSpaceParams","inSelectedSpaceRangeGraph","inCondensedSelectedSpaceRangeGraph","inSelectedSpaceRangeGraphAreaBottom","inCondensedSelectedSpaceRangeGraphAreaBottom","_createAxis","_moveAxis","newAxis","oldAxis","oldIndex","leftAxes","rightAxes","exportedAxes","originalAxis","seen","candidateAxis","findMatchingAxis","inValueSpacePrimary","inValueSpaceRangeGraph","_showSeries","boundCalculator","reverse","highlightedSeries","autoscaleY","boundHistory","hasNextBounds","hasPreviousBounds","tooltipState","contextMenuState","draggingY","averageLoopTime","loopTimes","averageLoopTimes","axisToName","leftCount","rightCount","showingOptions","showingSidebar","showingAnnotations","userCreatedSeries","annotationState","theme","exportMode","_exportMode","enumMap","renderer","_nonExportTheme","boundingFunction","debounceHistory","_boundingCalculatorDebouncer","_addBoundCalculatorToHistory","boundsSelectors","_customBoundsSelectors","indexedCustomBoundSelectors","registerSeriesClick","selectedSeriesIndex","setHighlightedSeries","toggleIndividualPoints","toggleYAutoscaling","toggleExportMode","setBoundsFromSelection","pixelSelection","minPixelY","maxPixelY","pow","boundCalculatorFromSelection","nextBounds","previousBounds","setLabel","toggleScale","oldScale","recalculateTooltips","setTooltipMousePosition","clientX","_tooltipClientX","clientY","_tooltipClientY","shiftKey","shiftKeyPressedOnMove","tooltipAllNext","tooltipStateArg","showOnlySavedTooltips","bottom","newMouseX","newMouseY","setContextMenuMousePosition","toggleAlwaysTooltipped","registerClick","toggleTooltipSaved","oldSavedTooltips","currentTooltips","lastTooltip","currentTooltipIndex","findIndex","clearSavedTooltips","markDragStart","finalizeDrag","draggedSeries","hasAxis","sameGrapherID","timingFrameCount","toggleShowingOptions","toggleMaxPrecision","toggleShowingAnnotations","toggleShowingSidebar","setShowing","skipResize","isX","existingIndex","indexToSet","triggerResize","useEvent","eventSource","initialState","watch","originalInitialState","setValue","useState","useEffect","updatedValue","originalUpdatedValue","usePrimarySize","useAxes","useSeries","useHighlightedSeries","useRightAxisCount","useRightAxes","useLeftAxisCount","useLeftAxes","useAxisBounds","useAutoscaleY","useShowingOptions","useMaxPrecision","useShowingSidebar","useShowingAnnotations","useSizing","useTheme","bodyHeight","lineOnly","draggablePoints","onPointDrag","onDraggablePointsDoubleClick","onPointlessDoubleClick","newXT","newYT","xT","yT","stopPropagation","cx","cy","onMouseDown","xOffset","yOffset","onMouseMove","moveEvent","onMouseUp","removeEventListener","addEventListener","verticalLines","isRangeGraph","relevantVerticalLines","line","lineStyle","fontSize","textAnchor","dominantBaseline","x1","x2","points","GraphBody","boundsSelectionEnabled","showTooltips","tooltipOptions","canvasEl","useCallback","el","boundsSelection","setBoundsSelection","start","useTooltipState","showAnnotations","useAnnotationState","useContextMenu","onScroll","onGlobalMouseMove","passive","onMouseLeave","currentNode","classList","contains","closest","onContextMenu","preventDefault","placeTick","trueValue","inverted","totalSize","formatter","formatOptions","opts","scaledValue","pixelValue","placeTickByPixel","roundToDivisor","divisor","divisors","bestDelta","bestDivisor","delta","placeGrid","expectedLabelSize","labelPadding","skipFirst","skipLast","paddedLabelSize","ticks","placementParams","amount","unit","span","desiredCount","subspan","getEvenDateTickSpacing","position","currentDate","setMinutes","setSeconds","setMilliseconds","setDate","lastDateString","tick","placeDatesGrid","tickSpacing","roundTo","getEvenTickSpacing","roundToEvenNumber","placeNumbersGrid","locals","XAxis","showAxes","showGrid","bigLabels","xTickUnit","formatXAxisLabel","useSelection","useHasXEnum","useEnumMap","minDate","maxDate","calculateTimePrecision","minLabel","maxLabel","expectedLabelWidth","marginBottom","skipGrid","classes","xAxisHeight","YAxis","showSeriesKey","sideIndex","dragPositionYOffset","showAxisColors","sidePadding","setDraggedSeries","dragDelta","setDragDelta","dx","dy","highlightedOpacity","unhighlightedOpacity","marginLeft","opacity","edge","strokeDasharray","startDrag","startX","startY","mouseUpEvent","dataset","grapherId","onMouseOver","onMouseOut","RangeSelectionButtonBase","selected","children","description","RangeSelectionButton","currentBoundCalculator","PercentileButton","usePercentile","usePercentileAsymmetry","onChange","onKeyUp","keyCode","focusable","viewBox","Options","sidebarEnabled","useShowIndividualPoints","RangeSelection","customBoundsSelectorsOnly","rightAxisCount","leftAxisCount","marginRight","useGlobalBounds","useBoundCalculator","useBoundHistory","customBoundSelectorNames","RangeGraph","state","selectionBounds","stopDragging","startScroll","startLeftDrag","startRightDrag","componentDidMount","_renderer","setState","componentDidUpdate","prevProps","componentWillUnmount","_dragType","leftX","percentage","_scrollAnchorPercentage","boundToRight","boundToLeft","addListeners","pixelStartX","pixelMinX","pixelMaxX","markDates","SeriesKeyItem","backgroundColor","SeriesKeyAxisContainer","showingLabelInput","toggleLabelInputShowing","placeholder","SeriesKey","dragPosition","setDragPosition","keyRef","useRef","keyWidth","setKeyWidth","sizeCalculationHandle","current","cancelAnimationFrame","querySelectorAll","clientWidth","calculateStyles","useAlwaysTooltipped","toggleTooltipped","startDragging","seriesKeyEl","targetLeft","seriesKeyLeft","seriesKeyMarginLeft","clientStartX","clientStartY","pointerEvents","zIndex","GraphTitle","title","SeriesToggle","checked","defaultChecked","borderColor","Sidebar","Grapher","grapherDefaultProps","showRangeGraph","showRangeSelectors","useMemo","stateControllerInitialization","exportStateController","onRenderTime","onAxisChange","useDraggingY","styles","classNames","calculateClassNamesAndStyles","commonYAxisProps","xAxisIntegersOnly","markRangeGraphDates","syncBounds","syncTooltips","syncDragState","_stateControllers","_syncBounds","_syncTooltips","_syncDragState","otherStateController","stateArg","_tooltipIgnoreState","shouldHideTooltips","random","AVAILABLE_COLORS","BUILT_IN_BOUND_CALCULATORS"],"sourceRoot":""}