@windborne/grapher 1.0.0
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/.eslintrc.js +85 -0
- package/.idea/codeStyles/Project.xml +19 -0
- package/.idea/codeStyles/codeStyleConfig.xml +5 -0
- package/.idea/grapher.iml +12 -0
- package/.idea/inspectionProfiles/Project_Default.xml +6 -0
- package/.idea/misc.xml +6 -0
- package/.idea/modules.xml +8 -0
- package/.idea/vcs.xml +6 -0
- package/0.bundle.js +2 -0
- package/0.bundle.js.map +1 -0
- package/1767282193a714f63082.module.wasm +0 -0
- package/537.bundle.js +2 -0
- package/537.bundle.js.map +1 -0
- package/831.bundle.js +2 -0
- package/831.bundle.js.map +1 -0
- package/bundle.js +2 -0
- package/bundle.js.map +1 -0
- package/package.json +75 -0
- package/readme.md +129 -0
- package/src/components/annotations.js +62 -0
- package/src/components/context_menu.js +73 -0
- package/src/components/draggable_points.js +114 -0
- package/src/components/graph_body.js +292 -0
- package/src/components/graph_title.js +16 -0
- package/src/components/options.js +111 -0
- package/src/components/percentile_button.js +72 -0
- package/src/components/range_graph.js +352 -0
- package/src/components/range_selection.js +175 -0
- package/src/components/range_selection_button.js +26 -0
- package/src/components/range_selection_button_base.js +51 -0
- package/src/components/series_key.js +235 -0
- package/src/components/series_key_axis_container.js +70 -0
- package/src/components/series_key_item.js +52 -0
- package/src/components/sidebar.js +76 -0
- package/src/components/tooltip.js +244 -0
- package/src/components/vertical_lines.js +70 -0
- package/src/components/x_axis.js +124 -0
- package/src/components/y_axis.js +239 -0
- package/src/eventable.js +65 -0
- package/src/grapher.js +367 -0
- package/src/grapher.scss +914 -0
- package/src/helpers/axis_sizes.js +2 -0
- package/src/helpers/binary_search.js +67 -0
- package/src/helpers/color_to_vector.js +35 -0
- package/src/helpers/colors.js +27 -0
- package/src/helpers/custom_prop_types.js +159 -0
- package/src/helpers/flatten_simple_data.js +81 -0
- package/src/helpers/format.js +233 -0
- package/src/helpers/generator_params_equal.js +10 -0
- package/src/helpers/name_for_series.js +16 -0
- package/src/helpers/place_grid.js +257 -0
- package/src/helpers/pyodide_ready.js +13 -0
- package/src/multigrapher.js +105 -0
- package/src/renderer/background.frag +7 -0
- package/src/renderer/background.vert +7 -0
- package/src/renderer/background_program.js +48 -0
- package/src/renderer/circle.frag +26 -0
- package/src/renderer/circle.vert +12 -0
- package/src/renderer/create_gl_program.js +36 -0
- package/src/renderer/draw_area.js +159 -0
- package/src/renderer/draw_background.js +15 -0
- package/src/renderer/draw_bars.js +80 -0
- package/src/renderer/draw_line.js +69 -0
- package/src/renderer/draw_zero_line.js +24 -0
- package/src/renderer/extract_vertices.js +137 -0
- package/src/renderer/graph_body_renderer.js +293 -0
- package/src/renderer/line.frag +51 -0
- package/src/renderer/line.vert +32 -0
- package/src/renderer/line_program.js +125 -0
- package/src/renderer/paths_from.js +72 -0
- package/src/renderer/scale_bounds.js +28 -0
- package/src/renderer/size_canvas.js +59 -0
- package/src/rust/Cargo.lock +233 -0
- package/src/rust/Cargo.toml +35 -0
- package/src/rust/pkg/grapher_rs.d.ts +42 -0
- package/src/rust/pkg/grapher_rs.js +351 -0
- package/src/rust/pkg/grapher_rs_bg.d.ts +11 -0
- package/src/rust/pkg/grapher_rs_bg.wasm +0 -0
- package/src/rust/pkg/index.js +342 -0
- package/src/rust/pkg/index_bg.wasm +0 -0
- package/src/rust/pkg/package.json +14 -0
- package/src/rust/src/extract_vertices.rs +83 -0
- package/src/rust/src/get_point_number.rs +50 -0
- package/src/rust/src/lib.rs +15 -0
- package/src/rust/src/selected_space_to_render_space.rs +131 -0
- package/src/state/average_loop_times.js +15 -0
- package/src/state/bound_calculator_from_selection.js +36 -0
- package/src/state/bound_calculators.js +41 -0
- package/src/state/calculate_annotations_state.js +59 -0
- package/src/state/calculate_data_bounds.js +104 -0
- package/src/state/calculate_tooltip_state.js +241 -0
- package/src/state/data_types.js +13 -0
- package/src/state/expand_bounds.js +58 -0
- package/src/state/find_matching_axis.js +31 -0
- package/src/state/get_default_bounds_calculator.js +15 -0
- package/src/state/hooks.js +164 -0
- package/src/state/infer_type.js +74 -0
- package/src/state/merge_bounds.js +64 -0
- package/src/state/multigraph_state_controller.js +334 -0
- package/src/state/selection_from_global_bounds.js +25 -0
- package/src/state/space_conversions/condense_data_space.js +115 -0
- package/src/state/space_conversions/data_space_to_selected_space.js +328 -0
- package/src/state/space_conversions/selected_space_to_background_space.js +144 -0
- package/src/state/space_conversions/selected_space_to_render_space.js +161 -0
- package/src/state/space_conversions/simple_series_to_data_space.js +229 -0
- package/src/state/state_controller.js +1770 -0
- package/src/state/sync_pool.js +101 -0
- package/test/setup.js +15 -0
- package/test/space_conversions/data_space_to_selected_space.test.js +434 -0
- package/webpack.dev.config.js +109 -0
- package/webpack.prod.config.js +60 -0
- package/webpack.test.config.js +59 -0
package/bundle.js.map
ADDED
@@ -0,0 +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/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/infer_type.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/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/space_conversions/selected_space_to_background_space.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});\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};\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 width: PropTypes.number,\n markTop: PropTypes.bool,\n style: PropTypes.object,\n markerStyle: PropTypes.object\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);\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 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';\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 }) {\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 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\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 });\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 };\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(async () => {\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 await this.resize();\n disabled = false; // eslint-disable-line require-atomic-updates\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 * @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\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 linePaths = pathsFrom(dataInRenderSpace, {\n splitAtY: zero\n });\n\n for (let path of areaPaths) {\n context.beginPath();\n\n const [firstX, _startY] = path[0];\n const [lastX, _lastY] = path[path.length - 1];\n\n context.moveTo(firstX, areaBottom);\n\n for (let i = 0; i < path.length; i++) {\n const [x, y] = path[i];\n context.lineTo(x, y);\n }\n\n context.lineTo(lastX, areaBottom);\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 * @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\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 (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 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 let height = 12*3 + 6;\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 + 3;\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 return (\n <div className=\"grapher-tooltip\">\n <svg>\n {\n this.props.tooltips.map(({ x, y, color, pixelY, pixelX, series, index, xLabel, yLabel, fullYPrecision }, i) => {\n const axisLabel = (series.name || series.yKey || index).toString();\n const width = Math.max(axisLabel.length, (xLabel || formatX(x, formatXOptions)).length + 4, getYLabelContent({ yLabel, y, fullYPrecision}).length + 4) * 7.5;\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 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 // display in a fixed position if not wide enough\n if (fixedPosition || this.props.alwaysFixedPosition) {\n textLeft = 6;\n\n let 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 let 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 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 </svg>\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.oneOfType([PropTypes.number, PropTypes.string]),\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') {\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.isRequired,\n y: PropTypes.number.isRequired,\n showing: PropTypes.bool.isRequired,\n value: PropTypes.oneOfType([\n PropTypes.instanceOf(Date),\n PropTypes.number,\n PropTypes.object\n ])\n }).isRequired\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 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 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","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 }\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 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.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 }\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 = {\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 });\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 });\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 singleSeries.inCondensedSelectedSpacePrimary = condenseDataSpace({\n data: singleSeries.inSelectedSpace.data,\n swap: singleSeries.inCondensedSelectedSpacePrimary,\n minX: currentBounds.minX,\n maxX: currentBounds.maxX,\n renderWidth,\n dataChanged\n });\n\n singleSeries.inRenderSpacePrimary = selectedSpaceToRenderSpace({\n data: singleSeries.inCondensedSelectedSpacePrimary.data,\n swap: singleSeries.inRenderSpacePrimary,\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.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\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 singleSeries.inSelectedSpaceRangeGraph = dataSpaceToSelectedSpace({\n data: singleSeries.inDataSpace,\n swap: singleSeries.inSelectedSpaceRangeGraph,\n minX: globalBounds.minX,\n maxX: globalBounds.maxX,\n ignoreDiscontinuities: singleSeries.ignoreDiscontinuities,\n square: singleSeries.square\n });\n\n singleSeries.inCondensedSelectedSpaceRangeGraph = condenseDataSpace({\n data: singleSeries.inSelectedSpaceRangeGraph.data,\n swap: singleSeries.inCondensedSelectedSpaceRangeGraph,\n minX: globalBounds.minX,\n maxX: globalBounds.maxX,\n renderWidth,\n dataChanged\n });\n\n singleSeries.inRenderSpaceRangeGraph = selectedSpaceToRenderSpace({\n data: singleSeries.inCondensedSelectedSpaceRangeGraph.data,\n swap: singleSeries.inRenderSpaceRangeGraph,\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\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","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","/**\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 }) {\n const bounds = useAxisBounds(stateController)[0];\n const sizing = useSizing(stateController);\n\n if (!sizing) {\n return null;\n }\n\n return (\n <div className=\"grapher-vertical-lines\">\n <svg width={sizing.elementWidth} height={sizing.elementHeight}>\n {\n verticalLines.map((line, index) => {\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 * sizing.elementWidth;\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 return (\n <React.Fragment key={index}>\n <line\n x1={pixelX}\n y1={0}\n x2={pixelX}\n y2={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 </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};\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) {\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 }) {\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 };\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: 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};\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';\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 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 </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};\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 />\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 />\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 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}.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}.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-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}.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}.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-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}.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}.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-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\\n svg {\\n position: absolute;\\n overflow: visible;\\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\\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","Series","Axis","axisIndex","series","side","scale","label","Axes","CustomBoundsSelector","calculator","datesOnly","CustomBoundsSelectors","TooltipOptionsRaw","includeSeriesLabel","includeXLabel","includeYLabel","includeXValue","includeYValue","floating","alwaysFixedPosition","floatPosition","floatDelta","savingDisabled","TooltipOptions","Annotation","x","Date","xEnd","content","Annotations","DraggablePoint","y","radius","fillColor","strokeColor","strokeWidth","onClick","onDoubleClick","DraggablePoints","VerticalLine","markTop","style","markerStyle","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","shadowColor","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","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","useDataSpace","currentBounds","inSelectedSpace","inDataSpace","_sizing","commonCPUParams","flush","index","zero","hasNegatives","find","tuple","indexInAxis","fillStyle","barBottom","fillRect","drawBars","indexOf","globalGradient","createLinearGradient","value","Array","isArray","addColorStop","areaBottom","areaPaths","linePaths","firstX","_startY","lastX","_lastY","fill","positive","arc","PI","drawArea","drawParams","setLineDash","drawLine","renderBackground","inBackgroundSpace","_backgroundProgram","drawBackground","markSizeChanged","ResizeObserver","first","disabled","observe","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","textTop","formatXOptions","React","propTypes","CustomPropTypes","Tooltip","props","halfHeight","passThroughProps","className","tooltips","pixelY","pixelX","fixedPosition","multiplier","caretSize","isFinite","transform","commonLabelProps","maxPrecision","baseLeft","axisCount","yTranslation","key","r","d","_extends","defaultProps","mouseX","mouseY","ContextMenu","setTextRef","ref","textRef","contextMenu","showing","range","document","createRange","selection","getSelection","removeAllRanges","selectNodeContents","addRange","focus","formatDateTime","dateTimeStr","datePart","timePart","formattedDate","period","left","top","toLocaleString","displayValue","autoFocus","inferType","options","useSimpleData","simpleData","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","sort","_x1","y1","_x2","y2","asymmetry","min","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","tooltip","distance","sqrt","xDistance","pixelWidth","all","lastMinute","last10Minutes","lastHour","lastDay","condenseDataSpace","targetBucketCount","partiallyCondensedData","concat","CONDENSE_THRESHOLD","condensedData","bucketSize","minInBucket","maxInBucket","currentBucketIndex","bucketIndex","nameForSeries","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","b","a","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","_recalculateAxisBounds","modifiedSeries","newData","modifiedAxes","modifiedSeriesAndDependents","newDataInDataSpace","newDataBounds","newPointCount","previousSelection","newSelectedData","fixedY","targetBounds","byAxis","selectedBoundsList","selectedDataBounds","boundsCalculator","selectionFromGlobalBounds","export","night","_theme","inBackgroundSpacePrimary","inRenderSpacePrimary","_defaultLineWidth","inRenderSpaceRangeGraph","s","inCondensedSelectedSpacePrimary","conditions","evaluator","comparator","comparedAgainst","parsedValue","currentSection","condition","interpolatedMaxX","interpolatedMinX","selectedSpaceToBackgroundSpace","inSelectedSpaceRangeGraph","inCondensedSelectedSpaceRangeGraph","_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","minPixelX","maxPixelX","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","textStyle","draggablePoints","onPointDrag","onDraggablePointsDoubleClick","onPointlessDoubleClick","event","newXT","newYT","xT","yT","stopPropagation","cx","cy","onMouseDown","xOffset","yOffset","onMouseMove","moveEvent","onMouseUp","removeEventListener","addEventListener","verticalLines","line","lineStyle","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","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","object","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","some","chunkLoadingGlobal","p0i32","p1i32","w","wasm","wasmModuleId","idx","installedWasmModuleData","importObject","req","fetch","WebAssembly","compileStreaming","items","instantiate","instantiateStreaming","arrayBuffer","bytes","res","instance"],"sourceRoot":""}
|