@windborne/grapher 1.0.37 → 1.0.39

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.
@@ -1 +1 @@
1
- {"version":3,"file":"bundle.esm.js","mappings":"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","sources":["webpack://@windborne/grapher/./src/helpers/colors.js","webpack://@windborne/grapher/./src/grapher.scss","webpack://@windborne/grapher/./node_modules/css-loader/dist/runtime/api.js","webpack://@windborne/grapher/./node_modules/css-loader/dist/runtime/sourceMaps.js","webpack://@windborne/grapher/./node_modules/prop-types/factoryWithThrowingShims.js","webpack://@windborne/grapher/./node_modules/prop-types/index.js","webpack://@windborne/grapher/./node_modules/prop-types/lib/ReactPropTypesSecret.js","webpack://@windborne/grapher/./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js","webpack://@windborne/grapher/./node_modules/style-loader/dist/runtime/insertBySelector.js","webpack://@windborne/grapher/./node_modules/style-loader/dist/runtime/insertStyleElement.js","webpack://@windborne/grapher/./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js","webpack://@windborne/grapher/./node_modules/style-loader/dist/runtime/styleDomAPI.js","webpack://@windborne/grapher/./node_modules/style-loader/dist/runtime/styleTagTransform.js","webpack://@windborne/grapher/./src/renderer/background.frag","webpack://@windborne/grapher/./src/renderer/background.vert","webpack://@windborne/grapher/./src/renderer/circle.frag","webpack://@windborne/grapher/./src/renderer/circle.vert","webpack://@windborne/grapher/./src/renderer/line.frag","webpack://@windborne/grapher/./src/renderer/line.vert","webpack://@windborne/grapher/./src/renderer/shadow.frag","webpack://@windborne/grapher/./src/renderer/shadow.vert","webpack://@windborne/grapher/webpack/bootstrap","webpack://@windborne/grapher/webpack/runtime/compat get default export","webpack://@windborne/grapher/webpack/runtime/define property getters","webpack://@windborne/grapher/webpack/runtime/ensure chunk","webpack://@windborne/grapher/webpack/runtime/get javascript chunk filename","webpack://@windborne/grapher/webpack/runtime/hasOwnProperty shorthand","webpack://@windborne/grapher/webpack/runtime/make namespace object","webpack://@windborne/grapher/webpack/runtime/publicPath","webpack://@windborne/grapher/webpack/runtime/import chunk loading","webpack://@windborne/grapher/webpack/runtime/nonce","webpack://@windborne/grapher/external module \"react\"","webpack://@windborne/grapher/./src/state/data_types.js","webpack://@windborne/grapher/./src/helpers/custom_prop_types.js","webpack://@windborne/grapher/./src/eventable.js","webpack://@windborne/grapher/./src/state/infer_type.js","webpack://@windborne/grapher/./src/helpers/color_to_vector.js","webpack://@windborne/grapher/./src/renderer/create_gl_program.js","webpack://@windborne/grapher/./src/renderer/background_program.js","webpack://@windborne/grapher/./src/renderer/size_canvas.js","webpack://@windborne/grapher/./src/renderer/paths_from.js","webpack://@windborne/grapher/./src/renderer/draw_zero_line.js","webpack://@windborne/grapher/./src/renderer/draw_area.js","webpack://@windborne/grapher/./src/renderer/draw_bars.js","webpack://@windborne/grapher/./src/renderer/draw_line.js","webpack://@windborne/grapher/./src/state/rust_api.js","webpack://@windborne/grapher/./src/renderer/extract_vertices.js","webpack://@windborne/grapher/./src/renderer/line_program.js","webpack://@windborne/grapher/./src/renderer/shadow_program.js","webpack://@windborne/grapher/./src/renderer/graph_body_renderer.js","webpack://@windborne/grapher/./src/renderer/draw_background.js","webpack://@windborne/grapher/./src/helpers/format.js","webpack://@windborne/grapher/./src/helpers/axis_sizes.js","webpack://@windborne/grapher/./src/components/tooltip.jsx","webpack://@windborne/grapher/./src/components/context_menu.jsx","webpack://@windborne/grapher/./src/state/space_conversions/simple_series_to_data_space.js","webpack://@windborne/grapher/./src/state/calculate_data_bounds.js","webpack://@windborne/grapher/./src/state/merge_bounds.js","webpack://@windborne/grapher/./src/state/expand_bounds.js","webpack://@windborne/grapher/./src/helpers/binary_search.js","webpack://@windborne/grapher/./src/state/space_conversions/data_space_to_selected_space.js","webpack://@windborne/grapher/./src/renderer/scale_bounds.js","webpack://@windborne/grapher/./src/state/space_conversions/selected_space_to_render_space.js","webpack://@windborne/grapher/./src/helpers/flatten_simple_data.js","webpack://@windborne/grapher/./src/state/calculate_tooltip_state.js","webpack://@windborne/grapher/./src/state/bound_calculators.js","webpack://@windborne/grapher/./src/state/space_conversions/condense_data_space.js","webpack://@windborne/grapher/./src/helpers/name_for_series.js","webpack://@windborne/grapher/./src/state/space_conversions/selected_space_to_background_space.js","webpack://@windborne/grapher/./src/state/state_controller.js","webpack://@windborne/grapher/./src/state/get_default_bounds_calculator.js","webpack://@windborne/grapher/./src/helpers/generator_params_equal.js","webpack://@windborne/grapher/./src/state/calculate_annotations_state.js","webpack://@windborne/grapher/./src/state/selection_from_global_bounds.js","webpack://@windborne/grapher/./src/state/find_matching_axis.js","webpack://@windborne/grapher/./src/state/average_loop_times.js","webpack://@windborne/grapher/./src/state/bound_calculator_from_selection.js","webpack://@windborne/grapher/./src/state/hooks.js","webpack://@windborne/grapher/./src/components/annotations.jsx","webpack://@windborne/grapher/./src/components/draggable_points.jsx","webpack://@windborne/grapher/./src/components/vertical_lines.jsx","webpack://@windborne/grapher/./src/components/graph_body.jsx","webpack://@windborne/grapher/./src/grapher.scss?e17f","webpack://@windborne/grapher/./src/helpers/place_grid.js","webpack://@windborne/grapher/./src/components/x_axis.jsx","webpack://@windborne/grapher/./src/components/y_axis.jsx","webpack://@windborne/grapher/./src/components/range_selection_button_base.jsx","webpack://@windborne/grapher/./src/components/range_selection_button.jsx","webpack://@windborne/grapher/./src/components/percentile_button.jsx","webpack://@windborne/grapher/./src/components/options.jsx","webpack://@windborne/grapher/./src/components/range_selection.jsx","webpack://@windborne/grapher/./src/components/range_graph.jsx","webpack://@windborne/grapher/./src/components/series_key_item.jsx","webpack://@windborne/grapher/./src/components/series_key_axis_container.jsx","webpack://@windborne/grapher/./src/components/series_key.jsx","webpack://@windborne/grapher/./src/components/graph_title.jsx","webpack://@windborne/grapher/./src/components/sidebar.jsx","webpack://@windborne/grapher/./src/state/sync_pool.js","webpack://@windborne/grapher/./src/grapher.jsx","webpack://@windborne/grapher/./src/state/multigraph_state_controller.js","webpack://@windborne/grapher/./src/multigrapher.jsx"],"sourcesContent":["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/**\n * Applies reduced opacity to a color\n * @param {string} color \n * @param {number} opacityFactor \n * @returns {string}\n */\nexport function applyReducedOpacity(color, opacityFactor) {\n if (!color) return color;\n\n if (color.startsWith(\"rgba(\")) {\n const matches = color.match(/rgba\\((\\d+),\\s*(\\d+),\\s*(\\d+),\\s*([\\d.]+)\\)/);\n if (matches) {\n const [, r, g, b, a] = matches;\n const newAlpha = parseFloat(a) * opacityFactor;\n return `rgba(${r}, ${g}, ${b}, ${newAlpha})`;\n }\n }\n\n if (color.startsWith(\"rgb(\")) {\n const matches = color.match(/rgb\\((\\d+),\\s*(\\d+),\\s*(\\d+)\\)/);\n if (matches) {\n const [, r, g, b] = matches;\n return `rgba(${r}, ${g}, ${b}, ${opacityFactor})`;\n }\n }\n\n if (color.startsWith(\"#\")) {\n let hex = color.slice(1);\n if (hex.length === 3) {\n hex = hex\n .split(\"\")\n .map((char) => char + char)\n .join(\"\");\n }\n const r = parseInt(hex.slice(0, 2), 16);\n const g = parseInt(hex.slice(2, 4), 16);\n const b = parseInt(hex.slice(4, 6), 16);\n return `rgba(${r}, ${g}, ${b}, ${opacityFactor})`;\n }\n\n return color;\n}\n\n/**\n * Applies reduced opacity to a gradient\n * @param {Array<[number, string]>} gradient \n * @param {number} opacityFactor \n * @returns {Array<[number, string]>}\n */\nexport function applyReducedOpacityToGradient(gradient, opacityFactor) {\n if (!gradient || !Array.isArray(gradient)) {\n return gradient;\n }\n\n return gradient.map((stop) => {\n if (Array.isArray(stop) && stop.length === 2) {\n const [position, color] = stop;\n const translucentColor = applyReducedOpacity(color, opacityFactor);\n return [position, translucentColor];\n } else if (typeof stop === \"string\") {\n return applyReducedOpacity(stop, opacityFactor);\n }\n return stop;\n });\n}\n\n/**\n * Creates a default gradient from a color at half opacity\n * @param {string} color \n * @returns {Array<[number, string]>}\n */\nexport function createDefaultGradient(color) {\n if (!color) return [[0, 'transparent'], [1, 'transparent']];\n \n const halfOpacityColor = applyReducedOpacity(color, 0.5);\n return [[0, halfOpacityColor], [1, halfOpacityColor]];\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, #131313, #1e1e1e);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;margin-top:10px}.grapher-night .graph-body{width:100%;height:400px;position:relative}.grapher-night .graph-body canvas{width:100%;height:100%}.grapher-night .graph-body .grapher-tooltip,.grapher-night .graph-body .grapher-draggable-points,.grapher-night .graph-body .grapher-vertical-lines{position:absolute;top:0;left:0;right:0;z-index:20}.grapher-night .graph-body .grapher-tooltip>svg,.grapher-night .graph-body .grapher-draggable-points>svg,.grapher-night .graph-body .grapher-vertical-lines>svg{position:absolute;overflow:visible;left:0}.grapher-night .graph-body .grapher-vertical-lines{pointer-events:none;user-select:none}.grapher-night .graph-body .grapher-tooltip .tooltip-item path{fill:rgba(0,0,0,.6)}.grapher-night .graph-body .grapher-tooltip .tooltip-item text{fill:#f0f0f0;dominant-baseline:hanging;text-anchor:start}.grapher-night .graph-body .grapher-tooltip .tooltip-item.tooltip-item-fixed path{fill:#000}.grapher-night .graph-body .grapher-tooltip .line{position:absolute;height:400px;border-left:1px solid #ccc}.grapher-night .graph-body .grapher-tooltip .custom-tooltip-container{position:absolute}.grapher-night .graph-body .grapher-context-menu{position:absolute;top:0;left:0}.grapher-night .graph-body .grapher-context-menu .menu-item .menu-text{user-select:all;position:absolute;top:0;background:rgba(0,0,0,.6);border:1px solid rgba(255,255,255,.3);color:#f0f0f0;padding:2px 4px;max-width:max-content;width:200px}.grapher-night .graph-body .grapher-draggable-points circle{cursor:pointer}.grapher-night .graph-body .grapher-vertical-lines line{stroke:#ccc}.grapher-night .graph-body .grapher-vertical-lines polygon{fill:#ccc}.grapher-night .graph-body .grapher-annotations{position:absolute;top:0;pointer-events:none;user-select:none;z-index:10}.grapher-night .graph-body .grapher-annotations .grapher-annotation{position:absolute}.grapher-night .graph-body .grapher-annotations .grapher-annotation .annotation-marker{display:inline-block;background:rgba(255,255,255,.3)}.grapher-night .graph-body .grapher-annotations .grapher-annotation.grapher-annotation-range .annotation-range-marker{display:inline-block;background-color:rgba(128,128,128,.2);background-image:repeating-linear-gradient(53deg, #626266, #626266 1px, rgba(255, 255, 255, 0.1) 1px, rgba(255, 255, 255, 0.1) 4px);background-size:40px 40px;border-right:1px solid #fff;border-left:1px solid #fff}.grapher-night .graph-body .grapher-annotations .grapher-annotation .annotation-text{position:absolute;background:rgba(0,0,0,.6);border:1px solid rgba(255,255,255,.3);color:#f0f0f0;padding:2px 4px;white-space:nowrap;font-size:10px;z-index:10}.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.x-axis-dual{height:30px}.grapher-night .axis.y-axis{height:400px}.grapher-night .axis.y-axis .axis-item text{text-anchor:end}.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:rgba(192,192,192,.3);stroke-width:1px}.grapher-night .axis .axis-item path{stroke:rgba(192,192,192,.3);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:1px}.grapher-night .axis .axis-item.axis-item-big-labels text{font-size:16px}.grapher-night .range-selection-graph{width:100%;background-color:rgba(0,0,0,.3);height:calc(50px + 14px)}.grapher-night .range-selection-graph .graph-body-secondary{height:50px}.grapher-night .range-selection-graph .graph-body-secondary canvas{height:100%}.grapher-night .range-selection-graph .graph-body-secondary svg{position:absolute;left:0;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 .target-selection-outline{stroke:#aaa;cursor:ew-resize;fill:rgba(0,0,0,0)}.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{fill:#808083;cursor:ew-resize}.grapher-night .range-selection-graph .graph-body-secondary svg .selection-bar-rifles{stroke:#fff;stroke-width:1px;cursor:ew-resize}.grapher-night .range-selection-graph .graph-body-secondary svg .selection-bar-handle-hit{cursor:ew-resize}.grapher-night .range-selection-graph .graph-body-secondary svg .selection-bar-handle{stroke:#aaa;fill:#666;stroke-width:1px;cursor:ew-resize;transition:stroke-width .15s ease,fill .15s ease}.grapher-night .range-selection-graph .graph-body-secondary svg .selection-handle .selection-handle-hit{cursor:ew-resize}.grapher-night .range-selection-graph .graph-body-secondary svg .selection-handle .selection-handle-line{stroke:#aaa;stroke-width:1;transition:stroke-width .15s ease}.grapher-night .range-selection-graph .graph-body-secondary svg .selection-handle:hover .selection-handle-line{stroke-width:3}.grapher-night .range-selection-graph .graph-body-secondary svg .selection-handle.selection-handle-dragging .selection-handle-line{stroke-width:3}.grapher-night .range-selection-graph .graph-body-secondary svg .selection-handle:hover .selection-bar-handle{stroke-width:2px}.grapher-night .range-selection-graph .graph-body-secondary svg .selection-handle.selection-handle-dragging .selection-bar-handle{stroke-width:2px}.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:#9f9f9f;stroke-width:1px}.grapher-night .range-selection-graph .graph-body-secondary svg .axis-item.axis-item-highlighted path{stroke:#fff}.grapher-night .range-selection-graph .graph-body-secondary svg .axis-item.axis-item-highlighted text{fill:#fff}.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;margin-top:10px}.grapher-day .graph-body{width:100%;height:400px;position:relative}.grapher-day .graph-body canvas{width:100%;height:100%}.grapher-day .graph-body .grapher-tooltip,.grapher-day .graph-body .grapher-draggable-points,.grapher-day .graph-body .grapher-vertical-lines{position:absolute;top:0;left:0;right:0;z-index:20}.grapher-day .graph-body .grapher-tooltip>svg,.grapher-day .graph-body .grapher-draggable-points>svg,.grapher-day .graph-body .grapher-vertical-lines>svg{position:absolute;overflow:visible;left:0}.grapher-day .graph-body .grapher-vertical-lines{pointer-events:none;user-select:none}.grapher-day .graph-body .grapher-tooltip .tooltip-item path{fill:rgba(255,255,255,.6)}.grapher-day .graph-body .grapher-tooltip .tooltip-item text{fill:#0f0f0f;dominant-baseline:hanging;text-anchor:start}.grapher-day .graph-body .grapher-tooltip .tooltip-item.tooltip-item-fixed path{fill:#fff}.grapher-day .graph-body .grapher-tooltip .line{position:absolute;height:400px;border-left:1px solid #333}.grapher-day .graph-body .grapher-tooltip .custom-tooltip-container{position:absolute}.grapher-day .graph-body .grapher-context-menu{position:absolute;top:0;left:0}.grapher-day .graph-body .grapher-context-menu .menu-item .menu-text{user-select:all;position:absolute;top:0;background:rgba(255,255,255,.6);border:1px solid rgba(0,0,0,.3);color:#0f0f0f;padding:2px 4px;max-width:max-content;width:200px}.grapher-day .graph-body .grapher-draggable-points circle{cursor:pointer}.grapher-day .graph-body .grapher-vertical-lines line{stroke:#333}.grapher-day .graph-body .grapher-vertical-lines polygon{fill:#333}.grapher-day .graph-body .grapher-annotations{position:absolute;top:0;pointer-events:none;user-select:none;z-index:10}.grapher-day .graph-body .grapher-annotations .grapher-annotation{position:absolute}.grapher-day .graph-body .grapher-annotations .grapher-annotation .annotation-marker{display:inline-block;background:rgba(0,0,0,.3)}.grapher-day .graph-body .grapher-annotations .grapher-annotation.grapher-annotation-range .annotation-range-marker{display:inline-block;background-color:rgba(128,128,128,.2);background-image:repeating-linear-gradient(53deg, #626266, #626266 1px, rgba(255, 255, 255, 0.1) 1px, rgba(255, 255, 255, 0.1) 4px);background-size:40px 40px;border-right:1px solid #fff;border-left:1px solid #fff}.grapher-day .graph-body .grapher-annotations .grapher-annotation .annotation-text{position:absolute;background:rgba(255,255,255,.6);border:1px solid rgba(0,0,0,.3);color:#0f0f0f;padding:2px 4px;white-space:nowrap;font-size:10px;z-index:10}.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.x-axis-dual{height:30px}.grapher-day .axis.y-axis{height:400px}.grapher-day .axis.y-axis .axis-item text{text-anchor:end}.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: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:1px}.grapher-day .axis .axis-item.axis-item-big-labels text{font-size:16px}.grapher-day .range-selection-graph{width:100%;background-color:rgba(255,255,255,.3);height:calc(50px + 14px)}.grapher-day .range-selection-graph .graph-body-secondary{height:50px}.grapher-day .range-selection-graph .graph-body-secondary canvas{height:100%}.grapher-day .range-selection-graph .graph-body-secondary svg{position:absolute;left:0;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 .target-selection-outline{stroke:#333;cursor:ew-resize;fill:rgba(0,0,0,0)}.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{fill:#b0b0b7;cursor:ew-resize}.grapher-day .range-selection-graph .graph-body-secondary svg .selection-bar-rifles{stroke:#333;stroke-width:1px;cursor:ew-resize}.grapher-day .range-selection-graph .graph-body-secondary svg .selection-bar-handle-hit{cursor:ew-resize}.grapher-day .range-selection-graph .graph-body-secondary svg .selection-bar-handle{stroke:#333;fill:#b0b0b7;stroke-width:1px;cursor:ew-resize;transition:stroke-width .15s ease,fill .15s ease}.grapher-day .range-selection-graph .graph-body-secondary svg .selection-handle .selection-handle-hit{cursor:ew-resize}.grapher-day .range-selection-graph .graph-body-secondary svg .selection-handle .selection-handle-line{stroke:#333;stroke-width:1;transition:stroke-width .15s ease}.grapher-day .range-selection-graph .graph-body-secondary svg .selection-handle:hover .selection-handle-line{stroke-width:3}.grapher-day .range-selection-graph .graph-body-secondary svg .selection-handle.selection-handle-dragging .selection-handle-line{stroke-width:3}.grapher-day .range-selection-graph .graph-body-secondary svg .selection-handle:hover .selection-bar-handle{stroke-width:2px}.grapher-day .range-selection-graph .graph-body-secondary svg .selection-handle.selection-handle-dragging .selection-bar-handle{stroke-width:2px}.grapher-day .range-selection-graph .graph-body-secondary svg .axis-item text{fill:#555;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:#555;stroke-width:1px}.grapher-day .range-selection-graph .graph-body-secondary svg .axis-item.axis-item-highlighted path{stroke:#000}.grapher-day .range-selection-graph .graph-body-secondary svg .axis-item.axis-item-highlighted text{fill:#000}.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;margin-top:10px}.grapher-export .graph-body{width:100%;height:400px;position:relative}.grapher-export .graph-body canvas{width:100%;height:100%}.grapher-export .graph-body .grapher-tooltip,.grapher-export .graph-body .grapher-draggable-points,.grapher-export .graph-body .grapher-vertical-lines{position:absolute;top:0;left:0;right:0;z-index:20}.grapher-export .graph-body .grapher-tooltip>svg,.grapher-export .graph-body .grapher-draggable-points>svg,.grapher-export .graph-body .grapher-vertical-lines>svg{position:absolute;overflow:visible;left:0}.grapher-export .graph-body .grapher-vertical-lines{pointer-events:none;user-select:none}.grapher-export .graph-body .grapher-tooltip .tooltip-item path{fill:rgba(255,255,255,.6)}.grapher-export .graph-body .grapher-tooltip .tooltip-item text{fill:#0f0f0f;dominant-baseline:hanging;text-anchor:start}.grapher-export .graph-body .grapher-tooltip .tooltip-item.tooltip-item-fixed path{fill:#fff}.grapher-export .graph-body .grapher-tooltip .line{position:absolute;height:400px;border-left:1px solid #333}.grapher-export .graph-body .grapher-tooltip .custom-tooltip-container{position:absolute}.grapher-export .graph-body .grapher-context-menu{position:absolute;top:0;left:0}.grapher-export .graph-body .grapher-context-menu .menu-item .menu-text{user-select:all;position:absolute;top:0;background:rgba(255,255,255,.6);border:1px solid rgba(0,0,0,.3);color:#0f0f0f;padding:2px 4px;max-width:max-content;width:200px}.grapher-export .graph-body .grapher-draggable-points circle{cursor:pointer}.grapher-export .graph-body .grapher-vertical-lines line{stroke:#333}.grapher-export .graph-body .grapher-vertical-lines polygon{fill:#333}.grapher-export .graph-body .grapher-annotations{position:absolute;top:0;pointer-events:none;user-select:none;z-index:10}.grapher-export .graph-body .grapher-annotations .grapher-annotation{position:absolute}.grapher-export .graph-body .grapher-annotations .grapher-annotation .annotation-marker{display:inline-block;background:rgba(0,0,0,.3)}.grapher-export .graph-body .grapher-annotations .grapher-annotation.grapher-annotation-range .annotation-range-marker{display:inline-block;background-color:rgba(128,128,128,.2);background-image:repeating-linear-gradient(53deg, #626266, #626266 1px, rgba(255, 255, 255, 0.1) 1px, rgba(255, 255, 255, 0.1) 4px);background-size:40px 40px;border-right:1px solid #fff;border-left:1px solid #fff}.grapher-export .graph-body .grapher-annotations .grapher-annotation .annotation-text{position:absolute;background:rgba(255,255,255,.6);border:1px solid rgba(0,0,0,.3);color:#0f0f0f;padding:2px 4px;white-space:nowrap;font-size:10px;z-index:10}.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.x-axis-dual{height:30px}.grapher-export .axis.y-axis{height:400px}.grapher-export .axis.y-axis .axis-item text{text-anchor:end}.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-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:1px}.grapher-export .axis .axis-item.axis-item-big-labels text{font-size:16px}.grapher-export .range-selection-graph{width:100%;background-color:rgba(255,255,255,.3);height:calc(50px + 14px)}.grapher-export .range-selection-graph .graph-body-secondary{height:50px}.grapher-export .range-selection-graph .graph-body-secondary canvas{height:100%}.grapher-export .range-selection-graph .graph-body-secondary svg{position:absolute;left:0;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 .target-selection-outline{stroke:#333;cursor:ew-resize;fill:rgba(0,0,0,0)}.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{fill:#b0b0b7;cursor:ew-resize}.grapher-export .range-selection-graph .graph-body-secondary svg .selection-bar-rifles{stroke:#333;stroke-width:1px;cursor:ew-resize}.grapher-export .range-selection-graph .graph-body-secondary svg .selection-bar-handle-hit{cursor:ew-resize}.grapher-export .range-selection-graph .graph-body-secondary svg .selection-bar-handle{stroke:#333;fill:#b0b0b7;stroke-width:1px;cursor:ew-resize;transition:stroke-width .15s ease,fill .15s ease}.grapher-export .range-selection-graph .graph-body-secondary svg .selection-handle .selection-handle-hit{cursor:ew-resize}.grapher-export .range-selection-graph .graph-body-secondary svg .selection-handle .selection-handle-line{stroke:#333;stroke-width:1;transition:stroke-width .15s ease}.grapher-export .range-selection-graph .graph-body-secondary svg .selection-handle:hover .selection-handle-line{stroke-width:3}.grapher-export .range-selection-graph .graph-body-secondary svg .selection-handle.selection-handle-dragging .selection-handle-line{stroke-width:3}.grapher-export .range-selection-graph .graph-body-secondary svg .selection-handle:hover .selection-bar-handle{stroke-width:2px}.grapher-export .range-selection-graph .graph-body-secondary svg .selection-handle.selection-handle-dragging .selection-bar-handle{stroke-width:2px}.grapher-export .range-selection-graph .graph-body-secondary svg .axis-item text{fill:#333;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:#333;stroke-width:1px}.grapher-export .range-selection-graph .graph-body-secondary svg .axis-item.axis-item-highlighted path{stroke:#000}.grapher-export .range-selection-graph .graph-body-secondary svg .axis-item.axis-item-highlighted text{fill:#000}.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: #131313,\\n $background-color-2: #1e1e1e,\\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: rgb(192, 192, 192, 0.3),\\n $axis-line-width: 1px,\\n $axis-tick-color: rgb(192, 192, 192, 0.3),\\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-background-color: rgba(0, 0, 0, 0.3),\\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-selection-bar-height: 14px,\\n $range-graph-handle-color: #AAA,\\n $range-graph-handle-fill-color: #666,\\n $range-graph-axis-text-color: #9f9f9f,\\n $range-graph-tick-highlighted-color: #FFF,\\n $range-graph-text-highlighted-color: #FFF,\\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 $x-axis-dual-height: 30px;\\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 margin-top: 10px;\\n }\\n\\n .graph-body {\\n width: 100%;\\n height: $primary-graph-body-height;\\n position: relative;\\n\\n canvas {\\n width: 100%;\\n height: 100%;\\n }\\n\\n .grapher-tooltip, .grapher-draggable-points, .grapher-vertical-lines {\\n position: absolute;\\n top: 0;\\n left: 0;\\n right: 0;\\n z-index: 20;\\n\\n > svg {\\n position: absolute;\\n overflow: visible;\\n left: 0;\\n }\\n }\\n\\n .grapher-vertical-lines {\\n pointer-events: none;\\n user-select: none;\\n }\\n\\n .grapher-tooltip {\\n .tooltip-item {\\n path {\\n fill: $tooltip-background-color;\\n }\\n\\n text {\\n fill: $tooltip-text-color;\\n dominant-baseline: hanging;\\n text-anchor: start;\\n }\\n\\n &.tooltip-item-fixed {\\n path {\\n fill: rgba($tooltip-background-color, 1);\\n }\\n }\\n }\\n\\n .line {\\n position: absolute;\\n height: 400px;\\n border-left: 1px solid $tooltip-line-color;\\n }\\n\\n .custom-tooltip-container {\\n position: absolute;\\n }\\n }\\n\\n .grapher-context-menu {\\n position: absolute;\\n top: 0;\\n left: 0;\\n .menu-item {\\n\\n .menu-text {\\n user-select: all;\\n position: absolute;\\n top: 0;\\n background: $tooltip-background-color;\\n border: 1px solid $annotation-background-color;\\n color: $tooltip-text-color;\\n padding: 2px 4px;\\n max-width: max-content;\\n width: 200px;\\n }\\n }\\n }\\n\\n .grapher-draggable-points {\\n circle {\\n cursor: pointer;\\n }\\n }\\n\\n .grapher-vertical-lines {\\n line {\\n stroke: $vertical-line-color;\\n }\\n\\n polygon {\\n fill: $vertical-line-color;\\n }\\n }\\n\\n .grapher-annotations {\\n position: absolute;\\n top: 0;\\n pointer-events: none;\\n user-select: none;\\n z-index: 10;\\n\\n .grapher-annotation {\\n position: absolute;\\n\\n .annotation-marker {\\n display: inline-block;\\n background: $annotation-background-color;\\n }\\n\\n &.grapher-annotation-range {\\n .annotation-range-marker {\\n display: inline-block;\\n background-color: rgba(128, 128, 128, 0.2);\\n background-image: repeating-linear-gradient(53deg, #626266, #626266 1px, rgba(255, 255, 255, 0.1) 1px, rgba(255, 255, 255, 0.1) 4px);\\n background-size: 40px 40px;\\n border-right: 1px solid white;\\n border-left: 1px solid white;\\n }\\n }\\n\\n .annotation-text {\\n position: absolute;\\n background: $tooltip-background-color;\\n border: 1px solid $annotation-background-color;\\n color: $tooltip-text-color;\\n padding: 2px 4px;\\n white-space: nowrap;\\n font-size: 10px;\\n z-index: 10;\\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 \\n &.x-axis-dual {\\n height: $x-axis-dual-height;\\n }\\n display: block;\\n }\\n\\n &.y-axis {\\n height: $primary-graph-body-height;\\n\\n .axis-item text {\\n text-anchor: end;\\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-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: 1px;\\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 background-color: $range-graph-selection-background-color;\\n height: calc(#{$secondary-graph-body-height} + #{$range-graph-selection-bar-height}); \\n\\n .graph-body-secondary {\\n height: $secondary-graph-body-height;\\n\\n canvas {\\n height: 100%;\\n }\\n\\n svg {\\n position: absolute;\\n left: 0;\\n width: 100%;\\n overflow: visible;\\n\\n .target-selection {\\n fill: $range-graph-selection-range-color;\\n cursor: ew-resize;\\n }\\n\\n\\n .target-selection-outline {\\n stroke: $range-graph-selection-outline-color;\\n cursor: ew-resize;\\n fill: transparent;\\n }\\n\\n .selection-bar-track {\\n fill: $range-graph-selection-bar-track-color;\\n }\\n\\n .selection-bar {\\n fill: $range-graph-selection-bar-color;\\n cursor: ew-resize;\\n }\\n\\n .selection-bar-rifles {\\n stroke: $range-graph-selection-bar-rifles-color;\\n stroke-width: 1px;\\n cursor: ew-resize;\\n }\\n\\n .selection-bar-handle-hit {\\n cursor: ew-resize;\\n }\\n\\n .selection-bar-handle {\\n stroke: $range-graph-handle-color;\\n fill: $range-graph-handle-fill-color;\\n stroke-width: 1px;\\n cursor: ew-resize;\\n transition: stroke-width 0.15s ease, fill 0.15s ease;\\n }\\n\\n .selection-handle {\\n .selection-handle-hit {\\n cursor: ew-resize;\\n }\\n\\n .selection-handle-line {\\n stroke: $range-graph-handle-color;\\n stroke-width: 1;\\n transition: stroke-width 0.15s ease;\\n }\\n\\n &:hover .selection-handle-line {\\n stroke-width: 3;\\n }\\n\\n &.selection-handle-dragging .selection-handle-line {\\n stroke-width: 3;\\n }\\n\\n &:hover .selection-bar-handle {\\n stroke-width: 2px;\\n }\\n\\n &.selection-handle-dragging .selection-bar-handle {\\n stroke-width: 2px;\\n }\\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: $range-graph-axis-text-color;\\n stroke-width: 1px;\\n }\\n \\n &.axis-item-highlighted {\\n path {\\n stroke: $range-graph-tick-highlighted-color;\\n }\\n \\n text {\\n fill: $range-graph-text-highlighted-color;\\n }\\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-background-color: rgba(255, 255, 255, 0.3),\\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-selection-bar-height: 14px,\\n $range-graph-handle-color: #333,\\n $range-graph-handle-fill-color: #B0B0B7,\\n $range-graph-axis-text-color: #555,\\n $range-graph-tick-highlighted-color: #000,\\n $range-graph-text-highlighted-color: #000,\\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-background-color: rgba(255, 255, 255, 0.3),\\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-selection-bar-height: 14px,\\n $range-graph-handle-color: #333,\\n $range-graph-handle-fill-color: #B0B0B7,\\n $range-graph-axis-text-color: #333,\\n $range-graph-tick-highlighted-color: #000,\\n $range-graph-text-highlighted-color: #000,\\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;\\nuniform float width; // Canvas width for normalization\\nuniform float cutoffX; // Cutoff X position as ratio (0.0-1.0)\\nuniform float cutoffOpacity; // Opacity for pre-cutoff area\\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 // Apply cutoff opacity if active\\n vec4 finalColor = vec4(color);\\n if (cutoffX >= 0.0) {\\n // Convert pixel position to normalized coordinate (0.0 to 1.0)\\n float normalizedX = gl_FragCoord.x / width;\\n \\n // Apply reduced opacity to pixels left of cutoff\\n if (normalizedX < cutoffX) {\\n finalColor.a *= cutoffOpacity;\\n }\\n }\\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 = finalColor;\\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 = \"precision highp float;\\n\\nvarying vec4 trapBounds; // [x1, lineY1, x2, lineY2]\\nvarying vec4 trapBottom; // [x1, bottomY1, x2, bottomY2] \\nvarying vec2 worldPos; // World position\\n\\nuniform int gradientCount;\\nuniform sampler2D gradientTexture; // Texture containing gradient data\\nuniform vec4 fallbackColor;\\n\\nvec4 interpolateGradient(float position) {\\n if (gradientCount <= 0) {\\n return fallbackColor;\\n }\\n if (gradientCount == 1) {\\n return texture2D(gradientTexture, vec2(0.5 / float(gradientCount * 2), 0.5));\\n }\\n\\n float textureWidth = float(gradientCount * 2);\\n float firstStop = texture2D(gradientTexture, vec2(0.5 / textureWidth, 0.5)).r;\\n float lastStop = texture2D(gradientTexture, vec2((float((gradientCount - 1) * 2) + 0.5) / textureWidth, 0.5)).r;\\n \\n // Scale position to fit the gradient range\\n if (lastStop > firstStop) {\\n position = firstStop + position * (lastStop - firstStop);\\n }\\n \\n position = clamp(position, 0.0, 1.0);\\n\\n // Handle boundary cases first\\n vec4 firstColor = texture2D(gradientTexture, vec2(1.5 / textureWidth, 0.5));\\n vec4 lastColor = texture2D(gradientTexture, vec2((float((gradientCount - 1) * 2 + 1) + 0.5) / textureWidth, 0.5));\\n \\n if (position <= firstStop) return firstColor;\\n if (position >= lastStop) return lastColor;\\n \\n // Calculate normalized position within the gradient range\\n float normalizedPos = (position - firstStop) / max(lastStop - firstStop, 0.001);\\n normalizedPos = clamp(normalizedPos, 0.0, 1.0);\\n \\n // Map to segment index using only float operations\\n float segmentFloat = normalizedPos * float(gradientCount - 1);\\n float segmentIndex = floor(segmentFloat);\\n \\n // Ensure segment index is within valid bounds using float operations\\n segmentIndex = min(segmentIndex, float(gradientCount - 2));\\n segmentIndex = max(segmentIndex, 0.0);\\n \\n // Calculate texture coordinates for the two colors to interpolate\\n float texCoordA = (segmentIndex * 2.0 + 1.0 + 0.5) / textureWidth;\\n float texCoordB = ((segmentIndex + 1.0) * 2.0 + 1.0 + 0.5) / textureWidth;\\n \\n // Sample the two colors\\n vec4 colorA = texture2D(gradientTexture, vec2(texCoordA, 0.5));\\n vec4 colorB = texture2D(gradientTexture, vec2(texCoordB, 0.5));\\n \\n // Get the actual gradient stops for proper interpolation\\n float stopA = texture2D(gradientTexture, vec2((segmentIndex * 2.0 + 0.5) / textureWidth, 0.5)).r;\\n float stopB = texture2D(gradientTexture, vec2(((segmentIndex + 1.0) * 2.0 + 0.5) / textureWidth, 0.5)).r;\\n \\n // Calculate interpolation factor based on actual stop positions\\n float stopRange = stopB - stopA;\\n float t = stopRange > 0.001 ? (position - stopA) / stopRange : 0.0;\\n t = clamp(t, 0.0, 1.0);\\n \\n return mix(colorA, colorB, t);\\n}\\n\\nvoid main() {\\n float pixelX = worldPos.x;\\n float pixelY = worldPos.y;\\n \\n // Extract trapezoid corners\\n float x1 = trapBounds.x;\\n float lineY1 = trapBounds.y;\\n float x2 = trapBounds.z;\\n float lineY2 = trapBounds.w;\\n \\n float bottomX1 = trapBottom.x;\\n float bottomY1 = trapBottom.y;\\n float bottomX2 = trapBottom.z;\\n float bottomY2 = trapBottom.w;\\n \\n // Interpolate line Y at current pixel X\\n float t = (pixelX - x1) / (x2 - x1 + 0.001); // Avoid division by zero\\n t = clamp(t, 0.0, 1.0);\\n \\n float lineYAtPixel = mix(lineY1, lineY2, t);\\n float bottomYAtPixel = mix(bottomY1, bottomY2, t);\\n \\n // Calculate gradient position: 0.0 at line, 1.0 at bottom\\n float totalDistance = abs(bottomYAtPixel - lineYAtPixel);\\n float gradientPos = totalDistance > 0.001 ? \\n abs(pixelY - lineYAtPixel) / totalDistance : 0.0;\\n \\n vec4 color = interpolateGradient(gradientPos);\\n gl_FragColor = color;\\n}\\n\"","module.exports = \"precision highp float;\\n\\nattribute vec2 position;\\nattribute vec4 trapezoidBounds; // [x1, y1_line, x2, y2_line] - the line segment \\nattribute vec4 trapezoidBottom; // [x1, y1_bottom, x2, y2_bottom] - the bottom segment\\n\\nuniform float width;\\nuniform float height;\\n\\nvarying vec4 trapBounds; // Pass trapezoid line bounds to fragment\\nvarying vec4 trapBottom; // Pass trapezoid bottom bounds to fragment \\nvarying vec2 worldPos; // Pass world position\\n\\nvoid main() {\\n trapBounds = trapezoidBounds;\\n trapBottom = trapezoidBottom;\\n worldPos = position;\\n \\n gl_Position = vec4(2.0*position.x/width - 1.0, 1.0 - 2.0*position.y/height, 0.0, 1.0);\\n}\\n\"","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".bundle.esm.js\";\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.p = \"/assets/\";","__webpack_require__.b = new URL(\"./\", import.meta.url);\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t792: 0\n};\n\nvar installChunk = (data) => {\n\tvar {ids, modules, runtime} = data;\n\t// add \"modules\" to the modules object,\n\t// then flag all \"ids\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tfor(moduleId in modules) {\n\t\tif(__webpack_require__.o(modules, moduleId)) {\n\t\t\t__webpack_require__.m[moduleId] = modules[moduleId];\n\t\t}\n\t}\n\tif(runtime) runtime(__webpack_require__);\n\tfor(;i < ids.length; i++) {\n\t\tchunkId = ids[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[ids[i]] = 0;\n\t}\n\n}\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// import() 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[1]);\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 = import(\"./\" + __webpack_require__.u(chunkId)).then(installChunk, (e) => {\n\t\t\t\t\t\tif(installedChunks[chunkId] !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t});\n\t\t\t\t\tvar promise = Promise.race([promise, new Promise((resolve) => (installedChunkData = installedChunks[chunkId] = [resolve]))])\n\t\t\t\t\tpromises.push(installedChunkData[1] = promise);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n};\n\n// no external install chunk\n\n// no on chunks loaded","__webpack_require__.nc = undefined;","var x = (y) => {\n\tvar x = {}; __webpack_require__.d(x, y); return x\n} \nvar y = (x) => (() => (x))\nconst __WEBPACK_NAMESPACE_OBJECT__ = x({ [\"default\"]: () => (__WEBPACK_EXTERNAL_MODULE_react__[\"default\"]), [\"useCallback\"]: () => (__WEBPACK_EXTERNAL_MODULE_react__.useCallback), [\"useEffect\"]: () => (__WEBPACK_EXTERNAL_MODULE_react__.useEffect), [\"useMemo\"]: () => (__WEBPACK_EXTERNAL_MODULE_react__.useMemo), [\"useRef\"]: () => (__WEBPACK_EXTERNAL_MODULE_react__.useRef), [\"useState\"]: () => (__WEBPACK_EXTERNAL_MODULE_react__.useState) });","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 minPointSpacing: PropTypes.number,\n rendering: PropTypes.oneOf(['line', 'bar', 'area', 'shadow']), // defaults to line\n negativeColor: PropTypes.string, // colors lines and points below zero for all renderings\n gradient: PropTypes.array, // only applies to area and shadow\n negativeGradient: PropTypes.array, // gradient for values below zero (area and shadow)\n zeroLineWidth: PropTypes.number, // only applies to bar and area\n zeroLineColor: PropTypes.string, // only applies to bar and area\n zeroLineY: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), // only applies to bar and area\n pointRadius: PropTypes.number, // only applies to area\n tooltipWidth: PropTypes.number,\n hasAreaBottom: PropTypes.bool,\n shadowColor: PropTypes.string,\n gradient: PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.string, PropTypes.array])), // gradient colors or [position, color] pairs\n rangeKey: PropTypes.string\n});\n\nconst Series = PropTypes.arrayOf(SingleSeries);\n\nconst Axis = PropTypes.shape({\n axisIndex: PropTypes.number.isRequired,\n series: PropTypes.array.isRequired,\n side: PropTypes.oneOf(['left', 'right']).isRequired,\n scale: PropTypes.oneOf(['linear', 'log']).isRequired,\n label: PropTypes.string\n});\n\nconst Axes = PropTypes.arrayOf(Axis);\n\nconst CustomBoundsSelector = PropTypes.shape({\n label: PropTypes.string.isRequired,\n calculator: PropTypes.func.isRequired,\n datesOnly: PropTypes.bool\n});\n\nconst CustomBoundsSelectors = PropTypes.arrayOf(CustomBoundsSelector);\n\nconst TooltipOptionsRaw = {\n includeSeriesLabel: PropTypes.bool,\n includeXLabel: PropTypes.bool,\n includeYLabel: PropTypes.bool,\n includeXValue: PropTypes.bool,\n includeYValue: PropTypes.bool,\n floating: PropTypes.bool,\n alwaysFixedPosition: PropTypes.bool,\n floatPosition: PropTypes.oneOf(['top', 'bottom']),\n floatDelta: PropTypes.number,\n savingDisabled: PropTypes.bool,\n customTooltip: PropTypes.func,\n combineTooltips: PropTypes.oneOfType([PropTypes.bool, PropTypes.number])\n};\n\nconst TooltipOptions = PropTypes.shape(TooltipOptionsRaw);\n\nconst Annotation = PropTypes.shape({\n x: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.instanceOf(Date)]),\n startX: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.instanceOf(Date)]),\n endX: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.instanceOf(Date)]),\n series: PropTypes.arrayOf(PropTypes.string),\n content: PropTypes.string,\n lineOnly: PropTypes.bool\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.oneOfType([PropTypes.number, PropTypes.instanceOf(Date)]).isRequired,\n color: PropTypes.string,\n lineTop: PropTypes.number,\n width: PropTypes.number,\n markTop: PropTypes.bool,\n style: PropTypes.object,\n markerStyle: PropTypes.object,\n text: PropTypes.string,\n textTop: PropTypes.number,\n textStyle: PropTypes.object,\n minPixelX: PropTypes.number,\n maxPixelX: PropTypes.number,\n onRangeGraph: PropTypes.oneOfType([\n PropTypes.bool,\n PropTypes.object // anything that can be passed into the overall vertical line\n ]),\n onRangeGraphOnly: PropTypes.bool\n});\nconst VerticalLines = PropTypes.arrayOf(VerticalLine);\n\nconst CustomPropTypes = {\n Data,\n SingleSeries,\n Series,\n Axis,\n Axes,\n CustomBoundsSelector,\n CustomBoundsSelectors,\n TooltipOptions,\n TooltipOptionsRaw,\n Annotations,\n DraggablePoint,\n DraggablePoints,\n VerticalLine,\n VerticalLines\n};\n\n\nexport default CustomPropTypes;\n","export 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 {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","/**\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]{3}$|^#[\\dA-F]{6}$/i.test(color)) {\n throw new Error(`Color must be a hex string: ${color}`);\n }\n\n // support for short hex codes, expanding 3-digit hex to 6-digit\n if (color.length === 4) {\n color = '#' + color[1] + color[1] + color[2] + color[2] + color[3] + color[3];\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","/**\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 return null;\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 return null;\n }\n\n const program = gl.createProgram();\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n\n gl.linkProgram(program);\n \n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n console.error('Shader program linking failed:', gl.getProgramInfoLog(program));\n return null;\n }\n\n gl.validateProgram(program);\n if (!gl.getProgramParameter(program, gl.VALIDATE_STATUS)) {\n console.error('Shader program validation failed:', gl.getProgramInfoLog(program));\n return null;\n }\n\n return program;\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","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","import {DPI_INCREASE} from './size_canvas';\n\n/**\n * Returns an array of contiguous paths from data in render space\n *\n * @param {{nullMask: Uint8Array, maxYValues: Float64Array, minYValues: Float64Array, yValues: Float64Array}} dataInRenderSpace\n * @param {Object} options\n * @param {Number} options.splitAtY - split the path whenever it's suddenly less or greater than this value\n * @return {[[Number]]}\n */\nexport default function pathsFrom(dataInRenderSpace, {splitAtY}={}) {\n const paths = [];\n let currentPath = [];\n let previouslyDiscontinuous = true;\n\n const { nullMask, maxYValues, minYValues, yValues } = dataInRenderSpace;\n\n for (let i = 0; i < yValues.length; i++) {\n const x = i*DPI_INCREASE;\n const y = yValues[i];\n\n if (nullMask[i] & 0b001) { // y null\n if (!previouslyDiscontinuous) {\n paths.push(currentPath);\n currentPath = [];\n }\n\n previouslyDiscontinuous = true;\n continue;\n }\n\n currentPath.push([x, y]);\n\n const minY = minYValues[i];\n const maxY = maxYValues[i];\n\n if (minY !== maxY) {\n if (!(nullMask[i] & 0b010)) {\n currentPath.push([x, minY]);\n }\n\n if (!(nullMask[i] & 0b100)) {\n currentPath.push([x, maxY]);\n }\n currentPath.push([x, y]);\n }\n\n previouslyDiscontinuous = false;\n\n if (typeof splitAtY === 'number' && i > 0) {\n const prevY = yValues[i-1];\n const signFlipped = !(nullMask[i-1] & 0b001) && (prevY < splitAtY && y >= splitAtY) || (prevY > splitAtY && y <= splitAtY) || (prevY === splitAtY && y !== splitAtY);\n\n if (signFlipped) {\n if (!previouslyDiscontinuous) {\n paths.push(currentPath);\n currentPath = [\n [x, y]\n ];\n }\n\n previouslyDiscontinuous = true;\n }\n }\n }\n\n if (!previouslyDiscontinuous) {\n paths.push(currentPath);\n }\n\n return paths;\n}\n","/**\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 if (!context) {\n console.error('Canvas context is null in drawZeroLine');\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 pathsFrom from \"./paths_from\";\nimport { drawZeroLine } from \"./draw_zero_line\";\nimport { DPI_INCREASE } from \"./size_canvas\";\nimport { applyReducedOpacity, applyReducedOpacityToGradient } from \"../helpers/colors\";\n\n/**\n * Draws the data on the canvas\n * Assumes the data is in individual point render space, ie x and y in pixels\n *\n * @param {Array<[number, number]>} individualPoints - data to draw\n * @param {Object} dataInRenderSpace\n * @param {Object} options - set of options\n * @param {Object} options.context - the context to draw on\n * @param {String} options.color - color of the bar to draw\n * @param {{renderWidth: Number, renderHeight: Number}} options.sizing - size of the canvas, in pixels\n * @param {Number} options.zero - y coordinate that represents \"zero\"\n * @param {Boolean} options.hasNegatives - if any values are negative (in which case should render from zero)\n * @param {Array<String>} [options.gradient] - an array of stops, from top to bottom of canvas, to draw with\n * @param {String} [options.zeroColor] - color of the zero line\n * @param {Number} [options.zeroWidth] - width of the zero line\n * @param {Boolean} [options.showIndividualPoints] - draw circles at each point\n * @param {String} [options.negativeColor] - color of the area below zero\n * @param {Number} [options.width] - line width\n * @param {Object} [options.inRenderSpaceAreaBottom] - if provided, will use this as the area bottom instead of zero/sizing.renderHeight\n * @private\n */\nexport default function drawArea(\n individualPoints,\n dataInRenderSpace,\n {\n color,\n context,\n sizing,\n zero,\n hasNegatives,\n gradient,\n negativeGradient,\n zeroColor,\n zeroWidth,\n showIndividualPoints,\n negativeColor,\n pointRadius,\n minPointSpacing,\n width,\n highlighted,\n shadowColor = \"black\",\n shadowBlur = 5,\n inRenderSpaceAreaBottom,\n cutoffIndex,\n cutoffOpacity,\n originalData,\n renderCutoffGradient,\n selectionBounds,\n isPreview,\n }\n) {\n if (!context) {\n console.error(\"Canvas context is null in drawArea\");\n return;\n }\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(\n 0,\n 0,\n 0,\n sizing.renderHeight\n );\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 shouldSplitAreaPaths = hasNegatives && negativeGradient;\n const areaPaths = pathsFrom(dataInRenderSpace, shouldSplitAreaPaths ? { splitAtY: zero } : undefined);\n const areaBottomPaths =\n inRenderSpaceAreaBottom && pathsFrom(inRenderSpaceAreaBottom, shouldSplitAreaPaths ? { splitAtY: zero } : undefined);\n\n const linePaths = pathsFrom(dataInRenderSpace, {\n splitAtY: zero,\n });\n\n if (renderCutoffGradient && cutoffIndex !== undefined && originalData) {\n drawAreaWithCutoff(\n individualPoints,\n areaPaths,\n areaBottomPaths,\n linePaths,\n {\n color,\n context,\n sizing,\n zero,\n hasNegatives,\n gradient,\n zeroColor,\n zeroWidth,\n showIndividualPoints,\n negativeColor,\n pointRadius,\n width,\n highlighted,\n shadowColor,\n shadowBlur,\n inRenderSpaceAreaBottom,\n cutoffIndex,\n cutoffOpacity,\n originalData,\n selectionBounds,\n isPreview,\n }\n );\n return;\n }\n\n for (let pathI = 0; pathI < areaPaths.length; pathI++) {\n const path = areaPaths[pathI];\n const areaBottomPath = areaBottomPaths && areaBottomPaths[pathI];\n \n // Determine if this path segment is positive or negative for gradient application\n let isPositive = true;\n if (hasNegatives && negativeGradient && path.length > 0) {\n // Check the average Y position of the path to determine if it's above or below zero\n let sumY = 0;\n for (let i = 0; i < path.length; i++) {\n sumY += path[i][1];\n }\n const avgY = sumY / path.length;\n isPositive = avgY <= zero; // In screen coordinates, smaller Y is higher up (positive)\n }\n \n // Set the fill style based on whether this is a positive or negative segment\n if (hasNegatives && negativeGradient) {\n if (isPositive) {\n // Use the original gradient or color for positive areas\n if (gradient && gradient.length >= 2) {\n const globalGradient = context.createLinearGradient(0, 0, 0, sizing.renderHeight);\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 context.fillStyle = globalGradient;\n } else {\n context.fillStyle = color;\n }\n } else {\n // Use negativeGradient for negative areas\n if (negativeGradient.length >= 2) {\n const negGradient = context.createLinearGradient(0, 0, 0, sizing.renderHeight);\n for (let i = 0; i < negativeGradient.length; i++) {\n const value = negativeGradient[i];\n if (Array.isArray(value)) {\n negGradient.addColorStop(value[0], value[1]);\n } else {\n negGradient.addColorStop(i / (negativeGradient.length - 1), value);\n }\n }\n context.fillStyle = negGradient;\n } else {\n context.fillStyle = negativeColor || color;\n }\n }\n }\n \n context.beginPath();\n\n const [firstX, _startY] = path[0];\n const [lastX, _lastY] = path[path.length - 1];\n\n if (!areaBottomPaths) {\n context.moveTo(firstX, areaBottom);\n }\n\n for (let i = 0; i < path.length; i++) {\n const [x, y] = path[i];\n context.lineTo(x, y);\n }\n\n if (areaBottomPath && areaBottomPath.length) {\n for (let i = areaBottomPath.length - 1; i >= 0; i--) {\n const [x, y] = areaBottomPath[i];\n context.lineTo(x, y);\n }\n\n context.lineTo(...path[0]);\n } else {\n context.lineTo(lastX, areaBottom);\n }\n\n context.fill();\n }\n\n if (highlighted) {\n width += 2;\n }\n\n width *= DPI_INCREASE;\n context.strokeStyle = color;\n context.lineWidth = width;\n\n for (let path of linePaths) {\n if (!path.length) {\n continue;\n }\n\n if (hasNegatives && negativeColor) {\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 } else {\n context.strokeStyle = color;\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 && !renderCutoffGradient) {\n // Apply point spacing for individual point circles only\n function applyPointSpacing(points, minSpacing) {\n if (!minSpacing || points.length <= 1) {\n return points;\n }\n \n const spacedPoints = [];\n let lastX = -Infinity;\n \n for (const point of points) {\n const [x] = point;\n if (x - lastX >= minSpacing) {\n spacedPoints.push(point);\n lastX = x;\n }\n }\n \n return spacedPoints;\n }\n\n const pointsToRender = applyPointSpacing(individualPoints, minPointSpacing);\n for (let [x, y] of pointsToRender) {\n // Determine the color for this point\n let pointColor = color;\n if (negativeColor && hasNegatives) {\n if (y === zero && zeroColor) {\n pointColor = zeroColor;\n } else if (y < zero) {\n pointColor = color;\n } else {\n pointColor = negativeColor;\n }\n }\n \n context.fillStyle = pointColor;\n context.beginPath();\n context.arc(x, y, pointRadius || 8, 0, 2 * Math.PI, false);\n context.fill();\n }\n }\n}\n\n/**\n * Draws the data on the canvas with cutoff\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 area to draw\n * @param {{renderWidth: Number, renderHeight: Number}} options.sizing - size of the canvas, in pixels\n * @param {Number} options.zero - y coordinate that represents \"zero\"\n * @param {Boolean} options.hasNegatives - if any values are negative (in which case should render from zero)\n * @param {Array<String>} [options.gradient] - an array of stops, from top to bottom of canvas, to draw with\n * @param {String} [options.zeroColor] - color of the zero line\n * @param {Number} [options.zeroWidth] - width of the zero line\n * @param {Boolean} [options.showIndividualPoints] - draw circles at each point\n * @param {String} [options.negativeColor] - color of the area below zero\n * @param {Number} [options.width] - line width\n * @param {Object} [options.inRenderSpaceAreaBottom] - if provided, will use this as the area bottom instead of zero/sizing.renderHeight\n * @private\n */\nfunction drawAreaWithCutoff(\n individualPoints,\n areaPaths,\n areaBottomPaths,\n linePaths,\n {\n color,\n context,\n sizing,\n zero,\n hasNegatives,\n gradient,\n zeroColor,\n zeroWidth,\n showIndividualPoints,\n negativeColor,\n pointRadius,\n width,\n highlighted,\n shadowColor,\n shadowBlur,\n inRenderSpaceAreaBottom,\n cutoffIndex,\n cutoffOpacity,\n originalData,\n selectionBounds,\n isPreview,\n }\n) {\n let cutoffTime;\n if (typeof originalData[0] === \"object\" && originalData[0].length === 2) {\n const baseIndex = Math.floor(cutoffIndex);\n const fraction = cutoffIndex - baseIndex;\n\n if (fraction === 0 || baseIndex >= originalData.length - 1) {\n const cutoffDate =\n originalData[Math.min(baseIndex, originalData.length - 1)][0];\n cutoffTime =\n cutoffDate instanceof Date ? cutoffDate.getTime() : cutoffDate;\n } else {\n const currentDate = originalData[baseIndex][0];\n const nextDate = originalData[baseIndex + 1][0];\n const currentTime =\n currentDate instanceof Date ? currentDate.getTime() : currentDate;\n const nextTime = nextDate instanceof Date ? nextDate.getTime() : nextDate;\n cutoffTime = currentTime + fraction * (nextTime - currentTime);\n }\n } else {\n cutoffTime = cutoffIndex;\n }\n\n let firstTime, lastTime;\n if (isPreview && selectionBounds) {\n firstTime = selectionBounds.minX instanceof Date ? selectionBounds.minX.getTime() : selectionBounds.minX;\n lastTime = selectionBounds.maxX instanceof Date ? selectionBounds.maxX.getTime() : selectionBounds.maxX;\n } else {\n firstTime = originalData[0][0] instanceof Date ? originalData[0][0].getTime() : originalData[0][0];\n lastTime = originalData[originalData.length - 1][0] instanceof Date ? \n originalData[originalData.length - 1][0].getTime() : originalData[originalData.length - 1][0];\n }\n\n const timeRatio = (cutoffTime - firstTime) / (lastTime - firstTime);\n\n if (timeRatio < 0) {\n for (let pathI = 0; pathI < areaPaths.length; pathI++) {\n const path = areaPaths[pathI];\n const areaBottomPath = areaBottomPaths && areaBottomPaths[pathI];\n\n renderEntireArea(path, areaBottomPath, {\n color,\n context,\n sizing,\n zero,\n hasNegatives,\n gradient,\n zeroColor,\n zeroWidth,\n highlighted,\n shadowColor,\n shadowBlur,\n inRenderSpaceAreaBottom,\n });\n }\n } else if (timeRatio > 1) {\n const reducedOpacityGradient = gradient\n ? applyReducedOpacityToGradient(gradient, cutoffOpacity)\n : null;\n for (let pathI = 0; pathI < areaPaths.length; pathI++) {\n const path = areaPaths[pathI];\n const areaBottomPath = areaBottomPaths && areaBottomPaths[pathI];\n\n renderEntireArea(path, areaBottomPath, {\n color: applyReducedOpacity(color, cutoffOpacity),\n context,\n sizing,\n zero,\n hasNegatives,\n gradient: reducedOpacityGradient,\n zeroColor,\n zeroWidth,\n highlighted,\n shadowColor,\n shadowBlur,\n inRenderSpaceAreaBottom,\n });\n }\n } else {\n if (isPreview) {\n for (let pathI = 0; pathI < areaPaths.length; pathI++) {\n const path = areaPaths[pathI];\n const areaBottomPath = areaBottomPaths && areaBottomPaths[pathI];\n\n if (!path.length) {\n continue;\n }\n\n const renderCutoffIndex = timeRatio * path.length;\n const splitIndex = Math.floor(renderCutoffIndex);\n const fraction = renderCutoffIndex - splitIndex;\n\n let ghostPoint = null;\n if (splitIndex < path.length - 1 && fraction > 0) {\n const [x1, y1] = path[splitIndex];\n const [x2, y2] = path[splitIndex + 1];\n ghostPoint = [x1 + fraction * (x2 - x1), y1 + fraction * (y2 - y1)];\n }\n\n const shouldRenderPre =\n splitIndex > 0 || (splitIndex === 0 && fraction > 0);\n\n if (shouldRenderPre) {\n const preCutoffPath = path.slice(0, splitIndex + 1);\n if (ghostPoint && splitIndex < path.length - 1) {\n preCutoffPath.push(ghostPoint);\n }\n\n const preCutoffAreaBottomPath = areaBottomPath\n ? areaBottomPath.slice(0, splitIndex + 1)\n : null;\n if (\n ghostPoint &&\n preCutoffAreaBottomPath &&\n splitIndex < areaBottomPath.length - 1\n ) {\n const bottomGhostPoint = [ghostPoint[0], zero];\n preCutoffAreaBottomPath.push(bottomGhostPoint);\n }\n\n const reducedOpacityGradient = gradient\n ? applyReducedOpacityToGradient(gradient, cutoffOpacity)\n : null;\n renderEntireArea(preCutoffPath, preCutoffAreaBottomPath, {\n color: applyReducedOpacity(color, cutoffOpacity),\n context,\n sizing,\n zero,\n hasNegatives,\n gradient: reducedOpacityGradient,\n zeroColor,\n zeroWidth,\n highlighted,\n shadowColor,\n shadowBlur,\n inRenderSpaceAreaBottom,\n });\n }\n\n const shouldRenderPost =\n splitIndex < path.length - 1 ||\n (splitIndex === path.length - 1 && fraction === 0);\n\n if (shouldRenderPost) {\n const postCutoffPath = [];\n if (ghostPoint && splitIndex < path.length - 1) {\n postCutoffPath.push(ghostPoint);\n }\n postCutoffPath.push(...path.slice(splitIndex + 1));\n\n const postCutoffAreaBottomPath = [];\n if (\n ghostPoint &&\n areaBottomPath &&\n splitIndex < areaBottomPath.length - 1\n ) {\n const bottomGhostPoint = [ghostPoint[0], zero];\n postCutoffAreaBottomPath.push(bottomGhostPoint);\n }\n if (areaBottomPath) {\n postCutoffAreaBottomPath.push(\n ...areaBottomPath.slice(splitIndex + 1)\n );\n }\n\n renderEntireArea(\n postCutoffPath,\n postCutoffAreaBottomPath.length ? postCutoffAreaBottomPath : null,\n {\n color,\n context,\n sizing,\n zero,\n hasNegatives,\n gradient,\n zeroColor,\n zeroWidth,\n highlighted,\n shadowColor,\n shadowBlur,\n inRenderSpaceAreaBottom,\n }\n );\n }\n }\n\n if (linePaths && linePaths.length > 0) {\n drawLinesWithCutoff(linePaths, timeRatio, {\n color,\n context,\n hasNegatives,\n negativeColor,\n zero,\n width,\n highlighted,\n cutoffOpacity,\n });\n }\n\n if (\n showIndividualPoints &&\n individualPoints &&\n individualPoints.length > 0\n ) {\n drawPointsWithCutoffByRatio(individualPoints, timeRatio, {\n color,\n context,\n negativeColor,\n hasNegatives,\n zero,\n zeroColor,\n pointRadius,\n cutoffOpacity,\n });\n }\n } else {\n if (!selectionBounds) {\n for (let pathI = 0; pathI < areaPaths.length; pathI++) {\n const path = areaPaths[pathI];\n const areaBottomPath = areaBottomPaths && areaBottomPaths[pathI];\n\n renderEntireArea(path, areaBottomPath, {\n color,\n context,\n sizing,\n zero,\n hasNegatives,\n gradient,\n zeroColor,\n zeroWidth,\n highlighted,\n shadowColor,\n shadowBlur,\n inRenderSpaceAreaBottom,\n });\n }\n } else {\n const visibleMinTime =\n selectionBounds.minX instanceof Date\n ? selectionBounds.minX.getTime()\n : selectionBounds.minX;\n const visibleMaxTime =\n selectionBounds.maxX instanceof Date\n ? selectionBounds.maxX.getTime()\n : selectionBounds.maxX;\n\n if (cutoffTime < visibleMinTime) {\n // cutoff before visible range - render entire area normally\n for (let pathI = 0; pathI < areaPaths.length; pathI++) {\n const path = areaPaths[pathI];\n const areaBottomPath = areaBottomPaths && areaBottomPaths[pathI];\n\n renderEntireArea(path, areaBottomPath, {\n color,\n context,\n sizing,\n zero,\n hasNegatives,\n gradient,\n zeroColor,\n zeroWidth,\n highlighted,\n shadowColor,\n shadowBlur,\n inRenderSpaceAreaBottom,\n });\n }\n } else if (cutoffTime > visibleMaxTime) {\n // cutoff after visible range - render entire area with reduced opacity\n const reducedOpacityGradient = gradient\n ? applyReducedOpacityToGradient(gradient, cutoffOpacity)\n : null;\n for (let pathI = 0; pathI < areaPaths.length; pathI++) {\n const path = areaPaths[pathI];\n const areaBottomPath = areaBottomPaths && areaBottomPaths[pathI];\n\n renderEntireArea(path, areaBottomPath, {\n color: applyReducedOpacity(color, cutoffOpacity),\n context,\n sizing,\n zero,\n hasNegatives,\n gradient: reducedOpacityGradient,\n zeroColor,\n zeroWidth,\n highlighted,\n shadowColor,\n shadowBlur,\n inRenderSpaceAreaBottom,\n });\n }\n } else {\n // cutoff within visible range - calculate position relative to visible bounds\n const visibleTimeRatio =\n (cutoffTime - visibleMinTime) / (visibleMaxTime - visibleMinTime);\n\n for (let pathI = 0; pathI < areaPaths.length; pathI++) {\n const path = areaPaths[pathI];\n const areaBottomPath = areaBottomPaths && areaBottomPaths[pathI];\n\n if (!path.length) {\n continue;\n }\n\n const renderCutoffIndex = visibleTimeRatio * path.length;\n const splitIndex = Math.floor(renderCutoffIndex);\n const fraction = renderCutoffIndex - splitIndex;\n\n // create ghost point for continuity if needed\n let ghostPoint = null;\n if (splitIndex < path.length - 1 && fraction > 0) {\n const [x1, y1] = path[splitIndex];\n const [x2, y2] = path[splitIndex + 1];\n ghostPoint = [\n x1 + fraction * (x2 - x1),\n y1 + fraction * (y2 - y1),\n ];\n }\n\n // render pre-cutoff area with reduced opacity\n const shouldRenderPre =\n splitIndex > 0 || (splitIndex === 0 && fraction > 0);\n\n if (shouldRenderPre) {\n renderAreaSegment(\n path,\n areaBottomPath,\n splitIndex,\n ghostPoint,\n true,\n {\n color: applyReducedOpacity(color, cutoffOpacity),\n context,\n sizing,\n zero,\n hasNegatives,\n gradient,\n areaBottomPaths,\n }\n );\n }\n\n // render post-cutoff area with normal opacity\n const shouldRenderPost = splitIndex < path.length - 1;\n\n if (shouldRenderPost) {\n renderAreaSegment(\n path,\n areaBottomPath,\n splitIndex,\n ghostPoint,\n false,\n {\n color,\n context,\n sizing,\n zero,\n hasNegatives,\n gradient,\n areaBottomPaths,\n }\n );\n }\n }\n }\n }\n }\n\n // draw outline lines with cutoff\n if (timeRatio >= 0 && timeRatio <= 1 && !isPreview) {\n if (selectionBounds) {\n const visibleMinTime =\n selectionBounds.minX instanceof Date\n ? selectionBounds.minX.getTime()\n : selectionBounds.minX;\n const visibleMaxTime =\n selectionBounds.maxX instanceof Date\n ? selectionBounds.maxX.getTime()\n : selectionBounds.maxX;\n\n // test case time\n if (cutoffTime < visibleMinTime) {\n // cutoff before visible range - draw lines normally\n drawLinesNormally(linePaths, {\n color,\n context,\n hasNegatives,\n negativeColor,\n width,\n highlighted,\n });\n } else if (cutoffTime > visibleMaxTime) {\n // cutoff after visible range - draw lines with reduced opacity (to match area)\n const reducedColor = applyReducedOpacity(color, cutoffOpacity);\n const reducedNegativeColor = negativeColor\n ? applyReducedOpacity(negativeColor, cutoffOpacity)\n : negativeColor;\n drawLinesNormally(linePaths, {\n color: reducedColor,\n context,\n hasNegatives,\n negativeColor: reducedNegativeColor,\n width,\n highlighted,\n });\n } else {\n // cutoff within visible range - split lines at cutoff\n const visibleTimeRatio =\n (cutoffTime - visibleMinTime) / (visibleMaxTime - visibleMinTime);\n drawLinesWithCutoff(linePaths, visibleTimeRatio, {\n color,\n context,\n hasNegatives,\n negativeColor,\n zero,\n width,\n highlighted,\n cutoffOpacity,\n });\n }\n } else {\n // no bounds available - draw lines normally\n drawLinesNormally(linePaths, {\n color,\n context,\n hasNegatives,\n negativeColor,\n width,\n highlighted,\n });\n }\n } else if (!isPreview) {\n // draw lines normally without cutoff\n drawLinesNormally(linePaths, {\n color,\n context,\n hasNegatives,\n negativeColor,\n width,\n highlighted,\n });\n }\n\n // draw other elements (zero line, points) normally\n if (zeroWidth) {\n const areaBottom = hasNegatives ? zero : sizing.renderHeight;\n drawZeroLine(areaBottom, {\n context,\n sizing,\n color,\n zero,\n zeroColor,\n zeroWidth,\n });\n }\n\n if (showIndividualPoints && !isPreview) {\n if (timeRatio >= 0 && timeRatio <= 1) {\n if (selectionBounds) {\n const visibleMinTime =\n selectionBounds.minX instanceof Date\n ? selectionBounds.minX.getTime()\n : selectionBounds.minX;\n const visibleMaxTime =\n selectionBounds.maxX instanceof Date\n ? selectionBounds.maxX.getTime()\n : selectionBounds.maxX;\n\n //test case time\n if (cutoffTime < visibleMinTime) {\n // cutoff before visible range - draw points normally\n drawPointsNormally(individualPoints, {\n color,\n context,\n negativeColor,\n hasNegatives,\n zero,\n zeroColor,\n pointRadius,\n });\n } else if (cutoffTime > visibleMaxTime) {\n // cutoff after visible range - draw points with reduced opacity\n const reducedColor = applyReducedOpacity(color, cutoffOpacity);\n const reducedNegativeColor = negativeColor\n ? applyReducedOpacity(negativeColor, cutoffOpacity)\n : negativeColor;\n const reducedZeroColor = zeroColor\n ? applyReducedOpacity(zeroColor, cutoffOpacity)\n : zeroColor;\n drawPointsNormally(individualPoints, {\n color: reducedColor,\n context,\n negativeColor: reducedNegativeColor,\n hasNegatives,\n zero,\n zeroColor: reducedZeroColor,\n pointRadius,\n });\n } else {\n // cutoff within visible range - split points at cutoff\n const visibleTimeRatio =\n (cutoffTime - visibleMinTime) / (visibleMaxTime - visibleMinTime);\n drawPointsWithCutoffByRatio(individualPoints, visibleTimeRatio, {\n color,\n context,\n negativeColor,\n hasNegatives,\n zero,\n zeroColor,\n pointRadius,\n cutoffOpacity,\n });\n }\n } else {\n // no bounds available - draw points normally\n drawPointsNormally(individualPoints, {\n color,\n context,\n negativeColor,\n hasNegatives,\n zero,\n zeroColor,\n pointRadius,\n });\n }\n } else {\n // cutoff outside data range - draw points normally\n drawPointsNormally(individualPoints, {\n color,\n context,\n negativeColor,\n hasNegatives,\n zero,\n zeroColor,\n pointRadius,\n });\n }\n } \n }\n}\n\nfunction renderEntireArea(\n path,\n areaBottomPath,\n {\n color,\n context,\n sizing,\n zero,\n hasNegatives,\n gradient,\n }\n) {\n context.fillStyle = color;\n\n if (gradient && gradient.length >= 2) {\n const globalGradient = context.createLinearGradient(\n 0,\n 0,\n 0,\n 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 context.fillStyle = globalGradient;\n } else {\n }\n\n const areaBottom = hasNegatives ? zero : sizing.renderHeight;\n\n context.beginPath();\n\n const [firstX, _startY] = path[0];\n const [lastX, _lastY] = path[path.length - 1];\n\n if (!areaBottomPath) {\n context.moveTo(firstX, areaBottom);\n }\n\n for (let i = 0; i < path.length; i++) {\n const [x, y] = path[i];\n context.lineTo(x, y);\n }\n\n if (areaBottomPath && areaBottomPath.length) {\n for (let i = areaBottomPath.length - 1; i >= 0; i--) {\n const [x, y] = areaBottomPath[i];\n context.lineTo(x, y);\n }\n context.lineTo(...path[0]);\n } else {\n context.lineTo(lastX, areaBottom);\n }\n\n context.fill();\n}\n\nfunction renderAreaSegment(\n path,\n areaBottomPath,\n splitIndex,\n ghostPoint,\n isPreCutoff,\n { color, context, sizing, zero, hasNegatives, gradient, areaBottomPaths }\n) {\n context.fillStyle = color;\n\n if (gradient && gradient.length >= 2) {\n const globalGradient = context.createLinearGradient(\n 0,\n 0,\n 0,\n sizing.renderHeight\n );\n for (let i = 0; i < gradient.length; i++) {\n const value = gradient[i];\n if (Array.isArray(value)) {\n const gradientColor = isPreCutoff\n ? applyReducedOpacity(value[1], 0.35)\n : value[1];\n globalGradient.addColorStop(value[0], gradientColor);\n } else {\n const gradientColor = isPreCutoff\n ? applyReducedOpacity(value, 0.35)\n : value;\n globalGradient.addColorStop(i / (gradient.length - 1), gradientColor);\n }\n }\n context.fillStyle = globalGradient;\n } else {\n }\n\n const areaBottom = hasNegatives ? zero : sizing.renderHeight;\n\n context.beginPath();\n\n if (isPreCutoff) {\n const endIndex = ghostPoint ? splitIndex + 1 : splitIndex;\n const [firstX] = path[0];\n\n if (!areaBottomPaths) {\n context.moveTo(firstX, areaBottom);\n }\n\n for (let i = 0; i <= endIndex && i < path.length; i++) {\n const [x, y] = i === endIndex && ghostPoint ? ghostPoint : path[i];\n context.lineTo(x, y);\n }\n\n if (areaBottomPath && areaBottomPath.length) {\n for (let i = Math.min(endIndex, areaBottomPath.length - 1); i >= 0; i--) {\n const [x, y] = areaBottomPath[i];\n context.lineTo(x, y);\n }\n context.lineTo(...path[0]);\n } else {\n const lastPoint = ghostPoint || path[endIndex] || path[path.length - 1];\n context.lineTo(lastPoint[0], areaBottom);\n }\n } else {\n const startIndex = ghostPoint ? splitIndex : splitIndex + 1;\n const startPoint = ghostPoint || path[startIndex];\n\n if (startPoint) {\n context.moveTo(startPoint[0], areaBottom);\n\n if (ghostPoint) {\n context.lineTo(...ghostPoint);\n }\n for (let i = startIndex; i < path.length; i++) {\n context.lineTo(...path[i]);\n }\n\n if (areaBottomPath && areaBottomPath.length) {\n for (\n let i = areaBottomPath.length - 1;\n i >= Math.max(startIndex, 0);\n i--\n ) {\n const [x, y] = areaBottomPath[i];\n context.lineTo(x, y);\n }\n if (ghostPoint) {\n context.lineTo(ghostPoint[0], areaBottom);\n }\n } else {\n const [lastX] = path[path.length - 1];\n context.lineTo(lastX, areaBottom);\n }\n }\n }\n\n context.fill();\n}\n\nfunction drawPointsNormally(\n individualPoints,\n { color, context, negativeColor, hasNegatives, zero, zeroColor, pointRadius }\n) {\n if (!individualPoints || !Array.isArray(individualPoints)) {\n return;\n }\n\n for (let i = 0; i < individualPoints.length; i++) {\n const [x, y] = individualPoints[i];\n\n let pointColor = color;\n if (negativeColor && hasNegatives) {\n if (y === zero && zeroColor) {\n pointColor = zeroColor;\n } else if (y < zero) {\n pointColor = color;\n } else {\n pointColor = negativeColor;\n }\n }\n\n context.fillStyle = pointColor;\n context.beginPath();\n context.arc(x, y, pointRadius || 8, 0, 2 * Math.PI, false);\n context.fill();\n }\n}\n\nfunction drawLinesNormally(\n linePaths,\n { color, context, hasNegatives, negativeColor, width, highlighted }\n) {\n if (!linePaths || !Array.isArray(linePaths)) {\n return;\n }\n\n if (highlighted) {\n width += 2;\n }\n width *= DPI_INCREASE;\n\n for (let path of linePaths) {\n if (!path.length) continue;\n\n context.strokeStyle = hasNegatives && negativeColor ? negativeColor : color;\n context.lineWidth = width;\n context.beginPath();\n for (let i = 0; i < path.length; i++) {\n const [x, y] = path[i];\n if (i === 0) {\n context.moveTo(x, y);\n } else {\n context.lineTo(x, y);\n }\n }\n context.stroke();\n }\n}\n\nfunction drawLinesWithCutoff(\n linePaths,\n timeRatio,\n {\n color,\n context,\n hasNegatives,\n negativeColor,\n zero,\n width,\n highlighted,\n cutoffOpacity,\n }\n) {\n if (!linePaths || !Array.isArray(linePaths)) {\n return;\n }\n\n if (highlighted) {\n width += 2;\n }\n width *= DPI_INCREASE;\n\n const cutoffPixelX = timeRatio * context.canvas.width;\n const preCutoffPaths = [];\n const postCutoffPaths = [];\n\n for (let path of linePaths) {\n if (!path.length) continue;\n\n const prePath = [];\n const postPath = [];\n let ghostPoint = null;\n let splitIndex = -1;\n\n for (let i = 0; i < path.length; i++) {\n const [x, y] = path[i];\n \n if (x < cutoffPixelX) {\n prePath.push([x, y]);\n splitIndex = i;\n } else {\n postPath.push([x, y]);\n }\n }\n\n if (prePath.length > 0 && postPath.length > 0) {\n const lastPrePoint = prePath[prePath.length - 1];\n const firstPostPoint = postPath[0];\n const [x1, y1] = lastPrePoint;\n const [x2, y2] = firstPostPoint;\n \n if (x2 !== x1) {\n const fraction = (cutoffPixelX - x1) / (x2 - x1);\n ghostPoint = [cutoffPixelX, y1 + fraction * (y2 - y1)];\n prePath.push(ghostPoint);\n postPath.unshift(ghostPoint);\n }\n }\n\n if (prePath.length > 0) {\n preCutoffPaths.push(prePath);\n }\n if (postPath.length > 0) {\n postCutoffPaths.push(postPath);\n }\n }\n\n if (preCutoffPaths.length > 0) {\n const reducedColor = applyReducedOpacity(color, cutoffOpacity);\n context.strokeStyle = reducedColor;\n context.lineWidth = width;\n\n for (let path of preCutoffPaths) {\n if (path.length > 1) {\n context.beginPath();\n for (let i = 0; i < path.length; i++) {\n const [x, y] = path[i];\n if (i === 0) {\n context.moveTo(x, y);\n } else {\n context.lineTo(x, y);\n }\n }\n context.stroke();\n }\n }\n }\n\n if (postCutoffPaths.length > 0) {\n context.strokeStyle = hasNegatives && negativeColor ? negativeColor : color;\n context.lineWidth = width;\n\n for (let path of postCutoffPaths) {\n if (path.length > 1) {\n context.beginPath();\n for (let i = 0; i < path.length; i++) {\n const [x, y] = path[i];\n if (i === 0) {\n context.moveTo(x, y);\n } else {\n context.lineTo(x, y);\n }\n }\n context.stroke();\n }\n }\n }\n}\n\nfunction drawPointsWithCutoffByRatio(\n individualPoints,\n timeRatio,\n {\n color,\n context,\n negativeColor,\n hasNegatives,\n zero,\n zeroColor,\n pointRadius,\n cutoffOpacity,\n }\n) {\n if (!individualPoints || !Array.isArray(individualPoints)) {\n return;\n }\n\n const canvasWidth = context.canvas.width;\n const cutoffPixelX = timeRatio * canvasWidth;\n\n for (let i = 0; i < individualPoints.length; i++) {\n const [x, y] = individualPoints[i];\n\n const isBeforeCutoff = x < cutoffPixelX;\n\n let pointColor = color;\n if (isBeforeCutoff) {\n pointColor = applyReducedOpacity(color, cutoffOpacity);\n }\n\n if (negativeColor && hasNegatives) {\n if (y === zero && zeroColor) {\n pointColor = zeroColor;\n } else if (y < zero) {\n pointColor = isBeforeCutoff\n ? applyReducedOpacity(color, cutoffOpacity)\n : color;\n } else {\n pointColor = isBeforeCutoff\n ? applyReducedOpacity(negativeColor, cutoffOpacity)\n : negativeColor;\n }\n }\n\n context.fillStyle = pointColor;\n context.beginPath();\n context.arc(x, y, pointRadius || 8, 0, 2 * Math.PI, false);\n context.fill();\n }\n}\n","import {drawZeroLine} from './draw_zero_line';\nimport { applyReducedOpacity } from \"../helpers/colors\";\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, cutoffIndex, cutoffOpacity, originalData, renderCutoffGradient, selectionBounds\n}) {\n if (!context) {\n console.error('Canvas context is null in drawBars');\n return;\n }\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 if (renderCutoffGradient && cutoffIndex !== undefined && originalData) {\n drawBarsWithCutoff(individualPoints, {\n color, context, sizing, indexInAxis, axisSeriesCount, zero, hasNegatives, negativeColor, zeroColor, zeroWidth, closestSpacing, bounds, cutoffIndex, cutoffOpacity, originalData, selectionBounds, barWidth, totalBarWidth, barBottom\n });\n return;\n }\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\nexport function getBarWidths({closestSpacing, bounds, sizing, axisSeriesCount}) {\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\n/**\n * Draws the data on the canvas with cutoff\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 * @param {Number} options.cutoffIndex - index of the cutoff\n * @param {Number} options.cutoffOpacity - opacity of the cutoff\n * @param {Array<[number, number]>} options.originalData - original data\n * @param {Boolean} options.selectionBounds - if selection bounds are available\n * @param {Number} options.barWidth - width of the bar\n * @param {Number} options.totalBarWidth - total width of the bar\n * @param {Number} options.barBottom - y coordinate that represents the bottom of the bar\n * @private\n */\nfunction drawBarsWithCutoff(individualPoints, {\n color, context, sizing, indexInAxis, axisSeriesCount, zero, hasNegatives, negativeColor, zeroColor, zeroWidth, closestSpacing, bounds, cutoffIndex, cutoffOpacity, originalData, selectionBounds, barWidth, totalBarWidth, barBottom\n}) {\n let cutoffTime;\n if (typeof originalData[0] === 'object' && originalData[0].length === 2) {\n const baseIndex = Math.floor(cutoffIndex);\n const fraction = cutoffIndex - baseIndex;\n \n if (fraction === 0 || baseIndex >= originalData.length - 1) {\n const cutoffDate = originalData[Math.min(baseIndex, originalData.length - 1)][0];\n cutoffTime = cutoffDate instanceof Date ? cutoffDate.getTime() : cutoffDate;\n } else {\n const currentDate = originalData[baseIndex][0];\n const nextDate = originalData[baseIndex + 1][0];\n const currentTime = currentDate instanceof Date ? currentDate.getTime() : currentDate;\n const nextTime = nextDate instanceof Date ? nextDate.getTime() : nextDate;\n cutoffTime = currentTime + fraction * (nextTime - currentTime);\n }\n } else {\n cutoffTime = cutoffIndex; \n }\n\n for (let i = 0; i < individualPoints.length; i++) {\n const [x, y] = individualPoints[i];\n \n let barColor = color;\n let isBeforeCutoff = false;\n\n if (i < originalData.length) {\n const dataPoint = originalData[i];\n const pointTime = dataPoint[0] instanceof Date ? dataPoint[0].getTime() : dataPoint[0];\n isBeforeCutoff = pointTime < cutoffTime;\n \n if (isBeforeCutoff) {\n barColor = applyReducedOpacity(color, cutoffOpacity);\n }\n }\n\n if (hasNegatives) {\n if (y <= zero) {\n context.fillStyle = barColor;\n } else {\n const negColor = isBeforeCutoff ? applyReducedOpacity(negativeColor, cutoffOpacity) : negativeColor;\n context.fillStyle = negColor;\n }\n } else {\n context.fillStyle = barColor;\n }\n\n context.fillRect(x - totalBarWidth / 2 + barWidth*indexInAxis, y, barWidth, barBottom-y);\n }\n\n if (zeroWidth) {\n drawZeroLine(barBottom, {\n context, sizing, color, zero, zeroColor, zeroWidth\n });\n }\n}\n","import {DPI_INCREASE} from './size_canvas';\nimport pathsFrom from './paths_from';\nimport { applyReducedOpacity } from \"../helpers/colors\";\n\nfunction applyPointSpacing(points, minSpacing) {\n if (!minSpacing || points.length <= 1) {\n return points;\n }\n \n const spacedPoints = [];\n let lastX = -Infinity;\n \n for (const point of points) {\n const [x] = point;\n if (x - lastX >= minSpacing) {\n spacedPoints.push(point);\n lastX = x;\n }\n }\n \n return spacedPoints;\n}\n\nexport default function drawLine(dataInRenderSpace, {\n color, width=1, context, shadowColor='black', shadowBlur=5, dashed=false, dashPattern=null, highlighted=false, showIndividualPoints=false, pointRadius, minPointSpacing, getIndividualPoints, getRanges, cutoffIndex, cutoffOpacity, originalData, renderCutoffGradient, currentBounds, selectionBounds, rendering, isPreview, negativeColor, hasNegatives, zero, zeroColor\n}) {\n if (!context) {\n console.error(\"Canvas context is null in drawLine\");\n return;\n }\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 // Split paths at zero line if negativeColor is specified\n const paths = pathsFrom(dataInRenderSpace, hasNegatives && negativeColor ? { splitAtY: zero } : undefined);\n\n for (let path of paths) {\n if (renderCutoffGradient && cutoffIndex !== undefined && originalData) {\n let cutoffTime;\n if (typeof originalData[0] === 'object' && originalData[0].length === 2) {\n const baseIndex = Math.floor(cutoffIndex);\n const fraction = cutoffIndex - baseIndex;\n \n if (fraction === 0 || baseIndex >= originalData.length - 1) {\n const cutoffDate = originalData[Math.min(baseIndex, originalData.length - 1)][0];\n cutoffTime = cutoffDate instanceof Date ? cutoffDate.getTime() : cutoffDate;\n } else {\n const currentDate = originalData[baseIndex][0];\n const nextDate = originalData[baseIndex + 1][0];\n const currentTime = currentDate instanceof Date ? currentDate.getTime() : currentDate;\n const nextTime = nextDate instanceof Date ? nextDate.getTime() : nextDate;\n cutoffTime = currentTime + fraction * (nextTime - currentTime);\n }\n } else {\n cutoffTime = cutoffIndex; \n }\n \n if (isPreview) {\n const firstTime = originalData[0][0] instanceof Date ? originalData[0][0].getTime() : originalData[0][0];\n const lastTime = originalData[originalData.length - 1][0] instanceof Date ? \n originalData[originalData.length - 1][0].getTime() : originalData[originalData.length - 1][0];\n const timeRatio = (cutoffTime - firstTime) / (lastTime - firstTime);\n \n if (timeRatio < 0) {\n context.lineWidth = width;\n context.beginPath();\n for (let i = 0; i < path.length; i++) {\n const [x, y] = path[i];\n if (i === 0) {\n context.moveTo(x, y);\n } else {\n context.lineTo(x, y);\n }\n }\n context.stroke();\n } else if (timeRatio > 1) {\n const reducedColor = applyReducedOpacity(color, cutoffOpacity);\n context.strokeStyle = reducedColor;\n context.lineWidth = width;\n context.beginPath();\n for (let i = 0; i < path.length; i++) {\n const [x, y] = path[i];\n if (i === 0) {\n context.moveTo(x, y);\n } else {\n context.lineTo(x, y);\n }\n }\n context.stroke();\n } else {\n const renderCutoffIndex = timeRatio * (path.length - 1);\n const splitIndex = Math.floor(renderCutoffIndex);\n const fraction = renderCutoffIndex - splitIndex;\n \n let ghostPoint = null;\n if (splitIndex < path.length - 1 && fraction > 0) {\n const [x1, y1] = path[splitIndex];\n const [x2, y2] = path[splitIndex + 1];\n ghostPoint = [\n x1 + fraction * (x2 - x1),\n y1 + fraction * (y2 - y1)\n ];\n }\n \n if (splitIndex > 0 || (splitIndex === 0 && fraction > 0)) {\n const reducedColor = applyReducedOpacity(color, cutoffOpacity);\n context.strokeStyle = reducedColor;\n context.lineWidth = width;\n context.beginPath();\n \n for (let i = 0; i <= splitIndex; i++) {\n const [x, y] = path[i];\n if (i === 0) {\n context.moveTo(x, y);\n } else {\n context.lineTo(x, y);\n }\n }\n \n if (ghostPoint) {\n context.lineTo(ghostPoint[0], ghostPoint[1]);\n }\n \n context.stroke();\n }\n \n if (splitIndex < path.length - 1) {\n context.strokeStyle = color;\n context.lineWidth = width;\n context.beginPath();\n \n if (ghostPoint) {\n context.moveTo(ghostPoint[0], ghostPoint[1]);\n } else {\n context.moveTo(path[splitIndex + 1][0], path[splitIndex + 1][1]);\n }\n \n for (let i = splitIndex + 1; i < path.length; i++) {\n const [x, y] = path[i];\n context.lineTo(x, y);\n }\n \n context.stroke();\n }\n }\n } else {\n if (!selectionBounds) {\n context.lineWidth = width;\n context.beginPath();\n for (let i = 0; i < path.length; i++) {\n const [x, y] = path[i];\n if (i === 0) {\n context.moveTo(x, y);\n } else {\n context.lineTo(x, y);\n }\n }\n context.stroke();\n continue;\n }\n \n const visibleMinTime = selectionBounds.minX instanceof Date ? selectionBounds.minX.getTime() : selectionBounds.minX;\n const visibleMaxTime = selectionBounds.maxX instanceof Date ? selectionBounds.maxX.getTime() : selectionBounds.maxX;\n \n if (cutoffTime < visibleMinTime) {\n context.lineWidth = width;\n context.beginPath();\n for (let i = 0; i < path.length; i++) {\n const [x, y] = path[i];\n if (i === 0) {\n context.moveTo(x, y);\n } else {\n context.lineTo(x, y);\n }\n }\n context.stroke();\n } else if (cutoffTime > visibleMaxTime) {\n const reducedColor = applyReducedOpacity(color, cutoffOpacity);\n context.strokeStyle = reducedColor;\n context.lineWidth = width;\n context.beginPath();\n for (let i = 0; i < path.length; i++) {\n const [x, y] = path[i];\n if (i === 0) {\n context.moveTo(x, y);\n } else {\n context.lineTo(x, y);\n }\n }\n context.stroke();\n context.strokeStyle = color;\n } else {\n const timeRatio = (cutoffTime - visibleMinTime) / (visibleMaxTime - visibleMinTime);\n const renderCutoffIndex = timeRatio * path.length;\n \n const preCutoffPath = [];\n const postCutoffPath = [];\n let ghostPoint = null;\n \n if (renderCutoffIndex > 0 && renderCutoffIndex < path.length - 1) {\n const beforeIndex = Math.floor(renderCutoffIndex);\n const afterIndex = Math.ceil(renderCutoffIndex);\n \n if (beforeIndex !== afterIndex) {\n const fraction = renderCutoffIndex - beforeIndex;\n const beforePoint = path[beforeIndex];\n const afterPoint = path[afterIndex];\n \n ghostPoint = [\n beforePoint[0] + fraction * (afterPoint[0] - beforePoint[0]),\n beforePoint[1] + fraction * (afterPoint[1] - beforePoint[1])\n ];\n \n } else {\n ghostPoint = path[renderCutoffIndex];\n }\n }\n \n for (let i = 0; i < path.length; i++) {\n if (i < renderCutoffIndex) {\n preCutoffPath.push(path[i]);\n } else {\n postCutoffPath.push(path[i]);\n }\n }\n \n if (ghostPoint) {\n if (preCutoffPath.length > 0) {\n preCutoffPath.push(ghostPoint);\n }\n if (postCutoffPath.length > 0) {\n postCutoffPath.unshift(ghostPoint);\n }\n }\n \n if (preCutoffPath.length > 1) {\n const reducedColor = applyReducedOpacity(color, cutoffOpacity);\n context.strokeStyle = reducedColor;\n context.lineWidth = width;\n context.beginPath();\n for (let i = 0; i < preCutoffPath.length; i++) {\n const [x, y] = preCutoffPath[i];\n if (i === 0) {\n context.moveTo(x, y);\n } else {\n context.lineTo(x, y);\n }\n }\n context.stroke();\n }\n \n if (postCutoffPath.length > 1) {\n context.strokeStyle = color;\n context.lineWidth = width;\n context.beginPath();\n for (let i = 0; i < postCutoffPath.length; i++) {\n const [x, y] = postCutoffPath[i];\n if (i === 0) {\n context.moveTo(x, y);\n } else {\n context.lineTo(x, y);\n }\n }\n context.stroke();\n }\n }\n }\n } else {\n if (hasNegatives && negativeColor) {\n let positive = true;\n if (path.length >= 2) {\n positive = path[1][1] <= zero;\n } else if (path.length > 0) {\n positive = path[0][1] <= zero;\n }\n context.strokeStyle = positive ? color : negativeColor;\n } else {\n context.strokeStyle = color;\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\n if (getRanges) {\n const ranges = getRanges();\n\n context.lineWidth = width;\n context.strokeStyle = color;\n context.setLineDash([]);\n const horizontalBarWidth = 8 * DPI_INCREASE;\n\n for (let range of ranges) {\n if (!range) {\n continue;\n }\n\n const { pixelX, pixelMinY, pixelMaxY } = range;\n\n if (pixelMinY !== null) {\n context.beginPath();\n context.moveTo(pixelX - (horizontalBarWidth / 2), pixelMinY);\n context.lineTo(pixelX + (horizontalBarWidth / 2), pixelMinY);\n context.stroke();\n }\n\n if (pixelMaxY !== null) {\n context.beginPath();\n context.moveTo(pixelX - (horizontalBarWidth / 2), pixelMaxY);\n context.lineTo(pixelX + (horizontalBarWidth / 2), pixelMaxY);\n context.stroke();\n }\n\n if (pixelMinY === null || pixelMaxY === null) {\n continue;\n }\n\n context.beginPath();\n context.moveTo(pixelX, pixelMinY);\n context.lineTo(pixelX, pixelMaxY);\n context.stroke();\n }\n }\n\n if (showIndividualPoints) {\n const individualPoints = getIndividualPoints();\n\n if (renderCutoffGradient && cutoffIndex !== undefined && originalData && selectionBounds) {\n const visibleBounds = selectionBounds;\n let firstTime, lastTime;\n \n if (visibleBounds && visibleBounds.minX !== undefined && visibleBounds.maxX !== undefined) {\n firstTime = visibleBounds.minX instanceof Date ? visibleBounds.minX.getTime() : visibleBounds.minX;\n lastTime = visibleBounds.maxX instanceof Date ? visibleBounds.maxX.getTime() : visibleBounds.maxX;\n } else {\n const firstItem = originalData[0];\n const lastItem = originalData[originalData.length - 1];\n const firstX = firstItem[0];\n const lastX = lastItem[0];\n \n firstTime = firstX instanceof Date ? firstX.getTime() : firstX;\n lastTime = lastX instanceof Date ? lastX.getTime() : lastX;\n }\n \n let cutoffTime;\n if (typeof cutoffIndex === 'string' && cutoffIndex === 'now') {\n cutoffTime = Date.now();\n } else if (typeof originalData[0] === 'object' && originalData[0].length === 2) {\n const baseIndex = Math.floor(cutoffIndex);\n const fraction = cutoffIndex - baseIndex;\n \n if (fraction === 0 || baseIndex >= originalData.length - 1) {\n const cutoffDate = originalData[Math.min(baseIndex, originalData.length - 1)][0];\n cutoffTime = cutoffDate instanceof Date ? cutoffDate.getTime() : cutoffDate;\n } else {\n const currentDate = originalData[baseIndex][0];\n const nextDate = originalData[baseIndex + 1][0];\n const currentTime = currentDate instanceof Date ? currentDate.getTime() : currentDate;\n const nextTime = nextDate instanceof Date ? nextDate.getTime() : nextDate;\n cutoffTime = currentTime + fraction * (nextTime - currentTime);\n }\n } else {\n cutoffTime = cutoffIndex; \n }\n \n if (cutoffTime !== null) {\n const timeDiff = cutoffTime - firstTime;\n const totalTime = lastTime - firstTime;\n const timeRatio = timeDiff / totalTime;\n \n if (timeRatio > 1) {\n const spacedPoints = applyPointSpacing(individualPoints, minPointSpacing);\n for (let i = 0; i < spacedPoints.length; i++) {\n const [x, y] = spacedPoints[i];\n \n let pointColor = color;\n if (negativeColor && hasNegatives) {\n if (y === zero && zeroColor) {\n pointColor = zeroColor;\n } else if (y < zero) {\n pointColor = color;\n } else {\n pointColor = negativeColor;\n }\n }\n \n const { applyReducedOpacity } = require(\"../helpers/colors\");\n const reducedOpacityColor = applyReducedOpacity(pointColor, cutoffOpacity);\n context.fillStyle = reducedOpacityColor;\n context.beginPath();\n context.arc(x, y, pointRadius || 8, 0, 2 * Math.PI, false);\n context.fill();\n }\n return;\n }\n }\n \n if (isPreview) {\n const visibleMinTime = selectionBounds.minX instanceof Date ? selectionBounds.minX.getTime() : selectionBounds.minX;\n const visibleMaxTime = selectionBounds.maxX instanceof Date ? selectionBounds.maxX.getTime() : selectionBounds.maxX;\n \n const spacedPoints = applyPointSpacing(individualPoints, minPointSpacing);\n for (let i = 0; i < spacedPoints.length; i++) {\n const [x, y] = spacedPoints[i];\n \n let isBeforeCutoff = false;\n if (cutoffTime < visibleMinTime) {\n isBeforeCutoff = false;\n } else if (cutoffTime > visibleMaxTime) {\n isBeforeCutoff = (rendering !== 'shadow');\n } else {\n const visibleCutoffRatio = (cutoffTime - visibleMinTime) / (visibleMaxTime - visibleMinTime);\n const cutoffPixelX = visibleCutoffRatio * context.canvas.width;\n isBeforeCutoff = x < cutoffPixelX;\n }\n \n let pointColor = color;\n if (negativeColor && hasNegatives) {\n if (y === zero && zeroColor) {\n pointColor = zeroColor;\n } else if (y < zero) {\n pointColor = color;\n } else {\n pointColor = negativeColor;\n }\n }\n \n if (isBeforeCutoff) {\n const reducedOpacityColor = applyReducedOpacity(pointColor, cutoffOpacity);\n context.fillStyle = reducedOpacityColor;\n } else {\n context.fillStyle = pointColor;\n }\n \n context.beginPath();\n context.arc(x, y, pointRadius || 8, 0, 2 * Math.PI, false);\n context.fill();\n }\n } else if (!selectionBounds) {\n const spacedPoints = applyPointSpacing(individualPoints, minPointSpacing);\n for (let i = 0; i < spacedPoints.length; i++) {\n const [x, y] = spacedPoints[i];\n \n let pointColor = color;\n if (negativeColor && hasNegatives) {\n if (y === zero && zeroColor) {\n pointColor = zeroColor;\n } else if (y < zero) {\n pointColor = color;\n } else {\n pointColor = negativeColor;\n }\n }\n \n context.fillStyle = pointColor;\n context.beginPath();\n context.arc(x, y, pointRadius || 8, 0, 2 * Math.PI, false);\n context.fill();\n }\n } else {\n const visibleMinTime = selectionBounds.minX instanceof Date ? selectionBounds.minX.getTime() : selectionBounds.minX;\n const visibleMaxTime = selectionBounds.maxX instanceof Date ? selectionBounds.maxX.getTime() : selectionBounds.maxX;\n \n const spacedPoints = applyPointSpacing(individualPoints, minPointSpacing);\n for (let i = 0; i < spacedPoints.length; i++) {\n const [x, y] = spacedPoints[i];\n \n let isBeforeCutoff = false;\n if (cutoffTime < visibleMinTime) {\n isBeforeCutoff = false;\n } else if (cutoffTime > visibleMaxTime) {\n isBeforeCutoff = (rendering !== 'shadow');\n } else {\n const visibleCutoffRatio = (cutoffTime - visibleMinTime) / (visibleMaxTime - visibleMinTime);\n const cutoffPixelX = visibleCutoffRatio * context.canvas.width;\n isBeforeCutoff = x < cutoffPixelX;\n }\n \n let pointColor = color;\n if (negativeColor && hasNegatives) {\n if (y === zero && zeroColor) {\n pointColor = zeroColor;\n } else if (y < zero) {\n pointColor = color;\n } else {\n pointColor = negativeColor;\n }\n }\n \n if (isBeforeCutoff) {\n const reducedOpacityColor = applyReducedOpacity(pointColor, cutoffOpacity);\n context.fillStyle = reducedOpacityColor;\n } else {\n context.fillStyle = pointColor;\n }\n \n context.beginPath();\n context.arc(x, y, pointRadius || 8, 0, 2 * Math.PI, false);\n context.fill();\n }\n }\n } else {\n const spacedPoints = applyPointSpacing(individualPoints, minPointSpacing);\n for (let i = 0; i < spacedPoints.length; i++) {\n const [x, y] = spacedPoints[i];\n \n // Determine point color based on position relative to zero\n let pointColor = color;\n if (negativeColor && hasNegatives) {\n if (y === zero && zeroColor) {\n pointColor = zeroColor;\n } else if (y < zero) {\n pointColor = color;\n } else {\n pointColor = negativeColor;\n }\n }\n \n context.fillStyle = pointColor;\n context.beginPath();\n context.arc(x, y, pointRadius || 8, 0, 2 * Math.PI, false);\n context.fill();\n }\n }\n }\n}\n","let rustApiModule;\nexport const RustAPIPromise = import('../rust/pkg/index.js').then((module) => {\n return module.default().then(() => {\n rustApiModule = module;\n });\n});\n\nexport default function RustAPI() {\n return rustApiModule;\n}\n","import pathsFrom from './paths_from';\nimport {DPI_INCREASE} from './size_canvas';\nimport RustAPI from '../state/rust_api';\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 && 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","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';\nimport { applyReducedOpacity } from \"../helpers/colors\";\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.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 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 if (parameters.renderCutoffGradient && parameters.cutoffIndex !== undefined && parameters.originalData) {\n this.drawLineWithCutoff(dataInRenderSpace, parameters);\n return;\n }\n\n const {positions, prevPositions, vertices, indices} = extractVertices(dataInRenderSpace, { dashed, dashPattern });\n\n if (!this._program) {\n console.error('WebGL line program is null - shader compilation failed!');\n return;\n }\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 const colorVector = colorToVector(parameters.color);\n gl.uniform4f(gl.getUniformLocation(this._program, 'color'), ...colorVector);\n gl.uniform4f(gl.getUniformLocation(this._program, 'shadowColor'), ...colorToVector(shadowColor));\n \n const cutoffX = parameters.cutoffX !== undefined ? parameters.cutoffX : -1.0; // Use parameter or disable\n const cutoffOpacity = parameters.cutoffOpacity !== undefined ? parameters.cutoffOpacity : 0.35;\n \n gl.uniform1f(gl.getUniformLocation(this._program, 'cutoffX'), cutoffX);\n gl.uniform1f(gl.getUniformLocation(this._program, 'cutoffOpacity'), cutoffOpacity);\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 const pointSize = parameters.pointRadius ? parameters.pointRadius * 2 * DPI_INCREASE : 2*(thickness+6);\n gl.uniform1f(gl.getUniformLocation(this._circleProgram, 'pointSize'), pointSize);\n\n let individualPoints = parameters.getIndividualPoints();\n \n if (parameters.minPointSpacing && individualPoints.length > 1) {\n const spacedPoints = [];\n let lastX = -Infinity;\n \n for (const point of individualPoints) {\n const [x] = point;\n if (x - lastX >= parameters.minPointSpacing) {\n spacedPoints.push(point);\n lastX = x;\n }\n }\n \n individualPoints = spacedPoints;\n }\n\n if (parameters.cutoffIndex !== undefined && parameters.cutoffIndex > 0 && parameters.originalData) {\n const { originalData } = parameters;\n let cutoffTime;\n \n if (typeof originalData[0] === 'object' && originalData[0].length === 2) {\n const baseIndex = Math.floor(parameters.cutoffIndex);\n const fraction = parameters.cutoffIndex - baseIndex;\n \n if (fraction === 0 || baseIndex >= originalData.length - 1) {\n const cutoffDate = originalData[Math.min(baseIndex, originalData.length - 1)][0];\n cutoffTime = cutoffDate instanceof Date ? cutoffDate.getTime() : cutoffDate;\n } else {\n const currentDate = originalData[baseIndex][0];\n const nextDate = originalData[baseIndex + 1][0];\n const currentTime = currentDate instanceof Date ? currentDate.getTime() : currentDate;\n const nextTime = nextDate instanceof Date ? nextDate.getTime() : nextDate;\n cutoffTime = currentTime + fraction * (nextTime - currentTime);\n }\n }\n \n const preCutoffPoints = [];\n const postCutoffPoints = [];\n\n if (parameters.isPreview) {\n const visibleMinTime = parameters.selectionBounds.minX instanceof Date ? parameters.selectionBounds.minX.getTime() : parameters.selectionBounds.minX;\n const visibleMaxTime = parameters.selectionBounds.maxX instanceof Date ? parameters.selectionBounds.maxX.getTime() : parameters.selectionBounds.maxX;\n const timeRatio = (cutoffTime - visibleMinTime) / (visibleMaxTime - visibleMinTime);\n const cutoffPixelX = timeRatio * width;\n \n for (let i = 0; i < individualPoints.length; i++) {\n const [pixelX, pixelY] = individualPoints[i];\n if (pixelX < cutoffPixelX) {\n preCutoffPoints.push(individualPoints[i]);\n } else {\n postCutoffPoints.push(individualPoints[i]);\n }\n }\n } else if (!parameters.selectionBounds) {\n postCutoffPoints.push(...individualPoints);\n } else {\n const visibleMinTime = parameters.selectionBounds.minX instanceof Date ? \n parameters.selectionBounds.minX.getTime() : parameters.selectionBounds.minX;\n const visibleMaxTime = parameters.selectionBounds.maxX instanceof Date ? \n parameters.selectionBounds.maxX.getTime() : parameters.selectionBounds.maxX;\n \n if (cutoffTime < visibleMinTime) {\n postCutoffPoints.push(...individualPoints);\n } else if (cutoffTime > visibleMaxTime) {\n if (parameters.rendering === 'shadow') {\n postCutoffPoints.push(...individualPoints);\n } else {\n preCutoffPoints.push(...individualPoints);\n }\n } else {\n const visibleCutoffRatio = (cutoffTime - visibleMinTime) / (visibleMaxTime - visibleMinTime);\n const renderWidth = this._gl.canvas.width;\n const cutoffPixelX = visibleCutoffRatio * renderWidth;\n \n individualPoints.forEach((point, index) => {\n const [pixelX, pixelY] = point;\n \n if (pixelX < cutoffPixelX) {\n preCutoffPoints.push(point);\n } else {\n postCutoffPoints.push(point);\n }\n });\n }\n }\n \n if (preCutoffPoints.length > 0) {\n const reducedOpacityColor = applyReducedOpacity(parameters.color, parameters.cutoffOpacity || 0.35);\n gl.uniform4f(gl.getUniformLocation(this._circleProgram, 'color'), ...colorToVector(reducedOpacityColor));\n \n gl.enableVertexAttribArray(0);\n gl.bindBuffer(gl.ARRAY_BUFFER, this._individualPointBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(preCutoffPoints.flat()), gl.STATIC_DRAW);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);\n gl.drawArrays(gl.POINTS, 0, preCutoffPoints.length);\n }\n \n if (postCutoffPoints.length > 0) {\n gl.uniform4f(gl.getUniformLocation(this._circleProgram, 'color'), ...colorToVector(parameters.color));\n \n gl.enableVertexAttribArray(0);\n gl.bindBuffer(gl.ARRAY_BUFFER, this._individualPointBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(postCutoffPoints.flat()), gl.STATIC_DRAW);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);\n gl.drawArrays(gl.POINTS, 0, postCutoffPoints.length);\n }\n } else {\n gl.uniform4f(gl.getUniformLocation(this._circleProgram, 'color'), ...colorToVector(parameters.color));\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 drawLineWithCutoff(dataInRenderSpace, parameters) {\n const { cutoffIndex, cutoffOpacity, originalData, selectionBounds } = parameters;\n \n let cutoffTime;\n if (typeof originalData[0] === 'object' && originalData[0].length === 2) {\n const baseIndex = Math.floor(cutoffIndex);\n const fraction = cutoffIndex - baseIndex;\n \n if (fraction === 0 || baseIndex >= originalData.length - 1) {\n const cutoffDate = originalData[Math.min(baseIndex, originalData.length - 1)][0];\n cutoffTime = cutoffDate instanceof Date ? cutoffDate.getTime() : cutoffDate;\n } else {\n const currentDate = originalData[baseIndex][0];\n const nextDate = originalData[baseIndex + 1][0];\n const currentTime = currentDate instanceof Date ? currentDate.getTime() : currentDate;\n const nextTime = nextDate instanceof Date ? nextDate.getTime() : nextDate;\n cutoffTime = currentTime + fraction * (nextTime - currentTime);\n }\n } else {\n cutoffTime = cutoffIndex; \n }\n\n if (parameters.isPreview) {\n const gl = this._gl;\n const visibleMinTime = selectionBounds.minX instanceof Date ? selectionBounds.minX.getTime() : selectionBounds.minX;\n const visibleMaxTime = selectionBounds.maxX instanceof Date ? selectionBounds.maxX.getTime() : selectionBounds.maxX;\n const timeRatio = (cutoffTime - visibleMinTime) / (visibleMaxTime - visibleMinTime);\n \n if (timeRatio < 0) {\n this.draw(dataInRenderSpace, { ...parameters, renderCutoffGradient: false });\n } else if (timeRatio > 1) {\n const reducedOpacityColor = applyReducedOpacity(parameters.color, cutoffOpacity);\n this.draw(dataInRenderSpace, { \n ...parameters, \n color: reducedOpacityColor,\n renderCutoffGradient: false \n });\n } else {\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n \n this.draw(dataInRenderSpace, {\n ...parameters,\n renderCutoffGradient: false,\n cutoffX: timeRatio,\n cutoffOpacity: cutoffOpacity || 0.35\n });\n }\n } else {\n if (!selectionBounds) {\n this.draw(dataInRenderSpace, { ...parameters, renderCutoffGradient: false });\n return;\n }\n \n const visibleMinTime = selectionBounds.minX instanceof Date ? selectionBounds.minX.getTime() : selectionBounds.minX;\n const visibleMaxTime = selectionBounds.maxX instanceof Date ? selectionBounds.maxX.getTime() : selectionBounds.maxX;\n\n if (cutoffTime < visibleMinTime) {\n this.draw(dataInRenderSpace, { ...parameters, renderCutoffGradient: false });\n } else if (cutoffTime > visibleMaxTime) {\n const reducedOpacityColor = applyReducedOpacity(parameters.color, cutoffOpacity);\n this.draw(dataInRenderSpace, { \n ...parameters, \n color: reducedOpacityColor,\n renderCutoffGradient: false \n });\n } else {\n const visibleCutoffRatio = (cutoffTime - visibleMinTime) / (visibleMaxTime - visibleMinTime);\n \n const gl = this._gl;\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n \n this.draw(dataInRenderSpace, {\n ...parameters,\n renderCutoffGradient: false,\n cutoffX: visibleCutoffRatio,\n cutoffOpacity: cutoffOpacity || 0.35\n });\n }\n }\n }\n}\n","import shadowFrag from \"./shadow.frag\";\nimport shadowVert from \"./shadow.vert\";\nimport colorToVector from \"../helpers/color_to_vector\";\nimport createGLProgram from \"./create_gl_program\";\nimport { applyReducedOpacity, applyReducedOpacityToGradient } from \"../helpers/colors\";\n\nexport default class ShadowProgram {\n constructor(gl) {\n this._gl = gl;\n\n this._program = createGLProgram(gl, shadowVert, shadowFrag);\n\n if (!this._program) {\n console.error(\"Failed to create shadow shader program\");\n this._program = null;\n return;\n }\n\n gl.validateProgram(this._program);\n if (!gl.getProgramParameter(this._program, gl.VALIDATE_STATUS)) {\n console.error(\n \"Shadow program validation failed:\",\n gl.getProgramInfoLog(this._program)\n );\n }\n\n const positionLoc = gl.getAttribLocation(this._program, \"position\");\n const trapezoidBoundsLoc = gl.getAttribLocation(\n this._program,\n \"trapezoidBounds\"\n );\n const trapezoidBottomLoc = gl.getAttribLocation(\n this._program,\n \"trapezoidBottom\"\n );\n\n if (\n positionLoc === -1 ||\n trapezoidBoundsLoc === -1 ||\n trapezoidBottomLoc === -1\n ) {\n console.error(\"Missing required shader attributes\");\n }\n\n this._positionBuffer = gl.createBuffer();\n this._trapezoidBoundsBuffer = gl.createBuffer();\n this._trapezoidBottomBuffer = gl.createBuffer();\n this._indexBuffer = gl.createBuffer();\n\n this._gradientTexture = gl.createTexture();\n\n if (!gl.getExtension(\"OES_element_index_uint\")) {\n console.error(\"Your browser does not support OES_element_index_uint\");\n }\n }\n\n dispose() {\n const gl = this._gl;\n if (this._gradientTexture) {\n gl.deleteTexture(this._gradientTexture);\n this._gradientTexture = null;\n }\n }\n\n /**\n * Convert trapezoids into WebGL geometry\n * @param {Array} trapezoids - Array of trapezoid definitions\n * @returns {Object} - Geometry data for WebGL\n */\n generateTrapezoidGeometry(trapezoids) {\n const positions = [];\n const trapezoidBounds = [];\n const trapezoidBottom = [];\n const indices = [];\n\n let vertexIndex = 0;\n\n for (const trap of trapezoids) {\n const { x1, y1, x2, y2, bottomY1, bottomY2 } = trap;\n\n const vertices = [\n [x1, y1],\n [x2, y2],\n [x2, bottomY2],\n [x1, bottomY1],\n ];\n\n const bounds = [x1, y1, x2, y2];\n const bottom = [x1, bottomY1, x2, bottomY2];\n\n for (let i = 0; i < 4; i++) {\n const [x, y] = vertices[i];\n\n positions.push(x, y);\n trapezoidBounds.push(...bounds);\n trapezoidBottom.push(...bottom);\n }\n\n indices.push(\n vertexIndex,\n vertexIndex + 1,\n vertexIndex + 2,\n vertexIndex,\n vertexIndex + 2,\n vertexIndex + 3\n );\n\n vertexIndex += 4;\n }\n\n return {\n positions: new Float32Array(positions),\n trapezoidBounds: new Float32Array(trapezoidBounds),\n trapezoidBottom: new Float32Array(trapezoidBottom),\n indices: new Uint32Array(indices),\n };\n }\n\n /**\n * Parse gradient definition to shader uniforms (supports up to 16 stops)\n * @param {Array} gradient - Gradient definition\n * @param {String} fallbackColor - Fallback color\n * @returns {Object} - Shader uniform data\n */\n parseGradient(gradient, fallbackColor) {\n if (!gradient || !Array.isArray(gradient) || gradient.length < 2) {\n const fallbackColorVec = colorToVector(fallbackColor);\n return {\n textureData: new Uint8Array([\n 0,\n 0,\n 0,\n 255,\n Math.floor(fallbackColorVec[0] * 255),\n Math.floor(fallbackColorVec[1] * 255),\n Math.floor(fallbackColorVec[2] * 255),\n Math.floor(fallbackColorVec[3] * 255),\n ]),\n textureWidth: 2,\n gradientCount: 1,\n fallbackColor: fallbackColorVec,\n };\n }\n\n const colors = [];\n const stops = [];\n\n for (let i = 0; i < gradient.length; i++) {\n const item = gradient[i];\n\n if (Array.isArray(item)) {\n stops.push(item[0]);\n colors.push(colorToVector(item[1]));\n } else {\n stops.push(i / (gradient.length - 1));\n colors.push(colorToVector(item));\n }\n }\n\n const textureWidth = colors.length * 2;\n const textureData = new Uint8Array(textureWidth * 4);\n\n for (let i = 0; i < colors.length; i++) {\n const stopIndex = i * 8;\n const colorIndex = stopIndex + 4;\n\n textureData[stopIndex] = Math.floor(stops[i] * 255);\n textureData[stopIndex + 1] = 0;\n textureData[stopIndex + 2] = 0;\n textureData[stopIndex + 3] = 255;\n\n textureData[colorIndex] = Math.floor(colors[i][0] * 255);\n textureData[colorIndex + 1] = Math.floor(colors[i][1] * 255);\n textureData[colorIndex + 2] = Math.floor(colors[i][2] * 255);\n textureData[colorIndex + 3] = Math.floor(colors[i][3] * 255);\n }\n\n return {\n textureData,\n textureWidth,\n gradientCount: colors.length,\n fallbackColor: colorToVector(fallbackColor),\n };\n }\n\n /**\n * Draw shadow/trapezoid geometry\n * @param {Array} individualPoints - Points defining the line\n * @param {Object} params - Rendering parameters\n */\n draw(individualPoints, params) {\n\n if (!individualPoints || individualPoints.length < 2) {\n return;\n }\n\n const gl = this._gl;\n const width = gl.drawingBufferWidth;\n const height = gl.drawingBufferHeight;\n\n gl.useProgram(this._program);\n\n if (\n params.renderCutoffGradient &&\n params.cutoffIndex !== undefined &&\n params.originalData\n ) {\n this.drawShadowWithCutoff(individualPoints, params);\n return;\n }\n\n const trapezoids = [];\n const positiveTrapezoids = [];\n const negativeTrapezoids = [];\n const { zero, inRenderSpaceAreaBottom, negativeGradient, hasNegatives } = params;\n\n\n for (let i = 0; i < individualPoints.length - 1; i++) {\n const [x1, y1] = individualPoints[i];\n const [x2, y2] = individualPoints[i + 1];\n\n let bottomY1 = zero;\n let bottomY2 = zero;\n\n const y1RelativeToZero = y1 - zero;\n const y2RelativeToZero = y2 - zero;\n const crossesZero = y1RelativeToZero * y2RelativeToZero < 0;\n\n if (crossesZero) {\n const t =\n Math.abs(y1RelativeToZero) /\n (Math.abs(y1RelativeToZero) + Math.abs(y2RelativeToZero));\n const xCross = x1 + (x2 - x1) * t;\n const yCross = zero;\n\n if (Math.abs(y1 - yCross) > 0.1) {\n const trap = {\n x1,\n y1,\n x2: xCross,\n y2: yCross,\n bottomY1,\n bottomY2: zero,\n };\n trapezoids.push(trap);\n \n // Determine if positive or negative (in screen coords, smaller Y is higher/positive)\n if (hasNegatives && negativeGradient) {\n if (y1 <= zero) {\n positiveTrapezoids.push(trap);\n } else {\n negativeTrapezoids.push(trap);\n }\n }\n }\n\n if (Math.abs(y2 - yCross) > 0.1) {\n const trap = {\n x1: xCross,\n y1: yCross,\n x2,\n y2,\n bottomY1: zero,\n bottomY2,\n };\n trapezoids.push(trap);\n \n // Determine if positive or negative\n if (hasNegatives && negativeGradient) {\n if (y2 <= zero) {\n positiveTrapezoids.push(trap);\n } else {\n negativeTrapezoids.push(trap);\n }\n }\n }\n } else {\n // Skip trapezoids completely outside canvas\n if (x1 > width || x2 < 0) {\n continue;\n }\n \n // Clip trapezoid to canvas bounds if it extends beyond\n let finalX2 = x2;\n let finalY2 = y2;\n let finalBottomY2 = bottomY2;\n \n if (x2 > width) {\n const ratio = (width - x1) / (x2 - x1);\n finalX2 = width;\n finalY2 = y1 + (y2 - y1) * ratio;\n finalBottomY2 = bottomY1 + (bottomY2 - bottomY1) * ratio;\n }\n \n const trapezoid = { x1, y1, x2: finalX2, y2: finalY2, bottomY1, bottomY2: finalBottomY2 };\n trapezoids.push(trapezoid);\n \n // Determine if positive or negative\n if (hasNegatives && negativeGradient) {\n // Check average Y position\n const avgY = (y1 + finalY2) / 2;\n if (avgY <= zero) {\n positiveTrapezoids.push(trapezoid);\n } else {\n negativeTrapezoids.push(trapezoid);\n }\n }\n }\n }\n\n if (trapezoids.length === 0) {\n return;\n }\n\n const positionLoc = gl.getAttribLocation(this._program, \"position\");\n const trapezoidBoundsLoc = gl.getAttribLocation(\n this._program,\n \"trapezoidBounds\"\n );\n const trapezoidBottomLoc = gl.getAttribLocation(\n this._program,\n \"trapezoidBottom\"\n );\n\n gl.uniform1f(gl.getUniformLocation(this._program, \"width\"), width);\n gl.uniform1f(gl.getUniformLocation(this._program, \"height\"), height);\n\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n // Helper function to render a set of trapezoids with a given gradient\n const renderTrapezoidSet = (trapSet, gradient, color) => {\n if (trapSet.length === 0) return;\n\n const geometry = this.generateTrapezoidGeometry(trapSet);\n\n gl.enableVertexAttribArray(positionLoc);\n gl.bindBuffer(gl.ARRAY_BUFFER, this._positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, geometry.positions, gl.STATIC_DRAW);\n gl.vertexAttribPointer(positionLoc, 2, gl.FLOAT, false, 0, 0);\n\n gl.enableVertexAttribArray(trapezoidBoundsLoc);\n gl.bindBuffer(gl.ARRAY_BUFFER, this._trapezoidBoundsBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, geometry.trapezoidBounds, gl.STATIC_DRAW);\n gl.vertexAttribPointer(trapezoidBoundsLoc, 4, gl.FLOAT, false, 0, 0);\n\n gl.enableVertexAttribArray(trapezoidBottomLoc);\n gl.bindBuffer(gl.ARRAY_BUFFER, this._trapezoidBottomBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, geometry.trapezoidBottom, gl.STATIC_DRAW);\n gl.vertexAttribPointer(trapezoidBottomLoc, 4, gl.FLOAT, false, 0, 0);\n\n const gradientData = this.parseGradient(gradient, color);\n\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, this._gradientTexture);\n\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n gl.RGBA,\n gradientData.textureWidth,\n 1,\n 0,\n gl.RGBA,\n gl.UNSIGNED_BYTE,\n gradientData.textureData\n );\n\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n\n gl.uniform1i(gl.getUniformLocation(this._program, \"gradientTexture\"), 0);\n gl.uniform1i(\n gl.getUniformLocation(this._program, \"gradientCount\"),\n gradientData.gradientCount\n );\n gl.uniform4fv(\n gl.getUniformLocation(this._program, \"fallbackColor\"),\n gradientData.fallbackColor\n );\n\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, geometry.indices, gl.STATIC_DRAW);\n\n gl.drawElements(gl.TRIANGLES, geometry.indices.length, gl.UNSIGNED_INT, 0);\n };\n\n // If we have negativeGradient and separate trapezoid sets, render them separately\n if (hasNegatives && negativeGradient && (positiveTrapezoids.length > 0 || negativeTrapezoids.length > 0)) {\n // Render positive trapezoids with the normal gradient\n renderTrapezoidSet(positiveTrapezoids, params.gradient, params.color);\n \n // Render negative trapezoids with negativeGradient\n renderTrapezoidSet(negativeTrapezoids, negativeGradient, params.color);\n } else {\n // Fallback to rendering all trapezoids with the same gradient (original behavior)\n renderTrapezoidSet(trapezoids, params.gradient, params.color);\n }\n \n const error = gl.getError();\n if (error !== gl.NO_ERROR) {\n console.error('WebGL error in shadow rendering:', error);\n } else {\n //he he he haw\n }\n }\n\n /**\n * Draw shadow chart with cutoff gradient\n * @param {Array} individualPoints - Points defining the line\n * @param {Object} params - Rendering parameters with cutoff info\n */\n drawShadowWithCutoff(individualPoints, params) {\n\n const { cutoffIndex, cutoffOpacity, originalData, selectionBounds, zero } =\n params;\n\n this._lastIndividualPoints = null;\n this._lastParams = null;\n\n // All cutoff data is now in tuple format [x, y] from graph_body_renderer\n let cutoffTime;\n \n if (Array.isArray(originalData[0]) && originalData[0].length === 2) {\n const baseIndex = Math.floor(cutoffIndex);\n const fraction = cutoffIndex - baseIndex;\n\n if (fraction === 0 || baseIndex >= originalData.length - 1) {\n const cutoffItem = originalData[Math.min(baseIndex, originalData.length - 1)];\n const cutoffDate = cutoffItem[0];\n cutoffTime = cutoffDate instanceof Date ? cutoffDate.getTime() : cutoffDate;\n } else {\n const currentItem = originalData[baseIndex];\n const nextItem = originalData[baseIndex + 1];\n const currentDate = currentItem[0];\n const nextDate = nextItem[0];\n const currentTime = currentDate instanceof Date ? currentDate.getTime() : currentDate;\n const nextTime = nextDate instanceof Date ? nextDate.getTime() : nextDate;\n cutoffTime = currentTime + fraction * (nextTime - currentTime);\n }\n } else {\n cutoffTime = cutoffIndex;\n }\n\n const visibleBounds = params.selectionBounds;\n let firstTime, lastTime;\n \n if (visibleBounds && visibleBounds.minX !== undefined && visibleBounds.maxX !== undefined) {\n firstTime = visibleBounds.minX instanceof Date ? visibleBounds.minX.getTime() : visibleBounds.minX;\n lastTime = visibleBounds.maxX instanceof Date ? visibleBounds.maxX.getTime() : visibleBounds.maxX;\n } else {\n const firstItem = originalData[0];\n const lastItem = originalData[originalData.length - 1];\n const firstX = firstItem[0];\n const lastX = lastItem[0];\n \n firstTime = firstX instanceof Date ? firstX.getTime() : firstX;\n lastTime = lastX instanceof Date ? lastX.getTime() : lastX;\n }\n \n const timeDiff = cutoffTime - firstTime;\n const totalTime = lastTime - firstTime;\n const timeRatio = timeDiff / totalTime;\n\n if (timeRatio < 0) {\n this.draw(individualPoints, { ...params, renderCutoffGradient: false });\n } else if (timeRatio > 1) {\n const reducedOpacityColor = applyReducedOpacity(\n params.color,\n cutoffOpacity\n );\n const translucentGradient = applyReducedOpacityToGradient(\n params.gradient,\n cutoffOpacity\n );\n this.draw(individualPoints, {\n ...params,\n color: reducedOpacityColor,\n gradient: translucentGradient,\n renderCutoffGradient: false,\n });\n } else {\n this.drawSplitShadowTrapezoids(\n individualPoints,\n { ...params, selectionBounds: params.selectionBounds },\n timeRatio,\n cutoffTime\n );\n }\n }\n\n /**\n * Draw split shadow trapezoids with cutoff\n * @param {Array} individualPoints - Points defining the line\n * @param {Object} params - Rendering parameters\n * @param {number} timeRatio - Position of cutoff in visible range (0-1)\n * @param {number} cutoffTime - Cutoff timestamp\n */\n drawSplitShadowTrapezoids(individualPoints, params, timeRatio, cutoffTime) {\n const { zero, cutoffOpacity, selectionBounds } = params;\n const gl = this._gl;\n\n const renderWidth = gl.canvas.width;\n const cutoffPixelX = timeRatio * renderWidth;\n\n const preCutoffPoints = [];\n const postCutoffPoints = [];\n \n for (let i = 0; i < individualPoints.length; i++) {\n const [pixelX, pixelY] = individualPoints[i];\n \n if (pixelX < cutoffPixelX) {\n preCutoffPoints.push(individualPoints[i]);\n } else {\n postCutoffPoints.push(individualPoints[i]);\n }\n }\n \n let ghostPoint = null;\n if (preCutoffPoints.length > 0 && postCutoffPoints.length > 0) {\n const lastPrePoint = preCutoffPoints[preCutoffPoints.length - 1];\n const firstPostPoint = postCutoffPoints[0];\n \n const [x1, y1] = lastPrePoint;\n const [x2, y2] = firstPostPoint;\n \n if (x2 !== x1) {\n const interpolationRatio = (cutoffPixelX - x1) / (x2 - x1);\n const ghostY = y1 + interpolationRatio * (y2 - y1);\n ghostPoint = [cutoffPixelX, ghostY];\n \n preCutoffPoints.push(ghostPoint);\n postCutoffPoints.unshift(ghostPoint);\n }\n }\n\n if (preCutoffPoints.length >= 2) {\n const reducedOpacityColor = applyReducedOpacity(\n params.color,\n cutoffOpacity\n );\n const gl = this._gl;\n\n gl.disable(gl.DEPTH_TEST);\n\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n const translucentGradient = applyReducedOpacityToGradient(\n params.gradient,\n cutoffOpacity\n );\n\n this.draw(preCutoffPoints, {\n ...params,\n color: reducedOpacityColor,\n gradient: translucentGradient,\n renderCutoffGradient: false,\n });\n } else {\n }\n\n if (postCutoffPoints.length >= 2) {\n this.draw(postCutoffPoints, {\n ...params,\n renderCutoffGradient: false,\n });\n } else {\n }\n }\n}\n","import Eventable from '../eventable';\nimport getColor, { createDefaultGradient } from '../helpers/colors';\nimport inferType from '../state/infer_type';\nimport BackgroundProgram from './background_program.js';\nimport drawArea from './draw_area';\nimport drawBackground from './draw_background.js';\nimport drawBars from './draw_bars';\nimport drawLine from './draw_line';\nimport LineProgram from './line_program';\nimport ShadowProgram from './shadow_program';\nimport sizeCanvas, { DPI_INCREASE } from './size_canvas';\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 \n if (!this._canvas) {\n console.error('Canvas element is null in GraphBodyRenderer constructor');\n this._initialized = false;\n return;\n }\n \n if (webgl) {\n this._context = this._canvas.getContext('webgl');\n if (this._context) {\n this._lineProgram = new LineProgram(this._context);\n this._shadowProgram = new ShadowProgram(this._context);\n } else {\n console.error('❌ WebGL context creation failed');\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 if (!this._context) {\n console.error('Failed to get canvas context in GraphBodyRenderer');\n this._initialized = false;\n return;\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._shadowProgram && this._shadowProgram.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 if (this._zeroLineCanvas && this._zeroLineCanvas.parentNode) {\n this._zeroLineCanvas.parentNode.removeChild(this._zeroLineCanvas);\n this._zeroLineCanvas = null;\n this._zeroLineContext = null;\n }\n }\n\n clear() {\n if (this._webgl) {\n this._lineProgram.clear();\n } else {\n this._context.clearRect(0, 0, this._context.canvas.width, this._context.canvas.height);\n }\n }\n\n render(singleSeries, inRenderSpace, { highlighted, showIndividualPoints, shadowColor, shadowBlur, width, defaultLineWidth, bounds, globalBounds, inRenderSpaceAreaBottom }) {\n if (!this._initialized || !this._context || !this._canvas) {\n console.warn('GraphBodyRenderer: Cannot render - not initialized, missing context, or missing canvas');\n return;\n }\n \n let cutoffIndex = -1;\n let cutoffTime = null; \n let cutoffData = singleSeries.data; \n\n const isObjectFormat = singleSeries.data && singleSeries.data.length > 0 && \n typeof singleSeries.data[0] === 'object' && \n !Array.isArray(singleSeries.data[0]);\n \n if (isObjectFormat && singleSeries.cutoffTime) {\n cutoffData = singleSeries.data.map(point => {\n const xValue = point[singleSeries.xKey || 'x'];\n const yValue = point[singleSeries.yKey || 'y'];\n \n const convertedX = typeof xValue === 'string' ? new Date(xValue) : xValue;\n \n return [convertedX, yValue];\n });\n }\n \n if (singleSeries.cutoffTime && singleSeries.data && singleSeries.data.length > 0) {\n let cutoffDate;\n if (singleSeries.cutoffTime === 'now') {\n cutoffDate = new Date();\n } else if (typeof singleSeries.cutoffTime === 'number') {\n cutoffDate = new Date(singleSeries.cutoffTime);\n } else {\n cutoffDate = singleSeries.cutoffTime;\n }\n \n cutoffTime = cutoffDate instanceof Date ? cutoffDate.getTime() : cutoffDate;\n \n for (let i = 0; i < cutoffData.length - 1; i++) {\n const currentPoint = cutoffData[i];\n const nextPoint = cutoffData[i + 1];\n \n const currentTime = currentPoint[0] instanceof Date ? currentPoint[0].getTime() : currentPoint[0];\n const nextTime = nextPoint[0] instanceof Date ? nextPoint[0].getTime() : nextPoint[0];\n \n if (currentTime <= cutoffTime && cutoffTime <= nextTime) {\n const timeRatio = (cutoffTime - currentTime) / (nextTime - currentTime);\n cutoffIndex = i + timeRatio;\n break;\n } else if (currentTime > cutoffTime) {\n cutoffIndex = i;\n break;\n }\n }\n \n if (cutoffIndex === -1) {\n cutoffIndex = cutoffData.length - 1;\n }\n }\n \n const getIndividualPoints = (useDataSpace, includeBeyondBounds = false) => {\n if (!useDataSpace && inRenderSpace && inRenderSpace.yValues && !showIndividualPoints) {\n if (!bounds) {\n bounds = singleSeries.axis.currentBounds;\n }\n \n const individualPoints = [];\n const { yValues, nullMask } = inRenderSpace;\n const threshold = yValues.length / 2;\n let pastThreshold = 0;\n const samples = [];\n \n for (let pixelX = 0; pixelX < yValues.length; pixelX++) {\n if (nullMask[pixelX] === 0) {\n const xCoord = pixelX * DPI_INCREASE;\n individualPoints.push([xCoord, yValues[pixelX]]);\n \n if (pixelX > threshold) {\n pastThreshold++;\n if (samples.length < 3) samples.push({pixelX, xCoord, nullMask: nullMask[pixelX]});\n }\n }\n }\n \n if (individualPoints.length < 50) {\n return getIndividualPoints(true, includeBeyondBounds);\n }\n\n return individualPoints;\n }\n\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 let boundsMinX = bounds.minX instanceof Date ? bounds.minX.getTime() : bounds.minX;\n let boundsMaxX = bounds.maxX instanceof Date ? bounds.maxX.getTime() : bounds.maxX;\n \n let foundBeyondBounds = false;\n let lastPointBeforeBounds = null;\n \n for (let i = 0; i < data.length; i++) {\n let x, y;\n \n if (Array.isArray(data[i])) {\n [x, y] = data[i];\n } else if (typeof data[i] === 'object' && data[i] !== null) {\n x = data[i][singleSeries.xKey];\n y = data[i][singleSeries.yKey];\n } else {\n continue;\n }\n \n if (y === null || y === undefined) {\n continue;\n }\n\n let xValue = x instanceof Date ? x.getTime() : x;\n \n if (xValue < boundsMinX) {\n if (includeBeyondBounds) {\n lastPointBeforeBounds = [xValue, y];\n }\n continue;\n }\n \n if (xValue > boundsMaxX) {\n if (includeBeyondBounds && !foundBeyondBounds) {\n foundBeyondBounds = true;\n } else {\n break;\n }\n }\n\n const renderWidth = this._sizing.renderWidth / DPI_INCREASE;\n const xCoord = (xValue - boundsMinX) / (boundsMaxX - boundsMinX) * (renderWidth - 1) * DPI_INCREASE;\n const yCoord = (1.0 - (y - bounds.minY) / (bounds.maxY - bounds.minY)) * this._sizing.renderHeight;\n \n individualPoints.push([xCoord, yCoord]);\n }\n\n if (lastPointBeforeBounds && includeBeyondBounds) {\n const [beforeXValue, beforeY] = lastPointBeforeBounds;\n const renderWidth = this._sizing.renderWidth / DPI_INCREASE;\n const beforeXCoord = (beforeXValue - boundsMinX) / (boundsMaxX - boundsMinX) * (renderWidth - 1) * DPI_INCREASE;\n const beforeYCoord = (1.0 - (beforeY - bounds.minY) / (bounds.maxY - bounds.minY)) * this._sizing.renderHeight;\n individualPoints.unshift([beforeXCoord, beforeYCoord]);\n }\n\n return individualPoints;\n };\n\n const getRanges = () => {\n if (!bounds) {\n bounds = singleSeries.axis.currentBounds;\n }\n\n if (!singleSeries.rangeKey) {\n return [];\n }\n\n const inferredType = inferType(singleSeries, { useSimpleData: true });\n if (inferredType !== 'objects') {\n return [];\n }\n\n return (singleSeries.simpleData || singleSeries.data).map((object) => {\n const range = object[singleSeries.rangeKey];\n\n if (!range) {\n return null;\n }\n\n const min = range.min;\n const max = range.max;\n const x = object[singleSeries.xKey];\n\n return {\n x,\n range,\n\n pixelX: (x - bounds.minX) / (bounds.maxX - bounds.minX) * this._sizing.renderWidth,\n pixelMinY: typeof min === 'number' ? (1.0 - (min - bounds.minY) / (bounds.maxY - bounds.minY)) * this._sizing.renderHeight : null,\n pixelMaxY: typeof max === 'number' ? (1.0 - (max - bounds.minY) / (bounds.maxY - bounds.minY)) * this._sizing.renderHeight : null\n };\n });\n };\n\n const cpuRendering = singleSeries.rendering === 'bar' || singleSeries.rendering === 'area';\n let commonCPUParams;\n\n if (cpuRendering) {\n if (this._webgl) {\n console.warn(`CPU rendering (${singleSeries.rendering}) is not supported with webgl={true}. Use webgl={false} or switch to 'line' rendering.`);\n return;\n }\n \n if (!this._context2d) {\n this._context2d = this._canvas.getContext('2d', { willReadFrequently: false });\n }\n \n if (!this._context2d) {\n console.error('Failed to get 2D context for CPU rendering');\n return;\n }\n\n if (this._webgl) {\n this._context.flush();\n }\n\n if (!bounds) {\n bounds = singleSeries.axis?.currentBounds;\n }\n\n if (!bounds) {\n console.error('No bounds available for rendering');\n return;\n }\n\n const zero = singleSeries.zeroLineY === 'bottom' ?\n this._sizing.renderHeight :\n (1.0 - ((singleSeries.zeroLineY || 0) - bounds.minY) / (bounds.maxY - bounds.minY)) * this._sizing.renderHeight;\n\n commonCPUParams = {\n context: this._context2d,\n color: getColor(singleSeries.color, singleSeries.index, singleSeries.multigrapherSeriesIndex),\n sizing: this._sizing,\n zero,\n hasNegatives: !!singleSeries.inDataSpace.find((tuple) => tuple[1] < 0),\n negativeColor: singleSeries.negativeColor,\n zeroWidth: singleSeries.zeroLineWidth,\n zeroColor: singleSeries.zeroLineColor\n };\n\n if (!commonCPUParams.hasNegatives && singleSeries.expandYWith) {\n commonCPUParams.hasNegatives = singleSeries.expandYWith.some((y) => y < 0);\n }\n }\n\n if (singleSeries.rendering === 'bar') {\n let barParams = {\n ...commonCPUParams,\n indexInAxis: singleSeries.axis.series.indexOf(singleSeries),\n axisSeriesCount: singleSeries.axis.series.length,\n closestSpacing: globalBounds.closestSpacing,\n bounds\n };\n\n if (singleSeries.cutoffTime) {\n barParams.cutoffIndex = cutoffIndex;\n barParams.cutoffOpacity = singleSeries.cutoffOpacity !== undefined ? singleSeries.cutoffOpacity : 0.35;\n barParams.originalData = cutoffData;\n barParams.renderCutoffGradient = cutoffIndex >= 0; \n \n const selection = this === this._stateController.rangeGraphRenderer \n ? this._stateController._bounds \n : (this._stateController._selection || this._stateController._bounds);\n barParams.selectionBounds = selection;\n }\n\n drawBars(getIndividualPoints(true), barParams);\n return;\n }\n\n if (singleSeries.rendering === 'area') {\n let areaParams = {\n ...commonCPUParams,\n showIndividualPoints: typeof singleSeries.showIndividualPoints === 'boolean' ? singleSeries.showIndividualPoints : showIndividualPoints,\n gradient: singleSeries.gradient,\n negativeGradient: singleSeries.negativeGradient,\n pointRadius: singleSeries.pointRadius,\n minPointSpacing: singleSeries.minPointSpacing,\n highlighted,\n width: width || singleSeries.width || defaultLineWidth,\n shadowColor,\n shadowBlur,\n inRenderSpaceAreaBottom\n };\n\n if (singleSeries.cutoffTime) {\n areaParams.cutoffIndex = cutoffIndex;\n areaParams.cutoffOpacity = singleSeries.cutoffOpacity !== undefined ? singleSeries.cutoffOpacity : 0.35;\n areaParams.originalData = cutoffData;\n areaParams.renderCutoffGradient = cutoffIndex >= 0; \n areaParams.isPreview = this === this._stateController.rangeGraphRenderer; \n \n const selection = this === this._stateController.rangeGraphRenderer \n ? this._stateController._bounds \n : (this._stateController._selection || this._stateController._bounds);\n areaParams.selectionBounds = selection;\n }\n\n drawArea(getIndividualPoints(true), inRenderSpace, areaParams);\n }\n\n if (singleSeries.rendering === 'shadow') {\n if (!this._webgl || !this._shadowProgram) {\n console.warn('Shadow rendering requires WebGL. Enable webgl={true} on your Grapher component.', {\n webgl: !!this._webgl,\n shadowProgram: !!this._shadowProgram,\n program: !!this._shadowProgram?._program\n });\n return;\n }\n \n if (!this._shadowProgram._program) {\n console.error('ShadowProgram has no valid WebGL program');\n return;\n }\n \n if (!inRenderSpace) {\n console.error('inRenderSpace is null for shadow rendering');\n return;\n }\n \n if (!bounds) {\n bounds = singleSeries.axis?.currentBounds;\n }\n \n if (!bounds) {\n console.error('No bounds available for shadow rendering');\n return;\n }\n \n let zero;\n if (singleSeries.zeroLineY === 'bottom') {\n zero = this._sizing.renderHeight;\n } else if (singleSeries.zeroLineY !== undefined) {\n zero = (1.0 - ((singleSeries.zeroLineY) - bounds.minY) / (bounds.maxY - bounds.minY)) * this._sizing.renderHeight;\n } else {\n if (bounds.minY <= 0 && bounds.maxY >= 0) {\n zero = (1.0 - (0 - bounds.minY) / (bounds.maxY - bounds.minY)) * this._sizing.renderHeight;\n } else {\n zero = this._sizing.renderHeight;\n }\n }\n \n const boundsChanged = !this._lastBounds || \n bounds.minY !== this._lastBounds.minY || \n bounds.maxY !== this._lastBounds.maxY || \n this._sizing.renderHeight !== this._lastRenderHeight;\n \n this._lastBounds = {...bounds};\n this._lastRenderHeight = this._sizing.renderHeight;\n \n if (boundsChanged && this._lastShadowCache) {\n this._lastShadowCache = null;\n }\n \n if (zero > this._sizing.renderHeight * 1.5) {\n zero = this._sizing.renderHeight;\n } else if (zero < -this._sizing.renderHeight * 0.5) {\n zero = 0;\n }\n \n const shadowColor = getColor(singleSeries.color, singleSeries.index, singleSeries.multigrapherSeriesIndex);\n const hasNegatives = !!singleSeries.inDataSpace.find((tuple) => tuple[1] < 0);\n let shadowParams = {\n color: shadowColor,\n gradient: singleSeries.gradient || createDefaultGradient(shadowColor),\n negativeGradient: singleSeries.negativeGradient,\n hasNegatives,\n zero,\n sizing: this._sizing,\n inRenderSpaceAreaBottom\n };\n\n if (singleSeries.cutoffTime) {\n shadowParams.cutoffIndex = cutoffIndex;\n shadowParams.cutoffOpacity = singleSeries.cutoffOpacity !== undefined ? singleSeries.cutoffOpacity : 0.35;\n shadowParams.originalData = cutoffData;\n shadowParams.renderCutoffGradient = cutoffIndex >= 0; \n shadowParams.isPreview = this === this._stateController.rangeGraphRenderer; \n\n const selection = this === this._stateController.rangeGraphRenderer \n ? this._stateController._bounds \n : (this._stateController._selection || this._stateController._bounds);\n shadowParams.selectionBounds = selection || bounds;\n }\n\n this._shadowProgram.draw(getIndividualPoints(false, true), shadowParams);\n \n if (this._webgl) {\n const gl = this._context;\n gl.disable(gl.BLEND);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n }\n \n if (singleSeries.zeroLineWidth && singleSeries.zeroLineWidth > 0) {\n if (this._context2d) {\n this._context2d.save();\n this._context2d.strokeStyle = singleSeries.zeroLineColor || getColor(singleSeries.color, singleSeries.index, singleSeries.multigrapherSeriesIndex);\n this._context2d.lineWidth = singleSeries.zeroLineWidth;\n this._context2d.globalCompositeOperation = 'source-over';\n \n this._context2d.beginPath();\n this._context2d.moveTo(0, zero);\n this._context2d.lineTo(this._sizing.renderWidth, zero);\n this._context2d.stroke();\n this._context2d.restore();\n } else {\n if (!this._zeroLineCanvas) {\n this._zeroLineCanvas = document.createElement('canvas');\n this._zeroLineCanvas.style.position = 'absolute';\n this._zeroLineCanvas.style.top = '0';\n this._zeroLineCanvas.style.left = '0';\n this._zeroLineCanvas.style.pointerEvents = 'none';\n this._zeroLineContext = this._zeroLineCanvas.getContext('2d');\n this._canvas.parentNode.insertBefore(this._zeroLineCanvas, this._canvas.nextSibling);\n }\n \n this._zeroLineCanvas.width = this._canvas.width;\n this._zeroLineCanvas.height = this._canvas.height;\n this._zeroLineCanvas.style.width = this._canvas.style.width;\n this._zeroLineCanvas.style.height = this._canvas.style.height;\n \n this._zeroLineContext.clearRect(0, 0, this._zeroLineCanvas.width, this._zeroLineCanvas.height);\n this._zeroLineContext.strokeStyle = singleSeries.zeroLineColor || getColor(singleSeries.color, singleSeries.index, singleSeries.multigrapherSeriesIndex);\n this._zeroLineContext.lineWidth = singleSeries.zeroLineWidth;\n \n this._zeroLineContext.beginPath();\n this._zeroLineContext.moveTo(0, zero);\n this._zeroLineContext.lineTo(this._sizing.renderWidth, zero);\n this._zeroLineContext.stroke();\n }\n }\n }\n\n const isRangeGraph = this === this._stateController.rangeGraphRenderer;\n const shouldShowIndividualPoints = isRangeGraph \n ? false \n : (typeof singleSeries.showIndividualPoints === 'boolean' ? singleSeries.showIndividualPoints : showIndividualPoints);\n\n if (!bounds) {\n bounds = singleSeries.axis?.currentBounds || globalBounds;\n }\n\n let zero;\n if (singleSeries.zeroLineY === 'bottom') {\n zero = this._sizing.renderHeight;\n } else if (singleSeries.zeroLineY !== undefined && bounds) {\n zero = (1.0 - ((singleSeries.zeroLineY) - bounds.minY) / (bounds.maxY - bounds.minY)) * this._sizing.renderHeight;\n } else if (bounds) {\n if (bounds.minY <= 0 && bounds.maxY >= 0) {\n zero = (1.0 - (0 - bounds.minY) / (bounds.maxY - bounds.minY)) * this._sizing.renderHeight;\n } else {\n zero = this._sizing.renderHeight;\n }\n } else {\n zero = this._sizing.renderHeight;\n }\n const hasNegatives = !!singleSeries.inDataSpace.find((tuple) => tuple[1] < 0);\n\n // For WebGL shadow rendering, we need a separate 2D canvas overlay for lines/points\n // since WebGL and 2D contexts can't coexist on the same canvas\n let drawContext = this._context;\n \n if (this._webgl && singleSeries.rendering === 'shadow' && (width > 0 || shouldShowIndividualPoints)) {\n // Only create overlay if we're actually drawing lines or points\n if (!this._overlayCanvas) {\n this._overlayCanvas = document.createElement('canvas');\n this._overlayCanvas.style.position = 'absolute';\n this._overlayCanvas.style.top = '0';\n this._overlayCanvas.style.left = '0';\n this._overlayCanvas.style.pointerEvents = 'none';\n this._overlayContext = this._overlayCanvas.getContext('2d');\n this._canvas.parentNode.insertBefore(this._overlayCanvas, this._canvas.nextSibling);\n }\n \n // Size the overlay canvas to match the main canvas\n this._overlayCanvas.width = this._canvas.width;\n this._overlayCanvas.height = this._canvas.height;\n this._overlayCanvas.style.width = this._canvas.style.width;\n this._overlayCanvas.style.height = this._canvas.style.height;\n \n // Clear the overlay before drawing\n this._overlayContext.clearRect(0, 0, this._overlayCanvas.width, this._overlayCanvas.height);\n \n drawContext = this._overlayContext;\n } else if (this._context2d) {\n // For non-WebGL or non-shadow charts with 2D context\n drawContext = this._context2d;\n }\n\n const drawParams = {\n color: getColor(singleSeries.color, singleSeries.index, singleSeries.multigrapherSeriesIndex),\n context: drawContext,\n width: width || singleSeries.width || defaultLineWidth,\n shadowColor,\n shadowBlur,\n dashed: singleSeries.dashed,\n dashPattern: singleSeries.dashPattern,\n highlighted,\n showIndividualPoints: shouldShowIndividualPoints,\n pointRadius: singleSeries.pointRadius,\n minPointSpacing: singleSeries.minPointSpacing,\n getIndividualPoints,\n getRanges: singleSeries.rangeKey ? getRanges : null,\n rendering: singleSeries.rendering, // Pass rendering type for all charts\n negativeColor: singleSeries.negativeColor,\n hasNegatives,\n zero,\n zeroColor: singleSeries.zeroLineColor\n };\n \n if (this._webgl && singleSeries.rendering === 'shadow' && singleSeries.cutoffTime && (width > 0 || shouldShowIndividualPoints)) {\n drawParams.cutoffIndex = cutoffIndex;\n drawParams.cutoffOpacity = singleSeries.cutoffOpacity !== undefined ? singleSeries.cutoffOpacity : 0.35;\n drawParams.originalData = cutoffData;\n drawParams.renderCutoffGradient = cutoffIndex >= 0;\n \n const selection = this === this._stateController.rangeGraphRenderer \n ? this._stateController._bounds \n : (this._stateController._selection || this._stateController._bounds);\n drawParams.selectionBounds = selection || bounds;\n drawParams.currentBounds = bounds;\n }\n \n\n if (!inRenderSpace) {\n console.error('inRenderSpace is null for line rendering');\n return;\n }\n \n if (singleSeries.cutoffTime) {\n drawParams.cutoffIndex = cutoffIndex;\n drawParams.cutoffOpacity = singleSeries.cutoffOpacity !== undefined ? singleSeries.cutoffOpacity : 0.35;\n drawParams.originalData = cutoffData;\n drawParams.renderCutoffGradient = cutoffIndex >= 0;\n drawParams.currentBounds = bounds;\n drawParams.isPreview = this === this._stateController.rangeGraphRenderer;\n \n const selection = this === this._stateController.rangeGraphRenderer \n ? this._stateController._bounds \n : (this._stateController._selection || this._stateController._bounds);\n drawParams.selectionBounds = selection || bounds; \n }\n \n // For shadow rendering, always use 2D canvas for lines/points even with WebGL\n // This is because shadow uses WebGL for the fill but needs 2D canvas for lines/points\n // to support negativeColor and other features\n if (this._webgl && singleSeries.rendering !== 'shadow') {\n this._lineProgram.draw(inRenderSpace, drawParams);\n } else {\n drawLine(inRenderSpace, drawParams);\n }\n \n }\n\n renderBackground(inBackgroundSpace) {\n if (!inBackgroundSpace) {\n return;\n }\n\n if (this._webgl) {\n if (!this._backgroundProgram) {\n this._backgroundProgram = new BackgroundProgram(this._context);\n }\n \n this._backgroundProgram.draw(inBackgroundSpace);\n } else {\n drawBackground(inBackgroundSpace, {\n context: this._context\n });\n }\n }\n\n /**\n * Initializes canvas\n * Currently, just sets sizing\n */\n async _initializeCanvas() {\n this._sizing = await sizeCanvas(this._canvas, this._context);\n\n this.emit('size_changed', this._sizing);\n this._stateController.markSizeChanged();\n\n if (window.ResizeObserver) {\n let first = true;\n let disabled = false;\n\n this._resizeObserver = new window.ResizeObserver( () => {\n if (first) { // always fires once at the beginning\n first = false;\n return;\n }\n\n if (disabled) {\n return;\n }\n\n disabled = true;\n this.resize().then(() => {\n disabled = false;\n });\n });\n\n this._resizeObserver.observe(this._canvas.parentNode);\n }\n\n if (this._checkIntersection && window.IntersectionObserver) {\n this._intersectionObserver = new window.IntersectionObserver((entries) => {\n clearTimeout(this._intersectionTimeout);\n\n if (!entries[0].isIntersecting) {\n return;\n }\n\n this._intersectionTimeout = setTimeout(() => {\n this.resize();\n }, 50);\n }, {\n threshold: 0.1\n });\n\n this._intersectionObserver.observe(this._canvas.parentNode);\n }\n }\n\n async resize() {\n const sizingPromise = sizeCanvas(this._canvas, this._context, { reset: true });\n this._initialized = sizingPromise;\n\n this._sizing = await this._initialized;\n if (this._initialized !== sizingPromise) {\n return;\n }\n\n this.emit('size_changed', this._sizing);\n this._stateController.markSizeChanged(this);\n }\n\n resizeDebounced() {\n if (this._resizeTimeout) {\n clearTimeout(this._resizeTimeout);\n }\n\n this._resizeTimeout = setTimeout(() => {\n this.resize();\n this._resizeTimeout = null;\n }, 50);\n }\n\n recalculatePosition() {\n if (!this._sizing) {\n return;\n }\n\n this._sizing.boundingRect = this._canvas.getBoundingClientRect();\n }\n\n /**\n * Returns the bounding rect of the element\n *\n * @return {DOMRect}\n */\n get boundingRect() {\n return this._sizing?.boundingRect;\n }\n\n get sizing() {\n return this._sizing;\n }\n\n}\n","/**\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 if (!context) {\n console.error('Canvas context is null in drawBackground');\n return;\n }\n \n const width = context.canvas.width;\n const height = context.canvas.height;\n\n for (let { minXt, maxXt, color } of data) {\n context.fillStyle = color;\n context.fillRect(minXt*width, 0, (maxXt - minXt)*width, height);\n }\n}\n","export function calculatePrecision(value) {\n return Math.max(-Math.log10(Math.abs(value)) + 2, 0);\n}\n\nexport function calculateTimePrecision(minDate, maxDate) {\n minDate = new Date(minDate);\n maxDate = new Date(maxDate);\n\n const range = maxDate.valueOf() - minDate.valueOf();\n if (range < 3*1000) {\n return 'ms';\n } else if (range < 10*60*1000) {\n return 's';\n } else {\n return 'm';\n }\n}\n\nexport function roundToPrecision(value, precision=null) {\n if (precision === null) {\n precision = calculatePrecision(value);\n }\n\n if (isNaN(precision) || precision > 100) {\n return value.toString();\n }\n\n const rounded = value.toFixed(Math.ceil(precision));\n let stripped = rounded;\n if (rounded.includes('.')) {\n stripped = stripped.replace(/\\.?0+$/g, '');\n }\n\n if (stripped === '') {\n return '0';\n }\n\n return stripped;\n}\n\nconst DATE_TIME_FORMATTERS = {};\n\n/**\n * Given a timezone string, gets the offset relative to utc in milliseconds\n * For example, America/New_York in winter is GMT-05:00, so it evaluates to -5*60*60*1000\n *\n * @param {String} timeZone - the time zone string\n * @param {Date} sampleDate - a date to use in the conversions, since it can be time-of-year dependent with Daylight Savings Time\n * @return {number|null}\n */\nfunction timezoneToOffsetMS(timeZone, sampleDate) {\n try { // formats are finicky, so give up rather than abort rendering\n let datetimeFormatter = DATE_TIME_FORMATTERS[timeZone];\n if (!datetimeFormatter) {\n let properTimeZone = timeZone;\n if (!timeZone || timeZone === 'local') {\n properTimeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n }\n\n datetimeFormatter = new Intl.DateTimeFormat('en-US', {\n timeZone: properTimeZone,\n timeZoneName: 'longOffset'\n });\n DATE_TIME_FORMATTERS[timeZone] = datetimeFormatter;\n }\n\n const parts = datetimeFormatter.formatToParts(sampleDate);\n const offsetPart = parts.find(part => part.type === 'timeZoneName');\n\n if (!offsetPart) {\n return null;\n }\n\n if (offsetPart.value === 'GMT') {\n return 0;\n }\n\n if (!/^GMT[+-]\\d{2}:\\d{2}$/.test(offsetPart.value)) {\n return null;\n }\n\n const [hours, minutes] = offsetPart.value.slice(3).split(':');\n\n return parseInt(hours)*60*60*1000 + parseInt(minutes)*60*1000;\n } catch (e) {\n console.error(new Error(`Could not parse timezone offset for ${sampleDate} in ${timeZone}`)); // eslint-disable-line no-console\n console.error(e); // eslint-disable-line no-console\n return null;\n }\n}\n\n/**\n * Gets the Date object that represents the start of day in a given timezone\n * Note that this is still a native date object, so it will be in the local timezone\n * Its timestamp, however, will correspond to the start of the day in the given timezone\n *\n * @param date\n * @param timezone\n * @return {Date}\n */\nexport function startOfDayInTimezone(date, timezone) {\n if (!timezone) {\n const startOfDay = new Date(date);\n startOfDay.setHours(0, 0, 0, 0);\n return startOfDay;\n }\n\n const offset = timezoneToOffsetMS(timezone, date); // ms between timezone and utc\n let startOfDay = new Date(date);\n startOfDay.setUTCHours(0, 0, 0, 0);\n\n const difference = startOfDay.valueOf() - date.valueOf();\n\n // if we would have gone forward a day when offset is taken into account, we need to go back a day again\n if (difference > offset) {\n startOfDay = new Date(startOfDay.valueOf() - 24*60*60*1000);\n }\n\n return new Date(startOfDay.valueOf() - offset);\n}\n\nfunction formatTime(time, {precision, justTime, justDate, justMonthAndDay, unitOverride, clockStyle='24h', timeZone}) {\n const utc = timeZone && timeZone.toLowerCase() === 'utc';\n if (timeZone && !utc && timeZone !== 'local' && window.Intl && window.Intl.DateTimeFormat) {\n const offset = timezoneToOffsetMS(timeZone, time);\n const localOffset = timezoneToOffsetMS('local', time);\n\n if (typeof offset === 'number' && typeof localOffset === 'number') {\n time = new Date(time.valueOf() + offset - localOffset);\n }\n }\n\n const year = utc ? time.getUTCFullYear() : time.getFullYear();\n const month = (utc ? time.getUTCMonth() : time.getMonth()) + 1;\n const day = utc ? time.getUTCDate() : time.getDate();\n\n if (unitOverride === 'year') {\n return year.toString();\n }\n\n if (justDate) {\n return utc ? `${month}/${day}/${year}` : time.toLocaleDateString();\n }\n\n if (justMonthAndDay) {\n // eg Jan 19\n const monthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n return `${monthNames[month - 1]} ${day}`;\n }\n\n const hours = utc ? time.getUTCHours() : time.getHours();\n const minutes = utc ? time.getUTCMinutes() : time.getMinutes();\n const seconds = utc ? time.getUTCSeconds() : time.getSeconds();\n const milliseconds = utc ? time.getUTCMilliseconds() : time.getMilliseconds();\n\n let timeString;\n\n if (clockStyle === '12h') {\n timeString = `${((hours + 11) % 12 + 1).toString()}:${minutes.toString().padStart(2, '0')}`;\n } else {\n timeString = `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}`;\n }\n\n if (precision === 's' || precision === 'ms') {\n timeString += `:${seconds.toString().padStart(2, '0')}`;\n }\n\n if (precision === 'ms') {\n timeString += `.${milliseconds.toString().padStart(3, '0')}`;\n }\n\n if (clockStyle === '12h') {\n timeString += hours >= 12 ? 'pm' : 'am';\n }\n\n if (justTime) {\n return timeString;\n }\n\n if (utc) {\n timeString += ' UTC';\n }\n\n return (utc ? `${month}/${day}/${year}` : time.toLocaleDateString()) + ' ' + timeString;\n}\n\nexport function formatX(x, {dates=false, precision=null, justTime=false, justDate=false, justMonthAndDay=false, clockStyle='24h', unitOverride, timeZone, integersOnly=false, inverseEnumMap}={}) {\n if (dates && !(x instanceof Date)) {\n x = new Date(x);\n\n if (isNaN(x)) {\n return 'Invalid Date';\n }\n }\n\n if (x instanceof Date) {\n return formatTime(x, {precision, justTime, justDate, justMonthAndDay, unitOverride, clockStyle, timeZone});\n }\n\n if (isNaN(x)) {\n return 'NaN';\n }\n\n if (inverseEnumMap) {\n if (Math.abs(x - Math.round(x)) > 1e-10) {\n return '';\n }\n\n return inverseEnumMap[Math.round(x)];\n }\n\n if (integersOnly && Math.abs(x - Math.round(x)) > 1e-10) {\n return '';\n }\n\n return roundToPrecision(x, precision);\n}\n\nexport function formatY(y, {precision=null, log=false}={}) {\n if (y === null) {\n return 'null';\n }\n\n if (isNaN(y)) {\n return 'NaN';\n }\n\n if (log) {\n return `10^${roundToPrecision(Math.log10(y), precision)}`;\n }\n\n return roundToPrecision(y, precision);\n}\n","export const Y_AXIS_WIDTH = 32;\nexport const BIG_Y_AXIS_LABEL_OFFSET = 20;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport {formatX, formatY} from '../helpers/format';\nimport {Y_AXIS_WIDTH} from '../helpers/axis_sizes';\nimport CustomPropTypes from '../helpers/custom_prop_types';\n\nfunction getYLabelContent({ yLabel, y, fullYPrecision}) {\n if (fullYPrecision && !yLabel) {\n if (y === undefined) {\n return 'undefined';\n }\n\n if (y === null) {\n return 'null';\n }\n\n return y.toString();\n }\n\n if (typeof yLabel === 'number') {\n if (fullYPrecision) {\n return yLabel.toString();\n } else {\n return formatY(yLabel);\n }\n }\n\n if (typeof yLabel === 'object') {\n return formatY(y);\n }\n\n return yLabel || formatY(y);\n}\n\nfunction TooltipLabel({ axisLabel, x, y, xLabel, yLabel, textLeft, textTop, includeSeriesLabel, includeXValue, includeYValue, includeXLabel, includeYLabel, fullYPrecision, formatXOptions }) {\n let i = 0;\n\n return (\n <g>\n {\n includeSeriesLabel &&\n <text x={textLeft} y={textTop + (i++)*12}>\n {axisLabel}\n </text>\n }\n\n {\n includeXValue &&\n <text x={textLeft} y={textTop + (i++) * 12}>\n {includeXLabel && 'x: '}{xLabel || formatX(x, formatXOptions)}\n </text>\n }\n\n {\n includeYValue &&\n <text x={textLeft} y={textTop + (i++) * 12}>\n {includeYLabel && 'y: '}{getYLabelContent({ yLabel, y, fullYPrecision})}\n </text>\n }\n </g>\n );\n}\n\nTooltipLabel.propTypes = {\n axisLabel: PropTypes.string,\n x: PropTypes.oneOfType([PropTypes.number, PropTypes.instanceOf(Date)]),\n y: PropTypes.number,\n xLabel: PropTypes.string,\n yLabel: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n textLeft: PropTypes.number.isRequired,\n textTop: PropTypes.number.isRequired,\n fullYPrecision: PropTypes.bool,\n formatXOptions: PropTypes.object,\n ...CustomPropTypes.TooltipOptionsRaw\n};\n\nexport default class Tooltip extends React.PureComponent {\n\n render() {\n const textPadding = 3;\n let height = 12*3 + 2*textPadding;\n\n if (!this.props.includeSeriesLabel) {\n height -= 12;\n }\n\n if (!this.props.includeXValue) {\n height -= 12;\n }\n\n if (!this.props.includeYValue) {\n height -= 12;\n }\n\n const caretSize = 7;\n const halfHeight = height/2;\n const caretPadding = 4;\n\n const textTop = -halfHeight + textPadding;\n\n const formatXOptions = {\n clockStyle: this.props.clockStyle,\n timeZone: this.props.timeZone\n };\n\n const passThroughProps = {\n includeSeriesLabel: this.props.includeSeriesLabel,\n includeXLabel: this.props.includeXLabel,\n includeYLabel: this.props.includeYLabel,\n includeXValue: this.props.includeXValue,\n includeYValue: this.props.includeYValue,\n formatXOptions\n };\n\n const preparedTooltips = this.props.tooltips.map((tooltip) => {\n const { x, y, pixelY, pixelX, series, index, xLabel, yLabel, fullYPrecision } = tooltip;\n\n if (typeof pixelX !== 'number') {\n return null;\n }\n\n const axisLabel = (series.name || series.yKey || index).toString();\n let width = Math.max(axisLabel.length, (xLabel || formatX(x, formatXOptions)).length + 4, getYLabelContent({ yLabel, y, fullYPrecision}).length + 4) * 7.5;\n if (series.tooltipWidth) {\n width = series.tooltipWidth;\n }\n\n let fixedPosition = this.props.elementWidth < (width + 2*caretSize + 2*caretPadding);\n\n let multiplier = 1;\n if (pixelX >= this.props.elementWidth - (width + 2*caretSize + caretPadding)) {\n multiplier = -1;\n }\n\n if (pixelX < width + 2*caretSize + caretPadding && multiplier === -1) {\n fixedPosition = true;\n }\n\n if (y === null) {\n fixedPosition = true;\n }\n\n if (this.props.alwaysFixedPosition) {\n fixedPosition = true;\n }\n\n let textLeft = caretSize + caretPadding;\n if (multiplier < 0) {\n textLeft = -width - textLeft;\n } else {\n textLeft += 6;\n }\n\n if (!isFinite(pixelX)) {\n return null;\n }\n\n const transform = `translate(${pixelX},${pixelY})`;\n\n const commonLabelProps = {\n fullYPrecision: fullYPrecision || this.props.maxPrecision,\n x,\n y,\n axisLabel,\n xLabel,\n yLabel,\n ...passThroughProps\n };\n\n let yTranslation = 0;\n let baseLeft;\n\n if (fixedPosition) {\n textLeft = 6;\n\n baseLeft = this.props.elementWidth / 2 - width / 2;\n\n if (width > this.props.elementWidth && !this.props.floating) {\n baseLeft -= Y_AXIS_WIDTH * this.props.axisCount / 2;\n }\n\n yTranslation = 18;\n\n if (this.props.floating) {\n if (this.props.floatPosition === 'bottom') {\n yTranslation = this.props.elementHeight + halfHeight + 4;\n } else {\n yTranslation = -height;\n }\n\n if (this.props.floatDelta) {\n yTranslation += this.props.floatDelta;\n }\n }\n }\n\n return {\n ...tooltip,\n label: axisLabel,\n indexInAxis: series?.axis?.series?.indexOf(series),\n axisLabel,\n width,\n fixedPosition,\n multiplier,\n textLeft,\n transform,\n commonLabelProps,\n textTop,\n height,\n caretSize,\n halfHeight,\n caretPadding,\n yTranslation,\n baseLeft\n };\n }).filter(Boolean);\n\n const CustomTooltipComponent = this.props.customTooltip;\n\n let groupedTooltips;\n if (this.props.combineTooltips) {\n let combinationThreshold = 50; // in px how close tooltips should be to combine\n if (typeof this.props.combineTooltips === 'number') {\n combinationThreshold = this.props.combineTooltips;\n }\n\n groupedTooltips = [];\n\n for (let tooltip of preparedTooltips) {\n let added = false;\n for (let group of groupedTooltips) {\n if (Math.abs(group.pixelX - tooltip.pixelX) <= combinationThreshold) {\n group.tooltips.push(tooltip);\n if (tooltip.pixelX > group.pixelX) {\n group.pixelX = tooltip.pixelX;\n group.multiplier = tooltip.multiplier;\n }\n\n if (tooltip.pixelY < group.pixelY) {\n group.pixelY = tooltip.pixelY;\n }\n\n added = true;\n break;\n }\n }\n\n if (!added) {\n groupedTooltips.push({\n pixelX: tooltip.pixelX,\n pixelY: tooltip.pixelY,\n multiplier: tooltip.multiplier,\n tooltips: [tooltip]\n });\n }\n }\n\n for (let group of groupedTooltips) {\n let totalHeight = 0;\n let maxWidth = 0;\n\n // sort by indexInAxis\n group.tooltips.sort((a, b) => a.indexInAxis - b.indexInAxis);\n\n for (let i = 0; i < group.tooltips.length; i++) {\n group.tooltips[i].textTop = totalHeight;\n totalHeight += group.tooltips[i].height;\n maxWidth = Math.max(maxWidth, group.tooltips[i].width);\n }\n\n for (let i = 0; i < group.tooltips.length; i++) {\n group.tooltips[i].textTop -= totalHeight/2;\n group.tooltips[i].textTop += textPadding;\n }\n\n group.height = totalHeight;\n group.halfHeight = totalHeight / 2;\n group.caretSize = caretSize;\n group.width = maxWidth;\n }\n }\n\n return (\n <div className=\"grapher-tooltip\">\n <svg>\n {\n preparedTooltips.map((tooltip, i) => {\n const { color, fixedPosition, width, transform, baseLeft, commonLabelProps, yTranslation, multiplier, textLeft, textTop } = tooltip;\n\n if (this.props.customTooltip || groupedTooltips) {\n return (\n <g key={i} transform={transform} className=\"tooltip-item\">\n <circle r={4} fill={color}/>\n </g>\n );\n }\n\n // display in a fixed position if not wide enough\n if (fixedPosition) {\n return (\n <g key={i} className=\"tooltip-item tooltip-item-fixed\">\n <circle r={4} fill={color} transform={transform} />\n\n <g transform={`translate(${baseLeft}, ${yTranslation})`}>\n <path stroke={color} d={`M0,0 V-${halfHeight} h${width} V${halfHeight} h${-width} V0`} />\n\n <TooltipLabel\n textLeft={textLeft} textTop={textTop}\n {...commonLabelProps}\n />\n </g>\n </g>\n );\n }\n\n return (\n <g key={i} transform={transform} className=\"tooltip-item\">\n <circle r={4} fill={color} />\n\n <path stroke={color} d={`M${multiplier*caretPadding},0 L${multiplier*caretSize*2},-${caretSize} V-${halfHeight} h${multiplier*width} V${halfHeight} h${multiplier*-width} V${caretSize} L${multiplier*caretPadding},0`} />\n\n <TooltipLabel\n textLeft={textLeft} textTop={textTop}\n {...commonLabelProps}\n />\n </g>\n );\n })\n }\n\n {\n !this.props.customTooltip && groupedTooltips &&\n groupedTooltips.map(({ tooltips, pixelX, pixelY, halfHeight, multiplier, color, width }, i) =>\n <g key={i} transform={`translate(${pixelX},${pixelY})`} className=\"tooltip-item\">\n <path stroke={color} d={`M${multiplier*caretPadding},0 L${multiplier*caretSize*2},-${caretSize} V-${halfHeight} h${multiplier*width} V${halfHeight} h${multiplier*-width} V${caretSize} L${multiplier*caretPadding},0`} />\n\n {\n tooltips.map((tooltip, j) =>\n <TooltipLabel\n key={j}\n textTop={tooltip.textTop}\n textLeft={tooltip.textLeft}\n {...tooltip.commonLabelProps}\n />\n )\n }\n </g>\n )\n }\n </svg>\n\n {\n this.props.customTooltip &&\n (groupedTooltips || preparedTooltips).map((tooltip, i) =>\n <div\n key={i}\n className=\"custom-tooltip-container\"\n style={{top: tooltip.pixelY, left: tooltip.pixelX}}\n >\n <CustomTooltipComponent {...tooltip} />\n </div>\n )\n }\n </div>\n );\n }\n\n}\n\nTooltip.defaultProps = {\n includeSeriesLabel: true,\n includeXLabel: true,\n includeYLabel: true,\n includeXValue: true,\n includeYValue: true\n};\n\nTooltip.propTypes = {\n mouseX: PropTypes.number.isRequired,\n mouseY: PropTypes.number.isRequired,\n elementHeight: PropTypes.number.isRequired,\n elementWidth: PropTypes.number.isRequired,\n tooltips: PropTypes.arrayOf(PropTypes.shape({\n x: PropTypes.oneOfType([PropTypes.number, PropTypes.instanceOf(Date)]),\n y: PropTypes.number,\n pixelY: PropTypes.number,\n color: PropTypes.string,\n xLabel: PropTypes.string,\n yLabel: PropTypes.any,\n fullYPrecision: PropTypes.bool\n })),\n axisCount: PropTypes.number.isRequired,\n maxPrecision: PropTypes.bool.isRequired,\n clockStyle: PropTypes.oneOf(['12h', '24h']),\n timeZone: PropTypes.string,\n ...CustomPropTypes.TooltipOptionsRaw\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nexport default class ContextMenu extends React.PureComponent {\n constructor(props) {\n super(props);\n this.setTextRef = this.setTextRef.bind(this);\n }\n \n setTextRef(ref) {\n this.textRef = ref;\n\n if (this.props.contextMenu.showing && this.textRef) {\n const range = document.createRange();\n const selection = window.getSelection();\n\n selection.removeAllRanges();\n\n range.selectNodeContents(this.textRef);\n selection.addRange(range);\n this.textRef.focus();\n }\n }\n \n formatDateTime(dateTimeStr) {\n const [datePart, timePart] = dateTimeStr.split(', ');\n\n const [month, day, year] = datePart.split('/');\n const formattedDate = `${month.padStart(2, '0')}/${day.padStart(2, '0')}/${year}`;\n\n const [time, period] = timePart.split(' ');\n const [hours, minutes] = time.split(':');\n const formattedHours = hours.padStart(2, '0');\n const formattedTime = `${formattedHours}:${minutes} ${period}`;\n\n return `${formattedDate} ${formattedTime}`;\n }\n \n render() {\n const { x, y, showing, value } = this.props.contextMenu;\n\n const style = { left: x, top: y, width: '150px'};\n \n if (!showing || !value || value.toLocaleString() === 'Invalid Date' || isNaN(x) || isNaN(y)) {\n return null;\n }\n\n const displayValue = value instanceof Date ? this.formatDateTime(value.toLocaleString()) : value;\n return (\n <div className=\"grapher-context-menu\" style={style}>\n <div className=\"menu-item\">\n <div className=\"menu-text\" autoFocus={true} ref={this.setTextRef}>\n {displayValue}\n </div>\n </div>\n </div>\n );\n }\n\n}\n\nContextMenu.propTypes = {\n contextMenu: PropTypes.shape({\n x: PropTypes.number,\n y: PropTypes.number,\n showing: PropTypes.bool,\n value: PropTypes.oneOfType([\n PropTypes.instanceOf(Date),\n PropTypes.number,\n PropTypes.object\n ])\n }).isRequired\n};\n","import inferType from '../infer_type';\nimport { SIMPLE_DATA_TYPES } from '../data_types';\n\n/**\n * Given a series of a simple type (ie, not a function or an observable), converts it into data space\n *\n * @param {*} singleSeries\n * @param {Object} options\n * @return {*}\n */\nexport default function simpleSeriesToDataSpace(singleSeries, options={}) {\n const type = inferType(singleSeries, { useSimpleData: true, data: options.data });\n if (!SIMPLE_DATA_TYPES.includes(type)) {\n throw new Error(`Cannot normalize ${type} (expected a simple type)`);\n }\n\n const inDataSpace = {\n tuples: tuplesToDataSpace,\n values: valuesToDataSpace,\n objects: objectsToDataSpace\n }[type](options.data || singleSeries.simpleData || singleSeries.data, singleSeries, options);\n\n if (singleSeries.square) {\n const square = [];\n let prevY = options.prevY;\n for (let tuple of inDataSpace) {\n if (prevY !== undefined) {\n square.push([tuple[0], prevY]);\n }\n square.push(tuple);\n prevY = tuple[1];\n }\n\n return square;\n }\n\n if (singleSeries.shiftXBy) {\n for (let tuple of inDataSpace) {\n if (typeof tuple[0] === 'string') {\n const originalXValue = tuple[0];\n tuple[0] = new Date(new Date(tuple[0]).valueOf() + singleSeries.shiftXBy);\n if (isNaN(tuple[0])) {\n tuple[0] = options.stateController.enumToNumber(originalXValue, singleSeries);\n }\n } else if (tuple[0] instanceof Date) {\n tuple[0] = new Date(tuple[0].valueOf() + singleSeries.shiftXBy);\n } else if (typeof tuple[0] === 'number') {\n tuple[0] += singleSeries.shiftXBy;\n }\n }\n }\n\n if (singleSeries.xUnixDates) {\n for (let tuple of inDataSpace) {\n if (typeof tuple[0] === 'number') {\n tuple[0] = new Date(tuple[0]*1000);\n }\n }\n }\n\n return inDataSpace;\n}\n\n/**\n * Converts a values array to data space\n *\n * @param {Array<Number|String>} data\n * @param {Object} singleSeries\n * @param {Object} options\n * @param {Number} [options.valueXStart]\n * @param {StateController} options.stateController\n * @return {Array<Array<Number|Date|null>>}\n */\nfunction valuesToDataSpace(data, singleSeries, options) {\n const inDataSpace = [];\n\n for (let i = 0; i < data.length; i++) {\n let yValue = data[i];\n\n if (typeof yValue === 'string') {\n yValue = options.stateController.enumToNumber(yValue, singleSeries);\n }\n\n if (typeof yValue === 'boolean') {\n yValue = +yValue;\n }\n\n inDataSpace.push([i + (options.valueXStart || 0), yValue]);\n }\n\n return inDataSpace;\n}\n\n/**\n * Converts a tuples array to data space\n *\n * @param {Array<Array<Number|Date|null>>} data\n * @param {Object} singleSeries\n * @param {Object} options\n * @param {StateController} options.stateController\n * @return {Array<Array<Number|Date|null>>}\n */\nfunction tuplesToDataSpace(data, singleSeries, options) {\n return [...data.map(([ xValue, yValue]) => {\n if (yValue === undefined) {\n yValue = null;\n }\n\n if (typeof xValue === 'string') {\n const originalXValue = xValue;\n xValue = new Date(xValue);\n\n if (isNaN(xValue)) {\n xValue = options.stateController.enumToNumber(originalXValue, singleSeries, true);\n }\n }\n\n if (typeof yValue === 'string') {\n yValue = options.stateController.enumToNumber(yValue, singleSeries);\n }\n\n if (typeof yValue === 'boolean') {\n yValue = +yValue;\n }\n\n return [xValue, yValue];\n })];\n}\n\nfunction readBinaryFormatValue(view, offset, index) {\n const localOffset = view.getUint32(offset + 2 + Uint32Array.BYTES_PER_ELEMENT*index, true);\n\n if (localOffset === 0) {\n return null;\n }\n\n const type = view.getUint8(localOffset);\n\n if (type === 0) {\n return view.getFloat64(offset + localOffset + 1, true);\n } else if (type === 1 || type === 6) {\n return null;\n } else if (type === 3) {\n return new Date(view.getFloat64(offset + localOffset + 1, true));\n } else {\n throw new Error(`Binary format type ${type} not supported`);\n }\n}\n\n/**\n * Converts an objects array to data space\n *\n * @param {Array<Object>} data\n * @param {Object} series\n * @param {Object} options\n * @param {StateController} options.stateController\n * @return {Array<Array<Number|Date|null>>}\n */\nfunction objectsToDataSpace(data, series, options) {\n if (!series.xKey || typeof series.xKey !== 'string') {\n throw new Error('xKey must be provided in the series');\n }\n\n if (!series.yKey || typeof series.yKey !== 'string') {\n throw new Error('yKey must be provided in the series');\n }\n\n const inDataSpace = [];\n\n for (let point of data) {\n if (point.buffer instanceof ArrayBuffer) {\n const view = new DataView(point.buffer);\n const xIndex = point.channels[series.xKey];\n const yIndex = point.channels[series.yKey];\n\n for (let offset of point.offsets) {\n inDataSpace.push([readBinaryFormatValue(view, offset, xIndex), readBinaryFormatValue(view, offset, yIndex)]);\n }\n } else if (Array.isArray(point[series.yKey])) {\n if (point[series.yKey].length && !Array.isArray(point[series.yKey][0]) && typeof point[series.yKey][0] === 'object') {\n for (let subpoint of point[series.yKey]) {\n let yValue = subpoint[series.yKey];\n if (yValue === undefined) {\n yValue = null;\n }\n\n if (typeof yValue === 'string') {\n yValue = options.stateController.enumToNumber(yValue, series);\n }\n\n if (typeof yValue === 'boolean') {\n yValue = +yValue;\n }\n\n let xValue = subpoint[series.xKey];\n if (typeof xValue === 'string') {\n xValue = new Date(xValue);\n }\n\n inDataSpace.push([xValue, yValue]);\n }\n } else {\n inDataSpace.push(...point[series.yKey]);\n }\n } else {\n let yValue = point[series.yKey];\n if (yValue === undefined) {\n yValue = null;\n }\n\n let xValue = point[series.xKey];\n if (typeof xValue === 'string') {\n xValue = new Date(xValue);\n }\n\n if (typeof yValue === 'string') {\n yValue = options.stateController.enumToNumber(yValue, series);\n }\n\n if (typeof yValue === 'boolean') {\n yValue = +yValue;\n }\n\n inDataSpace.push([xValue, yValue]);\n }\n }\n\n return inDataSpace;\n}\n","function finalizeBounds(bounds, { dates }) {\n const initial = (bounds.minX === null && bounds.maxX === null) || bounds.minY === null || bounds.maxY === null;\n\n for (let key of Object.keys(bounds)) {\n if (typeof bounds[key] !== 'number') {\n bounds[key] = 0;\n }\n }\n\n bounds.initial = initial;\n bounds.dates = dates;\n\n return bounds;\n}\n\nfunction percentileBounds(inDataSpace, bounds, {percentile=100, percentileAsymmetry=0}={}) {\n let dates = false;\n\n bounds.minX = inDataSpace[0][0];\n if (bounds.minX instanceof Date) {\n bounds.minX = bounds.minX.valueOf();\n dates = true;\n }\n\n bounds.maxX = inDataSpace[inDataSpace.length - 1][0];\n if (bounds.maxX instanceof Date) {\n bounds.maxX = bounds.maxX.valueOf();\n dates = true;\n }\n\n const sortedByY = inDataSpace\n .filter(([_x, y]) => typeof y === 'number')\n .sort(([_x1, y1], [_x2, y2]) => y1 - y2);\n\n if (!sortedByY.length) {\n return finalizeBounds(bounds, {dates});\n }\n\n const asymmetry = Math.min(Math.abs(percentileAsymmetry), (100-percentile)/2) * (percentileAsymmetry < 0 ? -1 : 1);\n const inBottomPercentile = (100-percentile)/2 + asymmetry;\n const inTopPercentile = (100-percentile)/2 - asymmetry;\n\n const startIndex = Math.floor((sortedByY.length-1)*inBottomPercentile/100);\n const endIndex = Math.floor((sortedByY.length-1)*(100-inTopPercentile)/100);\n\n bounds.minY = sortedByY[startIndex][1];\n bounds.maxY = sortedByY[endIndex][1];\n\n return finalizeBounds(bounds, {dates});\n}\n\nexport default function calculateDataBounds(inDataSpace, {percentile=100, percentileAsymmetry=0}={}) {\n let bounds = {\n minX: null,\n maxX: null,\n minY: null,\n maxY: null,\n closestSpacing: null\n };\n\n if (percentile !== 100 && inDataSpace.length) {\n return percentileBounds(inDataSpace, bounds, {percentile, percentileAsymmetry});\n }\n\n let dates = false;\n let prevX = null;\n\n for (let [x, y] of inDataSpace) {\n if (x instanceof Date) {\n x = x.valueOf();\n dates = true;\n }\n\n if (typeof bounds.minX !== 'number' || x < bounds.minX) {\n bounds.minX = x;\n }\n\n if (typeof bounds.maxX !== 'number' || x > bounds.maxX) {\n bounds.maxX = x;\n }\n\n if (typeof prevX === 'number' && typeof x === 'number') {\n const spacing = x - prevX;\n if (typeof bounds.closestSpacing !== 'number' || spacing < bounds.closestSpacing) {\n bounds.closestSpacing = spacing;\n }\n }\n prevX = x;\n\n if (typeof y !== 'number') {\n continue;\n }\n\n if (typeof bounds.minY !== 'number' || y < bounds.minY) {\n bounds.minY = y;\n }\n\n if (typeof bounds.maxY !== 'number' || y > bounds.maxY) {\n bounds.maxY = y;\n }\n }\n\n return finalizeBounds(bounds, {dates});\n}\n","export default function mergeBounds(boundsList) {\n const mergedBounds = {\n minX: null,\n maxX: null,\n minY: null,\n maxY: null,\n closestSpacing: null,\n dates: false,\n initial: true\n };\n\n for (let { minX, maxX, minY, maxY, dates, initial, closestSpacing } of boundsList) {\n if (dates) {\n mergedBounds.dates = true;\n }\n\n if (initial) {\n continue;\n }\n mergedBounds.initial = false;\n\n if (mergedBounds.minX === null || minX < mergedBounds.minX) {\n mergedBounds.minX = minX;\n }\n\n if (mergedBounds.maxX === null || maxX > mergedBounds.maxX) {\n mergedBounds.maxX = maxX;\n }\n\n if (mergedBounds.closestSpacing === null || closestSpacing < mergedBounds.closestSpacing) {\n mergedBounds.closestSpacing = closestSpacing;\n }\n\n if (mergedBounds.minY === null || minY < mergedBounds.minY) {\n mergedBounds.minY = minY;\n }\n\n if (mergedBounds.maxY === null || maxY > mergedBounds.maxY) {\n mergedBounds.maxY = maxY;\n }\n }\n\n if (mergedBounds.minX === null) {\n mergedBounds.minX = 0;\n }\n\n if (mergedBounds.maxX === null) {\n mergedBounds.maxX = 0;\n }\n\n if (mergedBounds.closestSpacing === null) {\n mergedBounds.closestSpacing = 1;\n }\n\n if (mergedBounds.minY === null) {\n mergedBounds.minY = 0;\n }\n\n if (mergedBounds.maxY === null) {\n mergedBounds.maxY = 0;\n }\n\n return mergedBounds;\n}\n","/**\n * Expands bounds to give a little y padding\n *\n * @param {Object} bounds\n * @param {?Number} bounds.minY\n * @param {?Number} bounds.maxY\n * @param {?Number} bounds.minX\n * @param {?Number} bounds.maxX\n * @param {Array<Number>} [expandYWith]\n * @param {Number} [extendXForNBars=0]\n * @return {Object}\n */\nexport default function expandBounds(bounds, {expandYWith = [], extendXForNBars=0}) {\n const expandedBounds = Object.assign({}, bounds);\n for (let y of expandYWith) {\n if (y === null || y === undefined) {\n continue;\n }\n\n if (typeof expandedBounds.minY !== 'number' || y < expandedBounds.minY) {\n expandedBounds.minY = y;\n }\n\n if (typeof expandedBounds.maxY !== 'number' || y > expandedBounds.maxY) {\n expandedBounds.maxY = y;\n }\n }\n\n expandedBounds.unscaledMinY = expandedBounds.minY;\n expandedBounds.unscaledMaxY = expandedBounds.maxY;\n\n const range = expandedBounds.maxY - expandedBounds.minY;\n const midpoint = expandedBounds.minY + range/2;\n expandedBounds.minY = midpoint - 1.05*range/2;\n expandedBounds.maxY = midpoint + 1.05*range/2;\n\n if (expandedBounds.minY === expandedBounds.maxY && expandedBounds.minY !== null) {\n if (expandedBounds.minY > 0) {\n expandedBounds.minY *= 0.95;\n expandedBounds.maxY *= 1.05;\n } else if (expandedBounds.minY < 0) {\n expandedBounds.minY *= 1.05;\n expandedBounds.maxY *= 0.95;\n } else {\n expandedBounds.minY -= 1;\n expandedBounds.maxY += 1;\n }\n }\n\n if (extendXForNBars && expandedBounds.minX !== expandedBounds.maxX && expandedBounds.minX !== null && expandedBounds.maxX !== null) {\n // Base expansion factor on expected bar count\n const barWidth = (expandedBounds.maxX - expandedBounds.minX) / extendXForNBars;\n expandedBounds.minX -= barWidth/2;\n expandedBounds.maxX += barWidth/2;\n }\n\n return expandedBounds;\n}\n","/**\n * Finds the closest point to the target\n *\n * @param {Array} data - the data, in data space\n * @param {Number} targetX - the x coordinate to get closest to\n * @param {Object} [searchParams]\n * @param {String} [searchParams.searchType] - whether to search for the closest, one before, or one after\n * @param {Boolean} [searchParams.returnIndex] - whether to return the index or the object itself\n * @param {Number} [startIndex] - where to start the search from\n * @param {Number} [endIndex] - where to end the search\n * @return {Array|Number}\n */\nexport default function binarySearch(data, targetX, searchParams={}, startIndex=0, endIndex=undefined) {\n if (endIndex === undefined) {\n endIndex = data.length - 1;\n }\n\n if (data.length === 0) {\n return searchParams.returnIndex ? -1 : [null, null];\n }\n\n const middleIndex = Math.floor((startIndex + endIndex)/2);\n\n if (targetX === data[middleIndex][0] || (data[middleIndex][0] instanceof Date && data[middleIndex][0].valueOf() === targetX)) {\n if (searchParams.returnIndex) {\n return middleIndex;\n } else {\n return data[middleIndex];\n }\n }\n\n if (startIndex === endIndex) {\n if (data[startIndex][0] < targetX && searchParams.searchType === 'before') {\n return searchParams.returnIndex ? startIndex : data[startIndex];\n } else if (data[startIndex][0] > targetX && searchParams.searchType === 'after') {\n return searchParams.returnIndex ? startIndex : data[startIndex];\n } else {\n return searchParams.returnIndex ? -1 : [null, null];\n }\n }\n\n if (endIndex - 1 === startIndex) {\n let index;\n\n if (searchParams.searchType === 'before') {\n index = startIndex;\n // index = (targetX <= data[startIndex][0]) ? startIndex : endIndex;\n } else if (searchParams.searchType === 'after') {\n index = endIndex;\n // index = (targetX >= data[endIndex][0]) ? endIndex : startIndex;\n } else {\n index = Math.abs(data[startIndex][0] - targetX) > Math.abs(data[endIndex][0] - targetX) ?\n endIndex :\n startIndex;\n }\n\n return searchParams.returnIndex ? index : data[index];\n }\n\n if (targetX > data[middleIndex][0]) {\n return binarySearch(data, targetX, searchParams, middleIndex, endIndex);\n }\n\n if (targetX < data[middleIndex][0]) {\n return binarySearch(data, targetX, searchParams, startIndex, middleIndex);\n }\n}\n","import binarySearch from '../../helpers/binary_search';\n\nfunction validateSelectedSpaceConversion({ data, inSelectedSpace, firstIndex, lastIndex, ignoreDiscontinuities }) { // eslint-disable-line no-unused-vars\n let correct = data.slice(firstIndex + 1, lastIndex);\n if (ignoreDiscontinuities) {\n correct = correct.filter(([_x, y]) => (y !== null && y !== undefined));\n }\n\n if (correct.length !== inSelectedSpace.length) {\n console.log({ // eslint-disable-line no-console\n data,\n attempt: inSelectedSpace.map(([x, y]) => [undateify(x), y]),\n correct: correct.map(([x, y]) => [undateify(x), y]),\n sdl: window.sdl\n });\n window.tacomaDataPaused = true;\n throw new Error('Failed to select via swap');\n }\n\n for (let i = 0; i < correct.length; i++) {\n if (undateify(correct[i][0]) !== undateify(inSelectedSpace[i][0]) || correct[i][1] !== inSelectedSpace[i][1]) {\n console.log({ // eslint-disable-line no-console\n i,\n attempt: inSelectedSpace.map(([x, y]) => [undateify(x), y]),\n correct: correct.map(([x, y]) => [undateify(x), y]),\n correctX: undateify(correct[i][0]),\n correctY: correct[i][1],\n attemptX: undateify(inSelectedSpace[i][0]),\n attemptY: inSelectedSpace[i][1]\n });\n window.tacomaDataPaused = true;\n throw new Error('Failed to select via swap');\n }\n }\n}\n\n/**\n * Converts from data space to selected space\n *\n * @param {Array<Array<Number>>} data\n * @param {{data: Array<Array<Number>>}|*} [swap]\n * @param {Number} minX\n * @param {Number} maxX\n * @param {Boolean} ignoreDiscontinuities\n * @param {Boolean} square\n * @return {{data: Array<Array<Number>>, lastAdded: boolean, firstAdded: boolean, afterIndex: Number, ignoreDiscontinuities: boolean, minX: Number, maxX: Number, beforeIndex: Number}}\n */\nexport default function dataSpaceToSelectedSpace({ data, swap, minX, maxX, ignoreDiscontinuities, square }) {\n if (!data.length || data.length && minX > data[data.length - 1][0] || data.length && maxX < data[0][0]) {\n //let previouslyEmpty = !data.length;\n return {\n data: [\n [minX, null],\n [maxX, null]\n ],\n firstAdded: true,\n lastAdded: true\n //previouslyEmpty\n };\n }\n\n let beforeIndex = binarySearch(data, minX, { searchType: 'before', returnIndex: true }) || 0;\n let afterIndex = binarySearch(data, maxX, { searchType: 'after', returnIndex: true }) || 0;\n if (afterIndex === -1) {\n afterIndex = 0;\n }\n\n while (beforeIndex >= 0 && data[beforeIndex][0] >= minX) {\n beforeIndex --;\n }\n\n while (afterIndex < data.length && data[afterIndex][0] <= maxX) {\n afterIndex ++;\n }\n\n let inSelectedSpace;\n let addToEndOnly = false;\n\n let firstAdded = false;\n let lastAdded = false;\n\n let beginningInterpolationIndex = beforeIndex;\n let endInterpolationIndex = afterIndex;\n if (ignoreDiscontinuities) {\n while (beginningInterpolationIndex >= 0 && data[beginningInterpolationIndex][1] === null) {\n beginningInterpolationIndex --;\n }\n while (endInterpolationIndex < data.length && data[endInterpolationIndex][1] === null) {\n endInterpolationIndex++;\n }\n }\n\n if (swap) {\n inSelectedSpace = swap.data;\n if (swap.lastAdded) {\n inSelectedSpace.pop();\n }\n if (minX === swap.minX) {\n addToEndOnly = true;\n }\n if (beforeIndex !== swap.beforeIndex) {\n addToEndOnly = false;\n if (swap.firstAdded) {\n inSelectedSpace.shift();\n }\n let index = swap.beforeIndex;\n while (index >= 0 && inSelectedSpace.length && inSelectedSpace[0][0] >= minX) {\n if (!ignoreDiscontinuities || data[index][1] || data[index][1] === 0) {\n inSelectedSpace.unshift(data[index]);\n }\n index --;\n }\n while (index < data.length && inSelectedSpace.length && inSelectedSpace[0][0] < minX) {\n inSelectedSpace.shift();\n index ++;\n }\n }\n\n if (ignoreDiscontinuities && !swap.ignoreDiscontinuities) {\n inSelectedSpace = inSelectedSpace.filter(([_x, y]) => (y !== null && y !== undefined));\n }\n\n if (beforeIndex === swap.beforeIndex && swap.firstAdded) {\n firstAdded = true;\n\n let interpolationIndex = beforeIndex + 1;\n if (ignoreDiscontinuities) {\n while (interpolationIndex < data.length && data[interpolationIndex][1] === null) {\n interpolationIndex ++;\n }\n }\n\n if (beginningInterpolationIndex === -1 && inSelectedSpace.length) {\n inSelectedSpace[0] = [minX, null];\n } else {\n if (square && inSelectedSpace.length) {\n inSelectedSpace[0] = [minX, data[beginningInterpolationIndex][1]];\n } else {\n if (inSelectedSpace.length) {\n inSelectedSpace[0] = [minX, interpolate(data, beginningInterpolationIndex, interpolationIndex, minX)];\n }\n }\n }\n if (data[beforeIndex + 1][0] === inSelectedSpace[0][0] && data[beforeIndex + 1][1] === inSelectedSpace[0][1]) {\n firstAdded = false;\n }\n }\n let lastIncluded = swap.afterIndex;\n if (swap.ignoreDiscontinuities && !ignoreDiscontinuities) {\n let nullIndex = beforeIndex + 1;\n let selectedIndex = 0;\n if (firstAdded) {\n selectedIndex ++;\n }\n while (selectedIndex <= inSelectedSpace.length && nullIndex < data.length && nullIndex < afterIndex) {\n if (data[nullIndex][0] <= maxX && data[nullIndex][1] === null && (!inSelectedSpace[selectedIndex] || inSelectedSpace[selectedIndex][0] !== data[nullIndex][0] || inSelectedSpace[selectedIndex][1] !== data[nullIndex][1])) {\n inSelectedSpace.splice(selectedIndex, 0, data[nullIndex]);\n if (nullIndex >= lastIncluded) {\n lastIncluded = nullIndex + 1;\n }\n }\n nullIndex ++;\n selectedIndex ++;\n }\n }\n\n let dataIndex = lastIncluded || 0;\n while (dataIndex < data.length && data[dataIndex][0] <= maxX) {\n if (data[dataIndex][0] >= minX) {\n if (!ignoreDiscontinuities || data[dataIndex][1] || data[dataIndex][1] === 0) {\n inSelectedSpace.push(data[dataIndex]);\n }\n }\n dataIndex ++;\n }\n while (inSelectedSpace.length && inSelectedSpace[inSelectedSpace.length - 1][0] > maxX) {\n inSelectedSpace.pop();\n }\n\n } else {\n inSelectedSpace = data.slice(beforeIndex + 1, afterIndex);\n if (ignoreDiscontinuities) {\n inSelectedSpace = inSelectedSpace.filter(([_x, y]) => (y !== null && y !== undefined));\n }\n }\n\n if (!inSelectedSpace.length) {\n if (square) {\n if (beginningInterpolationIndex < 0) {\n inSelectedSpace = [[minX, null], [maxX, null]];\n } else {\n inSelectedSpace = [[minX, data[beginningInterpolationIndex][1]], [maxX, data[beginningInterpolationIndex][1]]];\n }\n } else {\n inSelectedSpace = [[minX, interpolate(data, beginningInterpolationIndex, endInterpolationIndex, minX)], [maxX, interpolate(data, beginningInterpolationIndex, endInterpolationIndex, maxX)]];\n }\n firstAdded = true;\n lastAdded = true;\n }\n\n if (!addToEndOnly) {\n let interpolationIndex = beforeIndex + 1;\n if (ignoreDiscontinuities) {\n while (interpolationIndex < data.length && data[interpolationIndex][1] === null) {\n interpolationIndex ++;\n }\n }\n\n if (inSelectedSpace.length && inSelectedSpace[0][0] > minX) {\n firstAdded = true;\n if (beginningInterpolationIndex === -1) {\n inSelectedSpace.unshift([minX, null]);\n } else {\n if (square) {\n inSelectedSpace.unshift([minX, data[beginningInterpolationIndex][1]]);\n } else {\n inSelectedSpace.unshift([minX, interpolate(data, beginningInterpolationIndex, interpolationIndex, minX)]);\n }\n }\n }\n }\n\n if (inSelectedSpace.length && inSelectedSpace[inSelectedSpace.length - 1][0] < maxX) {\n lastAdded = true;\n\n let interpolationIndex = afterIndex - 1;\n if (ignoreDiscontinuities) {\n while (interpolationIndex >= 0 && data[interpolationIndex][1] === null) {\n interpolationIndex --;\n }\n }\n\n if (endInterpolationIndex === data.length) {\n inSelectedSpace.push([maxX, null]);\n } else {\n if (square) {\n inSelectedSpace.push([maxX, inSelectedSpace[inSelectedSpace.length - 1][1]]);\n } else {\n inSelectedSpace.push([maxX, interpolate(data, interpolationIndex, endInterpolationIndex, maxX)]);\n }\n }\n }\n\n if (inSelectedSpace.length === 1) {\n let begPoint;\n let endPoint;\n if (square) {\n if (beginningInterpolationIndex < 0) {\n begPoint = [minX, null];\n } else {\n begPoint = [minX, data[beginningInterpolationIndex][1]];\n }\n endPoint = [maxX, inSelectedSpace[0][1]];\n } else {\n begPoint = [minX, interpolate(data, beginningInterpolationIndex, beforeIndex + 1, minX)];\n endPoint = [maxX, interpolate(data, afterIndex - 1, endInterpolationIndex, maxX)];\n }\n inSelectedSpace.unshift(begPoint);\n inSelectedSpace.push(endPoint);\n firstAdded = true;\n lastAdded = true;\n }\n\n return {\n data: inSelectedSpace,\n minX,\n maxX,\n beforeIndex,\n afterIndex,\n firstAdded,\n lastAdded,\n ignoreDiscontinuities\n //previouslyEmpty: false\n };\n}\n\nfunction undateify(potentialDate) {\n if (potentialDate instanceof Date) {\n return potentialDate.valueOf();\n }\n\n return potentialDate;\n}\n\n/**\n * Finds the point at the boundary via interpolation\n *\n * @param {Array<Array<Number>>} data\n * @param {Number} firstIndex\n * @param {Number} secondIndex\n * @param {Number} boundary\n * @return {null|*}\n */\nfunction interpolate(data, firstIndex, secondIndex, boundary) {\n if (firstIndex < 0 || secondIndex < 0) {\n return null;\n }\n\n if (firstIndex >= data.length || secondIndex >= data.length) {\n return null;\n }\n\n if (firstIndex === secondIndex) {\n return data[firstIndex][1];\n }\n\n const [xBefore, yBefore] = data[firstIndex];\n const [xAfter, yAfter] = data[secondIndex];\n\n if (boundary === xBefore && yBefore !== null) {\n return yBefore;\n }\n\n if (boundary === xAfter && yAfter !== null) {\n return yAfter;\n }\n\n if (yBefore === null || yAfter === null) {\n return null;\n }\n\n const percent = (boundary - xBefore)/(xAfter - xBefore);\n if (percent < 0 || percent > 1) {\n return null;\n }\n\n return percent*(yAfter - yBefore) + yBefore;\n}\n","/**\n * Scales y min and max bounds according to linear or log\n *\n * @param {Number} minY\n * @param {Number} maxY\n * @param {'linear'|'log'} scale\n * @return {{minY: Number, maxY: Number}}\n */\nexport default function scaleBounds({ minY, maxY, scale }) {\n if (scale === 'log') {\n maxY = Math.log10(maxY);\n\n if (minY <= 0) {\n if (maxY > 0) {\n minY = -maxY;\n } else {\n minY = 2*maxY;\n }\n } else {\n minY = Math.log10(minY);\n }\n }\n\n return {\n minY,\n maxY\n };\n}\n","import scaleBounds from '../../renderer/scale_bounds';\nimport RustAPI from '../rust_api';\n\n\nfunction selectedSpaceToRenderSpaceInPlace({ data, renderWidth, renderHeight, minX, maxX, minY, maxY, scale }, { nullMask, yValues, minYValues, maxYValues }) {\n let i = 0;\n let prevI = i - 1;\n\n for (let pixelX = 0; pixelX < renderWidth; pixelX++) {\n // find the x value that corresponds to the x pixel\n const x = (pixelX/(renderWidth - 1))*(maxX - minX) + minX;\n\n // set i such that data[i][0] < x <= data[i+1][0]\n let minSeenY = null;\n let maxSeenY = null;\n\n if (i > 0 && i <= data.length && data[i - 1][1] === null) {\n i--;\n }\n\n if (i < data.length - 2 && data[i + 1][0] < x) {\n i++;\n }\n\n for (i; i < data.length - 2 && data[i + 1][0] < x; i++) {\n const curY = data[i][1];\n\n if (curY === null) {\n continue;\n }\n\n if (minSeenY === null || curY < minSeenY) {\n minSeenY = curY;\n }\n\n if (maxSeenY === null || curY > maxSeenY) {\n maxSeenY = curY;\n }\n }\n\n minYValues[pixelX] = minSeenY === null ? 0 : renderHeight*(1 - ((scale === 'log' ? Math.log10(minSeenY) : minSeenY) - minY)/(maxY - minY));\n maxYValues[pixelX] = maxSeenY === null ? 0 : renderHeight*(1 - ((scale === 'log' ? Math.log10(maxSeenY) : maxSeenY) - minY)/(maxY - minY));\n\n // pass any discontinuities along\n if (i >= data.length - 1 || data[i][1] === null || data[i + 1][1] === null) {\n const y = i >= data.length - 1 ? null : data[i][1];\n\n nullMask[pixelX] = ((y === null) << 0) | ((minSeenY === null) << 1) | ((maxSeenY === null) << 2);\n yValues[pixelX] = y === null ? 0 : renderHeight*(1 - ((scale === 'log' ? Math.log10(y) : y) - minY)/(maxY - minY));\n\n i++;\n\n continue;\n }\n\n // interpolate\n const [xBefore, yBefore] = data[i];\n const [xAfter, yAfter] = data[i + 1];\n\n const percent = (x - xBefore) / (xAfter - xBefore);\n let y = percent * (yAfter - yBefore) + yBefore;\n\n // we're at the first point after the direction changed. Don't interpolate\n if (prevI !== i) {\n y = yBefore;\n }\n\n // // two x's with the same value; common in area charts\n // // to avoid this from having gotten skipped over, save in either min or max as appropriate\n // if (i > 0 && data[i - 1][0] === data[i][0]) {\n // // 0: minY a\n // // 1: original a\n // // 2: minY b\n // // 3: original b\n //\n // const [xBeforeOffset, yBeforeOffset] = data[i - 1];\n // const [xAfter, yAfter] = data[i + 1];\n // }\n\n yValues[pixelX] = y === null ? 0 : renderHeight*(1 - ((scale === 'log' ? Math.log10(y) : y) - minY)/(maxY - minY));\n nullMask[pixelX] = ((y === null) << 0) | ((minSeenY === null) << 1) | ((maxSeenY === null) << 2);\n\n prevI = i;\n }\n}\n\n/**\n * Convert from selected space to value space\n *\n * @param data\n * @param {Object} [swap]\n * @param {Number} renderWidth - width, in pixels, of the area in which the graph is rendered\n * @param {Number} renderHeight - height, in pixels, of the area in which the graph is rendered\n * @param {Number} minX - the minimum x value that is rendered\n * @param {Number} maxX - the maximum x value that is rendered\n * @param {Number} minY - the minimum y value that is rendered\n * @param {Number} maxY - the maximum y value that is rendered\n * @param {'log'|'linear'} scale\n * @param {Boolean} [dataChanged] - if true, will not rely on the prior data state from swap being accurate\n * @return {{nullMask: Uint8Array, maxYValues: Float64Array, minYValues: Float64Array, yValues: Float64Array, dataF64: Float64Array, dataNullMask: Uint8Array}}\n */\nexport default function selectedSpaceToRenderSpace({ data, swap, renderWidth, renderHeight, minX, maxX, minY, maxY, scale, dataChanged }) {\n if (swap && swap.yValues.length !== renderWidth) {\n swap = null;\n }\n\n const nullMask = (swap && swap.nullMask) || new Uint8Array(renderWidth);\n nullMask.fill(0);\n const yValues = new Float64Array(renderWidth);\n const minYValues = new Float64Array(renderWidth);\n const maxYValues = new Float64Array(renderWidth);\n\n const scaledBounds = scaleBounds({ minY, maxY, scale});\n minY = scaledBounds.minY;\n maxY = scaledBounds.maxY;\n\n const inParams = { data, renderWidth, renderHeight, minX, maxX, minY, maxY, scale };\n\n let dataF64, dataNullMask;\n\n if (RustAPI()) {\n let copyIndexStart = 0;\n\n const hasSwap = swap && swap.dataNullMask && swap.dataF64;\n const useSwap = !dataChanged && hasSwap && swap.minX === minX && swap.maxX <= maxX && swap.length <= data.length;\n\n if (!useSwap || swap.dataNullMask.length < data.length) {\n const extraSpaceFactor = 1.25;\n dataF64 = new Float64Array(Math.floor(data.length*2*extraSpaceFactor));\n dataNullMask = new Uint8Array(Math.floor(data.length*extraSpaceFactor));\n\n if (useSwap) {\n dataNullMask.set(swap.dataNullMask);\n dataF64.set(swap.dataF64);\n }\n } else {\n dataF64 = swap.dataF64;\n dataNullMask = swap.dataNullMask;\n }\n\n if (useSwap) {\n copyIndexStart = Math.max(swap.length - 1, 0);\n }\n\n for (let i = copyIndexStart; i < data.length; i++) {\n dataF64[2*i] = data[i][0];\n dataF64[2*i + 1] = data[i][1];\n\n if (data[i][1] === null) {\n dataNullMask[i] = 1;\n } else {\n dataNullMask[i] = 0;\n }\n }\n RustAPI().selected_space_to_render_space(data.length, dataF64, dataNullMask, inParams, nullMask, yValues, minYValues, maxYValues);\n } else {\n selectedSpaceToRenderSpaceInPlace(inParams, { nullMask, yValues, minYValues, maxYValues });\n }\n\n return {\n nullMask,\n yValues,\n minYValues,\n maxYValues,\n dataF64,\n dataNullMask,\n minX,\n maxX,\n length: data.length\n };\n}\n","/**\n * Flattens simple data\n * Returns an array of tuples (x value, simple point)\n *\n * @param simpleData\n * @param series\n * @param inDataSpace\n * @return {[]}\n */\nexport default function flattenSimpleData(simpleData, {series, inDataSpace }) {\n const flattened = [];\n let fI = 0;\n\n for (let point of simpleData) {\n const yValue = extractYValue(point, series);\n\n if (series.yKey && Array.isArray(yValue)) {\n for (let subpoint of point[series.yKey]) {\n if (series.ignoreDiscontinuities && typeof subpoint[series.yKey] !== 'number' && !Array.isArray(subpoint)) {\n continue;\n }\n\n const x = inDataSpace[fI++][0];\n\n if (series.square && flattened.length > 0) {\n flattened.push([x, flattened[flattened.length - 1][1]]);\n }\n\n flattened.push([x, subpoint]);\n }\n\n continue;\n }\n\n if (series.ignoreDiscontinuities && (yValue === undefined || yValue === null)) {\n continue;\n }\n\n const x = inDataSpace[fI++][0];\n\n if (series.square && flattened.length > 0) {\n flattened.push([x, flattened[flattened.length - 1][1]]);\n }\n\n flattened.push([x, point]);\n }\n\n if (flattened.length !== inDataSpace.length) {\n console.warn('Flattening didn\\'t give the same length as it has in data space'); // eslint-disable-line no-console\n }\n\n return flattened;\n}\n\nexport function extractYValue(point, series) {\n if (series.yKey) {\n return point[series.yKey];\n }\n\n if (Array.isArray(point)) {\n if (point.length === 1) {\n return point[0];\n } else {\n return point[1];\n }\n }\n\n return point;\n}\n\nexport function extractXValue(point, series) {\n if (series.xKey) {\n return point[series.xKey];\n }\n\n if (Array.isArray(point)) {\n return point[0];\n }\n\n return point;\n}\n","import binarySearch from '../helpers/binary_search';\nimport scaleBounds from '../renderer/scale_bounds';\nimport getColor from '../helpers/colors';\nimport flattenSimpleData, {extractXValue, extractYValue} from '../helpers/flatten_simple_data';\nimport {getBarWidths} from '../renderer/draw_bars';\n\nconst DISTANCE_THRESHOLD = 20;\n\n/**\n * Figures out the tooltip state\n *\n * @param {Boolean} mousePresent\n * @param {Number} mouseX\n * @param {Number} mouseY\n * @param {Object} sizing\n * @param {Array<Object>} series\n * @param {Set} alwaysTooltipped\n * @param {Array<Object>} savedTooltips\n * @param {Boolean} [allTooltipped]\n * @param {Number} closestSpacing\n * @return {{mouseX: *, mouseY: *, elementWidth: number, elementHeight: number, tooltips: any[]}}\n */\nexport default function calculateTooltipState({mousePresent, mouseX, mouseY, sizing, series, alwaysTooltipped, savedTooltips, allTooltipped, closestSpacing }) {\n // filter out saved tooltips for nonexistent series\n savedTooltips = savedTooltips.filter((tooltip) => tooltip.series.axis);\n\n for (let savedTooltip of savedTooltips) {\n moveTooltip({ mouseX, mouseY, sizing}, savedTooltip);\n }\n\n if (!mousePresent) {\n return {\n mouseX,\n mouseY,\n elementWidth: sizing.elementWidth,\n elementHeight: sizing.elementHeight,\n tooltips: [...savedTooltips]\n };\n }\n\n const tooltips = [];\n\n let minDistance = Infinity;\n\n for (let i = 0; i < series.length; i++) {\n const singleSeries = series[i];\n\n if (singleSeries.hidden) {\n continue;\n }\n\n const axis = singleSeries.axis;\n\n const scale = axis.scale;\n const bounds = axis.currentBounds;\n const { minY, maxY } = scaleBounds({...bounds, scale });\n\n const trueX = mouseX/sizing.elementWidth * (bounds.maxX - bounds.minX) + bounds.minX;\n\n let data = singleSeries.inDataSpace;\n if (singleSeries.ignoreDiscontinuities) {\n data = data.filter((tuple) => typeof tuple[1] === 'number');\n }\n\n if (data.length === 0) {\n continue;\n }\n\n const dataMinX = data[0][0];\n const dataMaxX = data[data.length - 1][0];\n const dataRange = dataMaxX - dataMinX;\n const padding = Math.max(dataRange * 0.05, (bounds.maxX - bounds.minX) * 0.02); \n\n if (trueX < dataMinX - padding || trueX > dataMaxX + padding) {\n continue;\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 ignoreYDistanceCheck = 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 (!ignoreYDistanceCheck && (xDistance > xDistanceThreshold || yDistance > yDistanceThreshold || 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 ignoreYDistanceCheck\n });\n }\n\n const unsavedTooltips = tooltips.filter(({ distance, ignoreYDistanceCheck }) => {\n return distance === minDistance || ignoreYDistanceCheck;\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.ignoreYDistanceCheck && lastTooltip.distance > DISTANCE_THRESHOLD)) {\n return savedTooltips;\n }\n\n const currentTooltipIndex = savedTooltips.findIndex((tooltip) => {\n return tooltip.x === lastTooltip.x && tooltip.y === lastTooltip.y;\n });\n\n if (currentTooltipIndex === -1) {\n return [...savedTooltips, lastTooltip];\n } else {\n return savedTooltips.filter((_, index) => index !== currentTooltipIndex);\n }\n}\n","const BOUND_CALCULATORS = {\n all: () => {},\n lastMinute: (globalBounds) => {\n if (!globalBounds.dates) {\n return;\n }\n\n return {\n minX: Math.max(new Date(globalBounds.maxX).valueOf() - 60*1000, globalBounds.minX)\n };\n },\n last10Minutes: (globalBounds) => {\n if (!globalBounds.dates) {\n return;\n }\n\n return {\n minX: Math.max(new Date(globalBounds.maxX).valueOf() - 10*60*1000, globalBounds.minX)\n };\n },\n lastHour: (globalBounds) => {\n if (!globalBounds.dates) {\n return;\n }\n\n return {\n minX: Math.max(new Date(globalBounds.maxX).valueOf() - 60*60*1000, globalBounds.minX)\n };\n },\n lastDay: (globalBounds) => {\n if (!globalBounds.dates) {\n return;\n }\n\n return {\n minX: Math.max(new Date(globalBounds.maxX).valueOf() - 24*60*60*1000, globalBounds.minX)\n };\n }\n};\n\nexport default BOUND_CALCULATORS;\n","const BUCKETS_PER_PIXEL = 2;\nconst CONDENSE_THRESHOLD = 2;\n\n/**\n * Condenses the dataset down to a lower number of points to make subsequent operations more efficient\n * Will only condense when data length passes a given threshold\n * Note that this works best on datasets that are relatively evenly distributed across the x axis\n *\n * @param {Array<Array>} data\n * @param {{data: [], minX: Number, maxX: Number, length: Number}} swap\n * @param {Number} minX\n * @param maxX\n * @param renderWidth\n * @param dataChanged\n * @return {{data: [], minX: Number, maxX: Number, length: Number}}\n */\nexport default function condenseDataSpace({ data, swap, minX, maxX, renderWidth, dataChanged }) {\n const targetBucketCount = renderWidth*BUCKETS_PER_PIXEL;\n\n const useSwap = !dataChanged && swap && swap.minX === minX && swap.maxX <= maxX && swap.length <= data.length;\n\n let partiallyCondensedData;\n if (useSwap) {\n partiallyCondensedData = swap.data;\n\n if (data.length > swap.length) {\n // always overwrite the last in case it was mangled by the selected space interpolation\n if (data.length > 0 && partiallyCondensedData.length > 0) {\n partiallyCondensedData[partiallyCondensedData.length - 1] = data[swap.length - 1];\n }\n\n partiallyCondensedData = partiallyCondensedData.concat(data.slice(swap.length));\n }\n } else {\n partiallyCondensedData = [...data];\n }\n\n if (partiallyCondensedData.length / targetBucketCount < CONDENSE_THRESHOLD*2) { // * 2 because min and max\n return {\n data: partiallyCondensedData,\n minX,\n maxX,\n length: data.length\n };\n }\n\n const condensedData = [];\n const bucketSize = (maxX - minX)/targetBucketCount;\n let minInBucket = null;\n let maxInBucket = null;\n let currentBucketIndex = 0;\n\n // always add the first point so that x ranges are preserved\n if (data.length) {\n condensedData.push(data[0]);\n }\n\n for (let tuple of partiallyCondensedData) {\n const [x, y] = tuple;\n\n if (y === null) {\n continue;\n }\n\n const bucketIndex = Math.floor((x - minX)/bucketSize);\n\n if (bucketIndex !== currentBucketIndex) {\n if (minInBucket && maxInBucket) {\n if (minInBucket === maxInBucket) {\n if (condensedData[condensedData.length - 1] !== minInBucket) {\n condensedData.push(minInBucket);\n }\n } else if (minInBucket[0] < maxInBucket[0]) {\n condensedData.push(maxInBucket, minInBucket);\n } else {\n condensedData.push(minInBucket, maxInBucket);\n }\n }\n\n minInBucket = null;\n maxInBucket = null;\n currentBucketIndex = bucketIndex;\n }\n\n if (!minInBucket || y < minInBucket[1]) {\n minInBucket = tuple;\n }\n\n if (!maxInBucket || y > maxInBucket[1]) {\n maxInBucket = tuple;\n }\n }\n\n if (minInBucket && maxInBucket) {\n if (minInBucket === maxInBucket) {\n condensedData.push(minInBucket);\n } else if (minInBucket[0] < maxInBucket[0]) {\n condensedData.push(maxInBucket, minInBucket);\n } else {\n condensedData.push(minInBucket, maxInBucket);\n }\n }\n\n // always add the last point so that x ranges are preserved\n if (data.length >= 2 && data[data.length - 1] !== minInBucket && data[data.length - 1] !== maxInBucket) {\n condensedData.push(data[data.length - 1]);\n }\n\n return {\n data: condensedData,\n minX,\n maxX,\n length: data.length\n };\n}\n","/**\n * Gets the proper name for a series\n *\n * @param {Object} singleSeries\n * @param {Number} index\n * @return {string}\n */\nexport default function nameForSeries(singleSeries, index) {\n let name = singleSeries.name || singleSeries.yKey;\n\n if (!name) {\n name = index.toString();\n }\n\n return name;\n}\n","export function selectedSpaceToBackgroundSpace({ data, background, minX, maxX }) {\n if (!background) {\n return null;\n }\n\n const conditions = [];\n for (let [key, color] of Object.entries(background)) {\n if (typeof color === 'object') {\n if (typeof color.evaluator !== 'function') {\n throw new Error('Invalid background declaration: ' + key + ' (evaluator must be a function)');\n }\n\n conditions.push(Object.assign({\n key,\n comparator: 'custom',\n comparedAgainst: null\n }, color));\n continue;\n }\n\n if (key === 'null') {\n conditions.push({\n evaluator: (y) => y === null && color,\n color,\n key,\n comparator: '=',\n comparedAgainst: null\n });\n continue;\n }\n\n const [comparator, value] = key.split(' ');\n if (!comparator || !value || isNaN(parseFloat(value))) {\n throw new Error('Invalid background declaration: ' + key);\n }\n\n const parsedValue = parseFloat(value);\n\n let evaluator;\n if (comparator === '=') {\n evaluator = (y) => typeof y === 'number' && y === parsedValue && color;\n } else if (comparator === '<') {\n evaluator = (y) => typeof y === 'number' && y < parsedValue && color;\n } else if (comparator === '>') {\n evaluator = (y) => typeof y === 'number' && y > parsedValue && color;\n } else if (comparator === '<=') {\n evaluator = (y) => typeof y === 'number' && y <= parsedValue && color;\n } else if (comparator === '>=') {\n evaluator = (y) => typeof y === 'number' && y >= parsedValue && color;\n } else {\n throw new Error('Invalid background declaration: ' + key);\n }\n\n conditions.push({\n evaluator,\n color,\n key,\n comparator,\n comparedAgainst: parsedValue\n });\n }\n\n const inBackgroundSpace = [];\n let currentSection = null;\n\n for (let i = 0; i < data.length; i++) {\n let [x, y] = data[i];\n if (x instanceof Date) {\n x = x.valueOf();\n }\n\n for (let condition of currentSection ? [currentSection.condition, ...conditions] : conditions) {\n const color = condition.evaluator(y);\n\n if (currentSection) {\n if (currentSection.color === color) {\n break;\n }\n\n let interpolatedMaxX = x;\n if (i > 0) {\n let [prevX, prevY] = data[i - 1];\n if (prevX instanceof Date) {\n prevX = prevX.valueOf();\n }\n\n if (currentSection.condition.comparedAgainst === null) {\n interpolatedMaxX = x;\n } else if (y === null) {\n interpolatedMaxX = prevX;\n } else {\n interpolatedMaxX = prevX + (condition.comparedAgainst - prevY)/(y - prevY)*(x - prevX);\n }\n }\n\n inBackgroundSpace.push({\n ...currentSection,\n maxX: interpolatedMaxX,\n maxXt: (interpolatedMaxX - minX)/(maxX - minX)\n });\n currentSection = null;\n }\n\n if (color) {\n let interpolatedMinX = x;\n if (i > 0) {\n let [prevX, prevY] = data[i - 1];\n if (prevX instanceof Date) {\n prevX = prevX.valueOf();\n }\n\n if (condition.comparedAgainst === null) {\n interpolatedMinX = prevX;\n } else if (prevY === null) {\n interpolatedMinX = x;\n } else {\n interpolatedMinX = prevX + (condition.comparedAgainst - prevY)/(y - prevY)*(x - prevX);\n }\n }\n\n currentSection = {\n minX: interpolatedMinX,\n minXt: (interpolatedMinX - minX)/(maxX - minX),\n color,\n condition\n };\n\n break;\n }\n }\n }\n\n if (currentSection) {\n inBackgroundSpace.push({\n ...currentSection,\n maxX: data[data.length - 1][0],\n maxXt: (data[data.length - 1][0] - minX)/(maxX - minX)\n });\n }\n\n return {\n data: inBackgroundSpace\n };\n}\n","import simpleSeriesToDataSpace from './space_conversions/simple_series_to_data_space';\nimport calculateDataBounds from './calculate_data_bounds';\nimport mergeBounds from './merge_bounds';\nimport expandBounds from './expand_bounds';\nimport selectionFromGlobalBounds from './selection_from_global_bounds';\nimport dataSpaceToSelectedSpace from './space_conversions/data_space_to_selected_space';\nimport selectedSpaceToRenderSpace from './space_conversions/selected_space_to_render_space';\nimport Eventable from '../eventable';\nimport boundCalculatorFromSelection from './bound_calculator_from_selection';\nimport calculateTooltipState, {toggleTooltipSaved} from './calculate_tooltip_state';\nimport getDefaultBoundsCalculator from './get_default_bounds_calculator';\nimport inferType from './infer_type';\nimport {SIMPLE_DATA_TYPES} from './data_types';\nimport generatorParamsEqual from '../helpers/generator_params_equal';\nimport findMatchingAxis from './find_matching_axis';\nimport {DPI_INCREASE} from '../renderer/size_canvas';\nimport {averageLoopTimes} from './average_loop_times';\nimport condenseDataSpace from './space_conversions/condense_data_space.js';\nimport calculateAnnotationsState from './calculate_annotations_state.js';\nimport {selectedSpaceToBackgroundSpace} from './space_conversions/selected_space_to_background_space.js';\nimport RustAPI, {RustAPIPromise} from './rust_api';\n\nexport default class StateController extends Eventable {\n\n constructor({ defaultBoundsCalculator, customBoundsSelectors, requireWASM, defaultShowIndividualPoints, defaultShowSidebar, defaultShowAnnotations, defaultShowOptions, syncPool, grapherID, sharedDataCache, sharedSubscriptions, fullscreen }) {\n super();\n\n this._requireWASM = requireWASM;\n if (requireWASM) {\n RustAPIPromise.then(() => {\n this._markDirty();\n });\n }\n\n this._series = [];\n this._seriesFromOriginalSeries = new Map();\n\n this._axes = [\n {\n series: [],\n scale: 'linear',\n side: 'left',\n axisIndex: 0\n }\n ];\n this._highlightedSeries = null;\n\n this._showIndividualPoints = defaultShowIndividualPoints || false;\n this._autoscaleY = true;\n this._percentile = 100;\n this._percentileAsymmetry = 0;\n this._showingOptions = defaultShowOptions;\n this._maxPrecision = false;\n this._showingSidebar = defaultShowSidebar || false;\n this._showingAnnotations = defaultShowAnnotations || false;\n this._grapherID = grapherID;\n this._fullscreen = fullscreen || false;\n\n this._alwaysTooltipped = new Set();\n this._tooltipState = {\n mousePresent: false,\n mouseX: 0,\n mouseY: 0,\n elementWidth: 0,\n elementHeight: 0,\n tooltips: []\n };\n this._contextMenuPosition = {\n x: 0,\n y: 0,\n showing: false,\n value: null\n };\n this._savedTooltips = [];\n this._draggingY = false;\n this._annotations = [];\n this._annotationsState = {\n elementWidth: 0,\n annotations: []\n };\n this._enumMap = {};\n this._hasXEnum = false;\n\n this._timingBuffer = [];\n this._timingIndex = 0;\n this._timingFrameCount = 0;\n\n this._modifiedSeries = new Set();\n this._deferredEmissions = {};\n this._deferredPriorityEmissions = {};\n this.primaryRenderer = null;\n this.rangeGraphRenderer = null;\n\n this._boundsCalculator = getDefaultBoundsCalculator(defaultBoundsCalculator, customBoundsSelectors);\n this._boundsHistory = [this._boundsCalculator];\n this._boundsIndex = 0;\n\n this._dataCache = sharedDataCache || new Map();\n this._subscriptions = sharedSubscriptions || new Map();\n this._subscriptionsShared = !!sharedSubscriptions;\n this._observablesToSeries = new Map();\n this._generators = new Set();\n this._generatorsToSeries = new Map();\n this._generatorCallArgs = new Map();\n this._seriesChangedFromPromises = new Set();\n\n this._syncPool = syncPool;\n if (this._syncPool) {\n this._syncPool.add(this);\n }\n\n this._onDataChange();\n }\n\n dispose() {\n this.emit('dispose', this);\n\n this.clearListeners();\n\n if (!this._subscriptionsShared) {\n for (let listener of this._subscriptions.values()) {\n listener.unsubscribe();\n }\n this._subscriptions.clear();\n }\n\n for (let singleSeries of this._series) {\n this._removeSeries(singleSeries);\n }\n\n if (this._syncPool) {\n this._syncPool.remove(this);\n }\n\n this.disposed = true;\n }\n\n setSeries(series) {\n const userSeries = this._series.filter((singleSeries) => singleSeries.userCreated);\n const propsSeries = this._series.filter((singleSeries) => !singleSeries.userCreated);\n\n if (series.length === propsSeries.length) {\n let anyDifferent = false;\n for (let i = 0; i < series.length; i++) {\n if (series[i] !== this._series[i].originalSeries) {\n anyDifferent = true;\n break;\n }\n }\n\n if (!anyDifferent) {\n return;\n }\n } else {\n this._mustResize = this._mustResize || this._fullscreen;\n }\n\n const newSeriesSet = new Set(series);\n for (let singleSeries of propsSeries) {\n if (!newSeriesSet.has(singleSeries.originalSeries)) {\n this._removeSeries(singleSeries);\n }\n }\n\n this._series.splice(0);\n for (let i = 0; i < series.length; i++) {\n const originalSeries = series[i];\n\n let singleSeries = this._seriesFromOriginalSeries.get(originalSeries);\n if (!singleSeries) {\n singleSeries = {\n ...originalSeries,\n originalSeries\n };\n this._seriesFromOriginalSeries.set(originalSeries, singleSeries);\n\n if (singleSeries.defaultAlwaysTooltipped) {\n this._alwaysTooltipped.add(singleSeries);\n this._tooltipsChanged = true;\n this.deferredEmit('always_tooltipped_changed', this._alwaysTooltipped);\n }\n }\n\n singleSeries.index = i;\n this._series.push(singleSeries);\n this._assignAxisTo(singleSeries);\n\n if (singleSeries.hidden) {\n this._hideSeries(singleSeries);\n }\n }\n\n for (let i = 0; i < userSeries.length; i++) {\n const singleSeries = userSeries[i];\n singleSeries.index = i + series.length;\n this._series.push(singleSeries);\n }\n\n this.deferredEmit('series_changed', this._series);\n\n this._dataChanged = true;\n this._markDirty();\n }\n\n _markDirty() {\n if (this._frameRequested) {\n return;\n }\n\n if (this._requireWASM && !RustAPI) {\n return;\n }\n\n const frameRequestStart = performance.now();\n this._frameRequested = true;\n requestAnimationFrame(() => {\n if (this.disposed) {\n return;\n }\n\n const frameExecutionStart = performance.now();\n\n const dataProcessingStart = performance.now();\n if (this._dataChanged) {\n this._onDataChange();\n this._mustRerender = true;\n this._tooltipsChanged = true;\n this._annotationsChanged = true;\n } else if (this._modifiedSeries.size) {\n this._onDataAdd(this._modifiedSeries);\n this._mustRerender = true;\n this._tooltipsChanged = true;\n this._annotationsChanged = true;\n } else {\n if (this._primarySizeChanged) {\n this._calculatePrimarySizeDependents();\n this._mustRerender = true;\n }\n if (this._rangeGraphSizeChanged) {\n this._calculateRangeGraphSizeDependents();\n this._mustRerender = true;\n }\n }\n const dataProcessingEnd = performance.now();\n\n const renderPipelineStart = performance.now();\n if (this._mustRerender) {\n this._render();\n }\n const renderPipelineEnd = performance.now();\n\n const generatorsStart = performance.now();\n if (this._mustCallGenerators) {\n this._callGenerators();\n }\n const generatorsEnd = performance.now();\n\n const tooltipStart = performance.now();\n if (this._tooltipsChanged) {\n this._recalculateTooltips();\n }\n const tooltipEnd = performance.now();\n\n const contextMenuStart = performance.now();\n if (this._contextMenuChanged) {\n this._recalculateContextMenu();\n }\n const contextMenuEnd = performance.now();\n\n const annotationStart = performance.now();\n if (this._annotationsChanged) {\n this._recalculateAnnotations();\n }\n const annotationEnd = performance.now();\n\n if (this._mustResize) {\n this.primaryRenderer.resizeDebounced();\n this.rangeGraphRenderer && this.rangeGraphRenderer.resizeDebounced();\n }\n\n this._frameRequested = false;\n this._mustRerender = false;\n this._dataChanged = false;\n this._primarySizeChanged = false;\n this._rangeGraphSizeChanged = false;\n this._modifiedSeries.clear();\n this._seriesChangedFromPromises.clear();\n this._tooltipsChanged = false;\n this._contextMenuChanged = false;\n this._annotationsChanged = false;\n this._mustCallGenerators = false;\n this._mustResize = false;\n\n const callbacksStart = performance.now();\n for (let emission of [...Object.values(this._deferredPriorityEmissions), ...Object.values(this._deferredEmissions)]) {\n this.emit(...emission);\n }\n const callbacksEnd = performance.now();\n this._deferredEmissions = {};\n this._deferredPriorityEmissions = {};\n\n const completionTime = performance.now();\n const loopTime = {\n frameExecution: completionTime - frameExecutionStart,\n frameRequestAndExecution: completionTime - frameRequestStart,\n generators: generatorsEnd - generatorsStart,\n dataProcessing: dataProcessingEnd - dataProcessingStart,\n renderPipeline: renderPipelineEnd - renderPipelineStart,\n tooltips: tooltipEnd - tooltipStart,\n contextMenu: contextMenuEnd - contextMenuStart,\n annotations: annotationEnd - annotationStart,\n callbacks: callbacksEnd - callbacksStart\n };\n this.lastLoopTime = loopTime;\n if (this._timingFrameCount) {\n if (this._timingBuffer.length < this._timingFrameCount) {\n this._timingBuffer.push(loopTime);\n } else {\n this._timingBuffer[this._timingIndex % this._timingFrameCount] = loopTime;\n }\n this._timingIndex++;\n }\n this.emit('render_time', completionTime - frameExecutionStart, loopTime);\n });\n }\n\n deferredEmit(...args) {\n this._deferredEmissions[args[0]] = args;\n }\n\n deferredPriorityEmit(...args) {\n this._deferredPriorityEmissions[args[0]] = args;\n }\n\n _seriesToSimpleData(singleSeries) {\n const type = inferType(singleSeries);\n if (SIMPLE_DATA_TYPES.includes(type)) {\n return singleSeries.data;\n }\n\n // get a reference to whatever you already have\n let currentData = this._dataCache.get(singleSeries.data);\n\n if (currentData && this._seriesChangedFromPromises.has(singleSeries.data)) {\n return currentData;\n }\n\n if (!currentData) {\n currentData = [];\n this._dataCache.set(singleSeries.data, currentData);\n singleSeries.simpleData = currentData;\n }\n\n if (type === 'object_observable' || type === 'tuple_observable') {\n let sameDataSet = this._observablesToSeries.get(singleSeries.data);\n if (sameDataSet) {\n const firstSameDataSeries = sameDataSet.values().next().value;\n currentData = firstSameDataSeries.simpleData;\n if (!currentData) {\n throw new Error(`Cannot find simpleData in ${firstSameDataSeries.name || firstSameDataSeries.yKey || firstSameDataSeries.data}`);\n }\n this._dataCache.set(singleSeries.data, currentData);\n singleSeries.simpleData = currentData;\n } else {\n sameDataSet = new Set();\n singleSeries.simpleData = currentData;\n this._observablesToSeries.set(singleSeries.data, sameDataSet);\n }\n\n sameDataSet.add(singleSeries);\n\n this._listenToObservableData({\n observable: singleSeries.data,\n currentData\n });\n }\n\n if (type === 'generator') {\n if (!this._generatorsToSeries.has(singleSeries.data)) {\n this._generatorsToSeries.set(singleSeries.data, new Set());\n }\n\n this._generatorsToSeries.get(singleSeries.data).add(singleSeries);\n\n if (!this._generators.has(singleSeries.data)) {\n this._generators.add(singleSeries.data);\n this._callGenerator(singleSeries.data);\n }\n }\n\n // return whatever you have; it'll fetch more in the background\n return currentData;\n }\n\n _listenToPromise(singleSeries, dataPromise) {\n dataPromise.then((resolved) => {\n this._dataCache.set(singleSeries.data, resolved);\n singleSeries.simpleData = resolved;\n this._seriesChangedFromPromises.add(singleSeries.data);\n this._dataChanged = true;\n this._markDirty();\n });\n }\n\n _listenToObservableData({ observable, currentData }) {\n if (this._subscriptions.has(observable)) { // someone else already listened to it\n return;\n }\n this._subscriptions.set(observable, true);\n\n // listen to the new data\n const listener = observable.observe((point) => {\n if (Array.isArray(point)) {\n for (let datum of point) {\n currentData.push(datum);\n }\n } else {\n currentData.push(point);\n }\n\n this.emit('observable_modified', observable);\n\n this.markObservableModified(observable);\n });\n this._subscriptions.set(observable, listener);\n }\n\n markObservableModified(observable) {\n if (!this._observablesToSeries.has(observable)) {\n return;\n }\n\n for (let singleSeries of this._observablesToSeries.get(observable)) {\n this._modifiedSeries.add(singleSeries);\n }\n this._markDirty();\n }\n\n _unsubscribeFromStaleSeries() {\n const currentSeries = new Set(this._series);\n for (let [observable, seriesSet] of this._observablesToSeries) {\n let stillHasListener = false;\n\n for (let singleSeries of seriesSet) {\n if (currentSeries.has(singleSeries)) {\n stillHasListener = true;\n break;\n }\n }\n\n if (!stillHasListener) {\n this._subscriptions.get(observable).unsubscribe();\n this._subscriptions.delete(observable);\n this._observablesToSeries.delete(observable);\n }\n }\n\n for (let [generator, seriesSet ] of this._generatorsToSeries) {\n let stillHasSeries = false;\n\n for (let singleSeries of seriesSet) {\n if (currentSeries.has(singleSeries)) {\n stillHasSeries = true;\n break;\n }\n }\n\n if (!stillHasSeries) {\n this._generatorsToSeries.delete(generator);\n this._generators.delete(generator);\n this._generatorCallArgs.delete(generator);\n }\n }\n }\n\n async _callGenerator(generator) {\n const parameters = {\n minX: this._selection.minX,\n maxX: this._selection.maxX,\n sizing: this.primaryRenderer.sizing\n };\n\n if (generatorParamsEqual(this._generatorCallArgs.get(generator), parameters)) {\n return;\n }\n this._generatorCallArgs.set(generator, parameters);\n\n // Note: potential race condition if generator is stupid. For now, we'll rely on generator being smart\n // Race condition: a new, faster one runs before completed\n const data = await Promise.resolve(generator(parameters));\n\n // do nothing if the generator returned nothing\n if (!data) {\n return;\n }\n\n // because calling the generator may have taken some time, check that there are still listeners for it\n if (!this._generatorsToSeries.has(generator)) {\n return;\n }\n\n this._dataChanged = true;\n this._markDirty();\n\n if (typeof data.observe === 'function') {\n const currentData = [];\n this._dataCache.set(generator, currentData);\n for (let singleSeries of this._generatorsToSeries.get(generator)) {\n singleSeries.simpleData = currentData;\n }\n\n for (let singleSeries of this._generatorsToSeries.get(generator)) {\n if (!this._observablesToSeries.has(data)) {\n this._observablesToSeries.set(data, new Set());\n }\n\n this._observablesToSeries.get(data).add(singleSeries);\n }\n\n this._listenToObservableData({\n observable: data,\n currentData\n });\n } else {\n this._dataCache.set(generator, data);\n for (let singleSeries of this._generatorsToSeries.get(generator)) {\n singleSeries.simpleData = data;\n }\n }\n }\n\n _callGenerators() {\n for (let generator of this._generators) {\n this._callGenerator(generator);\n }\n }\n\n _recalculateTooltips() {\n if (!this.primaryRenderer || !this.primaryRenderer.sizing) {\n return;\n }\n\n this._tooltipState = calculateTooltipState({\n mousePresent: this._tooltipState.mousePresent,\n mouseX: this._tooltipState.mouseX,\n mouseY: this._tooltipState.mouseY,\n sizing: this.primaryRenderer.sizing,\n series: this._series,\n alwaysTooltipped: this._alwaysTooltipped,\n savedTooltips: this._savedTooltips,\n allTooltipped: this._tooltipAllNext,\n closestSpacing: this._globalBounds.closestSpacing\n });\n this._tooltipAllNext = false;\n this.deferredEmit('tooltip_state_changed', this._tooltipState, this._tooltipStateArg);\n this._tooltipStateArg = null;\n }\n \n _recalculateContextMenu() {\n if (!this.primaryRenderer || !this.primaryRenderer.sizing) {\n return;\n }\n\n const boundingRect = this.primaryRenderer.boundingRect;\n const sizing = this.primaryRenderer.sizing;\n let value = null;\n let newX = null;\n \n for (let series of this._series) {\n const bounds = series.axis.currentBounds;\n \n newX = this._contextMenuPosition.x - boundingRect.left;\n \n // if it's on the right side, move it to the left one width\n if (this._contextMenuPosition.x > (boundingRect.right - sizing.elementWidth) * 2) newX -= 130;\n\n if (series.xKey === 'timestamp' || series.xKey === 'time' || series.xKey === 'date') {\n value = new Date((this._contextMenuPosition.x - boundingRect.left) / sizing.elementWidth * (bounds.maxX - bounds.minX) + bounds.minX);\n } else {\n value = (this._contextMenuPosition.x - boundingRect.left) / sizing.elementWidth * (bounds.maxX - bounds.minX) + bounds.minX;\n }\n }\n this._contextMenuPosition = {\n x: newX,\n y: this._contextMenuPosition.y - boundingRect.top,\n showing: this._contextMenuPosition.showing,\n value: value\n };\n this.deferredEmit('context_menu_position_changed', this._contextMenuPosition);\n }\n\n _recalculateAnnotations() {\n if (!this.primaryRenderer || !this.primaryRenderer.sizing) {\n return;\n }\n\n this._annotationsState = calculateAnnotationsState({\n annotations: this._annotations,\n series: this._series,\n sizing: this.primaryRenderer.sizing,\n selection: this._selection\n });\n this.deferredEmit('annotations_changed', this._annotationsState);\n }\n\n _onDataChange() {\n this._expandYWith = [];\n const dataBoundsList = [];\n\n for (let singleSeries of this._series) {\n if (singleSeries.hidden) {\n continue;\n }\n\n const simpleData = this._seriesToSimpleData(singleSeries);\n singleSeries.inDataSpace = simpleSeriesToDataSpace({\n ...singleSeries,\n data: simpleData\n }, {\n stateController: this\n });\n singleSeries.simpleDataSliceStart = simpleData.length;\n singleSeries.dataBounds = calculateDataBounds(singleSeries.inDataSpace);\n if (singleSeries.rendering === 'bar') {\n singleSeries.dataBounds = expandBounds(singleSeries.dataBounds, { extendXForNBars: singleSeries.inDataSpace.length, expandYWith: singleSeries.expandYWith });\n }\n\n dataBoundsList.push(singleSeries.dataBounds);\n\n if (singleSeries.expandYWith) {\n this._expandYWith.push(singleSeries.expandYWith);\n }\n }\n\n this._unsubscribeFromStaleSeries();\n\n this._dataBounds = mergeBounds(dataBoundsList);\n\n this._recalculateSelection({ disableSwap: true});\n\n for (let singleSeries of this._series) {\n if (singleSeries.hidden) {\n continue;\n }\n\n singleSeries.selectedBounds = calculateDataBounds(singleSeries.inSelectedSpace.data, { percentile: this._percentile, percentileAsymmetry: this._percentileAsymmetry });\n if (singleSeries.hasAreaBottom) {\n singleSeries.selectedBoundsAreaTop = singleSeries.selectedBounds;\n singleSeries.selectedBoundsAreaBottom = calculateDataBounds(singleSeries.inSelectedSpaceAreaBottom.data, { percentile: this._percentile, percentileAsymmetry: this._percentileAsymmetry });\n\n singleSeries.selectedBounds = mergeBounds([\n singleSeries.selectedBoundsAreaTop,\n singleSeries.selectedBoundsAreaBottom\n ]);\n }\n }\n\n this._recalculateAxisBounds();\n\n for (let singleSeries of this._series) {\n if (singleSeries.hidden) {\n continue;\n }\n\n this._calculatePrimarySizeDependents(singleSeries, { dataChanged: true });\n this._calculateRangeGraphSizeDependents(singleSeries, { dataChanged: true });\n }\n }\n\n _onDataAdd(modifiedSeries) {\n const newData = new Map();\n const modifiedAxes = new Set();\n\n const modifiedSeriesAndDependents = new Set();\n for (let singleSeries of modifiedSeries) {\n modifiedSeriesAndDependents.add(singleSeries);\n }\n\n for (let singleSeries of modifiedSeries) {\n modifiedAxes.add(singleSeries.axis);\n\n if (!singleSeries.inDataSpace) {\n throw new Error('inDataSpace must be present for onDataAdd to be called');\n }\n\n const simpleData = this._seriesToSimpleData(singleSeries);\n\n let prevY;\n if (singleSeries.inDataSpace.length) {\n prevY = singleSeries.inDataSpace[singleSeries.inDataSpace.length - 1][1];\n }\n\n const newDataInDataSpace = simpleSeriesToDataSpace(singleSeries, {\n data: simpleData.slice(singleSeries.simpleDataSliceStart || 0),\n valueXStart: singleSeries.inDataSpace.length,\n prevY,\n stateController: this\n });\n newData.set(singleSeries, newDataInDataSpace);\n singleSeries.simpleDataSliceStart = simpleData.length;\n\n if (newDataInDataSpace.length < 32) {\n singleSeries.inDataSpace.push(...newDataInDataSpace);\n } else {\n for (let point of newDataInDataSpace) {\n singleSeries.inDataSpace.push(point);\n }\n }\n\n let newDataBounds = calculateDataBounds(newDataInDataSpace);\n if (singleSeries.rendering === 'bar') {\n newDataBounds = expandBounds(newDataBounds, { extendXForNBars: singleSeries.inDataSpace.length, expandYWith: singleSeries.expandYWith });\n }\n\n singleSeries.dataBounds = mergeBounds([singleSeries.dataBounds, newDataBounds]);\n this._dataBounds = mergeBounds([this._dataBounds, newDataBounds]);\n\n // save these off for debugging only\n singleSeries.newPointCount = newDataInDataSpace.length;\n singleSeries.newDataBounds = newDataBounds;\n }\n\n const previousSelection = this._selection;\n this._recalculateSelection();\n\n for (let singleSeries of modifiedSeries) {\n if (!singleSeries.inSelectedSpace.data.length) { // empty, trivially fast\n singleSeries.selectedBounds = calculateDataBounds(singleSeries.inSelectedSpace.data);\n continue;\n }\n\n const firstX = singleSeries.inSelectedSpace.data[0][0];\n const lastX = singleSeries.inSelectedSpace.data[singleSeries.inSelectedSpace.data.length - 1][0];\n\n const oldBoundSubsetOfNewBounds = previousSelection.minX >= firstX && previousSelection.maxX <= lastX;\n\n if (!oldBoundSubsetOfNewBounds || this._percentile !== 100) {\n // this is significantly slower, but it's too complex to diff the old bounds and new bounds or diff percentiles\n // besides, it not being a subset hopefully means its a lower volume of data\n singleSeries.selectedBounds = calculateDataBounds(singleSeries.inSelectedSpace.data, { percentile: this._percentile, percentileAsymmetry: this._percentileAsymmetry});\n if (singleSeries.hasAreaBottom) {\n singleSeries.selectedBoundsAreaTop = singleSeries.selectedBounds;\n singleSeries.selectedBoundsAreaBottom = calculateDataBounds(singleSeries.inSelectedSpaceAreaBottom.data, { percentile: this._percentile, percentileAsymmetry: this._percentileAsymmetry });\n\n singleSeries.selectedBounds = mergeBounds([\n singleSeries.selectedBoundsAreaTop,\n singleSeries.selectedBoundsAreaBottom\n ]);\n }\n continue;\n }\n\n // note: we could do a binary search here, but there are typically only a few points added each frame, so it isn't worth it\n const newSelectedData = newData.get(singleSeries)\n .filter((tuple) => tuple[0] >= this._selection.minX && tuple[0] <= this._selection.maxX);\n\n singleSeries.newSelectedData = newSelectedData;\n singleSeries.selectedBounds = mergeBounds([singleSeries.selectedBounds, calculateDataBounds(newSelectedData)]);\n }\n\n this._recalculateAxisBounds();\n\n this.deferredPriorityEmit('axis_bounds_changed', this._axes.map(({ currentBounds }) => currentBounds));\n\n for (let axis of modifiedAxes) {\n for (let singleSeries of axis.series) {\n this._calculatePrimarySizeDependents(singleSeries);\n this._calculateRangeGraphSizeDependents(singleSeries);\n }\n }\n }\n\n _recalculateAxisBounds() {\n for (let axis of this._axes) {\n if (this._selection.fixedY || !this._autoscaleY) {\n axis.targetBounds = this._selection;\n if (axis.targetBounds.byAxis) {\n axis.targetBounds = axis.targetBounds.byAxis[axis.axisIndex];\n }\n\n axis.currentBounds = axis.targetBounds;\n continue;\n }\n\n const selectedBoundsList = [];\n const expandYWith = [];\n\n for (let singleSeries of axis.series) {\n selectedBoundsList.push(singleSeries.selectedBounds);\n\n if (singleSeries.expandYWith) {\n expandYWith.push(...singleSeries.expandYWith);\n }\n\n if (singleSeries.rendering === 'bar') {\n expandYWith.push(singleSeries.selectedBounds.minY, singleSeries.selectedBounds.maxY);\n }\n }\n\n axis.selectedDataBounds = mergeBounds(selectedBoundsList);\n axis.targetBounds = axis.currentBounds = expandBounds(axis.selectedDataBounds, {expandYWith});\n }\n this.deferredPriorityEmit('axis_bounds_changed', this._axes.map(({ currentBounds }) => currentBounds));\n }\n\n /**\n * Recalculates global bounds, selection, and data in selected space (for each series)\n * REQUIRES that this._dataBounds and this._expandYWith are set & up-to-date\n *\n * @private\n */\n _recalculateSelection({disableSwap = false}={}) {\n this._globalBounds = expandBounds(this._dataBounds, {expandYWith: this._expandYWith.flat()});\n this.deferredPriorityEmit('global_bounds_changed', this._globalBounds);\n this._selection = selectionFromGlobalBounds(this._globalBounds, this._boundsCalculator);\n this.deferredPriorityEmit('selection_changed', this._selection);\n\n for (let singleSeries of this._series) {\n if (singleSeries.hidden) {\n continue;\n }\n\n singleSeries.inSelectedSpace = dataSpaceToSelectedSpace({\n data: singleSeries.hasAreaBottom ? singleSeries.inDataSpace.filter((_, i) => i % 2 === 1) : singleSeries.inDataSpace,\n swap: disableSwap ? null : singleSeries.inSelectedSpace,\n minX: this._selection.minX,\n maxX: this._selection.maxX,\n ignoreDiscontinuities: singleSeries.ignoreDiscontinuities,\n square: singleSeries.square\n });\n\n if (singleSeries.hasAreaBottom) {\n singleSeries.inSelectedSpaceAreaBottom = dataSpaceToSelectedSpace({\n data:singleSeries.inDataSpace.filter((_, i) => i % 2 === 0),\n swap: disableSwap ? null : singleSeries.inSelectedSpaceAreaBottom,\n minX: this._selection.minX,\n maxX: this._selection.maxX,\n ignoreDiscontinuities: singleSeries.ignoreDiscontinuities,\n square: singleSeries.square\n });\n }\n }\n }\n\n _render() {\n if (!this.primaryRenderer || !this.primaryRenderer.sizing) {\n return;\n }\n\n this.primaryRenderer.clear();\n if (this.rangeGraphRenderer) {\n this.rangeGraphRenderer.clear();\n }\n\n for (let singleSeries of this._series) {\n if (singleSeries.hidden) {\n continue;\n }\n\n const shadowColor = singleSeries.shadowColor || {\n day: 'white',\n export: 'transparent',\n night: 'black'\n }[this._theme] || 'black';\n\n const shadowBlur = undefined;\n\n this.primaryRenderer.renderBackground(singleSeries.inBackgroundSpacePrimary);\n\n this.primaryRenderer.render(singleSeries, singleSeries.inRenderSpacePrimary, {\n highlighted: this._highlightedSeries === singleSeries.index,\n showIndividualPoints: this._showIndividualPoints,\n shadowColor,\n shadowBlur,\n defaultLineWidth: this._defaultLineWidth,\n globalBounds: this._globalBounds,\n inRenderSpaceAreaBottom: singleSeries.inRenderSpacePrimaryAreaBottom\n });\n\n if (this.rangeGraphRenderer && this.rangeGraphRenderer.sizing) {\n // Use tighter bounds for range graph to prevent clipping\n const rangeGraphBounds = {\n ...this._globalBounds,\n minY: this._globalBounds.unscaledMinY !== undefined ? this._globalBounds.unscaledMinY : this._globalBounds.minY,\n maxY: this._globalBounds.unscaledMaxY !== undefined ? this._globalBounds.unscaledMaxY : this._globalBounds.maxY\n };\n \n this.rangeGraphRenderer.render(singleSeries, singleSeries.inRenderSpaceRangeGraph, {\n shadowColor: 'transparent',\n shadowBlur: 0,\n width: 1,\n showIndividualPoints: false,\n bounds: rangeGraphBounds,\n globalBounds: rangeGraphBounds,\n inRenderSpaceAreaBottom: singleSeries.inRenderSpaceRangeGraphAreaBottom\n });\n }\n }\n }\n\n _calculatePrimarySizeDependents(singleSeries, { dataChanged=false } = {}) {\n if (!this.primaryRenderer || !this.primaryRenderer.sizing) {\n return;\n }\n\n if (!singleSeries) {\n for (let s of this._series) {\n this._calculatePrimarySizeDependents(s);\n }\n return;\n }\n\n if (!this._series.includes(singleSeries)) {\n throw new Error('Series no longer exists');\n }\n\n if (singleSeries.hidden) {\n return;\n }\n\n const { currentBounds, scale } = singleSeries.axis;\n const renderWidth = Math.ceil(this.primaryRenderer.sizing.renderWidth/DPI_INCREASE);\n const renderHeight = Math.ceil(this.primaryRenderer.sizing.renderHeight);\n\n const toCondensedSelectedSpaceParams = {\n minX: currentBounds.minX,\n maxX: currentBounds.maxX,\n renderWidth,\n dataChanged\n };\n\n singleSeries.inCondensedSelectedSpacePrimary = condenseDataSpace({\n data: singleSeries.inSelectedSpace.data,\n swap: singleSeries.inCondensedSelectedSpacePrimary,\n ...toCondensedSelectedSpaceParams\n });\n\n const toRenderSpaceParams = {\n minX: currentBounds.minX,\n maxX: currentBounds.maxX,\n minY: currentBounds.minY,\n maxY: currentBounds.maxY,\n renderWidth,\n renderHeight,\n scale,\n dataChanged\n };\n\n singleSeries.inRenderSpacePrimary = selectedSpaceToRenderSpace({\n data: singleSeries.inCondensedSelectedSpacePrimary.data,\n swap: singleSeries.inRenderSpacePrimary,\n ...toRenderSpaceParams\n });\n\n singleSeries.inBackgroundSpacePrimary = selectedSpaceToBackgroundSpace({\n data: singleSeries.inCondensedSelectedSpacePrimary.data,\n background: singleSeries.background,\n swap: singleSeries.inBackgroundSpacePrimary,\n minX: currentBounds.minX,\n maxX: currentBounds.maxX\n });\n\n if (singleSeries.hasAreaBottom) {\n singleSeries.inCondensedSelectedSpacePrimaryAreaBottom = condenseDataSpace({\n data: singleSeries.inSelectedSpaceAreaBottom.data,\n swap: singleSeries.inCondensedSelectedSpacePrimaryAreaBottom,\n ...toCondensedSelectedSpaceParams\n });\n\n singleSeries.inRenderSpacePrimaryAreaBottom = selectedSpaceToRenderSpace({\n data: singleSeries.inCondensedSelectedSpacePrimaryAreaBottom.data,\n swap: singleSeries.inRenderSpacePrimaryAreaBottom,\n ...toRenderSpaceParams\n });\n\n singleSeries.inBackgroundSpacePrimaryAreaBottom = selectedSpaceToBackgroundSpace({\n data: singleSeries.inCondensedSelectedSpacePrimaryAreaBottom.data,\n background: singleSeries.background,\n swap: singleSeries.inBackgroundSpacePrimaryAreaBottom,\n minX: currentBounds.minX,\n maxX: currentBounds.maxX\n });\n }\n }\n\n _calculateRangeGraphSizeDependents(singleSeries, { dataChanged=false } = {}) {\n if (!this.rangeGraphRenderer || !this.rangeGraphRenderer.sizing) {\n return;\n }\n\n if (!singleSeries) {\n for (let s of this._series) {\n this._calculateRangeGraphSizeDependents(s);\n }\n return;\n }\n\n if (!this._series.includes(singleSeries)) {\n throw new Error('Series no longer exists');\n }\n\n if (singleSeries.hidden) {\n return;\n }\n\n const { scale } = singleSeries.axis;\n const globalBounds = this._globalBounds;\n \n const rangeGraphBounds = {\n ...globalBounds,\n minY: globalBounds.unscaledMinY !== undefined ? globalBounds.unscaledMinY : globalBounds.minY,\n maxY: globalBounds.unscaledMaxY !== undefined ? globalBounds.unscaledMaxY : globalBounds.maxY\n };\n \n const renderWidth = Math.ceil(this.rangeGraphRenderer.sizing.renderWidth/DPI_INCREASE);\n const renderHeight = Math.ceil(this.rangeGraphRenderer.sizing.renderHeight);\n\n const toSelectedSpaceParams = {\n minX: globalBounds.minX,\n maxX: globalBounds.maxX,\n ignoreDiscontinuities: singleSeries.ignoreDiscontinuities,\n square: singleSeries.square\n };\n\n singleSeries.inSelectedSpaceRangeGraph = dataSpaceToSelectedSpace({\n data: singleSeries.hasAreaBottom ? singleSeries.inDataSpace.filter((_, i) => i % 2 === 1) : singleSeries.inDataSpace,\n swap: singleSeries.inSelectedSpaceRangeGraph,\n ...toSelectedSpaceParams\n });\n\n const toCondensedSelectedSpaceParams = {\n minX: globalBounds.minX,\n maxX: globalBounds.maxX,\n renderWidth,\n dataChanged\n };\n\n singleSeries.inCondensedSelectedSpaceRangeGraph = condenseDataSpace({\n data: singleSeries.inSelectedSpaceRangeGraph.data,\n swap: singleSeries.inCondensedSelectedSpaceRangeGraph\n });\n\n const toRenderSpaceParams = {\n minX: rangeGraphBounds.minX,\n maxX: rangeGraphBounds.maxX,\n minY: rangeGraphBounds.minY,\n maxY: rangeGraphBounds.maxY,\n renderWidth,\n renderHeight,\n scale,\n dataChanged\n };\n\n singleSeries.inRenderSpaceRangeGraph = selectedSpaceToRenderSpace({\n data: singleSeries.inCondensedSelectedSpaceRangeGraph.data,\n swap: singleSeries.inRenderSpaceRangeGraph,\n ...toRenderSpaceParams\n });\n\n if (singleSeries.hasAreaBottom) {\n singleSeries.inSelectedSpaceRangeGraphAreaBottom = dataSpaceToSelectedSpace({\n data: singleSeries.inDataSpace.filter((_, i) => i % 2 === 0), // take the odd points for area bottom\n swap: singleSeries.inSelectedSpaceRangeGraphAreaBottom,\n ...toSelectedSpaceParams\n });\n\n singleSeries.inCondensedSelectedSpaceRangeGraphAreaBottom = condenseDataSpace({\n data: singleSeries.inSelectedSpaceRangeGraphAreaBottom.data,\n swap: singleSeries.inCondensedSelectedSpaceRangeGraphAreaBottom,\n ...toCondensedSelectedSpaceParams\n });\n\n singleSeries.inRenderSpaceRangeGraphAreaBottom = selectedSpaceToRenderSpace({\n data: singleSeries.inCondensedSelectedSpaceRangeGraphAreaBottom.data,\n swap: singleSeries.inRenderSpaceRangeGraphAreaBottom,\n ...toRenderSpaceParams\n });\n }\n }\n\n _createAxis({ side }) {\n const axis = {\n series: [],\n scale: 'linear',\n side,\n axisIndex: this._axes.length\n };\n this._axes.push(axis);\n return axis;\n }\n\n _moveAxis(singleSeries, axisIndex) {\n if (!this._series.includes(singleSeries)) {\n throw new Error('Series no longer exists');\n }\n\n let newAxis;\n if (axisIndex === 'new-left' || axisIndex === 'new-right') {\n newAxis = this._createAxis({ side: axisIndex.split('-')[1] });\n } else {\n newAxis = this._axes[parseInt(axisIndex)];\n }\n\n if (singleSeries.axis === newAxis) {\n return;\n }\n\n const oldAxis = singleSeries.axis;\n const oldIndex = oldAxis.series.indexOf(singleSeries);\n if (oldIndex === -1) {\n throw new Error('Series not present in axis');\n }\n oldAxis.series.splice(oldIndex, 1);\n\n newAxis.series.push(singleSeries);\n singleSeries.axis = newAxis;\n\n this._dataChanged = true;\n this.deferredEmit('axes_changed', this._axes);\n this.deferredEmit('left_axes_changed', this.leftAxes);\n this.deferredEmit('right_axes_changed', this.rightAxes);\n this.deferredEmit('exported_axes_changed', this.exportedAxes);\n this._markDirty();\n }\n\n _assignAxisTo(singleSeries) {\n if (singleSeries.axis && typeof singleSeries.axis === 'object') {\n return;\n }\n\n let axis;\n\n if (singleSeries.axisIndex) {\n const { axisIndex } = singleSeries;\n\n if (axisIndex === 'new-left' || axisIndex === 'new-right') {\n axis = this._createAxis({ side: axisIndex.split('-')[1] });\n } else {\n axis = this._axes[parseInt(axisIndex)];\n }\n } else if (singleSeries.axis) {\n singleSeries.originalAxis = singleSeries.axis;\n let [side, number] = singleSeries.axis.split('-');\n axis = findMatchingAxis({ axes: this._axes, side, number });\n\n if (!axis) {\n axis = this._createAxis({\n side\n });\n }\n } else {\n axis = this._axes[0];\n }\n\n axis.series.push(singleSeries);\n singleSeries.axis = axis;\n\n this.deferredEmit('axes_changed', this._axes);\n this.deferredEmit('exported_axes_changed', this.exportedAxes);\n\n if (singleSeries.axis.side === 'left') {\n this.deferredEmit('left_axes_changed', this.leftAxes);\n } else {\n this.deferredEmit('right_axes_changed', this.rightAxes);\n }\n }\n\n _removeSeries(singleSeries) {\n this._seriesFromOriginalSeries.delete(singleSeries.originalSeries);\n\n const { axis, data } = singleSeries;\n axis.series.splice(axis.series.indexOf(singleSeries), 1);\n const sameDataSet = this._observablesToSeries.get(data);\n if (sameDataSet) {\n sameDataSet.delete(singleSeries);\n if (sameDataSet.size === 0) {\n this._observablesToSeries.delete(data);\n }\n }\n\n if (this._generatorsToSeries.has(data)) {\n this._generatorsToSeries.get(data).delete(singleSeries);\n if (this._generatorsToSeries.get(data).size === 0) {\n this._generatorsToSeries.delete(data);\n this._generators.delete(data);\n }\n }\n\n this._alwaysTooltipped.delete(singleSeries);\n\n singleSeries.axis = singleSeries.originalAxis;\n delete singleSeries.originalAxis;\n delete singleSeries.inDataSpace;\n delete singleSeries.inSelectedSpace;\n delete singleSeries.inValueSpacePrimary;\n delete singleSeries.inValueSpaceRangeGraph;\n delete singleSeries.inRenderSpacePrimary;\n delete singleSeries.inRenderSpaceRangeGraph;\n delete singleSeries.newPointCount;\n delete singleSeries.newDataBounds;\n delete singleSeries.simpleDataSliceStart;\n\n this.deferredEmit('axes_changed', this._axes);\n this.deferredEmit('exported_axes_changed', this.exportedAxes);\n\n if (axis.side === 'left') {\n this.deferredEmit('left_axes_changed', this.leftAxes);\n } else {\n this.deferredEmit('right_axes_changed', this.rightAxes);\n }\n }\n\n _hideSeries(singleSeries) {\n const { axis } = singleSeries;\n const indexInAxis = axis.series.indexOf(singleSeries);\n singleSeries.indexInAxis = indexInAxis;\n axis.series.splice(indexInAxis, 1);\n\n this.deferredEmit('axes_changed', this._axes);\n\n if (axis.side === 'left') {\n this.deferredEmit('left_axes_changed', this.leftAxes);\n } else {\n this.deferredEmit('right_axes_changed', this.rightAxes);\n }\n }\n\n _showSeries(singleSeries) {\n const { axis } = singleSeries;\n axis.series.splice(singleSeries.indexInAxis, 0, singleSeries);\n\n this.deferredEmit('axes_changed', this._axes);\n\n if (axis.side === 'left') {\n this.deferredEmit('left_axes_changed', this.leftAxes);\n } else {\n this.deferredEmit('right_axes_changed', this.rightAxes);\n }\n }\n\n /*\n * Getters\n *******************\n */\n\n get boundCalculator() {\n return this._boundsCalculator;\n }\n\n get axes() {\n return this._axes;\n }\n\n get leftAxes() {\n const leftAxes = this._axes.filter(({ side, series }) => side === 'left' && series.length > 0).reverse();\n\n if (leftAxes.length === 0 && this.rightAxes.length === 0) {\n leftAxes.push(this._axes[0]);\n }\n\n return leftAxes;\n }\n\n get rightAxes() {\n return this._axes.filter(({ side, series }) => side === 'right' && series.length > 0 );\n }\n\n get bounds() {\n return this._axes.map(({ targetBounds }) => targetBounds);\n }\n\n get selection() {\n return this._selection;\n }\n\n get globalBounds() {\n return this._globalBounds;\n }\n\n get series() {\n return this._series;\n }\n\n get highlightedSeries() {\n return this._highlightedSeries;\n }\n\n get showIndividualPoints() {\n return this._showIndividualPoints;\n }\n\n get autoscaleY() {\n return this._autoscaleY;\n }\n\n get boundHistory() {\n return {\n hasNextBounds: this._boundsIndex < this._boundsHistory.length - 1,\n hasPreviousBounds: this._boundsIndex > 0\n };\n }\n\n get tooltipState() {\n return this._tooltipState;\n }\n \n get contextMenuState() {\n return this._contextMenuPosition;\n }\n\n get alwaysTooltipped() {\n return this._alwaysTooltipped;\n }\n\n get draggingY() {\n return this._draggingY;\n }\n\n get averageLoopTime() {\n return averageLoopTimes(this._timingBuffer);\n }\n\n get exportedAxes() {\n const axisToName = new Map();\n let leftCount = 0;\n let rightCount = 0;\n\n for (let axis of this._axes) {\n let name;\n if (axis.side === 'left') {\n name = `left-${leftCount}`;\n leftCount++;\n } else {\n name = `right-${rightCount}`;\n rightCount++;\n }\n\n for (let singleSeries of axis.series) {\n axisToName.set(singleSeries, name);\n }\n }\n\n return this.series.map((singleSeries) => {\n return {\n ...singleSeries.originalSeries,\n axis: axisToName.get(singleSeries)\n };\n });\n }\n\n get percentile() {\n return this._percentile;\n }\n\n get percentileAsymmetry() {\n return this._percentileAsymmetry;\n }\n\n get showingOptions() {\n return this._showingOptions;\n }\n\n get maxPrecision() {\n return this._maxPrecision;\n }\n\n get showingSidebar() {\n return this._showingSidebar;\n }\n\n get showingAnnotations() {\n return this._showingAnnotations;\n }\n\n get userCreatedSeries() {\n return this._series.filter((singleSeries) => singleSeries.userCreated);\n }\n\n get grapherID() {\n return this._grapherID;\n }\n\n get annotationState() {\n return this._annotationsState;\n }\n\n get sizing() {\n return this.primaryRenderer && this.primaryRenderer.sizing;\n }\n\n get theme() {\n return this._theme;\n }\n\n get exportMode() {\n return this._exportMode;\n }\n\n get enumMap() {\n return this._enumMap;\n }\n\n get hasXEnum() {\n return this._hasXEnum;\n }\n\n /*\n * Setters / ways to mutate the state that aren't the underlying data changing\n ***********************************************************************************\n */\n\n markSizeChanged(renderer) {\n if (renderer === this.primaryRenderer) {\n this.deferredEmit('primary_size_change', this.primaryRenderer.sizing);\n this.deferredEmit('primary_bounding_rect_change', this.primaryRenderer.boundingRect);\n this._primarySizeChanged = true;\n } else if (renderer === this.rangeGraphRenderer) {\n this.deferredEmit('range_graph_size_change', this.rangeGraphRenderer.sizing);\n this.deferredEmit('range_graph_bounding_rect_change', this.rangeGraphRenderer.boundingRect);\n this._rangeGraphSizeChanged = true;\n }\n\n this._mustRerender = true;\n this._tooltipsChanged = true;\n this._annotationsChanged = true;\n this._mustCallGenerators = true;\n this._markDirty();\n }\n\n set theme(value) {\n this._theme = value;\n this._mustRerender = true;\n this.deferredEmit('theme_change', this._theme);\n this._markDirty();\n }\n\n set exportMode(value) {\n this._exportMode = value;\n\n if (value) {\n this._nonExportTheme = this.theme;\n this.theme = 'export';\n } else {\n this.theme = this._nonExportTheme;\n }\n\n this.deferredEmit('export_mode_change', this._exportMode);\n this._markDirty();\n }\n\n set defaultLineWidth(value) {\n this._defaultLineWidth = value;\n this._mustRerender = true;\n this._markDirty();\n }\n\n set boundCalculator(boundingFunction) {\n if (!boundingFunction) {\n return;\n }\n\n if (boundingFunction === this._boundsCalculator) {\n return;\n }\n\n if (boundingFunction.debounceHistory) {\n clearTimeout(this._boundingCalculatorDebouncer);\n this._boundingCalculatorDebouncer = setTimeout(() => {\n this._addBoundCalculatorToHistory(boundingFunction);\n }, 250);\n } else {\n this._addBoundCalculatorToHistory(boundingFunction);\n }\n\n this._boundsCalculator = boundingFunction;\n this.deferredEmit('bound_calculator_changed', this._boundsCalculator);\n this._dataChanged = true;\n this._mustCallGenerators = true;\n this._markDirty();\n }\n\n set customBoundsSelectors(boundsSelectors) {\n this._customBoundsSelectors = this._customBoundsSelectors || {};\n\n const indexedCustomBoundSelectors = {};\n\n for (let { label, calculator } of boundsSelectors) {\n indexedCustomBoundSelectors[label] = calculator;\n\n if (this._boundsCalculator === this._customBoundsSelectors[label] && this._boundsCalculator !== calculator) {\n this.boundCalculator = calculator;\n }\n }\n\n this._customBoundsSelectors = indexedCustomBoundSelectors;\n }\n\n _addBoundCalculatorToHistory(boundingFunction) {\n this._boundsIndex++;\n this._boundsHistory = this._boundsHistory.slice(0, this._boundsIndex);\n this._boundsHistory.push(boundingFunction);\n this.emit('bound_history_changed', this.boundHistory);\n }\n\n registerSeriesClick(selectedSeriesIndex) {\n this.emit('series_click', this._series[selectedSeriesIndex], selectedSeriesIndex);\n }\n\n setHighlightedSeries(highlightedSeries) {\n this._highlightedSeries = highlightedSeries;\n this.deferredEmit('highlighted_series_changed', highlightedSeries);\n this._mustRerender = true;\n this._markDirty();\n }\n\n toggleIndividualPoints() {\n this._showIndividualPoints = !this._showIndividualPoints;\n this.deferredEmit('show_individual_points_changed', this._showIndividualPoints);\n this._mustRerender = true;\n this._markDirty();\n }\n\n toggleYAutoscaling() {\n this._autoscaleY = !this._autoscaleY;\n this.deferredEmit('autoscale_y_changed', this._autoscaleY);\n this._markDirty();\n }\n\n toggleExportMode() {\n this.exportMode = !this._exportMode;\n }\n\n setBoundsFromSelection(pixelSelection) {\n this.boundCalculator = boundCalculatorFromSelection(pixelSelection, {\n elementWidth: this.primaryRenderer.sizing.elementWidth,\n elementHeight: this.primaryRenderer.sizing.elementHeight,\n selection: this._selection,\n axes: this._axes\n });\n }\n\n nextBounds() {\n this._boundsIndex++;\n this._boundsCalculator = this._boundsHistory[this._boundsIndex];\n this.deferredEmit('bound_calculator_changed', this._boundsCalculator);\n this.deferredEmit('bound_history_changed', this.boundHistory);\n this._dataChanged = true;\n this._markDirty();\n }\n\n previousBounds() {\n this._boundsIndex--;\n this._boundsCalculator = this._boundsHistory[this._boundsIndex];\n this.deferredEmit('bound_calculator_changed', this._boundsCalculator);\n this.deferredEmit('bound_history_changed', this.boundHistory);\n this._dataChanged = true;\n this._markDirty();\n }\n\n setLabel({ axisIndex, label }) {\n this._axes[axisIndex].label = label;\n this.deferredEmit('axes_changed', [...this._axes]);\n this._markDirty();\n }\n\n toggleScale({ axisIndex }) {\n const oldScale = this._axes[axisIndex].scale;\n this._axes[axisIndex].scale = oldScale === 'log' ? 'linear' : 'log';\n\n this._dataChanged = true;\n this.deferredEmit('axes_changed', [...this._axes]);\n this._markDirty();\n }\n\n recalculateTooltips() {\n this.primaryRenderer.recalculatePosition();\n this.setTooltipMousePosition({\n clientX: this._tooltipClientX,\n clientY: this._tooltipClientY,\n shiftKey: this.shiftKeyPressedOnMove,\n tooltipAllNext: this._tooltipAllNext,\n tooltipStateArg: this._tooltipStateArg\n });\n }\n\n setTooltipMousePosition({ clientX, clientY, shiftKey, mouseX, mouseY, tooltipAllNext, tooltipStateArg }) {\n const sizing = this.primaryRenderer.sizing;\n if (!sizing) {\n return;\n }\n\n if (typeof clientX === 'number') {\n this._tooltipClientX = clientX;\n\n if (clientX < sizing.boundingRect.left || clientX > sizing.boundingRect.right) {\n this.showOnlySavedTooltips();\n return;\n }\n } else if (typeof mouseY !== 'number') {\n return;\n }\n\n if (typeof clientY === 'number') {\n this._tooltipClientY = clientY;\n\n if (clientY < sizing.boundingRect.top || clientY > sizing.boundingRect.bottom) {\n this.showOnlySavedTooltips();\n return;\n }\n } else if (typeof mouseY !== 'number') {\n return;\n }\n\n const newMouseX = mouseX || (clientX - sizing.boundingRect.left);\n const newMouseY = mouseY || (clientY - sizing.boundingRect.top);\n if (this._tooltipState.mousePresent && newMouseX === this._tooltipState.mouseX && newMouseY === this._tooltipState.mouseY) {\n return;\n }\n\n this._tooltipsChanged = true;\n this._tooltipState.mousePresent = true;\n this._tooltipState.mouseX = newMouseX;\n this._tooltipState.mouseY = newMouseY;\n this.shiftKeyPressedOnMove = shiftKey;\n this._tooltipAllNext = tooltipAllNext;\n this._tooltipStateArg = tooltipStateArg;\n this._markDirty();\n }\n \n setContextMenuMousePosition({ clientX, clientY }) {\n this._contextMenuPosition = { x: clientX, y: clientY, showing: !this._contextMenuPosition.showing };\n this._contextMenuChanged = true;\n this._markDirty();\n }\n\n toggleAlwaysTooltipped(singleSeries, shiftKey) {\n if (this._alwaysTooltipped.has(singleSeries)) {\n if (shiftKey) {\n this._alwaysTooltipped.clear();\n } else {\n this._alwaysTooltipped.delete(singleSeries);\n }\n } else {\n if (shiftKey) {\n for (let series of this._series) {\n this._alwaysTooltipped.add(series);\n }\n } else {\n this._alwaysTooltipped.add(singleSeries);\n }\n }\n\n this._tooltipsChanged = true;\n this.deferredEmit('always_tooltipped_changed', this._alwaysTooltipped);\n this._markDirty();\n }\n\n showOnlySavedTooltips(tooltipStateArg) {\n if (!this._tooltipState.mousePresent) {\n return;\n }\n\n this._tooltipsChanged = true;\n this._tooltipState.mousePresent = false;\n this._tooltipStateArg = tooltipStateArg;\n this._markDirty();\n }\n\n registerClick({ clientX }) {\n if (!this._listeners['series_click']) {\n return;\n }\n\n const boundingRect = this.primaryRenderer.boundingRect;\n const sizing = this.primaryRenderer.sizing;\n\n for (let series of this._series) {\n const bounds = series.axis.currentBounds;\n\n const x = (clientX - boundingRect.left) / sizing.elementWidth * (bounds.maxX - bounds.minX) + bounds.minX;\n this.emit('series_click', { x, series });\n }\n }\n\n toggleTooltipSaved() {\n const oldSavedTooltips = this._savedTooltips;\n this._savedTooltips = toggleTooltipSaved({\n currentTooltips: this._tooltipState.tooltips,\n savedTooltips: this._savedTooltips\n });\n this._tooltipsChanged = this._savedTooltips !== oldSavedTooltips;\n this._markDirty();\n }\n\n clearSavedTooltips() {\n if (this._savedTooltips.length === 0) {\n return;\n }\n\n this._savedTooltips = [];\n this._tooltipsChanged = true;\n this._markDirty();\n }\n\n markDragStart() {\n if (this._draggingY) {\n return;\n }\n\n this._draggingY = true;\n this.deferredEmit('dragging_y_changed', this._draggingY);\n this._markDirty();\n }\n\n finalizeDrag(draggedSeries, axisIndex, grapherID) {\n if (!this._draggingY) {\n return;\n }\n\n this._draggingY = false;\n this.deferredEmit('dragging_y_changed', this._draggingY);\n\n const hasAxis = axisIndex && axisIndex !== 0;\n const sameGrapherID = grapherID === this._grapherID;\n\n if (hasAxis && sameGrapherID) {\n this._moveAxis(draggedSeries, axisIndex);\n this.deferredEmit('dragging_y_finalized', { draggedSeries, axisIndex, grapherID });\n } else if (grapherID) {\n this.deferredEmit('dragging_y_finalized', { draggedSeries, axisIndex, grapherID });\n }\n\n this._markDirty();\n }\n\n set timingFrameCount(value) {\n if (typeof value !== 'number') {\n return;\n }\n\n this._timingBuffer = [];\n this._timingIndex = 0;\n this._timingFrameCount = value;\n }\n\n set percentile(value) {\n if (value === undefined) {\n return;\n }\n\n this.deferredEmit('percentile_changed', value);\n\n if (value === '') {\n value = 100;\n }\n\n value = parseFloat(value);\n if (!isNaN(value) && value <= 100 && value >= 0) {\n this._percentile = value;\n this._dataChanged = true;\n }\n\n this._markDirty();\n }\n\n set percentileAsymmetry(value) {\n if (value === undefined) {\n return;\n }\n\n this.deferredEmit('percentile_asymmetry_changed', value);\n\n if (value === '') {\n value = 0;\n }\n\n value = parseFloat(value);\n if (!isNaN(value) && value <= 50 && value >= -50) {\n this._percentileAsymmetry = value;\n this._dataChanged = true;\n }\n\n this._markDirty();\n }\n\n set showingOptions(value) {\n if (value === undefined) {\n return;\n }\n\n this._showingOptions = value;\n this.deferredEmit('showing_options_changed', value);\n this._markDirty();\n }\n\n toggleShowingOptions() {\n this.showingOptions = !this.showingOptions;\n }\n\n toggleMaxPrecision() {\n this._maxPrecision = !this._maxPrecision;\n this.deferredEmit('max_precision_changed', this._maxPrecision);\n this._markDirty();\n }\n\n toggleShowingAnnotations() {\n this._showingAnnotations = !this._showingAnnotations;\n this.deferredEmit('showing_annotations_changed', this._showingAnnotations);\n this._markDirty();\n }\n\n toggleShowingSidebar() {\n this._showingSidebar = !this._showingSidebar;\n this.deferredEmit('showing_sidebar_changed', this._showingSidebar);\n this._markDirty();\n }\n\n setShowing(singleSeries, showing) {\n singleSeries.hidden = !showing;\n this._series = [...this._series];\n\n if (singleSeries.hidden) {\n this._hideSeries(singleSeries);\n } else {\n this._showSeries(singleSeries);\n }\n\n this.deferredEmit('series_changed', this._series, { skipResize: true });\n this._dataChanged = true;\n this._markDirty();\n }\n\n set annotations(value) {\n this._annotations = value || [];\n this._annotationsChanged = true;\n this._markDirty();\n }\n\n /**\n * Converts an enum to a number, mutating saved state if necessary to track that\n *\n * @param {String} value\n * @param {Object} singleSeries\n * @param {Boolean} [isX]\n * @return {Number}\n */\n enumToNumber(value, singleSeries, isX) {\n const existingIndex = this._enumMap[value];\n if (typeof existingIndex === 'number') {\n return existingIndex;\n }\n\n const indexToSet = Object.keys(this._enumMap).length;\n this._enumMap[value] = indexToSet;\n\n // safely handle reference changes\n this._series[singleSeries.index].hasEnum = true;\n if (isX) {\n this._series[singleSeries.index].hasXEnum = true;\n this._hasXEnum = true;\n this.deferredEmit('has_x_enum_change', this._hasXEnum);\n this.deferredEmit('x_enum_map_change', this._enumMap);\n }\n\n this.deferredEmit('enum_map_change', this._enumMap);\n\n return indexToSet;\n }\n\n triggerResize() {\n this._mustResize = true;\n this._markDirty();\n }\n}\n","import BOUND_CALCULATORS from './bound_calculators';\n\nexport default function getDefaultBoundsCalculator(givenLabel, customCalculators) {\n if (BOUND_CALCULATORS[givenLabel]) {\n return BOUND_CALCULATORS[givenLabel];\n }\n\n for (let { label, calculator } of customCalculators) {\n if (givenLabel === label) {\n return calculator;\n }\n }\n\n return BOUND_CALCULATORS.all;\n}\n","export default function generatorParamsEqual(a, b) {\n if (a === undefined || b === undefined) {\n return a === b;\n }\n\n return (a.minX === b.minX) &&\n (a.maxX === b.maxX) &&\n (a.sizing.elementWidth === b.sizing.elementWidth) &&\n (a.sizing.renderWidth === b.sizing.renderWidth);\n}\n","import nameForSeries from '../helpers/name_for_series.js';\n\nexport default function calculateAnnotationsState({ annotations, series, sizing, selection }) {\n const shownSeries = new Set(series.map((singleSeries, i) => {\n return {\n name: nameForSeries(singleSeries, i),\n hidden: singleSeries.hidden\n };\n }).filter(({ hidden }) => !hidden).map(({ name }) => name));\n\n const { elementWidth } = sizing;\n const { minX, maxX } = selection;\n const xRange = maxX - minX;\n\n // Avoid division by zero if minX === maxX\n if (xRange === 0) {\n return {\n annotations: [],\n elementWidth\n };\n }\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 const isRange = annotation.startX !== undefined && annotation.endX !== undefined;\n const isPoint = annotation.x !== undefined;\n\n let xStartValue = annotation.startX;\n let xEndValue = annotation.endX;\n\n if (!isRange && isPoint) {\n xStartValue = annotation.x;\n xEndValue = annotation.x;\n } else if (!isRange && !isPoint) {\n return null;\n }\n\n const convertToNumber = (val) => {\n if (typeof val === 'string') return new Date(val).valueOf();\n if (val instanceof Date) return val.valueOf();\n return val;\n };\n\n let startX = convertToNumber(xStartValue);\n let endX = convertToNumber(xEndValue);\n\n if (startX > endX) {\n [startX, endX] = [endX, startX];\n }\n\n let pixelStartX = (startX - minX) / xRange * elementWidth;\n let pixelEndX = (endX - minX) / xRange * elementWidth;\n\n // Clamp values to be within the element width\n pixelStartX = Math.max(0, Math.min(elementWidth, pixelStartX));\n pixelEndX = Math.max(0, Math.min(elementWidth, pixelEndX));\n\n let pixelWidth = pixelEndX - pixelStartX;\n if (pixelWidth < 1 && pixelEndX > 0 && pixelStartX < elementWidth) {\n if (!isRange && isPoint) {\n pixelWidth = 1;\n pixelStartX -= 0.5;\n } else if (isRange) {\n pixelWidth = 1;\n } else {\n pixelWidth = 0;\n }\n }\n \n pixelStartX = Math.max(0, Math.min(elementWidth - pixelWidth, pixelStartX));\n\n\n if (pixelWidth <= 0) {\n return null;\n }\n\n\n return {\n ...annotation,\n isRange,\n pixelStartX,\n pixelWidth\n };\n }).filter(annotation => annotation !== null);\n\n return {\n annotations: renderableAnnotations,\n elementWidth\n };\n}\n","export default function selectionFromGlobalBounds(globalBounds, boundsCalculator) {\n const targetBounds = Object.assign({}, globalBounds, boundsCalculator(globalBounds));\n\n if (targetBounds.maxX instanceof Date) {\n targetBounds.maxX = targetBounds.maxX.valueOf();\n }\n\n if (targetBounds.minX instanceof Date) {\n targetBounds.minX = targetBounds.minX.valueOf();\n }\n\n if (targetBounds.maxX < targetBounds.minX) {\n targetBounds.maxX = targetBounds.minX;\n }\n\n if (targetBounds.minX < globalBounds.minX) {\n targetBounds.minX = globalBounds.minX;\n }\n\n if (targetBounds.maxX > globalBounds.maxX) {\n targetBounds.maxX = globalBounds.maxX;\n }\n\n return targetBounds;\n}\n","/**\n *\n * @param {Array<Object>} axes\n * @param {'left'|'right'} [side]\n * @param {String|Number} [number]\n * @return {Object|undefined}\n */\nexport default function findMatchingAxis({ axes, side, number }) {\n if (number) {\n number = parseInt(number) || 0;\n } else {\n number = 0;\n }\n\n let axis;\n let seen = 0;\n for (let candidateAxis of axes) {\n if (candidateAxis.side !== side) {\n continue;\n }\n\n if (seen === number) {\n axis = candidateAxis;\n break;\n }\n\n seen++;\n }\n\n return axis;\n}\n","export function averageLoopTimes(loopTimes) {\n const result = {};\n\n for (let loopTime of loopTimes) {\n for (let [key, value] of Object.entries(loopTime)) {\n result[key] = (result[key] || 0) + value;\n }\n }\n\n for (let [key, value] of Object.entries(result)) {\n result[key] = value/loopTimes.length;\n }\n\n return result;\n}\n","import scaleBounds from '../renderer/scale_bounds';\n\nexport default function boundCalculatorFromSelection({ minPixelX, maxPixelX, minPixelY, maxPixelY}, { elementWidth, elementHeight, selection, axes }) {\n if (Math.abs(maxPixelX - minPixelX) < 1 || Math.abs(maxPixelY - minPixelY) < 1) {\n return;\n }\n\n const minX = (minPixelX/elementWidth)*(selection.maxX - selection.minX) + selection.minX;\n const maxX = (maxPixelX/elementWidth)*(selection.maxX - selection.minX) + selection.minX;\n\n const byAxis = [];\n for (let { currentBounds, scale } of axes) {\n const scaledBounds = scaleBounds({ ...currentBounds, scale });\n let maxY = (1 - minPixelY/elementHeight)*(scaledBounds.maxY - scaledBounds.minY) + scaledBounds.minY;\n let minY = (1 - maxPixelY/elementHeight)*(scaledBounds.maxY - scaledBounds.minY) + scaledBounds.minY;\n\n if (scale === 'log') {\n minY = Math.pow(10, minY);\n maxY = Math.pow(10, maxY);\n }\n byAxis.push({\n minX,\n maxX,\n minY,\n maxY\n });\n }\n\n return () => {\n return {\n minX,\n maxX,\n byAxis\n };\n };\n}\n","import { useState, useEffect } from 'react';\n\nexport function useEvent(eventSource, eventName, initialState=null, watch=[]) {\n if (typeof initialState === 'function') {\n const originalInitialState = initialState;\n initialState = () => originalInitialState;\n }\n\n const [value, setValue] = useState(initialState);\n\n useEffect(() => {\n const listener = (updatedValue) => {\n if (typeof updatedValue === 'function') {\n const originalUpdatedValue = updatedValue;\n updatedValue = () => originalUpdatedValue;\n }\n setValue(updatedValue);\n };\n\n eventSource.on(eventName, listener);\n return () => {\n eventSource.off(eventName, listener);\n };\n }, [...watch, setValue, eventSource]);\n\n return value;\n}\n\nexport function usePrimarySize(stateController) {\n return useEvent(stateController, 'primary_size_change', stateController.primaryRenderer ? stateController.primaryRenderer.sizing : {\n elementWidth: 0,\n elementHeight: 0,\n renderWidth: 0,\n renderHeight: 0\n });\n}\n\nexport function useAxes(stateController) {\n return useEvent(stateController, 'axes_changed', stateController.axes);\n}\n\nexport function useSeries(stateController) {\n return useEvent(stateController, 'series_changed', stateController.series);\n}\n\nexport function useHighlightedSeries(stateController) {\n return useEvent(stateController, 'highlighted_series_changed', stateController.highlightedSeries);\n}\n\nexport function useRightAxisCount(stateController) {\n return useRightAxes(stateController).length;\n}\n\nexport function useLeftAxisCount(stateController) {\n return useLeftAxes(stateController).length;\n}\n\nexport function useRightAxes(stateController) {\n return useEvent(stateController, 'right_axes_changed', stateController.rightAxes);\n}\n\nexport function useLeftAxes(stateController) {\n return useEvent(stateController, 'left_axes_changed', stateController.leftAxes);\n}\n\nexport function useSelection(stateController) {\n return useEvent(stateController, 'selection_changed', stateController.selection);\n}\n\nexport function useGlobalBounds(stateController) {\n return useEvent(stateController, 'global_bounds_changed', stateController.globalBounds);\n}\n\nexport function useAxisBounds(stateController) {\n return useEvent(stateController, 'axis_bounds_changed', stateController.axes.map(({ currentBounds }) => currentBounds));\n}\n\nexport function useBoundCalculator(stateController) {\n return useEvent(stateController, 'bound_calculator_changed', stateController.boundCalculator);\n}\n\nexport function useShowIndividualPoints(stateController) {\n return useEvent(stateController, 'show_individual_points_changed', stateController.showIndividualPoints);\n}\n\nexport function useAutoscaleY(stateController) {\n return useEvent(stateController, 'autoscale_y_changed', stateController.autoscaleY);\n}\n\nexport function useBoundHistory(stateController) {\n return useEvent(stateController, 'bound_history_changed', stateController.boundHistory);\n}\n\nexport function useAlwaysTooltipped(stateController) {\n return useEvent(stateController, 'always_tooltipped_changed', stateController.alwaysTooltipped);\n}\n\nexport function useTooltipState(stateController) {\n return useEvent(stateController, 'tooltip_state_changed', stateController.tooltipState);\n}\n\nexport function useContextMenu(stateController) {\n return useEvent(stateController, 'context_menu_position_changed', stateController.contextMenuState);\n}\n\nexport function useDraggingY(stateController) {\n return useEvent(stateController, 'dragging_y_changed', stateController.draggingY);\n}\n\nexport function usePercentile(stateController) {\n return useEvent(stateController, 'percentile_changed', stateController.percentile);\n}\n\nexport function useShowingOptions(stateController) {\n return useEvent(stateController, 'showing_options_changed', stateController.showingOptions);\n}\n\nexport function useMaxPrecision(stateController) {\n return useEvent(stateController, 'max_precision_changed', stateController.maxPrecision);\n}\n\nexport function usePercentileAsymmetry(stateController) {\n return useEvent(stateController, 'percentile_asymmetry_changed', stateController.percentileAsymmetry);\n}\n\nexport function useShowingSidebar(stateController) {\n return useEvent(stateController, 'showing_sidebar_changed', stateController.showingSidebar);\n}\n\nexport function useShowingAnnotations(stateController) {\n return useEvent(stateController, 'showing_annotations_changed', stateController.showingAnnotations);\n}\n\nexport function useMultiSeries(multigraphStateController) {\n return useEvent(multigraphStateController, 'multi_series_changed', multigraphStateController.multiSeries);\n}\n\nexport function useAnnotationState(stateController) {\n return useEvent(stateController, 'annotations_changed', stateController.annotationState);\n}\n\nexport function useSizing(stateController) {\n return useEvent(stateController, 'primary_size_change', stateController.sizing);\n}\n\nexport function useTheme(stateController) {\n return useEvent(stateController, 'theme_change', stateController.theme);\n}\n\nexport function useExportMode(stateController) {\n return useEvent(stateController, 'export_mode_change', stateController.exportMode);\n}\n\nexport function useHasXEnum(stateController) {\n return useEvent(stateController, 'has_x_enum_change', stateController.hasXEnum);\n}\n\nexport function useEnumMap(stateController) {\n return useEvent(stateController, 'enum_map_change', stateController.enumMap);\n}\n\nexport function useXEnumMap(stateController) {\n return useEvent(stateController, 'x_enum_map_change', stateController.enumMap);\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nexport default class Annotations extends React.PureComponent {\n\n render() {\n const { bodyHeight, annotationState } = this.props;\n const { annotations, elementWidth } = annotationState;\n\n const validAnnotations = annotations.filter(a => a.pixelStartX !== undefined && a.pixelWidth !== undefined);\n\n return (\n <div className=\"grapher-annotations\">\n {\n validAnnotations.map(({ pixelStartX, pixelWidth, content, isRange, lineOnly }, i) => {\n const annotationStyle = {\n left: pixelStartX\n };\n\n if (isRange) {\n return (\n <div key={`range-${i}`} className=\"grapher-annotation grapher-annotation-range\" style={annotationStyle}>\n <div\n className=\"annotation-range-marker\"\n style={{ width: pixelWidth, height: bodyHeight }}\n />\n </div>\n );\n } else {\n const pointMarkerWidth = lineOnly ? pixelWidth : Math.max(pixelWidth, 1);\n\n const textStyle = {};\n if (content) {\n textStyle.top = 21 * i;\n textStyle.position = 'absolute';\n const approxTextWidth = (content || '').length * 5.5;\n if (elementWidth > 0 && elementWidth - pixelStartX < approxTextWidth + 10) {\n textStyle.left = -approxTextWidth - 5;\n textStyle.textAlign = 'right';\n } else {\n textStyle.left = pointMarkerWidth + 5;\n }\n }\n\n return (\n <div key={`point-${i}`} className=\"grapher-annotation grapher-annotation-point\" style={annotationStyle}>\n <div\n className=\"annotation-marker\"\n style={{ width: pointMarkerWidth, height: bodyHeight }}\n />\n {content && !lineOnly &&\n <div className=\"annotation-text\" style={textStyle}>\n {content}\n </div>\n }\n </div>\n );\n }\n })\n }\n </div>\n );\n }\n}\n\nAnnotations.propTypes = {\n annotationState: PropTypes.shape({\n annotations: PropTypes.arrayOf(PropTypes.shape({\n pixelStartX: PropTypes.number,\n pixelWidth: PropTypes.number,\n content: PropTypes.string,\n isRange: PropTypes.bool,\n lineOnly: PropTypes.bool\n })).isRequired,\n elementWidth: PropTypes.number.isRequired\n }),\n bodyHeight: PropTypes.number\n};\n","import React from 'react';\nimport CustomPropTypes from '../helpers/custom_prop_types.js';\nimport PropTypes from 'prop-types';\nimport StateController from '../state/state_controller.js';\nimport {LINE_COLORS} from '../helpers/colors.js';\nimport {useAxisBounds, useSizing} from '../state/hooks.js';\n\nexport default React.memo(DraggablePoints);\n\nfunction DraggablePoints({ stateController, draggablePoints, onPointDrag, onDraggablePointsDoubleClick }) {\n const bounds = useAxisBounds(stateController)[0];\n const sizing = useSizing(stateController);\n\n if (!sizing) {\n return null;\n }\n\n const onPointlessDoubleClick = onDraggablePointsDoubleClick && ((event) => {\n const newXT = (event.clientX - sizing.boundingRect.left)/sizing.elementWidth;\n const newYT = 1 - (event.clientY - sizing.boundingRect.top)/sizing.elementHeight;\n\n onDraggablePointsDoubleClick(event, {\n x: newXT*(bounds.maxX - bounds.minX) + bounds.minX,\n y: newYT*(bounds.maxY - bounds.minY) + bounds.minY\n });\n });\n\n return (\n <div className=\"grapher-draggable-points\" onDoubleClick={onPointlessDoubleClick}>\n <svg width={sizing.elementWidth} height={sizing.elementHeight}>\n {\n draggablePoints.map((point, index) => {\n const xT = (point.x - bounds.minX)/(bounds.maxX - bounds.minX);\n const yT = (1 - (point.y - bounds.minY)/(bounds.maxY - bounds.minY));\n\n if (xT < 0 || xT > 1 || yT < 0 || yT > 1) {\n return null;\n }\n\n const pixelX = xT * sizing.elementWidth;\n const pixelY = yT * sizing.elementHeight;\n\n const radius = point.radius || 5;\n const fillColor = point.fillColor || LINE_COLORS[0];\n const strokeColor = point.strokeColor || 'white';\n const strokeWidth = point.strokeWidth || 1;\n\n const onMouseDown = (event) => {\n event.stopPropagation();\n\n if (!onPointDrag) {\n return;\n }\n\n const xOffset = pixelX - event.clientX;\n const yOffset = pixelY - event.clientY;\n\n const onMouseMove = (moveEvent) => {\n const newXT = (moveEvent.clientX + xOffset)/sizing.elementWidth;\n const newYT = 1 - (moveEvent.clientY + yOffset)/sizing.elementHeight;\n\n onPointDrag({\n index,\n point,\n x: newXT*(bounds.maxX - bounds.minX) + bounds.minX,\n y: newYT*(bounds.maxY - bounds.minY) + bounds.minY\n }, moveEvent);\n };\n\n const onMouseUp = () => {\n window.removeEventListener('mousemove', onMouseMove);\n window.removeEventListener('mouseup', onMouseUp);\n };\n\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('mouseup', onMouseUp);\n };\n\n const onClick = point.onClick && ((event) => {\n point.onClick(event, point);\n });\n\n const onDoubleClick = point.onDoubleClick && ((event) => {\n event.stopPropagation();\n point.onDoubleClick(event, point);\n });\n\n return (\n <circle\n key={index}\n cx={pixelX}\n cy={pixelY}\n r={radius}\n fill={fillColor}\n stroke={strokeColor}\n strokeWidth={strokeWidth}\n onMouseDown={onMouseDown}\n onClick={onClick}\n onDoubleClick={onDoubleClick}\n />\n );\n })\n }\n </svg>\n </div>\n );\n}\n\nDraggablePoints.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n draggablePoints: CustomPropTypes.DraggablePoints.isRequired,\n onPointDrag: PropTypes.func,\n onDraggablePointsDoubleClick: PropTypes.func\n};\n","import React from 'react';\nimport CustomPropTypes from '../helpers/custom_prop_types.js';\nimport PropTypes from 'prop-types';\nimport StateController from '../state/state_controller.js';\nimport {useAxisBounds, useSizing} from '../state/hooks.js';\n\nexport default React.memo(VerticalLines);\n\nfunction VerticalLines({ stateController, verticalLines, isRangeGraph, bounds, elementWidth, elementHeight }) {\n bounds = bounds || useAxisBounds(stateController)[0];\n const sizing = useSizing(stateController);\n\n if (!sizing) {\n return null;\n }\n\n const relevantVerticalLines = verticalLines.filter(line => {\n if (isRangeGraph && !line.onRangeGraph) {\n return false;\n }\n\n if (line.onRangeGraphOnly && !isRangeGraph) {\n return false;\n }\n\n return true;\n });\n\n if (relevantVerticalLines.length === 0) {\n return null;\n }\n\n return (\n <div className=\"grapher-vertical-lines\">\n <svg width={elementWidth || sizing.elementWidth} height={elementHeight || sizing.elementHeight}>\n {\n relevantVerticalLines.map((line, index) => {\n if (isRangeGraph && typeof line.onRangeGraph === 'object') {\n line = {\n ...line,\n ...line.onRangeGraph\n };\n }\n\n const xT = (line.x - bounds.minX)/(bounds.maxX - bounds.minX);\n\n if (xT < 0 || xT > 1) {\n return null;\n }\n\n const pixelX = xT * (elementWidth || sizing.elementWidth);\n if (typeof line.minPixelX === 'number' && pixelX < line.minPixelX) {\n return null;\n }\n\n if (typeof line.maxPixelX === 'number' && pixelX > line.maxPixelX) {\n return null;\n }\n\n const lineStyle = {\n stroke: line.color,\n strokeWidth: line.width,\n ...(line.style || {})\n };\n\n const markerStyle = {\n fill: line.color,\n ...(line.markerStyle || {})\n };\n\n const textStyle = {\n ...{\n fontSize: '12px',\n fill: line.color,\n stroke: 'none',\n textAnchor: 'middle',\n dominantBaseline: 'hanging'\n },\n ...(line.textStyle || {})\n };\n\n let lineTop = 0;\n if (typeof line.lineTop === 'number') {\n lineTop = line.lineTop;\n } else if (line.text) {\n lineTop = 18;\n }\n\n let textTop = 5;\n if (typeof line.textTop === 'number') {\n textTop = line.textTop;\n }\n\n return (\n <React.Fragment key={index}>\n <line\n x1={pixelX}\n y1={lineTop}\n x2={pixelX}\n y2={(elementHeight || sizing.elementHeight)}\n style={lineStyle}\n />\n\n {\n line.markTop &&\n <polygon\n points={`${pixelX - 3},0 ${pixelX + 3},0 ${pixelX},3`}\n style={markerStyle}\n />\n }\n\n {\n line.text &&\n <text\n x={pixelX}\n y={textTop}\n style={textStyle}\n >\n {line.text}\n </text>\n }\n </React.Fragment>\n );\n })\n }\n </svg>\n </div>\n );\n}\n\nVerticalLines.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n verticalLines: CustomPropTypes.VerticalLines.isRequired,\n isRangeGraph: PropTypes.bool,\n bounds: PropTypes.object,\n elementWidth: PropTypes.number,\n elementHeight: PropTypes.number\n};\n","import React, { useCallback, useState, useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport CustomPropTypes from '../helpers/custom_prop_types';\nimport GraphBodyRenderer from '../renderer/graph_body_renderer';\nimport Tooltip from './tooltip.jsx';\nimport ContextMenu from './context_menu.jsx';\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.jsx';\nimport DraggablePoints from './draggable_points.jsx';\nimport VerticalLines from './vertical_lines.jsx';\nimport binarySearch from '../helpers/binary_search';\n\nexport default React.memo(GraphBody);\n\nfunction GraphBody({ stateController, webgl, bodyHeight, boundsSelectionEnabled, showTooltips, tooltipOptions, checkIntersection, draggablePoints, onPointDrag, onDraggablePointsDoubleClick, verticalLines, clockStyle, timeZone, onPointClick }) {\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 const getTouch = (event) => event.touches?.[0] || event.changedTouches?.[0];\n\n const onGlobalTouchStart = (event) => {\n if (!showTooltips) {\n return;\n }\n const touch = getTouch(event);\n if (!touch) return;\n stateController.setTooltipMousePosition({\n clientX: touch.clientX,\n clientY: touch.clientY\n });\n \n // Only prevent default if touch is within grapher bounds\n if (event.cancelable && event.target.closest('.graph-body')) {\n event.preventDefault();\n }\n };\n\n const onGlobalTouchMove = (event) => {\n if (!showTooltips) {\n return;\n }\n const touch = getTouch(event);\n if (!touch) return;\n stateController.setTooltipMousePosition({\n clientX: touch.clientX,\n clientY: touch.clientY\n });\n \n // Only prevent default if touch is within grapher bounds\n if (event.cancelable && event.target.closest('.graph-body')) {\n event.preventDefault();\n }\n };\n\n const onGlobalTouchEnd = () => {\n stateController.showOnlySavedTooltips();\n };\n\n window.addEventListener('scroll', onScroll, { passive: true });\n window.addEventListener('mousemove', onGlobalMouseMove, { passive: true });\n window.addEventListener('touchstart', onGlobalTouchStart, { passive: false });\n window.addEventListener('touchmove', onGlobalTouchMove, { passive: false });\n window.addEventListener('touchend', onGlobalTouchEnd, { passive: true });\n window.addEventListener('touchcancel', onGlobalTouchEnd, { passive: true });\n\n return () => {\n window.removeEventListener('scroll', onScroll);\n window.removeEventListener('mousemove', onGlobalMouseMove);\n window.removeEventListener('touchstart', onGlobalTouchStart);\n window.removeEventListener('touchmove', onGlobalTouchMove);\n window.removeEventListener('touchend', onGlobalTouchEnd);\n window.removeEventListener('touchcancel', onGlobalTouchEnd);\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 if (onPointClick) {\n const seriesToNearestPoint = {};\n\n const series = stateController.series;\n for (let i = 0; i < series.length; i++) {\n const singleSeries = series[i];\n\n const sizing = stateController.sizing;\n const bounds = singleSeries.axis.currentBounds;\n // const trueX = event.clientX/sizing.elementWidth * (bounds.maxX - bounds.minX) + bounds.minX;\n const trueX = stateController.tooltipState.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 seriesToNearestPoint[singleSeries.name] = closestPoint[0];\n }\n\n\n\n onPointClick(event, seriesToNearestPoint);\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 || stateController?.primaryRenderer?.boundingRect?.height}\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 onPointClick: PropTypes.func,\n clockStyle: PropTypes.oneOf(['12h', '24h']),\n timeZone: PropTypes.string\n};","\n import API from \"!../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../node_modules/css-loader/dist/cjs.js!../node_modules/sass-loader/dist/cjs.js!./grapher.scss\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../node_modules/css-loader/dist/cjs.js!../node_modules/sass-loader/dist/cjs.js!./grapher.scss\";\n export default content && content.locals ? content.locals : undefined;\n","import {startOfDayInTimezone} from './format';\n\nfunction placeTick(trueValue, {scale, min, max, inverted, totalSize, precision, formatter, dates, justTime, justDate, formatOptions={} }, opts={}) {\n let scaledValue = trueValue;\n\n if (scale === 'log') {\n scaledValue = 10**trueValue;\n }\n\n let percent = (trueValue - min)/(max - min);\n if (inverted) {\n percent = 1.0 - percent;\n }\n\n let pixelValue = percent * totalSize;\n if (isNaN(pixelValue)) {\n pixelValue = 0;\n }\n\n return {\n pixelValue,\n trueValue: scaledValue,\n label: formatter(scaledValue, { ...formatOptions, precision, log: scale === 'log', dates, justTime, justDate }),\n size: 'major',\n ...opts\n };\n}\n\nfunction placeTickByPixel(pixelValue, {scale, min, max, inverted, totalSize, precision, formatter, dates, justTime, justDate, formatOptions={} }, opts={}) {\n let percent = pixelValue/totalSize;\n if (inverted) {\n percent = 1.0 - percent;\n }\n\n let trueValue = percent * (max - min) + min;\n\n if (scale === 'log') {\n trueValue = Math.pow(10, trueValue);\n }\n\n return {\n pixelValue,\n trueValue,\n label: formatter(trueValue, { ...formatOptions, precision, log: scale === 'log', dates, justTime, justDate }),\n size: 'major',\n ...opts\n };\n}\n\nfunction roundToEvenNumber(value, tickSpacing) {\n return Math.round(value/tickSpacing)*tickSpacing;\n}\n\nfunction getEvenTickSpacing(span, desiredCount) {\n const subspan = span/desiredCount;\n\n const precision = -Math.log10(Math.abs(subspan)) + 1;\n const multiplier = (precision - Math.floor(precision)) > 0.5 ? 2 : 1;\n\n const roundTo = 10**Math.floor(precision) * multiplier;\n\n return Math.round(subspan * roundTo)/roundTo;\n}\n\nfunction roundToDivisor(value, divisor) {\n if (value <= 1) {\n return 1;\n }\n\n if (divisor === 1) {\n return Math.round(value);\n }\n\n if (value >= divisor) {\n return Math.round(value/divisor)*divisor;\n }\n\n let divisors;\n if (divisor === 24) {\n divisors = [1, 2, 6, 12, 24];\n } else if (divisor === 60) {\n divisors = [1, 2, 5, 10, 15, 30, 60];\n } else {\n throw new Error('Invalid divisor');\n }\n\n let bestDelta = Infinity;\n let bestDivisor = 1;\n for (let i = 0; i < divisors.length; i++) {\n const delta = Math.abs(divisors[i] - value);\n if (delta < bestDelta) {\n bestDivisor = divisors[i];\n bestDelta = delta;\n }\n }\n\n return bestDivisor;\n}\n\nfunction getEvenDateTickSpacing(span, desiredCount, unitOverride) {\n const subspan = span / desiredCount;\n\n if (subspan < 60*1000 && (!unitOverride || unitOverride === 'second')) {\n return {\n amount: roundToDivisor(subspan/1000, 60),\n unit: 's'\n };\n }\n\n if (subspan < 60*60*1000 && (!unitOverride || unitOverride === 'minute')) {\n return {\n amount: roundToDivisor(subspan/(60*1000), 60),\n unit: 'm'\n };\n }\n\n if (subspan < 24*60*60*1000 && (!unitOverride || unitOverride === 'hour')) {\n return {\n amount: roundToDivisor(subspan/(60*60*1000), 24),\n unit: 'h'\n };\n }\n\n if (unitOverride === 'day' || (subspan < 30*24*60*60*1000 && !unitOverride)) {\n return {\n amount: roundToDivisor(subspan/(24*60*60*1000), 1),\n unit: 'd'\n };\n }\n\n if (subspan > 30*24*60*60*1000 && (!unitOverride || unitOverride === 'month')) {\n return {\n amount: roundToDivisor(subspan/30*24*60*60*1000, 1),\n unit: 'month'\n };\n }\n\n if (unitOverride === 'year') {\n return {\n amount: roundToDivisor(subspan/365*24*60*60*1000, 1),\n unit: 'year'\n };\n }\n\n return {\n unit: 'm',\n amount: 60\n };\n}\n\nfunction placeNumbersGrid({ min, max, precision, expectedLabelSize, labelPadding, totalSize, scale='linear', formatter, inverted=false, formatOptions }) {\n const paddedLabelSize = expectedLabelSize + 2*labelPadding;\n\n const ticks = [];\n const placementParams = {scale, min, max, inverted, totalSize, precision, formatter, formatOptions, dates: false };\n\n const labelCount = Math.floor((totalSize - expectedLabelSize*2)/paddedLabelSize);\n const tickSpacing = getEvenTickSpacing(max - min, labelCount);\n if (tickSpacing > 0) {\n for (let value = roundToEvenNumber(min, tickSpacing); value < max; value += tickSpacing) {\n ticks.push(placeTick(value, placementParams));\n }\n }\n\n if (ticks.length) {\n if (inverted && ticks[ticks.length - 1].pixelValue > labelPadding) {\n ticks.push(placeTickByPixel(expectedLabelSize / 2, placementParams));\n }\n }\n\n return ticks.filter(({ pixelValue }) => pixelValue <= totalSize && pixelValue >= 0);\n}\n\nfunction placeDatesGrid({ min, max, precision, expectedLabelSize, labelPadding, totalSize, skipFirst=false, skipLast=false, scale='linear', formatter, inverted=false, formatOptions }) {\n const paddedLabelSize = expectedLabelSize + 2*labelPadding;\n\n const ticks = [];\n const placementParams = {scale, min, max, inverted, totalSize, precision, formatter, formatOptions, dates: true };\n\n const { amount, unit } = getEvenDateTickSpacing(max - min, totalSize/paddedLabelSize, formatOptions.unitOverride);\n\n const justDate = unit === 'month';\n\n if (!skipFirst) {\n ticks.push(placeTickByPixel(0, {...placementParams, justDate}, {position: 'first'}));\n }\n\n let currentDate = new Date(min);\n\n if (unit === 'h') {\n currentDate.setMinutes(0, 0, 0);\n } else if (unit === 'm') {\n currentDate.setSeconds(0, 0);\n } else if (unit === 's') {\n currentDate.setMilliseconds(0);\n } else if (unit === 'month') {\n currentDate = startOfDayInTimezone(currentDate, formatOptions.timeZone);\n currentDate.setDate(1);\n } else if (unit === 'd') {\n currentDate = startOfDayInTimezone(currentDate, formatOptions.timeZone);\n }\n\n let lastDateString = formatter(currentDate, {...formatOptions, ...placementParams, justDate: true });\n while (currentDate < max) {\n let delta = 24*60*60*1000;\n\n if (unit === 'h') {\n delta = (amount - currentDate.getHours() % amount)*60*60*1000;\n } else if (unit === 'm') {\n delta = (amount - currentDate.getMinutes() % amount)*60*1000;\n } else if (unit === 's') {\n delta = (amount - currentDate.getSeconds() % amount)*1000;\n } else if (unit === 'month') {\n delta = 0;\n if (currentDate.getMonth() === 11) {\n currentDate = new Date(currentDate.getFullYear() + 1, 0, 1);\n } else {\n currentDate = new Date(currentDate.getFullYear(), currentDate.getMonth() + 1, 1);\n }\n } else if (unit === 'year') {\n currentDate = new Date(currentDate.getFullYear() + 1, 0, 0);\n }\n\n currentDate = new Date(currentDate.valueOf() + delta);\n\n const justTime = formatter(currentDate, {...formatOptions, ...placementParams, justDate: true }) === lastDateString;\n\n const tick = placeTick(currentDate, {...placementParams, justTime, justDate});\n\n if (ticks.length && (tick.pixelValue - ticks[ticks.length - 1].pixelValue) < (expectedLabelSize + (labelPadding || 0))) {\n continue;\n }\n\n if (tick.pixelValue + expectedLabelSize/2 >= totalSize) {\n continue;\n }\n\n ticks.push(tick);\n lastDateString = formatter(currentDate, {...formatOptions, ...placementParams, justDate: true });\n }\n\n const justTime = lastDateString === formatter(max, {...formatOptions, ...placementParams, justDate: true });\n\n if (!skipLast && ticks[ticks.length - 1].pixelValue + expectedLabelSize < totalSize) {\n ticks.push(placeTickByPixel(totalSize, {...placementParams, justTime, justDate}, {position: 'last'}));\n }\n\n return ticks.filter(({ pixelValue }) => pixelValue <= totalSize && pixelValue >= 0);\n}\n\nfunction placeTimeOnlyGrid({ min, max, precision, expectedLabelSize, labelPadding, totalSize, skipFirst=false, skipLast=false, scale='linear', formatter, inverted=false, formatOptions={} }) {\n const paddedLabelSize = expectedLabelSize + 2*labelPadding;\n const ticks = [];\n const placementParams = { scale, min, max, inverted, totalSize, precision, formatter, formatOptions, dates: true };\n\n const desiredCount = Math.floor(totalSize/paddedLabelSize);\n const span = max - min;\n \n let unit, amount;\n \n const hourSpan = span / (60 * 60 * 1000);\n const minuteSpan = span / (60 * 1000);\n \n if (hourSpan <= desiredCount * 8) {\n unit = 'h';\n amount = Math.max(1, Math.ceil(hourSpan / desiredCount));\n if (amount <= 6) {\n } else if (amount <= 12) {\n amount = 12;\n } else if (amount <= 24) {\n amount = 24;\n } else {\n amount = Math.ceil(amount / 24) * 24;\n }\n } else {\n unit = 'h';\n amount = 24;\n }\n \n if (!skipFirst) {\n ticks.push(placeTickByPixel(0, {...placementParams, justTime: true}, {position: 'first'}));\n }\n \n let currentDate = new Date(min);\n \n if (unit === 'h') {\n currentDate.setMinutes(0, 0, 0);\n if (amount === 24) {\n currentDate.setHours(0);\n } else if (amount === 12) {\n const currentHour = currentDate.getHours();\n const alignedHour = currentHour < 12 ? 0 : 12;\n currentDate.setHours(alignedHour);\n } else {\n const currentHour = currentDate.getHours();\n const alignedHour = Math.floor(currentHour / amount) * amount;\n currentDate.setHours(alignedHour);\n }\n } else if (unit === 'm') {\n currentDate.setSeconds(0, 0);\n const currentMinute = currentDate.getMinutes();\n const alignedMinute = Math.floor(currentMinute / amount) * amount;\n currentDate.setMinutes(alignedMinute);\n } else if (unit === 's') {\n currentDate.setMilliseconds(0);\n const currentSecond = currentDate.getSeconds();\n const alignedSecond = Math.floor(currentSecond / amount) * amount;\n currentDate.setSeconds(alignedSecond);\n }\n \n while (currentDate < min) {\n if (unit === 'h') {\n currentDate = new Date(currentDate.valueOf() + amount * 60 * 60 * 1000);\n } else if (unit === 'm') {\n currentDate = new Date(currentDate.valueOf() + amount * 60 * 1000);\n } else if (unit === 's') {\n currentDate = new Date(currentDate.valueOf() + amount * 1000);\n }\n }\n \n while (currentDate < max) {\n const tick = placeTick(currentDate, {...placementParams, justTime: true});\n \n const reservedSpaceForLast = expectedLabelSize + labelPadding;\n const maxPixelForMiddleTicks = totalSize - reservedSpaceForLast;\n \n if (ticks.length && (tick.pixelValue - ticks[ticks.length - 1].pixelValue) < (expectedLabelSize + labelPadding)) {\n } else if (tick.pixelValue + expectedLabelSize < maxPixelForMiddleTicks) {\n ticks.push(tick);\n } else {\n break;\n }\n \n if (unit === 'h') {\n currentDate = new Date(currentDate.valueOf() + amount * 60 * 60 * 1000);\n } else if (unit === 'm') {\n currentDate = new Date(currentDate.valueOf() + amount * 60 * 1000);\n } else if (unit === 's') {\n currentDate = new Date(currentDate.valueOf() + amount * 1000);\n } else {\n break;\n }\n }\n \n if (!skipLast) {\n const lastTick = placeTick(max, {...placementParams, justTime: true}, {position: 'last'});\n if (ticks.length === 0 || (lastTick.pixelValue - ticks[ticks.length - 1].pixelValue) >= (expectedLabelSize + labelPadding/2)) {\n ticks.push(lastTick);\n } else {\n ticks[ticks.length - 1] = lastTick;\n }\n }\n \n return ticks.filter(({ pixelValue }) => pixelValue <= totalSize && pixelValue >= 0);\n}\n\nfunction placeDateOnlyGrid({ min, max, precision, expectedLabelSize, labelPadding, totalSize, skipFirst=false, skipLast=false, scale='linear', formatter, inverted=false, formatOptions={} }) {\n const paddedLabelSize = expectedLabelSize + 2*labelPadding;\n const ticks = [];\n \n const minYear = new Date(min).getFullYear();\n const maxYear = new Date(max).getFullYear();\n const spanMultipleYears = minYear !== maxYear;\n\n const customDateFormatter = (date, options) => {\n const monthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n const d = new Date(date);\n const month = monthNames[d.getMonth()];\n const day = d.getDate();\n const year = d.getFullYear();\n \n if (spanMultipleYears) {\n return `${month} ${day} ${year}`;\n } else {\n return `${month} ${day}`;\n }\n };\n \n const placementParams = { scale, min, max, inverted, totalSize, precision, formatter: customDateFormatter, formatOptions, dates: true };\n \n const span = max - min;\n const hourSpan = span / (60 * 60 * 1000);\n \n let { amount, unit } = getEvenDateTickSpacing(span, totalSize/paddedLabelSize, formatOptions.unitOverride);\n \n if ((unit === 'h' || unit === 'm' || unit === 's') && hourSpan >= 48) {\n unit = 'd';\n amount = Math.max(1, Math.ceil(hourSpan / 24 / Math.floor(totalSize/paddedLabelSize)));\n } else if ((unit === 'h' || unit === 'm' || unit === 's') && hourSpan < 48) {\n const startTick = placeTick(min, {...placementParams, justDate: true}, {position: 'first'});\n const endTick = placeTick(max, {...placementParams, justDate: true}, {position: 'last'});\n \n const ticks = [startTick];\n if ((endTick.pixelValue - startTick.pixelValue) >= (expectedLabelSize + labelPadding)) {\n ticks.push(endTick);\n }\n \n return ticks.filter(({ pixelValue }) => pixelValue <= totalSize && pixelValue >= 0);\n }\n \n if (!skipFirst) {\n ticks.push(placeTickByPixel(0, {...placementParams, justDate: true}, {position: 'first'}));\n }\n \n let currentDate = new Date(min);\n \n 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 currentDate.setHours(0, 0, 0, 0);\n }\n \n while (currentDate < max) {\n let delta = 24*60*60*1000;\n \n 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, 1);\n delta = 0;\n } else if (unit === 'd') {\n delta = amount * 24 * 60 * 60 * 1000;\n }\n \n if (delta > 0) {\n currentDate = new Date(currentDate.valueOf() + delta);\n }\n \n const tick = placeTick(currentDate, {...placementParams, justDate: true});\n \n const reservedSpaceForLast = expectedLabelSize + labelPadding;\n const maxPixelForMiddleTicks = totalSize - reservedSpaceForLast;\n \n if (ticks.length && (tick.pixelValue - ticks[ticks.length - 1].pixelValue) < (expectedLabelSize + (labelPadding || 0))) {\n continue;\n }\n \n if (tick.pixelValue + expectedLabelSize < maxPixelForMiddleTicks) {\n ticks.push(tick);\n } else {\n break;\n }\n }\n \n if (!skipLast) {\n const lastTick = placeTick(max, {...placementParams, justDate: true}, {position: 'last'});\n if (ticks.length === 0 || (lastTick.pixelValue - ticks[ticks.length - 1].pixelValue) >= (expectedLabelSize + labelPadding/2)) {\n ticks.push(lastTick);\n } else {\n ticks[ticks.length - 1] = lastTick;\n }\n }\n\n if (ticks.length === 0 && hourSpan >= 48) {\n ticks.push(placeTickByPixel(0, {...placementParams, justDate: true}, {position: 'first'}));\n }\n \n return ticks.filter(({ pixelValue }) => pixelValue <= totalSize && pixelValue >= 0);\n}\n\nexport { placeTimeOnlyGrid, placeDateOnlyGrid };\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, { placeTimeOnlyGrid, placeDateOnlyGrid } from '../helpers/place_grid';\nimport {useEnumMap, useHasXEnum, usePrimarySize, useSelection} from '../state/hooks';\nimport StateController from '../state/state_controller';\n\nexport default React.memo(XAxis);\n\nfunction XAxis({ showAxes, showGrid, stateController, bigLabels, xTickUnit, clockStyle, timeZone, integersOnly, formatXAxisLabel }) {\n if (!showAxes && !showGrid) {\n return null;\n }\n\n const { elementWidth, elementHeight } = usePrimarySize(stateController);\n const {minX, maxX, dates} = useSelection(stateController);\n const hasXEnum = useHasXEnum(stateController);\n const enumMap = useEnumMap(stateController);\n\n let precision;\n if (dates) {\n precision = calculateTimePrecision(minX, maxX);\n } else {\n precision = calculatePrecision(maxX - minX);\n }\n\n let inverseEnumMap = null;\n if (hasXEnum) {\n inverseEnumMap = {};\n for (const [key, value] of Object.entries(enumMap)) {\n inverseEnumMap[value] = key;\n }\n }\n\n const formatOptions = {\n unitOverride: xTickUnit,\n clockStyle,\n timeZone,\n integersOnly,\n inverseEnumMap,\n formatter: formatXAxisLabel\n };\n\n const minLabel = formatX(minX, {...formatOptions, dates, precision }).toString();\n const maxLabel = formatX(maxX, {...formatOptions, dates, precision }).toString();\n\n let expectedLabelWidth = Math.max(minLabel.length, maxLabel.length);\n if (bigLabels) {\n expectedLabelWidth *= 2;\n }\n\n const labelPadding = 30;\n\n let timeTicks = null;\n let dateTicks = null;\n let regularTicks = null;\n \n if (dates) {\n timeTicks = placeTimeOnlyGrid({\n min: minX,\n max: maxX,\n totalSize: elementWidth,\n precision,\n expectedLabelSize: expectedLabelWidth,\n labelPadding: labelPadding * 0.8,\n formatter: formatXAxisLabel || formatX,\n formatOptions\n });\n \n dateTicks = placeDateOnlyGrid({\n min: minX,\n max: maxX,\n totalSize: elementWidth,\n precision,\n expectedLabelSize: expectedLabelWidth * 2,\n labelPadding: labelPadding * 1.5,\n formatter: formatXAxisLabel || formatX,\n formatOptions\n });\n } else {\n regularTicks = placeGrid({\n min: minX,\n max: maxX,\n totalSize: elementWidth,\n precision,\n dates,\n formatter: formatXAxisLabel || formatX,\n expectedLabelSize: expectedLabelWidth,\n labelPadding,\n formatOptions\n });\n }\n\n const xAxisHeight = dates ? 30 : 20;\n\n return (\n <svg className={`axis x-axis${dates ? ' x-axis-dual' : ''}`} style={showAxes ? undefined : {marginBottom: -20}}>\n {\n showAxes &&\n <path d={`M-1,0 H${elementWidth}`} className=\"axis-line\" />\n }\n\n {/* Render time ticks in first row */}\n {\n dates && timeTicks && timeTicks.map(({ pixelValue, label, size, position, skipGrid }, i) => {\n\n const singleTick = timeTicks.length === 1;\n \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={`time-${i}`} className={classes.join(' ')}>\n {\n showAxes &&\n <path d={`M${pixelValue},1 v12`} className=\"axis-tick\" />\n }\n\n {\n showGrid && !skipGrid &&\n <path d={`M${pixelValue},0 v-${elementHeight}`} />\n }\n\n {\n showAxes &&\n <text \n x={(position === 'last' && !singleTick) ? pixelValue - 3 : pixelValue + 3} \n y={12} \n textAnchor={(position === 'last' && !singleTick) ? 'end' : 'start'}\n className='x-axis-text x-axis-time-text'\n >\n {label}\n </text>\n }\n </g>\n );\n })\n }\n \n {/* Render date ticks in second row */}\n {\n dates && dateTicks && dateTicks.map(({ pixelValue, label, size, position, trueValue }, i) => {\n \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 let timezoneLabel = undefined;\n if (timeZone) {\n if (i === 0) {\n timezoneLabel = timeZone.toLowerCase() === 'utc' ? 'UTC' : timeZone;\n }\n }\n\n return (\n <g key={`date-${i}`} className={classes.join(' ')}>\n {\n showAxes &&\n <text \n x={position === 'last' ? pixelValue - 3 : pixelValue + 3} \n y={25} \n textAnchor={position === 'last' ? 'end' : 'start'}\n className='x-axis-text x-axis-date-text'\n >\n <tspan className='x-axis-date-label'>\n {label}\n </tspan>\n {timezoneLabel && (\n <tspan className='x-axis-timezone-label'>\n {' '}({timezoneLabel})\n </tspan>\n )}\n </text>\n }\n </g>\n );\n })\n }\n \n {/* Render regular ticks for non-date data */}\n {\n !dates && regularTicks && regularTicks.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 v12`} className=\"axis-tick\" />\n }\n\n {\n showGrid && !skipGrid &&\n <path d={`M${pixelValue},0 v-${elementHeight}`} />\n }\n\n {\n showAxes &&\n <text \n x={position === 'last' ? pixelValue - 3 : pixelValue + 3} \n y={xAxisHeight - 5} \n textAnchor={position === 'last' ? 'end' : 'start'}\n className='x-axis-text'\n >\n {label}\n </text>\n }\n </g>\n );\n })\n }\n </svg>\n );\n}\n\nXAxis.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n showAxes: PropTypes.bool.isRequired,\n showGrid: PropTypes.bool.isRequired,\n bigLabels: PropTypes.bool,\n xTickUnit: PropTypes.oneOf(['year']),\n clockStyle: PropTypes.oneOf(['12h', '24h']),\n timeZone: PropTypes.string,\n integersOnly: PropTypes.bool,\n formatXAxisLabel: PropTypes.func\n};\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport {calculatePrecision, formatY} from '../helpers/format';\nimport {Y_AXIS_WIDTH, BIG_Y_AXIS_LABEL_OFFSET} from '../helpers/axis_sizes';\nimport scaleBounds from '../renderer/scale_bounds';\nimport getColor from '../helpers/colors';\nimport placeGrid from '../helpers/place_grid';\nimport {useAxes, useAxisBounds, useHighlightedSeries, usePrimarySize} from '../state/hooks';\nimport StateController from '../state/state_controller';\nimport CustomPropTypes from '../helpers/custom_prop_types';\n\nexport default React.memo(YAxis);\n\nfunction YAxis({ stateController, showAxes, showGrid, showSeriesKey, axis, sideIndex, bodyHeight, theme, grapherID, dragPositionYOffset=0, bigLabels, showAxisColors }) {\n if (!showAxes && !showGrid) {\n return null;\n }\n\n const { side, scale, axisIndex, label } = useAxes(stateController)[axis.axisIndex];\n\n const { elementWidth, elementHeight } = usePrimarySize(stateController);\n let { minY, maxY } = useAxisBounds(stateController)[axisIndex];\n\n const scaledBounds = scaleBounds({ minY, maxY, scale});\n minY = scaledBounds.minY;\n maxY = scaledBounds.maxY;\n\n const ticks = placeGrid({\n min: minY,\n max: maxY,\n totalSize: elementHeight,\n scale,\n precision: calculatePrecision(maxY - minY),\n formatter: formatY,\n inverted: true,\n expectedLabelSize: bigLabels ? 20 : 10,\n labelPadding: 30\n });\n\n const colorBoxSize = 10;\n const colorBoxPadding = 4;\n\n let sidePadding = 5;\n\n if (scale === 'log') {\n sidePadding = 2;\n }\n\n const highlightedSeries = useHighlightedSeries(stateController);\n\n const [draggedSeries, setDraggedSeries] = useState(null);\n const [dragDelta, setDragDelta] = useState({ dx: 0, dy: 0 });\n\n const startDrag = (event, singleSeries) => {\n let startX = event.clientX;\n let startY = event.clientY;\n\n if (side === 'left') {\n startX += Y_AXIS_WIDTH;\n }\n\n if (side === 'right') {\n startX -= Y_AXIS_WIDTH;\n }\n\n setDragDelta({\n dx: 0,\n dy: 0\n });\n\n const onMouseMove = (moveEvent) => {\n setDragDelta({\n dx: moveEvent.clientX - startX,\n dy: moveEvent.clientY - startY\n });\n };\n\n const onMouseUp = (mouseUpEvent) => {\n window.removeEventListener('mousemove', onMouseMove);\n window.removeEventListener('mouseup', onMouseUp);\n\n let target = mouseUpEvent.target;\n while (target && !(target.dataset || {}).axisIndex) {\n target = target.parentNode;\n }\n\n setDraggedSeries(null);\n stateController.finalizeDrag(singleSeries, target && (target.dataset || {}).axisIndex, target && (target.dataset || {}).grapherId);\n };\n\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('mouseup', onMouseUp);\n\n setDraggedSeries(singleSeries);\n stateController.markDragStart();\n };\n\n const highlightedOpacity = theme === 'day' ? 1.0 : 0.5;\n const unhighlightedOpacity = theme === 'day' ? 0.8 : 0.3;\n\n return (\n <svg className={`axis y-axis y-axis-${side}`}\n data-axis-index={axisIndex}\n data-grapher-id={grapherID}\n style={{\n width: Y_AXIS_WIDTH,\n marginLeft: showAxes ? undefined : -Y_AXIS_WIDTH,\n height: typeof bodyHeight === 'number' ? bodyHeight : undefined\n }}\n >\n {\n showAxes &&\n showAxisColors &&\n axis.series.map((singleSeries, i) => {\n const height = elementHeight/axis.series.length;\n\n return (\n <rect\n x={side === 'left' ? 0 : 2}\n y={i*height}\n width={Y_AXIS_WIDTH - 2}\n height={height}\n key={singleSeries.index}\n fill={getColor(singleSeries.color, singleSeries.index, singleSeries.multigrapherSeriesIndex)}\n opacity={singleSeries.index === highlightedSeries ? highlightedOpacity : unhighlightedOpacity}\n data-element-height={elementHeight}\n data-series-length={axis.series.length}\n />\n );\n })\n }\n\n {\n showAxes &&\n <path d={`M${side === 'left' ? Y_AXIS_WIDTH-1 : 1},3 V${elementHeight}`} className=\"axis-line\" />\n }\n\n {\n 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.jsx';\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.jsx';\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.jsx';\nimport RangeSelectionButtonBase from './range_selection_button_base.jsx';\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.jsx';\nimport RangeSelectionButtonBase from './range_selection_button_base.jsx';\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.jsx';\n\nexport default React.memo(RangeSelection);\n\nfunction RangeSelection({stateController, customBoundsSelectors, customBoundsSelectorsOnly, sidebarEnabled}) {\n const rightAxisCount = useRightAxisCount(stateController);\n const leftAxisCount = useLeftAxisCount(stateController);\n const showingOptions = useShowingOptions(stateController);\n\n let marginRight = Y_AXIS_WIDTH*rightAxisCount;\n if (rightAxisCount > 0) {\n marginRight += 5;\n }\n\n let marginLeft = Y_AXIS_WIDTH*leftAxisCount;\n if (leftAxisCount > 0) {\n marginLeft += 5;\n }\n\n const { dates } = useGlobalBounds(stateController);\n\n const currentBoundCalculator = useBoundCalculator(stateController);\n const { hasPreviousBounds, hasNextBounds } = useBoundHistory(stateController);\n\n const customBoundSelectorNames = new Set(customBoundsSelectors.map(({ label }) => label));\n\n return (\n <div className={`range-selection${dates ? '' : ' range-not-dates'}`} style={{ marginRight, marginLeft }}>\n <div className=\"range-buttons\">\n {\n showingOptions &&\n <Options\n stateController={stateController}\n sidebarEnabled={sidebarEnabled}\n />\n }\n\n <RangeSelectionButtonBase\n className=\"showing-options-button\"\n selected={showingOptions}\n onClick={() => stateController.toggleShowingOptions()}\n description=\"Show additional options\"\n >\n <div className=\"icon-container icon-container-square\">\n <svg focusable=\"false\" viewBox=\"0 0 512 512\">\n <path fill=\"currentColor\" d=\"M487.4 315.7l-42.6-24.6c4.3-23.2 4.3-47 0-70.2l42.6-24.6c4.9-2.8 7.1-8.6 5.5-14-11.1-35.6-30-67.8-54.7-94.6-3.8-4.1-10-5.1-14.8-2.3L380.8 110c-17.9-15.4-38.5-27.3-60.8-35.1V25.8c0-5.6-3.9-10.5-9.4-11.7-36.7-8.2-74.3-7.8-109.2 0-5.5 1.2-9.4 6.1-9.4 11.7V75c-22.2 7.9-42.8 19.8-60.8 35.1L88.7 85.5c-4.9-2.8-11-1.9-14.8 2.3-24.7 26.7-43.6 58.9-54.7 94.6-1.7 5.4.6 11.2 5.5 14L67.3 221c-4.3 23.2-4.3 47 0 70.2l-42.6 24.6c-4.9 2.8-7.1 8.6-5.5 14 11.1 35.6 30 67.8 54.7 94.6 3.8 4.1 10 5.1 14.8 2.3l42.6-24.6c17.9 15.4 38.5 27.3 60.8 35.1v49.2c0 5.6 3.9 10.5 9.4 11.7 36.7 8.2 74.3 7.8 109.2 0 5.5-1.2 9.4-6.1 9.4-11.7v-49.2c22.2-7.9 42.8-19.8 60.8-35.1l42.6 24.6c4.9 2.8 11 1.9 14.8-2.3 24.7-26.7 43.6-58.9 54.7-94.6 1.5-5.5-.7-11.3-5.6-14.1zM256 336c-44.1 0-80-35.9-80-80s35.9-80 80-80 80 35.9 80 80-35.9 80-80 80z\" />\n </svg>\n </div>\n </RangeSelectionButtonBase>\n \n <RangeSelectionButtonBase\n className=\"range-selection-history\"\n selected={false}\n onClick={() => stateController.previousBounds()}\n disabled={!hasPreviousBounds}\n >\n <div className=\"icon-container\">\n <svg focusable=\"false\" viewBox=\"0 0 256 512\">\n <path fill=\"currentColor\" d=\"M31.7 239l136-136c9.4-9.4 24.6-9.4 33.9 0l22.6 22.6c9.4 9.4 9.4 24.6 0 33.9L127.9 256l96.4 96.4c9.4 9.4 9.4 24.6 0 33.9L201.7 409c-9.4 9.4-24.6 9.4-33.9 0l-136-136c-9.5-9.4-9.5-24.6-.1-34z\" />\n </svg>\n </div>\n </RangeSelectionButtonBase>\n \n <RangeSelectionButtonBase\n className=\"range-selection-history\"\n selected={false}\n onClick={() => stateController.nextBounds()}\n disabled={!hasNextBounds}\n >\n <div className=\"icon-container\">\n <svg focusable=\"false\" viewBox=\"0 0 256 512\">\n <path fill=\"currentColor\" d=\"M224.3 273l-136 136c-9.4 9.4-24.6 9.4-33.9 0l-22.6-22.6c-9.4-9.4-9.4-24.6 0-33.9l96.4-96.4-96.4-96.4c-9.4-9.4-9.4-24.6 0-33.9L54.3 103c9.4-9.4 24.6-9.4 33.9 0l136 136c9.5 9.4 9.5 24.6.1 34z\"/>\n </svg>\n </div>\n </RangeSelectionButtonBase>\n\n {\n customBoundsSelectors.map(({label, calculator, datesOnly}, i) => {\n return (\n <RangeSelectionButton\n key={i}\n stateController={stateController}\n currentBoundCalculator={currentBoundCalculator}\n boundCalculator={calculator}\n disabled={datesOnly && !dates}\n >\n {label}\n </RangeSelectionButton>\n );\n })\n }\n\n {\n !customBoundSelectorNames.has('1m') && !customBoundsSelectorsOnly &&\n <RangeSelectionButton\n stateController={stateController}\n currentBoundCalculator={currentBoundCalculator}\n boundCalculator={BOUND_CALCULATORS.lastMinute}\n disabled={!dates}\n >\n 1m\n </RangeSelectionButton>\n }\n\n {\n !customBoundSelectorNames.has('10m') && !customBoundsSelectorsOnly &&\n <RangeSelectionButton\n stateController={stateController}\n currentBoundCalculator={currentBoundCalculator}\n boundCalculator={BOUND_CALCULATORS.last10Minutes}\n disabled={!dates}\n >\n 10m\n </RangeSelectionButton>\n }\n\n {\n !customBoundSelectorNames.has('1h') && !customBoundsSelectorsOnly &&\n <RangeSelectionButton\n stateController={stateController}\n currentBoundCalculator={currentBoundCalculator}\n boundCalculator={BOUND_CALCULATORS.lastHour}\n disabled={!dates}\n >\n 1h\n </RangeSelectionButton>\n }\n\n {\n !customBoundSelectorNames.has('1d') && !customBoundsSelectorsOnly &&\n <RangeSelectionButton\n stateController={stateController}\n currentBoundCalculator={currentBoundCalculator}\n boundCalculator={BOUND_CALCULATORS.lastDay}\n disabled={!dates}\n >\n 1d\n </RangeSelectionButton>\n }\n\n <RangeSelectionButton\n stateController={stateController}\n currentBoundCalculator={currentBoundCalculator}\n boundCalculator={BOUND_CALCULATORS.all}\n disabled={false}\n >\n All\n </RangeSelectionButton>\n </div>\n </div>\n );\n\n}\n\nRangeSelection.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n customBoundsSelectors: CustomPropTypes.CustomBoundsSelectors.isRequired,\n customBoundsSelectorsOnly: PropTypes.bool,\n sidebarEnabled: PropTypes.bool\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport GraphBodyRenderer from '../renderer/graph_body_renderer';\nimport StateController from '../state/state_controller';\nimport placeGrid from '../helpers/place_grid';\nimport {formatX} from '../helpers/format';\nimport VerticalLines from './vertical_lines.jsx';\nimport CustomPropTypes from '../helpers/custom_prop_types';\n\nexport default class RangeGraph extends React.PureComponent {\n\n constructor(props) {\n super(props);\n\n this.state = {\n elementWidth: 0,\n elementHeight: 0,\n selectionBounds: {\n minX: 0,\n maxX: 0\n },\n globalBounds: {\n minX: 0,\n maxX: 0\n }\n };\n\n this.onMouseMove = this.onMouseMove.bind(this);\n this.stopDragging = this.stopDragging.bind(this);\n this.startScroll = this.startScroll.bind(this);\n this.startLeftDrag = this.startLeftDrag.bind(this);\n this.startRightDrag = this.startRightDrag.bind(this);\n }\n\n getClientX(event) {\n if (event && event.touches && event.touches[0]) {\n return event.touches[0].clientX;\n }\n if (event && event.changedTouches && event.changedTouches[0]) {\n return event.changedTouches[0].clientX;\n }\n return event.clientX;\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 && this._renderer) {\n this._renderer.resize();\n }\n }\n\n componentWillUnmount() {\n if (this._renderer) {\n this._renderer.dispose();\n this._renderer = null;\n }\n }\n\n onMouseMove(event) {\n if (!this._dragType) {\n return;\n }\n\n // Prevent scrolling during touch-drag\n if (event && event.touches && event.preventDefault) {\n event.preventDefault();\n }\n\n let boundCalculator;\n const leftX = this.el.getBoundingClientRect().left;\n\n this.setState(({selectionBounds, globalBounds, elementWidth}) => {\n const pixelX = this.getClientX(event) - 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 window.addEventListener('touchmove', this.onMouseMove, { passive: false });\n window.addEventListener('touchend', this.stopDragging);\n window.addEventListener('touchcancel', this.stopDragging);\n }\n\n stopDragging() {\n this._dragType = null;\n this.forceUpdate();\n window.removeEventListener('mousemove', this.onMouseMove);\n window.removeEventListener('mouseup', this.stopDragging);\n window.removeEventListener('touchmove', this.onMouseMove);\n window.removeEventListener('touchend', this.stopDragging);\n window.removeEventListener('touchcancel', 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 = this.getClientX(event) - 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(event) {\n this._dragType = 'left';\n this.addListeners();\n }\n\n startRightDrag(event) {\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 const totalHeight = elementHeight + barSize; \n let ticks;\n\n if (selectionBounds.dates && this.props.markDates) {\n ticks = placeGrid({\n min: globalBounds.minX,\n max: globalBounds.maxX,\n totalSize: elementWidth,\n precision: 'day',\n dates: selectionBounds.dates,\n formatter: formatX,\n expectedLabelSize: 30,\n labelPadding: 5,\n formatOptions: {\n justMonthAndDay: true,\n unitOverride: 'day',\n timeZone: this.props.timeZone\n },\n skipFirst: true,\n skipLast: true\n });\n }\n\n return (\n <div className=\"range-selection-graph\">\n <div className=\"graph-body graph-body-secondary\" style={{ touchAction: 'none' }}>\n <canvas ref={(el) => this.el = el} />\n\n <svg style={{ height: totalHeight }}>\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 const isHighlighted = pixelValue >= pixelMinX && pixelValue <= pixelMaxX;\n if (isHighlighted) {\n classes.push('axis-item-highlighted');\n }\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 onTouchStart={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 onTouchStart={this.startScroll}\n />\n </g>\n\n <g>\n <rect\n x={pixelMinX}\n y={0}\n width={pixelMaxX - pixelMinX}\n height={totalHeight}\n className=\"target-selection-outline\"\n onMouseDown={this.startScroll}\n onTouchStart={this.startScroll}\n />\n </g>\n\n {/* Left handle */}\n <g className={`selection-handle${(this._dragType === 'left' || this._dragType === 'scroll') ? ' selection-handle-dragging' : ''}`}>\n <rect\n x={pixelMinX - 15}\n y={(elementHeight - 30)/2}\n width={30}\n height={30}\n fill=\"transparent\"\n className=\"selection-bar-handle-hit\"\n onMouseDown={this.startLeftDrag}\n onTouchStart={this.startLeftDrag}\n />\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 onTouchStart={this.startLeftDrag}\n />\n </g>\n\n {/* Right handle */}\n <g className={`selection-handle${(this._dragType === 'right' || this._dragType === 'scroll') ? ' selection-handle-dragging' : ''}`}>\n <rect\n x={pixelMaxX - 15}\n y={(elementHeight - 30)/2}\n width={30}\n height={30}\n fill=\"transparent\"\n className=\"selection-bar-handle-hit\"\n onMouseDown={this.startRightDrag}\n onTouchStart={this.startRightDrag}\n />\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 onTouchStart={this.startRightDrag}\n />\n </g>\n\n </svg>\n\n {\n this.props.verticalLines &&\n <VerticalLines\n stateController={this.props.stateController}\n verticalLines={this.props.verticalLines}\n isRangeGraph={true}\n bounds={globalBounds}\n elementHeight={elementHeight}\n elementWidth={elementWidth}\n />\n }\n </div>\n </div>\n );\n }\n\n}\n\nRangeGraph.defaultProps = {\n width: 3,\n shadowColor: 'transparent'\n};\n\nRangeGraph.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n webgl: PropTypes.bool,\n draggingY: PropTypes.bool,\n checkIntersection: PropTypes.bool,\n markDates: PropTypes.bool,\n timeZone: PropTypes.string,\n verticalLines: CustomPropTypes.VerticalLines\n};","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';\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.jsx';\nimport SeriesKeyAxisContainer from './series_key_axis_container.jsx';\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","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","import React, { useEffect, useMemo } from 'react';\nimport PropTypes from 'prop-types';\nimport CustomPropTypes from './helpers/custom_prop_types';\nimport GraphBody from './components/graph_body.jsx';\nimport './grapher.scss';\nimport XAxis from './components/x_axis.jsx';\nimport YAxis from './components/y_axis.jsx';\nimport RangeSelection from './components/range_selection.jsx';\nimport RangeGraph from './components/range_graph.jsx';\nimport SeriesKey from './components/series_key.jsx';\nimport {Y_AXIS_WIDTH} from './helpers/axis_sizes';\nimport GraphTitle from './components/graph_title.jsx';\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.jsx';\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 : true;\n const showAxes = typeof props.showAxes === 'boolean' ? props.showAxes : false;\n\n const commonYAxisProps = {\n stateController,\n 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 onPointClick={props.onPointClick}\n verticalLines={props.verticalLines}\n clockStyle={props.clockStyle}\n timeZone={props.timeZone}\n />\n\n <XAxis\n showGrid={showGrid}\n showAxes={showAxes}\n stateController={stateController}\n bigLabels={bigLabels}\n xTickUnit={props.xTickUnit}\n clockStyle={props.clockStyle}\n timeZone={props.timeZone}\n integersOnly={props.xAxisIntegersOnly}\n formatXAxisLabel={props.formatXAxisLabel}\n />\n\n {\n props.showRangeGraph &&\n <div className=\"range-graph-container\">\n <RangeGraph\n stateController={stateController}\n webgl={props.webgl}\n checkIntersection={props.checkIntersection}\n markDates={props.markRangeGraphDates}\n timeZone={props.timeZone}\n verticalLines={props.verticalLines}\n />\n </div>\n }\n </div>\n\n {\n rightAxes.map((axis, i) => {\n return <YAxis\n key={i}\n axis={axis}\n sideIndex={i}\n {...commonYAxisProps}\n />;\n })\n }\n\n {\n draggingY &&\n <div\n className=\"axis y-axis\"\n data-axis-index=\"new-right\"\n data-grapher-id={props.id}\n style={{\n width: Y_AXIS_WIDTH,\n height: typeof props.bodyHeight === 'number' ? props.bodyHeight : undefined\n }}\n />\n }\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nGrapher.propTypes = {\n series: CustomPropTypes.Series.isRequired,\n webgl: PropTypes.bool,\n requireWASM: PropTypes.bool,\n checkIntersection: PropTypes.bool,\n\n onAxisChange: PropTypes.func,\n onRenderTime: PropTypes.func,\n exportStateController: PropTypes.func,\n timingFrameCount: PropTypes.number,\n\n stateControllerInitialization: PropTypes.object,\n syncPool: PropTypes.instanceOf(SyncPool),\n id: PropTypes.string,\n dragPositionYOffset: PropTypes.number,\n\n theme: PropTypes.oneOf(['day', 'night', 'export']),\n title: PropTypes.string,\n fullscreen: PropTypes.bool,\n bodyHeight: PropTypes.number,\n height: PropTypes.number,\n width: PropTypes.number,\n\n showAxes: PropTypes.bool,\n showRangeGraph: PropTypes.bool,\n showRangeSelectors: PropTypes.bool,\n showSeriesKey: PropTypes.bool,\n showTooltips: PropTypes.bool,\n showGrid: PropTypes.bool,\n showAxisColors: PropTypes.bool,\n bigLabels: PropTypes.bool,\n xTickUnit: PropTypes.oneOf(['year']),\n formatXAxisLabel: PropTypes.func,\n xAxisIntegersOnly: PropTypes.bool,\n clockStyle: PropTypes.oneOf(['12h', '24h']),\n timeZone: PropTypes.string, // local, utc, or a full timezone string\n markRangeGraphDates: PropTypes.bool,\n\n boundsSelectionEnabled: PropTypes.bool,\n sidebarEnabled: PropTypes.bool,\n\n percentile: PropTypes.number,\n defaultShowOptions: PropTypes.bool,\n defaultShowIndividualPoints: PropTypes.bool,\n defaultShowSidebar: PropTypes.bool,\n defaultShowAnnotations: PropTypes.bool,\n defaultLineWidth: PropTypes.number,\n\n tooltipOptions: CustomPropTypes.TooltipOptions,\n\n customBoundsSelectors: CustomPropTypes.CustomBoundsSelectors,\n customBoundsSelectorsOnly: PropTypes.bool,\n defaultBoundsCalculator: PropTypes.string,\n\n annotations: CustomPropTypes.Annotations,\n draggablePoints: CustomPropTypes.DraggablePoints,\n onPointDrag: PropTypes.func,\n onDraggablePointsDoubleClick: PropTypes.func,\n verticalLines: CustomPropTypes.VerticalLines,\n onPointClick: PropTypes.func\n};\n\nexport const AVAILABLE_COLORS = LINE_COLORS;\nexport const BUILT_IN_BOUND_CALCULATORS = BOUND_CALCULATORS;\n","import Eventable from '../eventable.js';\nimport getColor from '../helpers/colors.js';\nimport nameForSeries from '../helpers/name_for_series.js';\n\nexport default class MultigraphStateController extends Eventable {\n\n constructor({ id }) {\n super();\n\n this._id = id;\n\n this._multiSeries = [];\n this._seriesToGraphIndices = new Map();\n this._graphIndicesToSeries = new Map();\n this._modifiedSeries = new Map();\n this._originalSeriesByMultigrapherIndex = new Map();\n this._stateControllers = new Set();\n this._prevSeries = [];\n\n this._dataCache = new Map();\n this._subscriptions = new Map();\n\n this._draggingY = false;\n\n this.on('multi_series_changed', () => {\n for (let stateController of this._stateControllers) {\n stateController._multiSeries = this._multiSeries;\n }\n });\n }\n\n /**\n * Takes an array of user-supplied series, then splits, modifies, and broadcasts them\n *\n * @param {Array<Object>} series\n */\n setSeries(series) {\n\n if (this._prevSeries.length === series.length) {\n let anyDifferent = false;\n for (let i = 0; i < series.length; i++) {\n if (series[i] !== this._prevSeries[i]) {\n anyDifferent = true;\n break;\n }\n }\n\n if (!anyDifferent) {\n return;\n }\n }\n\n this._prevSeries = series;\n\n const graphIndices = new Set();\n const currentSeriesSet = new Set(series);\n\n for (let singleSeries of series) {\n let graphIndex = singleSeries.graph || 0;\n\n if (this._seriesToGraphIndices.has(singleSeries)) {\n graphIndex = this._seriesToGraphIndices.get(singleSeries);\n }\n\n graphIndices.add(graphIndex);\n\n let seriesSet = this._graphIndicesToSeries.get(graphIndex);\n if (!seriesSet) {\n seriesSet = new Set();\n this._graphIndicesToSeries.set(graphIndex, seriesSet);\n }\n\n seriesSet.add(singleSeries);\n }\n\n const sortedGraphIndices = [...graphIndices].sort();\n\n this._multiSeries = [];\n let globalSeriesIndex = 0;\n\n for (let graphIndex of sortedGraphIndices) {\n const series = [];\n\n for (let singleSeries of this._graphIndicesToSeries.get(graphIndex)) {\n if (!currentSeriesSet.has(singleSeries)) {\n this._graphIndicesToSeries.get(graphIndex).delete(singleSeries);\n continue;\n }\n\n if (this._modifiedSeries.has(singleSeries)) {\n globalSeriesIndex++;\n series.push(this._modifiedSeries.get(singleSeries));\n continue;\n }\n\n const color = getColor(singleSeries.color, globalSeriesIndex);\n const name = nameForSeries(singleSeries, globalSeriesIndex);\n const modifiedSeries = {\n ...singleSeries,\n multigrapherSeriesIndex: globalSeriesIndex,\n multigrapherGraphIndex: graphIndex,\n color,\n name\n };\n\n this._modifiedSeries.set(singleSeries, modifiedSeries);\n this._originalSeriesByMultigrapherIndex.set(globalSeriesIndex, singleSeries);\n\n globalSeriesIndex++;\n series.push(modifiedSeries);\n }\n\n this._multiSeries.push(series);\n }\n\n if (this._nextMultigrapherSeriesIndex) {\n this._nextMultigrapherSeriesIndex = this._nextMultigrapherSeriesIndex - this._multiSeriesCount + globalSeriesIndex;\n } else {\n this._nextMultigrapherSeriesIndex = globalSeriesIndex;\n }\n this._multiSeriesCount = globalSeriesIndex;\n\n this.emit('multi_series_changed', this.multiSeries);\n }\n\n /**\n * Registers a state controller for series switching\n *\n * @param {StateController} stateController\n */\n registerStateController(stateController) {\n if (this._stateControllers.has(stateController)) {\n return;\n }\n\n this._stateControllers.add(stateController);\n stateController._multigraphStateController = this;\n stateController._multiSeries = this._multiSeries;\n\n stateController.on('dragging_y_finalized', ({ grapherID, axisIndex, draggedSeries }={}) => {\n if (grapherID === stateController.grapherID) {\n return;\n }\n\n const [check, multigrapherID, graphIndex] = grapherID.split('-');\n if (check !== 'multigrapher' || multigrapherID !== this._id) {\n return;\n }\n\n setTimeout(() => {\n this.moveSeries({ axisIndex, draggedSeries, graphIndex });\n });\n });\n\n stateController.on('dragging_y_changed', (draggingY) => {\n if (draggingY === this._draggingY) {\n return;\n }\n\n this._draggingY = draggingY;\n this.emit('dragging_y_changed', this._draggingY);\n });\n\n stateController.on('observable_modified', (observable) => {\n for (let otherStateController of this._stateControllers) {\n if (stateController === otherStateController) {\n continue;\n }\n\n otherStateController.markObservableModified(observable);\n }\n });\n\n stateController.on('dispose', () => {\n this._stateControllers.delete(stateController);\n });\n }\n\n /**\n * Moves the given dragged series (as specified by the child state controller) to a different graph\n *\n * @param {String} axisIndex - the axis index on the new graph to move the series to\n * @param {Object} draggedSeries - the series that got dragged. Different identity than what this may access\n * @param {String} graphIndex - the index of the graph to assign it to\n */\n moveSeries({ axisIndex, draggedSeries, graphIndex }) {\n const prevGraphCount = this.graphCount;\n\n const originalSeries = this._originalSeriesByMultigrapherIndex.get(draggedSeries.multigrapherSeriesIndex);\n const modifiedSeries = this._modifiedSeries.get(originalSeries);\n\n this._multiSeries[modifiedSeries.multigrapherGraphIndex].splice(\n this._multiSeries[modifiedSeries.multigrapherGraphIndex].indexOf(modifiedSeries), 1\n );\n this._multiSeries[modifiedSeries.multigrapherGraphIndex] = [...this._multiSeries[modifiedSeries.multigrapherGraphIndex]];\n\n if (graphIndex === 'top') {\n modifiedSeries.multigrapherGraphIndex = this._createGraphAtTop();\n } else if (graphIndex === 'bottom') {\n modifiedSeries.multigrapherGraphIndex = this._createGraphAtBottom();\n } else {\n modifiedSeries.multigrapherGraphIndex = parseInt(graphIndex);\n }\n\n modifiedSeries.axisIndex = axisIndex;\n // safe because stateController operates on a copy. We could also have changed the identify of modifiedSeries,\n // but with that we might reset data when moving it back\n delete modifiedSeries.axis;\n\n this._multiSeries[modifiedSeries.multigrapherGraphIndex] = [...this._multiSeries[modifiedSeries.multigrapherGraphIndex], modifiedSeries];\n this._multiSeries = [...this._multiSeries];\n\n for (let graphIndex = 0; graphIndex < this._multiSeries.length; graphIndex++) {\n const originalSeriesAtIndex = this._multiSeries[graphIndex].map(({ multigrapherSeriesIndex }) =>\n this._originalSeriesByMultigrapherIndex.get(multigrapherSeriesIndex));\n this._graphIndicesToSeries.set(graphIndex, new Set(originalSeriesAtIndex));\n\n for (let singleSeries of originalSeriesAtIndex) {\n this._seriesToGraphIndices.set(singleSeries, graphIndex);\n }\n }\n\n this.emit('multi_series_changed', this.multiSeries);\n this.emit('graph_count_changed', this.graphCount, prevGraphCount);\n }\n\n /**\n * Finds or creates an empty graph at the beginning and returns its index\n *\n * @return {number}\n * @private\n */\n _createGraphAtTop() {\n // check if there's anything at the beginning already\n let emptyAtTopIndex = null;\n\n for (let i = 0; i < this._multiSeries.length; i++) {\n if (this._multiSeries[i].length === 0) {\n emptyAtTopIndex = i;\n } else {\n break;\n }\n }\n\n if (emptyAtTopIndex !== null) {\n return emptyAtTopIndex;\n }\n\n // add a series at the beginning and mutate the graph index of each\n this._multiSeries = [[], ...this._multiSeries];\n for (let graphIndex = 0; graphIndex < this._multiSeries.length; graphIndex++) {\n if (!this._multiSeries[graphIndex].length) {\n continue;\n }\n\n this._multiSeries[graphIndex] = [...this._multiSeries[graphIndex]];\n\n for (let modifiedSeries of this._multiSeries[graphIndex]) {\n modifiedSeries.multigrapherGraphIndex = graphIndex;\n }\n }\n\n return 0;\n }\n\n /**\n * Finds or creates an empty graph at the end and returns its index\n *\n * @return {number}\n * @private\n */\n _createGraphAtBottom() {\n // check if there's anything at the beginning already\n let emptyAtBottomIndex = null;\n\n for (let i = this._multiSeries.length - 1; i >= 0; i--) {\n if (this._multiSeries[i].length === 0) {\n emptyAtBottomIndex = i;\n } else {\n break;\n }\n }\n\n if (emptyAtBottomIndex !== null) {\n return emptyAtBottomIndex;\n }\n\n // add something at the bottom\n this._multiSeries = [...this._multiSeries, []];\n\n return this._multiSeries.length - 1;\n }\n\n get multiSeries() {\n return this._multiSeries.filter((series) => series.length);\n }\n\n get series() {\n return [...this._stateControllers].map((stateController) => stateController.series).flat();\n }\n\n get graphCount() {\n return this.multiSeries.length;\n }\n\n get draggingY() {\n return this._draggingY;\n }\n\n dispose() {\n this.clearListeners();\n\n for (let listener of this._subscriptions.values()) {\n listener.unsubscribe();\n }\n\n this._subscriptions.clear();\n }\n\n get stateControllerInitialization() {\n return {\n sharedDataCache: this._dataCache,\n sharedSubscriptions: this._subscriptions\n };\n }\n\n incrementMultigrapherSeriesIndex() {\n const index = this._nextMultigrapherSeriesIndex;\n\n this._nextMultigrapherSeriesIndex ++;\n\n return index;\n }\n}\n","import React, { useEffect, useMemo } from 'react';\nimport PropTypes from 'prop-types';\nimport Grapher from './grapher.jsx';\nimport MultigraphStateController from './state/multigraph_state_controller.js';\nimport {useDraggingY, useMultiSeries} from './state/hooks.js';\nimport SyncPool from './state/sync_pool.js';\n\nexport default React.memo(MultiGrapher);\n\n\nfunction MultiGrapher(props) {\n /* eslint-disable react/prop-types */\n\n const multigrapherID = useMemo(() => Math.random().toString(36).slice(2), []);\n\n const multigraphStateController = useMemo(() => new MultigraphStateController({\n id: multigrapherID,\n ...props\n }), []);\n\n const multiSeries = useMultiSeries(multigraphStateController);\n\n const syncPool = useMemo(() => new SyncPool({\n syncBounds: props.syncBounds,\n syncTooltips: props.syncTooltips,\n syncDragState: true\n }), []);\n\n const registerStateController = useMemo(() => multigraphStateController.registerStateController.bind(multigraphStateController), [multigraphStateController]);\n\n useEffect(() => {\n if (process.env.NODE_ENV === 'development') {\n window.multigraphStateController = multigraphStateController;\n }\n\n return () => {\n multigraphStateController.dispose();\n };\n }, [multigraphStateController]);\n\n useEffect(() => {\n props.exportStateController && props.exportStateController(multigraphStateController);\n }, [multigraphStateController, props.exportStateController]);\n\n useEffect(() => {\n multigraphStateController.setSeries(props.series);\n }, [multigraphStateController, props.series]);\n\n useEffect(() => {\n if (!props.onMultiseriesChange) {\n return () => {};\n }\n\n multigraphStateController.on('multi_series_changed', props.onMultiseriesChange);\n return () => {\n multigraphStateController.off('multi_series_changed', props.onMultiseriesChange);\n };\n }, [multigraphStateController, props.onMultiseriesChange]);\n\n const draggingY = useDraggingY(multigraphStateController);\n\n return (\n <div className=\"multigrapher\">\n {\n draggingY && props.newUpperEnabled &&\n <div className={`new-grapher grapher-${props.theme}`} data-grapher-id={`multigrapher-${multigrapherID}-top`}>\n New grapher\n </div>\n }\n\n {\n multiSeries.map((series, i) =>\n <Grapher\n key={i}\n {...props}\n syncPool={syncPool}\n stateControllerInitialization={multigraphStateController.stateControllerInitialization}\n series={series}\n id={`multigrapher-${multigrapherID}-${i}`}\n dragPositionYOffset={props.newUpperEnabled ? 38 : 0}\n exportStateController={registerStateController}\n />\n )\n }\n\n {\n draggingY &&\n <div className={`new-grapher grapher-${props.theme}`} data-grapher-id={`multigrapher-${multigrapherID}-bottom`}>\n New grapher\n </div>\n }\n </div>\n );\n}\n\nMultiGrapher.defaultProps = {\n theme: 'night'\n};\n\nMultiGrapher.propTypes = Object.assign({}, Grapher.propTypes, {\n syncBounds: PropTypes.bool,\n syncTooltips: PropTypes.bool,\n newUpperEnabled: PropTypes.bool,\n onMultiseriesChange: PropTypes.func\n});\n"],"names":["LINE_COLORS","getColor","seriesColor","i","multigrapherSeriesIndex","length","undefined","applyReducedOpacity","color","opacityFactor","startsWith","matches","match","r","g","b","a","parseFloat","hex","slice","split","map","char","join","parseInt","applyReducedOpacityToGradient","gradient","Array","isArray","stop","position","createDefaultGradient","halfOpacityColor","___CSS_LOADER_EXPORT___","push","module","id","exports","cssWithMappingToString","list","toString","this","item","content","needLayer","concat","modules","media","dedupe","supports","layer","alreadyImportedModules","k","_k","cssMapping","btoa","base64","unescape","encodeURIComponent","JSON","stringify","data","sourceMapping","ReactPropTypesSecret","emptyFunction","emptyFunctionWithReset","resetWarningCache","shim","props","propName","componentName","location","propFullName","secret","err","Error","name","getShim","isRequired","ReactPropTypes","array","bigint","bool","func","number","object","string","symbol","any","arrayOf","element","elementType","instanceOf","node","objectOf","oneOf","oneOfType","shape","exact","checkPropTypes","PropTypes","stylesInDOM","getIndexByIdentifier","identifier","result","modulesToDom","options","idCountMap","identifiers","base","count","indexByIdentifier","obj","css","sourceMap","references","updater","addElementStyle","byIndex","splice","api","domAPI","update","newObj","remove","lastIdentifiers","newList","index","newLastIdentifiers","_i","_index","memo","insert","style","target","styleTarget","document","querySelector","window","HTMLIFrameElement","contentDocument","head","e","getTarget","appendChild","createElement","setAttributes","attributes","styleElement","nonce","setAttribute","insertStyleElement","styleTagTransform","apply","parentNode","removeChild","removeStyleElement","styleSheet","cssText","firstChild","createTextNode","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","m","n","getter","__esModule","d","definition","key","o","Object","defineProperty","enumerable","get","f","chunkId","Promise","all","keys","reduce","promises","u","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","p","URL","url","installedChunks","installChunk","ids","runtime","j","installedChunkData","promise","import","then","race","resolve","nc","y","__WEBPACK_EXTERNAL_MODULE_react__","x","SIMPLE_DATA_TYPES","DATA_TYPES","Data","SingleSeries","type","xKey","yKey","xUnixDates","xLabel","yLabel","ignoreDiscontinuities","dashed","dashPattern","width","rangeSelectorWidth","axis","expandYWith","defaultAlwaysTooltipped","square","shiftXBy","graph","background","hideFromKey","showIndividualPoints","minPointSpacing","rendering","negativeColor","negativeGradient","zeroLineWidth","zeroLineColor","zeroLineY","pointRadius","tooltipWidth","hasAreaBottom","shadowColor","rangeKey","Series","Axis","axisIndex","series","side","scale","label","Axes","CustomBoundsSelector","calculator","datesOnly","CustomBoundsSelectors","TooltipOptionsRaw","includeSeriesLabel","includeXLabel","includeYLabel","includeXValue","includeYValue","floating","alwaysFixedPosition","floatPosition","floatDelta","savingDisabled","customTooltip","combineTooltips","TooltipOptions","Annotation","Date","startX","endX","lineOnly","Annotations","DraggablePoint","radius","fillColor","strokeColor","strokeWidth","onClick","onDoubleClick","DraggablePoints","VerticalLine","lineTop","markTop","markerStyle","text","textTop","textStyle","minPixelX","maxPixelX","onRangeGraph","onRangeGraphOnly","VerticalLines","Eventable","constructor","_listeners","clearListeners","on","eventName","fn","Set","add","off","delete","size","emit","args","arguments","forEach","inferType","useSimpleData","simpleData","observe","colorToVector","parts","part","test","substr","createGLProgram","gl","vertShaderSource","fragShaderSource","vertexShader","createShader","VERTEX_SHADER","shaderSource","compileShader","getShaderParameter","COMPILE_STATUS","console","error","getShaderInfoLog","fragmentShader","FRAGMENT_SHADER","program","createProgram","attachShader","linkProgram","getProgramParameter","LINK_STATUS","validateProgram","VALIDATE_STATUS","getProgramInfoLog","BackgroundProgram","_gl","_program","backgroundVert","backgroundFrag","_vertexBuffer","createBuffer","_indexBuffer","getExtension","draw","useProgram","minXt","maxXt","uniform4f","getUniformLocation","vertices","Float32Array","bindBuffer","ARRAY_BUFFER","bufferData","STATIC_DRAW","positionLocation","getAttribLocation","enableVertexAttribArray","vertexAttribPointer","FLOAT","enable","BLEND","blendFunc","SRC_ALPHA","ONE_MINUS_SRC_ALPHA","drawArrays","TRIANGLES","DPI_INCREASE","async","sizeCanvas","canvas","context","reset","height","requestAnimationFrame","boundingRect","getBoundingClientRect","dpr","devicePixelRatio","bsr","webkitBackingStorePixelRatio","mozBackingStorePixelRatio","msBackingStorePixelRatio","oBackingStorePixelRatio","backingStorePixelRatio","pixelRatio","elementWidth","elementHeight","renderWidth","renderHeight","pathsFrom","dataInRenderSpace","splitAtY","paths","currentPath","previouslyDiscontinuous","nullMask","maxYValues","minYValues","yValues","minY","maxY","prevY","drawZeroLine","sizing","zeroColor","zeroWidth","strokeStyle","lineWidth","beginPath","moveTo","lineTo","stroke","renderEntireArea","path","areaBottomPath","zero","hasNegatives","fillStyle","globalGradient","createLinearGradient","addColorStop","areaBottom","firstX","_startY","lastX","_lastY","fill","renderAreaSegment","splitIndex","ghostPoint","isPreCutoff","areaBottomPaths","gradientColor","endIndex","Math","min","lastPoint","startIndex","startPoint","max","drawPointsNormally","individualPoints","pointColor","arc","PI","drawLinesNormally","linePaths","highlighted","drawLinesWithCutoff","timeRatio","cutoffOpacity","cutoffPixelX","preCutoffPaths","postCutoffPaths","prePath","postPath","lastPrePoint","firstPostPoint","x1","y1","x2","y2","unshift","reducedColor","drawPointsWithCutoffByRatio","isBeforeCutoff","getBarWidths","closestSpacing","bounds","axisSeriesCount","fullBarWidth","maxX","minX","totalBarWidth","barWidth","barSpacing","applyPointSpacing","points","minSpacing","spacedPoints","point","rustApiModule","RustAPIPromise","default","RustAPI","extractVerticesFromPaths","pointNumber","positions","prevPositions","indices","Uint32Array","verticesPattern","set","vertexPointer","sourceLength","copyWithin","pointI","prevX","LineProgram","lineVert","lineFrag","_circleProgram","circleVert","circleFrag","_positionBuffer","_prevPositionBuffer","_individualPointBuffer","dispose","clear","drawingBufferWidth","drawingBufferHeight","clearColor","viewport","parameters","thickness","shadowBlur","renderCutoffGradient","cutoffIndex","originalData","drawLineWithCutoff","get_point_number","extract_vertices","extractVertices","positionIndex","prevPositionIndex","vertexIndex","uniform1f","colorVector","cutoffX","ELEMENT_ARRAY_BUFFER","drawElements","UNSIGNED_INT","pointSize","getIndividualPoints","cutoffTime","baseIndex","floor","fraction","cutoffDate","getTime","currentDate","nextDate","currentTime","preCutoffPoints","postCutoffPoints","isPreview","visibleMinTime","selectionBounds","pixelX","pixelY","visibleMaxTime","reducedOpacityColor","flat","POINTS","visibleCutoffRatio","ShadowProgram","shadowVert","shadowFrag","positionLoc","trapezoidBoundsLoc","trapezoidBottomLoc","_trapezoidBoundsBuffer","_trapezoidBottomBuffer","_gradientTexture","createTexture","deleteTexture","generateTrapezoidGeometry","trapezoids","trapezoidBounds","trapezoidBottom","trap","bottomY1","bottomY2","bottom","parseGradient","fallbackColor","fallbackColorVec","textureData","Uint8Array","textureWidth","gradientCount","colors","stops","stopIndex","colorIndex","params","drawShadowWithCutoff","positiveTrapezoids","negativeTrapezoids","inRenderSpaceAreaBottom","y1RelativeToZero","y2RelativeToZero","xCross","abs","yCross","finalX2","finalY2","finalBottomY2","ratio","trapezoid","renderTrapezoidSet","trapSet","geometry","gradientData","activeTexture","TEXTURE0","bindTexture","TEXTURE_2D","texImage2D","RGBA","UNSIGNED_BYTE","texParameteri","TEXTURE_MIN_FILTER","NEAREST","TEXTURE_MAG_FILTER","TEXTURE_WRAP_S","CLAMP_TO_EDGE","TEXTURE_WRAP_T","uniform1i","uniform4fv","getError","NO_ERROR","_lastIndividualPoints","_lastParams","currentItem","nextItem","visibleBounds","firstTime","lastTime","firstItem","lastItem","translucentGradient","drawSplitShadowTrapezoids","disable","DEPTH_TEST","GraphBodyRenderer","stateController","canvasElement","webgl","checkIntersection","super","_stateController","_checkIntersection","_canvas","_webgl","_context","getContext","_lineProgram","_shadowProgram","alert","_context2d","_initialized","_initializeCanvas","_boundResize","resize","bind","_cachedAxisCount","_onAxisChange","axes","filter","_resizeObserver","disconnect","_intersectionObserver","_zeroLineCanvas","_zeroLineContext","clearRect","render","singleSeries","inRenderSpace","defaultLineWidth","globalBounds","warn","cutoffData","xValue","yValue","currentPoint","nextPoint","nextTime","useDataSpace","includeBeyondBounds","currentBounds","threshold","pastThreshold","samples","xCoord","inSelectedSpace","inDataSpace","boundsMinX","boundsMaxX","foundBeyondBounds","lastPointBeforeBounds","_sizing","yCoord","beforeXValue","beforeY","beforeXCoord","beforeYCoord","commonCPUParams","willReadFrequently","flush","find","tuple","some","barParams","indexInAxis","indexOf","selection","rangeGraphRenderer","_bounds","_selection","barBottom","barColor","dataPoint","negColor","fillRect","drawBarsWithCutoff","drawBars","areaParams","shouldSplitAreaPaths","areaPaths","pathI","reducedOpacityGradient","renderCutoffIndex","preCutoffPath","preCutoffAreaBottomPath","bottomGhostPoint","postCutoffPath","postCutoffAreaBottomPath","visibleTimeRatio","drawAreaWithCutoff","isPositive","sumY","negGradient","positive","pointsToRender","drawArea","shadowProgram","boundsChanged","_lastBounds","_lastRenderHeight","_lastShadowCache","shadowParams","save","globalCompositeOperation","restore","top","left","pointerEvents","insertBefore","nextSibling","shouldShowIndividualPoints","drawContext","_overlayCanvas","_overlayContext","drawParams","getRanges","range","pixelMinY","pixelMaxY","setLineDash","beforeIndex","afterIndex","ceil","beforePoint","afterPoint","ranges","horizontalBarWidth","now","require","drawLine","renderBackground","inBackgroundSpace","_backgroundProgram","drawBackground","markSizeChanged","ResizeObserver","first","disabled","IntersectionObserver","entries","clearTimeout","_intersectionTimeout","isIntersecting","setTimeout","sizingPromise","resizeDebounced","_resizeTimeout","recalculatePosition","calculatePrecision","log10","roundToPrecision","precision","isNaN","rounded","toFixed","stripped","includes","replace","DATE_TIME_FORMATTERS","timezoneToOffsetMS","timeZone","sampleDate","datetimeFormatter","properTimeZone","Intl","DateTimeFormat","resolvedOptions","timeZoneName","offsetPart","formatToParts","hours","minutes","startOfDayInTimezone","date","timezone","startOfDay","setHours","offset","setUTCHours","valueOf","formatX","dates","justTime","justDate","justMonthAndDay","clockStyle","unitOverride","integersOnly","inverseEnumMap","time","utc","toLowerCase","localOffset","year","getUTCFullYear","getFullYear","month","getUTCMonth","getMonth","day","getUTCDate","getDate","toLocaleDateString","getUTCHours","getHours","getUTCMinutes","getMinutes","seconds","getUTCSeconds","getSeconds","milliseconds","getUTCMilliseconds","getMilliseconds","timeString","padStart","formatTime","round","formatY","log","Y_AXIS_WIDTH","getYLabelContent","fullYPrecision","TooltipLabel","axisLabel","textLeft","formatXOptions","React","propTypes","CustomPropTypes","Tooltip","halfHeight","passThroughProps","preparedTooltips","tooltips","tooltip","fixedPosition","multiplier","caretSize","isFinite","transform","commonLabelProps","maxPrecision","baseLeft","yTranslation","axisCount","caretPadding","Boolean","CustomTooltipComponent","groupedTooltips","combinationThreshold","added","group","totalHeight","maxWidth","sort","className","_extends","defaultProps","mouseX","mouseY","ContextMenu","setTextRef","ref","textRef","contextMenu","showing","createRange","getSelection","removeAllRanges","selectNodeContents","addRange","focus","formatDateTime","dateTimeStr","datePart","timePart","formattedDate","period","toLocaleString","displayValue","autoFocus","simpleSeriesToDataSpace","tuples","tuplesToDataSpace","values","valuesToDataSpace","objects","objectsToDataSpace","originalXValue","enumToNumber","valueXStart","readBinaryFormatValue","view","getUint32","BYTES_PER_ELEMENT","getUint8","getFloat64","buffer","ArrayBuffer","DataView","xIndex","channels","yIndex","offsets","subpoint","finalizeBounds","initial","calculateDataBounds","percentile","percentileAsymmetry","sortedByY","_x","_x1","_x2","asymmetry","inBottomPercentile","inTopPercentile","percentileBounds","spacing","mergeBounds","boundsList","mergedBounds","expandBounds","extendXForNBars","expandedBounds","assign","unscaledMinY","unscaledMaxY","midpoint","binarySearch","targetX","searchParams","returnIndex","middleIndex","searchType","dataSpaceToSelectedSpace","swap","firstAdded","lastAdded","addToEndOnly","beginningInterpolationIndex","endInterpolationIndex","pop","shift","interpolationIndex","interpolate","lastIncluded","nullIndex","selectedIndex","dataIndex","begPoint","endPoint","firstIndex","secondIndex","boundary","xBefore","yBefore","xAfter","yAfter","percent","scaleBounds","selectedSpaceToRenderSpace","dataChanged","Float64Array","scaledBounds","inParams","dataF64","dataNullMask","copyIndexStart","hasSwap","useSwap","extraSpaceFactor","selected_space_to_render_space","prevI","minSeenY","maxSeenY","curY","selectedSpaceToRenderSpaceInPlace","flattenSimpleData","flattened","fI","extractYValue","extractXValue","moveTooltip","distance","sqrt","xDistance","pixelWidth","lastMinute","last10Minutes","lastHour","lastDay","condenseDataSpace","targetBucketCount","partiallyCondensedData","CONDENSE_THRESHOLD","condensedData","bucketSize","minInBucket","maxInBucket","currentBucketIndex","bucketIndex","nameForSeries","selectedSpaceToBackgroundSpace","conditions","evaluator","comparator","comparedAgainst","parsedValue","currentSection","condition","interpolatedMaxX","interpolatedMinX","StateController","defaultBoundsCalculator","customBoundsSelectors","requireWASM","defaultShowIndividualPoints","defaultShowSidebar","defaultShowAnnotations","defaultShowOptions","syncPool","grapherID","sharedDataCache","sharedSubscriptions","fullscreen","_requireWASM","_markDirty","_series","_seriesFromOriginalSeries","Map","_axes","_highlightedSeries","_showIndividualPoints","_autoscaleY","_percentile","_percentileAsymmetry","_showingOptions","_maxPrecision","_showingSidebar","_showingAnnotations","_grapherID","_fullscreen","_alwaysTooltipped","_tooltipState","mousePresent","_contextMenuPosition","_savedTooltips","_draggingY","_annotations","_annotationsState","annotations","_enumMap","_hasXEnum","_timingBuffer","_timingIndex","_timingFrameCount","_modifiedSeries","_deferredEmissions","_deferredPriorityEmissions","primaryRenderer","_boundsCalculator","givenLabel","customCalculators","BOUND_CALCULATORS","getDefaultBoundsCalculator","_boundsHistory","_boundsIndex","_dataCache","_subscriptions","_subscriptionsShared","_observablesToSeries","_generators","_generatorsToSeries","_generatorCallArgs","_seriesChangedFromPromises","_syncPool","_onDataChange","listener","unsubscribe","_removeSeries","disposed","setSeries","userSeries","userCreated","propsSeries","anyDifferent","originalSeries","_mustResize","newSeriesSet","has","_tooltipsChanged","deferredEmit","_assignAxisTo","hidden","_hideSeries","_dataChanged","_frameRequested","frameRequestStart","performance","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","alwaysTooltipped","savedTooltips","allTooltipped","savedTooltip","minDistance","Infinity","trueX","dataMinX","dataMaxX","dataRange","padding","closestIndex","closestPoint","ignoreYDistanceCheck","xDistanceThreshold","yDistanceThreshold","distanceThreshold","yDistance","enumLike","hasEnum","simplePoint","hasXEnum","unsavedTooltips","unsavedTooltipsCount","calculateTooltipState","_tooltipAllNext","_globalBounds","_tooltipStateArg","newX","right","shownSeries","xRange","annotation","seriesName","isRange","isPoint","xStartValue","xEndValue","convertToNumber","val","pixelStartX","pixelEndX","calculateAnnotationsState","_expandYWith","dataBoundsList","simpleDataSliceStart","dataBounds","_dataBounds","_recalculateSelection","disableSwap","selectedBounds","selectedBoundsAreaTop","selectedBoundsAreaBottom","inSelectedSpaceAreaBottom","_recalculateAxisBounds","modifiedSeries","newData","modifiedAxes","modifiedSeriesAndDependents","newDataInDataSpace","newDataBounds","newPointCount","previousSelection","newSelectedData","fixedY","targetBounds","byAxis","selectedBoundsList","selectedDataBounds","boundsCalculator","selectionFromGlobalBounds","_","export","night","_theme","inBackgroundSpacePrimary","inRenderSpacePrimary","_defaultLineWidth","inRenderSpacePrimaryAreaBottom","rangeGraphBounds","inRenderSpaceRangeGraph","inRenderSpaceRangeGraphAreaBottom","s","toCondensedSelectedSpaceParams","inCondensedSelectedSpacePrimary","toRenderSpaceParams","inCondensedSelectedSpacePrimaryAreaBottom","inBackgroundSpacePrimaryAreaBottom","toSelectedSpaceParams","inSelectedSpaceRangeGraph","inCondensedSelectedSpaceRangeGraph","inSelectedSpaceRangeGraphAreaBottom","inCondensedSelectedSpaceRangeGraphAreaBottom","_createAxis","_moveAxis","newAxis","oldAxis","oldIndex","leftAxes","rightAxes","exportedAxes","originalAxis","seen","candidateAxis","findMatchingAxis","inValueSpacePrimary","inValueSpaceRangeGraph","_showSeries","boundCalculator","reverse","highlightedSeries","autoscaleY","boundHistory","hasNextBounds","hasPreviousBounds","tooltipState","contextMenuState","draggingY","averageLoopTime","loopTimes","averageLoopTimes","axisToName","leftCount","rightCount","showingOptions","showingSidebar","showingAnnotations","userCreatedSeries","annotationState","theme","exportMode","_exportMode","enumMap","renderer","_nonExportTheme","boundingFunction","debounceHistory","_boundingCalculatorDebouncer","_addBoundCalculatorToHistory","boundsSelectors","_customBoundsSelectors","indexedCustomBoundSelectors","registerSeriesClick","selectedSeriesIndex","setHighlightedSeries","toggleIndividualPoints","toggleYAutoscaling","toggleExportMode","setBoundsFromSelection","pixelSelection","minPixelY","maxPixelY","pow","boundCalculatorFromSelection","nextBounds","previousBounds","setLabel","toggleScale","oldScale","recalculateTooltips","setTooltipMousePosition","clientX","_tooltipClientX","clientY","_tooltipClientY","shiftKey","shiftKeyPressedOnMove","tooltipAllNext","tooltipStateArg","showOnlySavedTooltips","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","useDraggingY","useShowingOptions","useMaxPrecision","useShowingSidebar","useShowingAnnotations","useSizing","useTheme","bodyHeight","validAnnotations","annotationStyle","pointMarkerWidth","approxTextWidth","textAlign","draggablePoints","onPointDrag","onDraggablePointsDoubleClick","onPointlessDoubleClick","event","newXT","newYT","xT","yT","stopPropagation","cx","cy","onMouseDown","xOffset","yOffset","onMouseMove","moveEvent","onMouseUp","removeEventListener","addEventListener","verticalLines","isRangeGraph","relevantVerticalLines","line","lineStyle","fontSize","textAnchor","dominantBaseline","GraphBody","boundsSelectionEnabled","showTooltips","tooltipOptions","onPointClick","canvasEl","useCallback","el","boundsSelection","setBoundsSelection","start","useTooltipState","showAnnotations","useAnnotationState","useContextMenu","onScroll","onGlobalMouseMove","getTouch","touches","changedTouches","onGlobalTouchStart","touch","cancelable","closest","preventDefault","onGlobalTouchMove","onGlobalTouchEnd","passive","onMouseLeave","currentNode","classList","contains","seriesToNearestPoint","onContextMenu","placeTick","trueValue","inverted","totalSize","formatter","formatOptions","opts","scaledValue","pixelValue","placeTickByPixel","roundToDivisor","divisor","divisors","bestDelta","bestDivisor","delta","getEvenDateTickSpacing","span","desiredCount","subspan","amount","unit","placeGrid","expectedLabelSize","labelPadding","skipFirst","skipLast","paddedLabelSize","ticks","placementParams","setMinutes","setSeconds","setMilliseconds","setDate","lastDateString","tick","placeDatesGrid","tickSpacing","roundTo","getEvenTickSpacing","roundToEvenNumber","placeNumbersGrid","locals","XAxis","showAxes","showGrid","bigLabels","xTickUnit","formatXAxisLabel","useSelection","useHasXEnum","useEnumMap","minDate","maxDate","calculateTimePrecision","minLabel","maxLabel","expectedLabelWidth","timeTicks","dateTicks","regularTicks","hourSpan","alignedHour","currentHour","currentMinute","alignedMinute","currentSecond","alignedSecond","maxPixelForMiddleTicks","lastTick","placeTimeOnlyGrid","spanMultipleYears","customDateFormatter","startTick","endTick","placeDateOnlyGrid","xAxisHeight","marginBottom","skipGrid","singleTick","classes","timezoneLabel","YAxis","showSeriesKey","sideIndex","dragPositionYOffset","showAxisColors","sidePadding","setDraggedSeries","dragDelta","setDragDelta","dx","dy","highlightedOpacity","unhighlightedOpacity","marginLeft","opacity","edge","strokeDasharray","startDrag","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","stopDragging","startScroll","startLeftDrag","startRightDrag","getClientX","componentDidMount","_renderer","setState","componentDidUpdate","prevProps","componentWillUnmount","_dragType","leftX","percentage","_scrollAnchorPercentage","boundToRight","boundToLeft","addListeners","forceUpdate","pixelMinX","pixelMaxX","markDates","touchAction","onTouchStart","SeriesKeyItem","backgroundColor","SeriesKeyAxisContainer","showingLabelInput","toggleLabelInputShowing","placeholder","SeriesKey","dragPosition","setDragPosition","keyRef","useRef","keyWidth","setKeyWidth","sizeCalculationHandle","current","cancelAnimationFrame","querySelectorAll","clientWidth","calculateStyles","useAlwaysTooltipped","toggleTooltipped","startDragging","seriesKeyEl","targetLeft","seriesKeyLeft","seriesKeyMarginLeft","clientStartX","clientStartY","zIndex","GraphTitle","title","SeriesToggle","checked","defaultChecked","borderColor","Sidebar","SyncPool","syncBounds","syncTooltips","syncDragState","_stateControllers","_syncBounds","_syncTooltips","_syncDragState","otherStateController","stateArg","_tooltipIgnoreState","shouldHideTooltips","random","Grapher","grapherDefaultProps","showRangeGraph","showRangeSelectors","useMemo","stateControllerInitialization","exportStateController","onRenderTime","onAxisChange","styles","classNames","calculateClassNamesAndStyles","commonYAxisProps","xAxisIntegersOnly","markRangeGraphDates","AVAILABLE_COLORS","BUILT_IN_BOUND_CALCULATORS","MultigraphStateController","_id","_multiSeries","_seriesToGraphIndices","_graphIndicesToSeries","_originalSeriesByMultigrapherIndex","_prevSeries","graphIndices","currentSeriesSet","graphIndex","sortedGraphIndices","globalSeriesIndex","multigrapherGraphIndex","_nextMultigrapherSeriesIndex","_multiSeriesCount","multiSeries","registerStateController","_multigraphStateController","check","multigrapherID","moveSeries","prevGraphCount","graphCount","_createGraphAtTop","_createGraphAtBottom","originalSeriesAtIndex","emptyAtTopIndex","emptyAtBottomIndex","incrementMultigrapherSeriesIndex","MultiGrapher","multigraphStateController","useMultiSeries","onMultiseriesChange","newUpperEnabled"],"sourceRoot":""}
1
+ {"version":3,"file":"bundle.esm.js","mappings":"uLAAO,MAAMA,EAAc,CACzB,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAGa,SAASC,EAASC,EAAaC,EAAGC,GAC/C,MAA2B,iBAAhBF,EACFA,EAGkB,iBAAhBA,EACFF,EAAYE,EAAcF,EAAYK,aAGfC,IAA5BF,EACKJ,EAAYI,EAA0BJ,EAAYK,QAGpDL,EAAYG,EAAIH,EAAYK,OACrC,CAQO,SAASE,EAAoBC,EAAOC,GACzC,IAAKD,EAAO,OAAOA,EAEnB,GAAIA,EAAME,WAAW,SAAU,CAC7B,MAAMC,EAAUH,EAAMI,MAAM,+CAC5B,GAAID,EAAS,CACX,MAAO,CAAEE,EAAGC,EAAGC,EAAGC,GAAKL,EAEvB,MAAQ,QAAOE,MAAMC,MAAMC,MADVE,WAAWD,GAAKP,IAEnC,CACF,CAEA,GAAID,EAAME,WAAW,QAAS,CAC5B,MAAMC,EAAUH,EAAMI,MAAM,kCAC5B,GAAID,EAAS,CACX,MAAO,CAAEE,EAAGC,EAAGC,GAAKJ,EACpB,MAAQ,QAAOE,MAAMC,MAAMC,MAAMN,IACnC,CACF,CAEA,GAAID,EAAME,WAAW,KAAM,CACzB,IAAIQ,EAAMV,EAAMW,MAAM,GAUtB,OATmB,IAAfD,EAAIb,SACNa,EAAMA,EACHE,MAAM,IACNC,KAAKC,GAASA,EAAOA,IACrBC,KAAK,KAKF,QAHEC,SAASN,EAAIC,MAAM,EAAG,GAAI,QAC1BK,SAASN,EAAIC,MAAM,EAAG,GAAI,QAC1BK,SAASN,EAAIC,MAAM,EAAG,GAAI,QACHV,IACnC,CAEA,OAAOD,CACT,CAQO,SAASiB,EAA8BC,EAAUjB,GACtD,OAAKiB,GAAaC,MAAMC,QAAQF,GAIzBA,EAASL,KAAKQ,IACnB,GAAIF,MAAMC,QAAQC,IAAyB,IAAhBA,EAAKxB,OAAc,CAC5C,MAAOyB,EAAUtB,GAASqB,EAE1B,MAAO,CAACC,EADiBvB,EAAoBC,EAAOC,GAEtD,CAAO,MAAoB,iBAAToB,EACTtB,EAAoBsB,EAAMpB,GAE5BoB,CAAI,IAXJH,CAaX,CAOO,SAASK,EAAsBvB,GACpC,IAAKA,EAAO,MAAO,CAAC,CAAC,EAAG,eAAgB,CAAC,EAAG,gBAE5C,MAAMwB,EAAmBzB,EAAoBC,EAAO,IACpD,MAAO,CAAC,CAAC,EAAGwB,GAAmB,CAAC,EAAGA,GACrC,C,gECrGIC,E,MAA0B,GAA4B,KAE1DA,EAAwBC,KAAK,CAACC,EAAOC,GAAI,8i6CAA+i6C,GAAG,CAAC,QAAU,EAAE,QAAU,CAAC,gCAAgC,MAAQ,GAAG,SAAW,+uaAA+ua,eAAiB,CAAC,4tvBAA4tvB,WAAa,MAEnpkF,S,UCDAD,EAAOE,QAAU,SAAUC,GACzB,IAAIC,EAAO,GA4EX,OAzEAA,EAAKC,SAAW,WACd,OAAOC,KAAKpB,KAAI,SAAUqB,GACxB,IAAIC,EAAU,GACVC,OAA+B,IAAZF,EAAK,GAoB5B,OAnBIA,EAAK,KACPC,GAAW,cAAcE,OAAOH,EAAK,GAAI,QAEvCA,EAAK,KACPC,GAAW,UAAUE,OAAOH,EAAK,GAAI,OAEnCE,IACFD,GAAW,SAASE,OAAOH,EAAK,GAAGrC,OAAS,EAAI,IAAIwC,OAAOH,EAAK,IAAM,GAAI,OAE5EC,GAAWL,EAAuBI,GAC9BE,IACFD,GAAW,KAETD,EAAK,KACPC,GAAW,KAETD,EAAK,KACPC,GAAW,KAENA,CACT,IAAGpB,KAAK,GACV,EAGAgB,EAAKpC,EAAI,SAAW2C,EAASC,EAAOC,EAAQC,EAAUC,GAC7B,iBAAZJ,IACTA,EAAU,CAAC,CAAC,KAAMA,OAASxC,KAE7B,IAAI6C,EAAyB,CAAC,EAC9B,GAAIH,EACF,IAAK,IAAII,EAAI,EAAGA,EAAIX,KAAKpC,OAAQ+C,IAAK,CACpC,IAAIhB,EAAKK,KAAKW,GAAG,GACP,MAANhB,IACFe,EAAuBf,IAAM,EAEjC,CAEF,IAAK,IAAIiB,EAAK,EAAGA,EAAKP,EAAQzC,OAAQgD,IAAM,CAC1C,IAAIX,EAAO,GAAGG,OAAOC,EAAQO,IACzBL,GAAUG,EAAuBT,EAAK,WAGrB,IAAVQ,SACc,IAAZR,EAAK,KAGdA,EAAK,GAAK,SAASG,OAAOH,EAAK,GAAGrC,OAAS,EAAI,IAAIwC,OAAOH,EAAK,IAAM,GAAI,MAAMG,OAAOH,EAAK,GAAI,MAF/FA,EAAK,GAAKQ,GAMVH,IACGL,EAAK,IAGRA,EAAK,GAAK,UAAUG,OAAOH,EAAK,GAAI,MAAMG,OAAOH,EAAK,GAAI,KAC1DA,EAAK,GAAKK,GAHVL,EAAK,GAAKK,GAMVE,IACGP,EAAK,IAGRA,EAAK,GAAK,cAAcG,OAAOH,EAAK,GAAI,OAAOG,OAAOH,EAAK,GAAI,KAC/DA,EAAK,GAAKO,GAHVP,EAAK,GAAK,GAAGG,OAAOI,IAMxBV,EAAKL,KAAKQ,GACZ,CACF,EACOH,CACT,C,UClFAJ,EAAOE,QAAU,SAAUK,GACzB,IAAIC,EAAUD,EAAK,GACfY,EAAaZ,EAAK,GACtB,IAAKY,EACH,OAAOX,EAET,GAAoB,mBAATY,KAAqB,CAC9B,IAAIC,EAASD,KAAKE,SAASC,mBAAmBC,KAAKC,UAAUN,MACzDO,EAAO,+DAA+DhB,OAAOW,GAC7EM,EAAgB,OAAOjB,OAAOgB,EAAM,OACxC,MAAO,CAAClB,GAASE,OAAO,CAACiB,IAAgBvC,KAAK,KAChD,CACA,MAAO,CAACoB,GAASpB,KAAK,KACxB,C,gBCNA,IAAIwC,EAAuB,EAAQ,KAEnC,SAASC,IAAiB,CAC1B,SAASC,IAA0B,CACnCA,EAAuBC,kBAAoBF,EAE3C7B,EAAOE,QAAU,WACf,SAAS8B,EAAKC,EAAOC,EAAUC,EAAeC,EAAUC,EAAcC,GACpE,GAAIA,IAAWV,EAAf,CAIA,IAAIW,EAAM,IAAIC,MACZ,mLAKF,MADAD,EAAIE,KAAO,sBACLF,CAPN,CAQF,CAEA,SAASG,IACP,OAAOV,CACT,CAHAA,EAAKW,WAAaX,EAMlB,IAAIY,EAAiB,CACnBC,MAAOb,EACPc,OAAQd,EACRe,KAAMf,EACNgB,KAAMhB,EACNiB,OAAQjB,EACRkB,OAAQlB,EACRmB,OAAQnB,EACRoB,OAAQpB,EAERqB,IAAKrB,EACLsB,QAASZ,EACTa,QAASvB,EACTwB,YAAaxB,EACbyB,WAAYf,EACZgB,KAAM1B,EACN2B,SAAUjB,EACVkB,MAAOlB,EACPmB,UAAWnB,EACXoB,MAAOpB,EACPqB,MAAOrB,EAEPsB,eAAgBlC,EAChBC,kBAAmBF,GAKrB,OAFAe,EAAeqB,UAAYrB,EAEpBA,CACT,C,gBC/CE5C,EAAOE,QAAU,EAAQ,IAAR,E,UCNnBF,EAAOE,QAFoB,8C,SCP3B,IAAIgE,EAAc,GAClB,SAASC,EAAqBC,GAE5B,IADA,IAAIC,GAAU,EACLrG,EAAI,EAAGA,EAAIkG,EAAYhG,OAAQF,IACtC,GAAIkG,EAAYlG,GAAGoG,aAAeA,EAAY,CAC5CC,EAASrG,EACT,KACF,CAEF,OAAOqG,CACT,CACA,SAASC,EAAalE,EAAMmE,GAG1B,IAFA,IAAIC,EAAa,CAAC,EACdC,EAAc,GACTzG,EAAI,EAAGA,EAAIoC,EAAKlC,OAAQF,IAAK,CACpC,IAAIuC,EAAOH,EAAKpC,GACZiC,EAAKsE,EAAQG,KAAOnE,EAAK,GAAKgE,EAAQG,KAAOnE,EAAK,GAClDoE,EAAQH,EAAWvE,IAAO,EAC1BmE,EAAa,GAAG1D,OAAOT,EAAI,KAAKS,OAAOiE,GAC3CH,EAAWvE,GAAM0E,EAAQ,EACzB,IAAIC,EAAoBT,EAAqBC,GACzCS,EAAM,CACRC,IAAKvE,EAAK,GACVK,MAAOL,EAAK,GACZwE,UAAWxE,EAAK,GAChBO,SAAUP,EAAK,GACfQ,MAAOR,EAAK,IAEd,IAA2B,IAAvBqE,EACFV,EAAYU,GAAmBI,aAC/Bd,EAAYU,GAAmBK,QAAQJ,OAClC,CACL,IAAII,EAAUC,EAAgBL,EAAKN,GACnCA,EAAQY,QAAUnH,EAClBkG,EAAYkB,OAAOpH,EAAG,EAAG,CACvBoG,WAAYA,EACZa,QAASA,EACTD,WAAY,GAEhB,CACAP,EAAY1E,KAAKqE,EACnB,CACA,OAAOK,CACT,CACA,SAASS,EAAgBL,EAAKN,GAC5B,IAAIc,EAAMd,EAAQe,OAAOf,GAYzB,OAXAc,EAAIE,OAAOV,GACG,SAAiBW,GAC7B,GAAIA,EAAQ,CACV,GAAIA,EAAOV,MAAQD,EAAIC,KAAOU,EAAO5E,QAAUiE,EAAIjE,OAAS4E,EAAOT,YAAcF,EAAIE,WAAaS,EAAO1E,WAAa+D,EAAI/D,UAAY0E,EAAOzE,QAAU8D,EAAI9D,MACzJ,OAEFsE,EAAIE,OAAOV,EAAMW,EACnB,MACEH,EAAII,QAER,CAEF,CACAzF,EAAOE,QAAU,SAAUE,EAAMmE,GAG/B,IAAImB,EAAkBpB,EADtBlE,EAAOA,GAAQ,GADfmE,EAAUA,GAAW,CAAC,GAGtB,OAAO,SAAgBoB,GACrBA,EAAUA,GAAW,GACrB,IAAK,IAAI3H,EAAI,EAAGA,EAAI0H,EAAgBxH,OAAQF,IAAK,CAC/C,IACI4H,EAAQzB,EADKuB,EAAgB1H,IAEjCkG,EAAY0B,GAAOZ,YACrB,CAEA,IADA,IAAIa,EAAqBvB,EAAaqB,EAASpB,GACtCuB,EAAK,EAAGA,EAAKJ,EAAgBxH,OAAQ4H,IAAM,CAClD,IACIC,EAAS5B,EADKuB,EAAgBI,IAEK,IAAnC5B,EAAY6B,GAAQf,aACtBd,EAAY6B,GAAQd,UACpBf,EAAYkB,OAAOW,EAAQ,GAE/B,CACAL,EAAkBG,CACpB,CACF,C,UCjFA,IAAIG,EAAO,CAAC,EA+BZhG,EAAOE,QAPP,SAA0B+F,EAAQC,GAChC,IAAIC,EAtBN,SAAmBA,GACjB,QAA4B,IAAjBH,EAAKG,GAAyB,CACvC,IAAIC,EAAcC,SAASC,cAAcH,GAGzC,GAAII,OAAOC,mBAAqBJ,aAAuBG,OAAOC,kBAC5D,IAGEJ,EAAcA,EAAYK,gBAAgBC,IAC5C,CAAE,MAAOC,GAEPP,EAAc,IAChB,CAEFJ,EAAKG,GAAUC,CACjB,CACA,OAAOJ,EAAKG,EACd,CAIeS,CAAUX,GACvB,IAAKE,EACH,MAAM,IAAI3D,MAAM,2GAElB2D,EAAOU,YAAYX,EACrB,C,UCvBAlG,EAAOE,QANP,SAA4BqE,GAC1B,IAAIhB,EAAU8C,SAASS,cAAc,SAGrC,OAFAvC,EAAQwC,cAAcxD,EAASgB,EAAQyC,YACvCzC,EAAQ0B,OAAO1C,EAASgB,EAAQA,SACzBhB,CACT,C,eCCAvD,EAAOE,QANP,SAAwC+G,GACtC,IAAIC,EAAmD,KACnDA,GACFD,EAAaE,aAAa,QAASD,EAEvC,C,UCoDAlH,EAAOE,QAjBP,SAAgBqE,GACd,GAAwB,oBAAb8B,SACT,MAAO,CACLd,OAAQ,WAAmB,EAC3BE,OAAQ,WAAmB,GAG/B,IAAIwB,EAAe1C,EAAQ6C,mBAAmB7C,GAC9C,MAAO,CACLgB,OAAQ,SAAgBV,IAjD5B,SAAeoC,EAAc1C,EAASM,GACpC,IAAIC,EAAM,GACND,EAAI/D,WACNgE,GAAO,cAAcpE,OAAOmE,EAAI/D,SAAU,QAExC+D,EAAIjE,QACNkE,GAAO,UAAUpE,OAAOmE,EAAIjE,MAAO,OAErC,IAAIH,OAAiC,IAAdoE,EAAI9D,MACvBN,IACFqE,GAAO,SAASpE,OAAOmE,EAAI9D,MAAM7C,OAAS,EAAI,IAAIwC,OAAOmE,EAAI9D,OAAS,GAAI,OAE5E+D,GAAOD,EAAIC,IACPrE,IACFqE,GAAO,KAELD,EAAIjE,QACNkE,GAAO,KAELD,EAAI/D,WACNgE,GAAO,KAET,IAAIC,EAAYF,EAAIE,UAChBA,GAA6B,oBAAT3D,OACtB0D,GAAO,uDAAuDpE,OAAOU,KAAKE,SAASC,mBAAmBC,KAAKC,UAAUsD,MAAe,QAKtIR,EAAQ8C,kBAAkBvC,EAAKmC,EAAc1C,EAAQA,QACvD,CAoBM+C,CAAML,EAAc1C,EAASM,EAC/B,EACAY,OAAQ,YArBZ,SAA4BwB,GAE1B,GAAgC,OAA5BA,EAAaM,WACf,OAAO,EAETN,EAAaM,WAAWC,YAAYP,EACtC,CAgBMQ,CAAmBR,EACrB,EAEJ,C,UC9CAjH,EAAOE,QAVP,SAA2B4E,EAAKmC,GAC9B,GAAIA,EAAaS,WACfT,EAAaS,WAAWC,QAAU7C,MAC7B,CACL,KAAOmC,EAAaW,YAClBX,EAAaO,YAAYP,EAAaW,YAExCX,EAAaJ,YAAYR,SAASwB,eAAe/C,GACnD,CACF,C,UCZA9E,EAAOE,QAAU,sG,UCAjBF,EAAOE,QAAU,mI,UCAjBF,EAAOE,QAAU,uoB,UCAjBF,EAAOE,QAAU,8Q,UCAjBF,EAAOE,QAAU,g+D,SCAjBF,EAAOE,QAAU,6hC,UCAjBF,EAAOE,QAAU,w0H,UCAjBF,EAAOE,QAAU,yqB,GCCb4H,EAA2B,CAAC,EAGhC,SAASC,EAAoBC,GAE5B,IAAIC,EAAeH,EAAyBE,GAC5C,QAAqB7J,IAAjB8J,EACH,OAAOA,EAAa/H,QAGrB,IAAIF,EAAS8H,EAAyBE,GAAY,CACjD/H,GAAI+H,EAEJ9H,QAAS,CAAC,GAOX,OAHAgI,EAAoBF,GAAUhI,EAAQA,EAAOE,QAAS6H,GAG/C/H,EAAOE,OACf,CAGA6H,EAAoBI,EAAID,ECxBxBH,EAAoBK,EAAKpI,IACxB,IAAIqI,EAASrI,GAAUA,EAAOsI,WAC7B,IAAOtI,EAAiB,QACxB,IAAM,EAEP,OADA+H,EAAoBQ,EAAEF,EAAQ,CAAExJ,EAAGwJ,IAC5BA,CAAM,ECLdN,EAAoBQ,EAAI,CAACrI,EAASsI,KACjC,IAAI,IAAIC,KAAOD,EACXT,EAAoBW,EAAEF,EAAYC,KAASV,EAAoBW,EAAExI,EAASuI,IAC5EE,OAAOC,eAAe1I,EAASuI,EAAK,CAAEI,YAAY,EAAMC,IAAKN,EAAWC,IAE1E,ECNDV,EAAoBgB,EAAI,CAAC,EAGzBhB,EAAoBpB,EAAKqC,GACjBC,QAAQC,IAAIP,OAAOQ,KAAKpB,EAAoBgB,GAAGK,QAAO,CAACC,EAAUZ,KACvEV,EAAoBgB,EAAEN,GAAKO,EAASK,GAC7BA,IACL,KCNJtB,EAAoBuB,EAAKN,GAEZA,EAAU,iBCHvBjB,EAAoBW,EAAI,CAAC7D,EAAK0E,IAAUZ,OAAOa,UAAUC,eAAeC,KAAK7E,EAAK0E,GCClFxB,EAAoBrJ,EAAKwB,IACH,oBAAXyJ,QAA0BA,OAAOC,aAC1CjB,OAAOC,eAAe1I,EAASyJ,OAAOC,YAAa,CAAEC,MAAO,WAE7DlB,OAAOC,eAAe1I,EAAS,aAAc,CAAE2J,OAAO,GAAO,ECL9D9B,EAAoB+B,EAAI,W,MCAxB/B,EAAoBnJ,EAAI,IAAImL,IAAI,iBAAkBC,KAKlD,IAAIC,EAAkB,CACrB,IAAK,GAGFC,EAAgBxI,IACnB,IAGIsG,EAAUgB,GAHV,IAACmB,EAAG,QAAExJ,EAAO,QAAEyJ,GAAW1I,EAGP1D,EAAI,EAC3B,IAAIgK,KAAYrH,EACZoH,EAAoBW,EAAE/H,EAASqH,KACjCD,EAAoBI,EAAEH,GAAYrH,EAAQqH,IAI5C,IADGoC,GAASA,EAAQrC,GACf/J,EAAImM,EAAIjM,OAAQF,IACpBgL,EAAUmB,EAAInM,GACX+J,EAAoBW,EAAEuB,EAAiBjB,IAAYiB,EAAgBjB,IACrEiB,EAAgBjB,GAAS,KAE1BiB,EAAgBE,EAAInM,IAAM,CAC3B,EAID+J,EAAoBgB,EAAEsB,EAAI,CAACrB,EAASK,KAElC,IAAIiB,EAAqBvC,EAAoBW,EAAEuB,EAAiBjB,GAAWiB,EAAgBjB,QAAW7K,EACtG,GAA0B,IAAvBmM,EAGF,GAAGA,EACFjB,EAAStJ,KAAKuK,EAAmB,QAC3B,CAGL,IAAIC,EAAUC,OAAO,KAAOzC,EAAoBuB,EAAEN,IAAUyB,KAAKP,GAAevD,IAE/E,MADgC,IAA7BsD,EAAgBjB,KAAgBiB,EAAgBjB,QAAW7K,GACxDwI,CAAC,IAEJ4D,EAAUtB,QAAQyB,KAAK,CAACH,EAAS,IAAItB,SAAS0B,GAAaL,EAAqBL,EAAgBjB,GAAW,CAAC2B,OAChHtB,EAAStJ,KAAKuK,EAAmB,GAAKC,EAExC,CACD,C,KCjDFxC,EAAoB6C,QAAKzM,E,8FCIzB,MAAM,GAJG0M,EAI8B,CAAE,QAAa,IAAOC,EAA4C,QAAG,YAAiB,IAAOA,EAA6C,YAAG,UAAe,IAAOA,EAA2C,UAAG,QAAa,IAAOA,EAAyC,QAAG,OAAY,IAAOA,EAAwC,OAAG,SAAc,IAAOA,EAA0C,UAHhbC,EAAI,CAAC,EAAGhD,EAAoBQ,EAAEwC,EAAGF,GAAWE,GADzC,IAACF,EACJE,E,kBCDE,MAAMC,EAAoB,CAC7B,SACA,SACA,WASSC,EAAa,IAAID,EAL1B,mBACA,oBACA,aCuBEE,EAMDjH,IAAAA,IAECkH,EAAelH,IAAAA,MAAgB,CACjCvC,KAAMwJ,EAAKvI,WACXyI,KAAMnH,IAAAA,MAAgB,IACfgH,EACH,UAEJI,KAAMpH,IAAAA,OACNqH,KAAMrH,IAAAA,OACNsH,WAAYtH,IAAAA,KACZ5F,MAAO4F,IAAAA,UAAoB,CAACA,IAAAA,OAAkBA,IAAAA,SAC9CxB,KAAMwB,IAAAA,OACNuH,OAAQvH,IAAAA,OACRwH,OAAQxH,IAAAA,OACRyH,sBAAuBzH,IAAAA,KACvB0H,OAAQ1H,IAAAA,KACR2H,YAAa3H,IAAAA,QAAkBA,IAAAA,QAC/B4H,MAAO5H,IAAAA,OACP6H,mBAAoB7H,IAAAA,OACpB8H,KAAM9H,IAAAA,UAAoB,CAACA,IAAAA,OAAkBA,IAAAA,SAC7C+H,YAAa/H,IAAAA,QAAkBA,IAAAA,QAC/BgI,wBAAyBhI,IAAAA,KACzBiI,OAAQjI,IAAAA,KACRkI,SAAUlI,IAAAA,OACVmI,MAAOnI,IAAAA,OACPoI,WAAYpI,IAAAA,OACZqI,YAAarI,IAAAA,KACbsI,qBAAsBtI,IAAAA,KACtBuI,gBAAiBvI,IAAAA,OACjBwI,UAAWxI,IAAAA,MAAgB,CAAC,OAAQ,MAAO,OAAQ,WACnDyI,cAAezI,IAAAA,OACf1E,SAAU0E,IAAAA,MACV0I,iBAAkB1I,IAAAA,MAClB2I,cAAe3I,IAAAA,OACf4I,cAAe5I,IAAAA,OACf6I,UAAW7I,IAAAA,UAAoB,CAACA,IAAAA,OAAkBA,IAAAA,SAClD8I,YAAa9I,IAAAA,OACb+I,aAAc/I,IAAAA,OACdgJ,cAAehJ,IAAAA,KACfiJ,YAAajJ,IAAAA,OACb1E,SAAU0E,IAAAA,QAAkBA,IAAAA,UAAoB,CAACA,IAAAA,OAAkBA,IAAAA,SACnEkJ,SAAUlJ,IAAAA,SAGRmJ,EAASnJ,IAAAA,QAAkBkH,GAE3BkC,EAAOpJ,IAAAA,MAAgB,CACzBqJ,UAAWrJ,IAAAA,OAAiBtB,WAC5B4K,OAAQtJ,IAAAA,MAAgBtB,WACxB6K,KAAMvJ,IAAAA,MAAgB,CAAC,OAAQ,UAAUtB,WACzC8K,MAAOxJ,IAAAA,MAAgB,CAAC,SAAU,QAAQtB,WAC1C+K,MAAOzJ,IAAAA,SAGL0J,EAAO1J,IAAAA,QAAkBoJ,GAEzBO,EAAuB3J,IAAAA,MAAgB,CACzCyJ,MAAOzJ,IAAAA,OAAiBtB,WACxBkL,WAAY5J,IAAAA,KAAetB,WAC3BmL,UAAW7J,IAAAA,OAGT8J,EAAwB9J,IAAAA,QAAkB2J,GAE1CI,EAAoB,CACtBC,mBAAoBhK,IAAAA,KACpBiK,cAAejK,IAAAA,KACfkK,cAAelK,IAAAA,KACfmK,cAAenK,IAAAA,KACfoK,cAAepK,IAAAA,KACfqK,SAAUrK,IAAAA,KACVsK,oBAAqBtK,IAAAA,KACrBuK,cAAevK,IAAAA,MAAgB,CAAC,MAAO,WACvCwK,WAAYxK,IAAAA,OACZyK,eAAgBzK,IAAAA,KAChB0K,cAAe1K,IAAAA,KACf2K,gBAAiB3K,IAAAA,UAAoB,CAACA,IAAAA,KAAgBA,IAAAA,UAGpD4K,EAAiB5K,IAAAA,MAAgB+J,GAEjCc,EAAa7K,IAAAA,MAAgB,CAC/B8G,EAAG9G,IAAAA,UAAoB,CAACA,IAAAA,OAAkBA,IAAAA,OAAkBA,IAAAA,WAAqB8K,QACjFC,OAAQ/K,IAAAA,UAAoB,CAACA,IAAAA,OAAkBA,IAAAA,OAAkBA,IAAAA,WAAqB8K,QACtFE,KAAMhL,IAAAA,UAAoB,CAACA,IAAAA,OAAkBA,IAAAA,OAAkBA,IAAAA,WAAqB8K,QACpFxB,OAAQtJ,IAAAA,QAAkBA,IAAAA,QAC1BzD,QAASyD,IAAAA,OACTiL,SAAUjL,IAAAA,OAERkL,EAAclL,IAAAA,QAAkB6K,GAEhCM,EAAiBnL,IAAAA,MAAgB,CACnC8G,EAAG9G,IAAAA,OAAiBtB,WACpBkI,EAAG5G,IAAAA,OAAiBtB,WACpB0M,OAAQpL,IAAAA,OACRqL,UAAWrL,IAAAA,OACXsL,YAAatL,IAAAA,OACbuL,YAAavL,IAAAA,OACbwL,QAASxL,IAAAA,KACTyL,cAAezL,IAAAA,OAEb0L,EAAkB1L,IAAAA,QAAkBmL,GAEpCQ,EAAe3L,IAAAA,MAAgB,CACjC8G,EAAG9G,IAAAA,UAAoB,CAACA,IAAAA,OAAkBA,IAAAA,WAAqB8K,QAAQpM,WACvEtE,MAAO4F,IAAAA,OACP4L,QAAS5L,IAAAA,OACT4H,MAAO5H,IAAAA,OACP6L,QAAS7L,IAAAA,KACTiC,MAAOjC,IAAAA,OACP8L,YAAa9L,IAAAA,OACb+L,KAAM/L,IAAAA,OACNgM,QAAShM,IAAAA,OACTiM,UAAWjM,IAAAA,OACXkM,UAAWlM,IAAAA,OACXmM,UAAWnM,IAAAA,OACXoM,aAAcpM,IAAAA,UAAoB,CAC9BA,IAAAA,KACAA,IAAAA,SAEJqM,iBAAkBrM,IAAAA,OAsBtB,EAlBwB,CACpBiH,OACAC,eACAiC,SACAC,OACAM,OACAC,uBACAG,wBACAc,iBACAb,oBACAmB,cACAC,iBACAO,kBACAC,eACAW,cAhBkBtM,IAAAA,QAAkB2L,ICjKzB,MAAMY,EAEjBC,WAAAA,GACInQ,KAAKoQ,WAAa,CAAC,CACvB,CAMAC,cAAAA,GACIrQ,KAAKoQ,WAAa,CAAC,CACvB,CASAE,EAAAA,CAAGC,EAAWC,GACVxQ,KAAKoQ,WAAWG,GAAavQ,KAAKoQ,WAAWG,IAAc,IAAIE,IAC/DzQ,KAAKoQ,WAAWG,GAAWG,IAAIF,EACnC,CAQAG,GAAAA,CAAIJ,EAAWC,GACNxQ,KAAKoQ,WAAWG,KAIrBvQ,KAAKoQ,WAAWG,GAAWK,OAAOJ,GAEM,IAApCxQ,KAAKoQ,WAAWG,GAAWM,aACpB7Q,KAAKoQ,WAAWG,GAE/B,CAOAO,IAAAA,CAAKP,GACD,IAAKvQ,KAAKoQ,WAAWG,GACjB,OAGJ,MAAMQ,EAAO,GACb,IAAK,IAAIrT,EAAI,EAAGA,EAAIsT,UAAUpT,OAAQF,IAClCqT,EAAKtR,KAAKuR,UAAUtT,IAGxBsC,KAAKoQ,WAAWG,GAAWU,SAAST,IAChCA,EAAGxJ,MAAMhH,KAAM+Q,EAAK,GAE5B,E,aClDW,SAASG,EAAUjE,EAAQhJ,EAAQ,CAAEkN,eAAe,IAC/D,GAAIlE,EAAOnC,MAAwB,UAAhBmC,EAAOnC,KACtB,OAAOmC,EAAOnC,KAGlB,MAAM1J,EAAO6C,EAAQ7C,MAAS6C,EAAQkN,eAAiBlE,EAAOmE,YAA6BnE,EAAO7L,KAElG,IAAKA,EACD,MAAM,IAAIc,MAAM,yBAGpB,GAAIhD,MAAMC,QAAQiC,GACd,OAAoB,IAAhBA,EAAKxD,QAILsB,MAAMC,QAAQiC,EAAK,IAHZ,SAOY,iBAAZA,EAAK,IAAoBA,EAAK,GAIlC,UAHI,SAMf,GAAIA,EAAKiQ,QACL,OAAIpE,EAAOlC,KACA,oBAEA,mBAIf,GAAoB,mBAAT3J,EACP,MAAO,YAGX,MAAM,IAAIc,MAAM,uBACpB,C,wCC9Ce,SAASoP,EAAcvT,GAClC,GAAc,UAAVA,EACAA,EAAQ,eACL,GAAc,UAAVA,EACPA,EAAQ,eACL,GAAc,gBAAVA,EACP,MAAO,CAAC,EAAG,EAAG,EAAG,GAGrB,GAAIA,EAAME,WAAW,OAAQ,CACzB,MAAMsT,EAAQxT,EAAMY,MAAM,KAAKC,KAAK4S,GAAShT,WAAWgT,EAAKrT,MAAM,eAAe,MAClF,MAAO,CACHoT,EAAM,GAAG,IACTA,EAAM,GAAG,IACTA,EAAM,GAAG,IACTA,EAAM3T,QAAU,EAAI2T,EAAM,GAAK,EAEvC,CAEA,GAAqB,iBAAVxT,IAAuB,+BAA+B0T,KAAK1T,GAClE,MAAM,IAAImE,MAAO,+BAA8BnE,KAYnD,OARqB,IAAjBA,EAAMH,SACNG,EAAQ,IAAMA,EAAM,GAAKA,EAAM,GAAKA,EAAM,GAAKA,EAAM,GAAKA,EAAM,GAAKA,EAAM,IAOxE,CAJGgB,SAAShB,EAAM2T,OAAO,EAAG,GAAK,IAAI,IAClC3S,SAAShB,EAAM2T,OAAO,EAAG,GAAK,IAAI,IAClC3S,SAAShB,EAAM2T,OAAO,EAAG,GAAK,IAAI,IAClC,EAEd,CC/Be,SAASC,EAAgBC,EAAIC,EAAkBC,GAC1D,MAAMC,EAAeH,EAAGI,aAAaJ,EAAGK,eAGxC,GAFAL,EAAGM,aAAaH,EAAcF,GAC9BD,EAAGO,cAAcJ,IACZH,EAAGQ,mBAAmBL,EAAcH,EAAGS,gBAExC,OADAC,QAAQC,MAAMX,EAAGY,iBAAiBT,IAC3B,KAGX,MAAMU,EAAiBb,EAAGI,aAAaJ,EAAGc,iBAG1C,GAFAd,EAAGM,aAAaO,EAAgBX,GAChCF,EAAGO,cAAcM,IACZb,EAAGQ,mBAAmBK,EAAgBb,EAAGS,gBAE1C,OADAC,QAAQC,MAAMX,EAAGY,iBAAiBC,IAC3B,KAGX,MAAME,EAAUf,EAAGgB,gBAMnB,OALAhB,EAAGiB,aAAaF,EAASZ,GACzBH,EAAGiB,aAAaF,EAASF,GAEzBb,EAAGkB,YAAYH,GAEVf,EAAGmB,oBAAoBJ,EAASf,EAAGoB,cAKxCpB,EAAGqB,gBAAgBN,GACdf,EAAGmB,oBAAoBJ,EAASf,EAAGsB,iBAKjCP,GAJHL,QAAQC,MAAM,oCAAqCX,EAAGuB,kBAAkBR,IACjE,QAPPL,QAAQC,MAAM,iCAAkCX,EAAGuB,kBAAkBR,IAC9D,KAUf,CCtCe,MAAMS,EAEjBjD,WAAAA,CAAYyB,GACR5R,KAAKqT,IAAMzB,EAEX5R,KAAKsT,SAAW3B,EAAgBC,EAAI2B,IAAgBC,KAEpDxT,KAAKyT,cAAgB7B,EAAG8B,eACxB1T,KAAK2T,aAAe/B,EAAG8B,eAElB9B,EAAGgC,aAAa,2BACjBtB,QAAQC,MAAM,uDAEtB,CAEAsB,IAAAA,EAAK,KAAEzS,IACH,MAAMwQ,EAAK5R,KAAKqT,IAChBzB,EAAGkC,WAAW9T,KAAKsT,UAInB,IAAK,IAAI,MAAES,EAAK,MAAEC,EAAK,MAAEjW,KAAWqD,EAAM,CACtCwQ,EAAGqC,UAAUrC,EAAGsC,mBAAmBlU,KAAKsT,SAAU,YAAahC,EAAcvT,IAE7E,MAAMoW,EAAW,IAAIC,aAAa,CAC9BL,EAAO,EAAGC,EAAO,EAAGA,GAAQ,EAC5BD,EAAO,EAAGC,GAAQ,EAAGD,GAAQ,IAGjCnC,EAAGyC,WAAWzC,EAAG0C,aAActU,KAAKyT,eACpC7B,EAAG2C,WAAW3C,EAAG0C,aAAc,IAAIF,aAAaD,GAAWvC,EAAG4C,aAE9D,MAAMC,EAAmB7C,EAAG8C,kBAAkB1U,KAAKsT,SAAU,YAC7D1B,EAAG+C,wBAAwBF,GAC3B7C,EAAGgD,oBAAoBH,EAAkB,EAAG7C,EAAGiD,OAAO,EAAO,EAAG,GAEhEjD,EAAGkD,OAAOlD,EAAGmD,OACbnD,EAAGoD,UAAUpD,EAAGqD,UAAWrD,EAAGsD,qBAC9BtD,EAAGuD,WAAWvD,EAAGwD,UAAW,EAAG,EACnC,CACJ,EC7CG,MAAMC,EAAe,EAWbC,eAAeC,EAAWC,EAAQC,GAAS,MAACC,GAAM,GAAM,CAAC,GAChEA,IACAF,EAAOjK,MAAQ,GACfiK,EAAOG,OAAS,GAChBH,EAAO5P,MAAM2F,MAAQ,IACrBiK,EAAO5P,MAAM+P,OAAS,SAEhB,IAAIhN,SAAS0B,GAAYuL,sBAAsBvL,MAGzD,IAAIwL,EAAeL,EAAOvO,WAAW6O,wBAErC,KAA8B,IAAvBD,EAAatK,aACV,IAAI5C,SAAS0B,GAAYuL,sBAAsBvL,KACrDwL,EAAeL,EAAOM,wBAG1B,MAAMC,EAAM9P,OAAO+P,kBAAoB,EACjCC,EAAMR,EAAQS,8BAChBT,EAAQU,2BACRV,EAAQW,0BACRX,EAAQY,yBACRZ,EAAQa,wBAA0B,EAEhCC,EAAalB,EAAaU,EAAME,EAEhCO,EAAeX,EAAatK,MAC5BkL,EAAgBZ,EAAaF,OAC7Be,EAAcF,EAAeD,EAC7BI,EAAeF,EAAgBF,EAUrC,OARAf,EAAOjK,MAAQmL,EACflB,EAAOG,OAASgB,EAChBnB,EAAO5P,MAAM2F,MAAS,GAAEiL,MACxBhB,EAAO5P,MAAM+P,OAAU,GAAEc,MAKlB,CACHF,aACAC,eACAC,gBACAC,cACAC,eACAd,eAER,CChDe,SAASe,EAAUC,GAAmB,SAACC,GAAU,CAAC,GAC7D,MAAMC,EAAQ,GACd,IAAIC,EAAc,GACdC,GAA0B,EAE9B,MAAM,SAAEC,EAAQ,WAAEC,EAAU,WAAEC,EAAU,QAAEC,GAAYR,EAEtD,IAAK,IAAInZ,EAAI,EAAGA,EAAI2Z,EAAQzZ,OAAQF,IAAK,CACrC,MAAM+M,EAAI/M,EAAE2X,EACN9K,EAAI8M,EAAQ3Z,GAElB,GAAkB,EAAdwZ,EAASxZ,GAAY,CAChBuZ,IACDF,EAAMtX,KAAKuX,GACXA,EAAc,IAGlBC,GAA0B,EAC1B,QACJ,CAEAD,EAAYvX,KAAK,CAACgL,EAAGF,IAErB,MAAM+M,EAAOF,EAAW1Z,GAClB6Z,EAAOJ,EAAWzZ,GAexB,GAbI4Z,IAASC,IACW,EAAdL,EAASxZ,IACXsZ,EAAYvX,KAAK,CAACgL,EAAG6M,IAGL,EAAdJ,EAASxZ,IACXsZ,EAAYvX,KAAK,CAACgL,EAAG8M,IAEzBP,EAAYvX,KAAK,CAACgL,EAAGF,KAGzB0M,GAA0B,EAEF,iBAAbH,GAAyBpZ,EAAI,EAAG,CACvC,MAAM8Z,EAAQH,EAAQ3Z,EAAE,MACc,EAAhBwZ,EAASxZ,EAAE,KAAgB8Z,EAAQV,GAAYvM,GAAKuM,GAAcU,EAAQV,GAAYvM,GAAKuM,GAAcU,IAAUV,GAAYvM,IAAMuM,KAGlJG,IACDF,EAAMtX,KAAKuX,GACXA,EAAc,CACV,CAACvM,EAAGF,KAIZ0M,GAA0B,EAElC,CACJ,CAMA,OAJKA,GACDF,EAAMtX,KAAKuX,GAGRD,CACX,CC5DO,SAASU,EAAalN,GAAG,QAAEkL,EAAO,OAAEiC,EAAM,MAAE3Z,EAAK,UAAE4Z,EAAS,UAAEC,IAC5DA,IAIAnC,GAKLA,EAAQoC,YAAcF,GAAa5Z,EACnC0X,EAAQqC,UAAYF,EAEpBnC,EAAQsC,YACRtC,EAAQuC,OAAO,EAAGzN,GAClBkL,EAAQwC,OAAOP,EAAOhB,YAAanM,GACnCkL,EAAQyC,UAVJ5F,QAAQC,MAAM,0CAWtB,CCi3BA,SAAS4F,EACPC,EACAC,GACA,MACEta,EAAK,QACL0X,EAAO,OACPiC,EAAM,KACNY,EAAI,aACJC,EAAY,SACZtZ,IAKF,GAFAwW,EAAQ+C,UAAYza,EAEhBkB,GAAYA,EAASrB,QAAU,EAAG,CACpC,MAAM6a,EAAiBhD,EAAQiD,qBAC7B,EACA,EACA,EACAhB,EAAOf,cAET,IAAK,IAAIjZ,EAAI,EAAGA,EAAIuB,EAASrB,OAAQF,IAAK,CACxC,MAAM6L,EAAQtK,EAASvB,GACnBwB,MAAMC,QAAQoK,GAChBkP,EAAeE,aAAapP,EAAM,GAAIA,EAAM,IAE5CkP,EAAeE,aAAajb,GAAKuB,EAASrB,OAAS,GAAI2L,EAE3D,CACAkM,EAAQ+C,UAAYC,CACtB,CAGA,MAAMG,EAAaL,EAAeD,EAAOZ,EAAOf,aAEhDlB,EAAQsC,YAER,MAAOc,EAAQC,GAAWV,EAAK,IACxBW,EAAOC,GAAUZ,EAAKA,EAAKxa,OAAS,GAEtCya,GACH5C,EAAQuC,OAAOa,EAAQD,GAGzB,IAAK,IAAIlb,EAAI,EAAGA,EAAI0a,EAAKxa,OAAQF,IAAK,CACpC,MAAO+M,EAAGF,GAAK6N,EAAK1a,GACpB+X,EAAQwC,OAAOxN,EAAGF,EACpB,CAEA,GAAI8N,GAAkBA,EAAeza,OAAQ,CAC3C,IAAK,IAAIF,EAAI2a,EAAeza,OAAS,EAAGF,GAAK,EAAGA,IAAK,CACnD,MAAO+M,EAAGF,GAAK8N,EAAe3a,GAC9B+X,EAAQwC,OAAOxN,EAAGF,EACpB,CACAkL,EAAQwC,UAAUG,EAAK,GACzB,MACE3C,EAAQwC,OAAOc,EAAOH,GAGxBnD,EAAQwD,MACV,CAEA,SAASC,EACPd,EACAC,EACAc,EACAC,EACAC,GACA,MAAEtb,EAAK,QAAE0X,EAAO,OAAEiC,EAAM,KAAEY,EAAI,aAAEC,EAAY,SAAEtZ,EAAQ,gBAAEqa,IAIxD,GAFA7D,EAAQ+C,UAAYza,EAEhBkB,GAAYA,EAASrB,QAAU,EAAG,CACpC,MAAM6a,EAAiBhD,EAAQiD,qBAC7B,EACA,EACA,EACAhB,EAAOf,cAET,IAAK,IAAIjZ,EAAI,EAAGA,EAAIuB,EAASrB,OAAQF,IAAK,CACxC,MAAM6L,EAAQtK,EAASvB,GACvB,GAAIwB,MAAMC,QAAQoK,GAAQ,CACxB,MAAMgQ,EAAgBF,GAClBvb,EAAAA,EAAAA,qBAAoByL,EAAM,GAAI,KAC9BA,EAAM,GACVkP,EAAeE,aAAapP,EAAM,GAAIgQ,EACxC,KAAO,CACL,MAAMA,EAAgBF,GAClBvb,EAAAA,EAAAA,qBAAoByL,EAAO,KAC3BA,EACJkP,EAAeE,aAAajb,GAAKuB,EAASrB,OAAS,GAAI2b,EACzD,CACF,CACA9D,EAAQ+C,UAAYC,CACtB,CAGA,MAAMG,EAAaL,EAAeD,EAAOZ,EAAOf,aAIhD,GAFAlB,EAAQsC,YAEJsB,EAAa,CACf,MAAMG,EAAWJ,EAAaD,EAAa,EAAIA,GACxCN,GAAUT,EAAK,GAEjBkB,GACH7D,EAAQuC,OAAOa,EAAQD,GAGzB,IAAK,IAAIlb,EAAI,EAAGA,GAAK8b,GAAY9b,EAAI0a,EAAKxa,OAAQF,IAAK,CACrD,MAAO+M,EAAGF,GAAK7M,IAAM8b,GAAYJ,EAAaA,EAAahB,EAAK1a,GAChE+X,EAAQwC,OAAOxN,EAAGF,EACpB,CAEA,GAAI8N,GAAkBA,EAAeza,OAAQ,CAC3C,IAAK,IAAIF,EAAI+b,KAAKC,IAAIF,EAAUnB,EAAeza,OAAS,GAAIF,GAAK,EAAGA,IAAK,CACvE,MAAO+M,EAAGF,GAAK8N,EAAe3a,GAC9B+X,EAAQwC,OAAOxN,EAAGF,EACpB,CACAkL,EAAQwC,UAAUG,EAAK,GACzB,KAAO,CACL,MAAMuB,EAAYP,GAAchB,EAAKoB,IAAapB,EAAKA,EAAKxa,OAAS,GACrE6X,EAAQwC,OAAO0B,EAAU,GAAIf,EAC/B,CACF,KAAO,CACL,MAAMgB,EAAaR,EAAaD,EAAaA,EAAa,EACpDU,EAAaT,GAAchB,EAAKwB,GAEtC,GAAIC,EAAY,CACdpE,EAAQuC,OAAO6B,EAAW,GAAIjB,GAE1BQ,GACF3D,EAAQwC,UAAUmB,GAEpB,IAAK,IAAI1b,EAAIkc,EAAYlc,EAAI0a,EAAKxa,OAAQF,IACxC+X,EAAQwC,UAAUG,EAAK1a,IAGzB,GAAI2a,GAAkBA,EAAeza,OAAQ,CAC3C,IACE,IAAIF,EAAI2a,EAAeza,OAAS,EAChCF,GAAK+b,KAAKK,IAAIF,EAAY,GAC1Blc,IACA,CACA,MAAO+M,EAAGF,GAAK8N,EAAe3a,GAC9B+X,EAAQwC,OAAOxN,EAAGF,EACpB,CACI6O,GACF3D,EAAQwC,OAAOmB,EAAW,GAAIR,EAElC,KAAO,CACL,MAAOG,GAASX,EAAKA,EAAKxa,OAAS,GACnC6X,EAAQwC,OAAOc,EAAOH,EACxB,CACF,CACF,CAEAnD,EAAQwD,MACV,CAEA,SAASc,EACPC,GACA,MAAEjc,EAAK,QAAE0X,EAAO,cAAErJ,EAAa,aAAEmM,EAAY,KAAED,EAAI,UAAEX,EAAS,YAAElL,IAEhE,GAAKuN,GAAqB9a,MAAMC,QAAQ6a,GAIxC,IAAK,IAAItc,EAAI,EAAGA,EAAIsc,EAAiBpc,OAAQF,IAAK,CAChD,MAAO+M,EAAGF,GAAKyP,EAAiBtc,GAEhC,IAAIuc,EAAalc,EACbqO,GAAiBmM,IAEjB0B,EADE1P,IAAM+N,GAAQX,EACHA,EACJpN,EAAI+N,EACAva,EAEAqO,GAIjBqJ,EAAQ+C,UAAYyB,EACpBxE,EAAQsC,YACRtC,EAAQyE,IAAIzP,EAAGF,EAAGkC,GAAe,EAAG,EAAG,EAAIgN,KAAKU,IAAI,GACpD1E,EAAQwD,MACV,CACF,CAEA,SAASmB,EACPC,GACA,MAAEtc,EAAK,QAAE0X,EAAO,aAAE8C,EAAY,cAAEnM,EAAa,MAAEb,EAAK,YAAE+O,IAEtD,GAAKD,GAAcnb,MAAMC,QAAQkb,GAAjC,CAIIC,IACF/O,GAAS,GAEXA,GAAS8J,EAET,IAAK,IAAI+C,KAAQiC,EACf,GAAKjC,EAAKxa,OAAV,CAEA6X,EAAQoC,YAAcU,GAAgBnM,EAAgBA,EAAgBrO,EACtE0X,EAAQqC,UAAYvM,EACpBkK,EAAQsC,YACR,IAAK,IAAIra,EAAI,EAAGA,EAAI0a,EAAKxa,OAAQF,IAAK,CACpC,MAAO+M,EAAGF,GAAK6N,EAAK1a,GACV,IAANA,EACF+X,EAAQuC,OAAOvN,EAAGF,GAElBkL,EAAQwC,OAAOxN,EAAGF,EAEtB,CACAkL,EAAQyC,QAbkB,CAR5B,CAuBF,CAEA,SAASqC,EACPF,EACAG,GACA,MACEzc,EAAK,QACL0X,EAAO,aACP8C,EAAY,cACZnM,EAAa,KACbkM,EAAI,MACJ/M,EAAK,YACL+O,EAAW,cACXG,IAGF,IAAKJ,IAAcnb,MAAMC,QAAQkb,GAC/B,OAGEC,IACF/O,GAAS,GAEXA,GAAS8J,EAET,MAAMqF,EAAeF,EAAY/E,EAAQD,OAAOjK,MAC1CoP,EAAiB,GACjBC,EAAkB,GAExB,IAAK,IAAIxC,KAAQiC,EAAW,CAC1B,IAAKjC,EAAKxa,OAAQ,SAElB,MAAMid,EAAU,GACVC,EAAW,GACjB,IAAI1B,EAAa,KACbD,GAAc,EAElB,IAAK,IAAIzb,EAAI,EAAGA,EAAI0a,EAAKxa,OAAQF,IAAK,CACpC,MAAO+M,EAAGF,GAAK6N,EAAK1a,GAEhB+M,EAAIiQ,GACNG,EAAQpb,KAAK,CAACgL,EAAGF,IACjB4O,EAAazb,GAEbod,EAASrb,KAAK,CAACgL,EAAGF,GAEtB,CAEA,GAAIsQ,EAAQjd,OAAS,GAAKkd,EAASld,OAAS,EAAG,CAC7C,MAAMmd,EAAeF,EAAQA,EAAQjd,OAAS,GACxCod,EAAiBF,EAAS,IACzBG,EAAIC,GAAMH,GACVI,EAAIC,GAAMJ,EAEbG,IAAOF,IAET7B,EAAa,CAACsB,EAAcQ,GADVR,EAAeO,IAAOE,EAAKF,IACAG,EAAKF,IAClDL,EAAQpb,KAAK2Z,GACb0B,EAASO,QAAQjC,GAErB,CAEIyB,EAAQjd,OAAS,GACnB+c,EAAelb,KAAKob,GAElBC,EAASld,OAAS,GACpBgd,EAAgBnb,KAAKqb,EAEzB,CAEA,GAAIH,EAAe/c,OAAS,EAAG,CAC7B,MAAM0d,GAAexd,EAAAA,EAAAA,qBAAoBC,EAAO0c,GAChDhF,EAAQoC,YAAcyD,EACtB7F,EAAQqC,UAAYvM,EAEpB,IAAK,IAAI6M,KAAQuC,EACf,GAAIvC,EAAKxa,OAAS,EAAG,CACnB6X,EAAQsC,YACR,IAAK,IAAIra,EAAI,EAAGA,EAAI0a,EAAKxa,OAAQF,IAAK,CACpC,MAAO+M,EAAGF,GAAK6N,EAAK1a,GACV,IAANA,EACF+X,EAAQuC,OAAOvN,EAAGF,GAElBkL,EAAQwC,OAAOxN,EAAGF,EAEtB,CACAkL,EAAQyC,QACV,CAEJ,CAEA,GAAI0C,EAAgBhd,OAAS,EAAG,CAC9B6X,EAAQoC,YAAcU,GAAgBnM,EAAgBA,EAAgBrO,EACtE0X,EAAQqC,UAAYvM,EAEpB,IAAK,IAAI6M,KAAQwC,EACf,GAAIxC,EAAKxa,OAAS,EAAG,CACnB6X,EAAQsC,YACR,IAAK,IAAIra,EAAI,EAAGA,EAAI0a,EAAKxa,OAAQF,IAAK,CACpC,MAAO+M,EAAGF,GAAK6N,EAAK1a,GACV,IAANA,EACF+X,EAAQuC,OAAOvN,EAAGF,GAElBkL,EAAQwC,OAAOxN,EAAGF,EAEtB,CACAkL,EAAQyC,QACV,CAEJ,CACF,CAEA,SAASqD,EACPvB,EACAQ,GACA,MACEzc,EAAK,QACL0X,EAAO,cACPrJ,EAAa,aACbmM,EAAY,KACZD,EAAI,UACJX,EAAS,YACTlL,EAAW,cACXgO,IAGF,IAAKT,IAAqB9a,MAAMC,QAAQ6a,GACtC,OAGF,MACMU,EAAeF,EADD/E,EAAQD,OAAOjK,MAGnC,IAAK,IAAI7N,EAAI,EAAGA,EAAIsc,EAAiBpc,OAAQF,IAAK,CAChD,MAAO+M,EAAGF,GAAKyP,EAAiBtc,GAE1B8d,EAAiB/Q,EAAIiQ,EAE3B,IAAIT,EAAalc,EACbyd,IACFvB,GAAanc,EAAAA,EAAAA,qBAAoBC,EAAO0c,IAGtCrO,GAAiBmM,IAEjB0B,EADE1P,IAAM+N,GAAQX,EACHA,EACJpN,EAAI+N,EACAkD,GACT1d,EAAAA,EAAAA,qBAAoBC,EAAO0c,GAC3B1c,EAESyd,GACT1d,EAAAA,EAAAA,qBAAoBsO,EAAeqO,GACnCrO,GAIRqJ,EAAQ+C,UAAYyB,EACpBxE,EAAQsC,YACRtC,EAAQyE,IAAIzP,EAAGF,EAAGkC,GAAe,EAAG,EAAG,EAAIgN,KAAKU,IAAI,GACpD1E,EAAQwD,MACV,CACF,CCnsCO,SAASwC,GAAa,eAACC,EAAc,OAAEC,EAAM,OAAEjE,EAAM,gBAAEkE,IAC1D,MAAMC,EAAeH,GAAkBC,EAAOG,KAAOH,EAAOI,MAAQrE,EAAOhB,YAErEsF,EAA+B,GAAfH,EAItB,MAAO,CACHI,SAHaD,EAAgBJ,EAI7BI,gBACAE,WAN8B,GAAfL,EAQvB,CC9EA,SAASM,EAAkBC,EAAQC,GAC/B,IAAKA,GAAcD,EAAOxe,QAAU,EAChC,OAAOwe,EAGX,MAAME,EAAe,GACrB,IAAIvD,GAAQ,IAEZ,IAAK,MAAMwD,KAASH,EAAQ,CACxB,MAAO3R,GAAK8R,EACR9R,EAAIsO,GAASsD,IACbC,EAAa7c,KAAK8c,GAClBxD,EAAQtO,EAEhB,CAEA,OAAO6R,CACX,C,4ECrBA,IAAIE,GACG,MAAMC,GAAiB,6BAA+BtS,MAAMzK,GACxDA,EAAOgd,UAAUvS,MAAK,KACzBqS,GAAgB9c,CAAM,MAIf,SAASid,KACpB,OAAOH,EACX,CCEO,SAASI,GAAyB7F,GAAO,OAAE1L,EAAM,YAAEC,IACtD,IAAIuR,EAAc,EAClB,IAAK,IAAIzE,KAAQrB,EACb,GAAI1L,EACA,IAAK,IAAI3N,EAAI,EAAGA,EAAI0a,EAAKxa,OAAQF,IACzB2N,GAAU3N,GAAK4N,EAAY,GAAKA,EAAY,KAAOA,EAAY,IAGnEuR,SAGJA,GAAezE,EAAKxa,OAI5B,MAAMkf,EAAY,IAAI1I,aAAyB,EAAZyI,GAC7BE,EAAgB,IAAI3I,aAAyB,EAAZyI,GACjC1I,EAAW,IAAIC,aAAyB,EAAZyI,GAC5BG,EAAU,IAAIC,YAAwB,EAAZJ,GAEhC,GAAIA,EAAc,EAAG,CACjB,MAAMK,EAAkB,IAAI9I,aAAa,CAAC,EAAG,EAAG,EAAG,IACnDD,EAASgJ,IAAID,GACb,IAAIE,EAAgBF,EAAgBtf,OAChCyf,EAAeH,EAAgBtf,OACnC,KAAOwf,EAAgBjJ,EAASvW,QACxBwf,EAAgBC,EAAelJ,EAASvW,SACxCyf,EAAelJ,EAASvW,OAASwf,GAGrCjJ,EAASmJ,WAAWF,EAAe,EAAGC,GACtCD,GAAiBC,EACjBA,IAAiB,CAEzB,CAEA,IAAIE,EAAS,EACb,IAAK,IAAInF,KAAQrB,EACb,IAAK,IAAIrZ,EAAI,EAAGA,EAAI0a,EAAKxa,OAAQF,IAAK,CAClC,GAAI2N,GAAU3N,GAAK4N,EAAY,GAAKA,EAAY,KAAOA,EAAY,GAC/D,SAGJ,MAAOb,EAAGF,GAAK6N,EAAK1a,GAEpB,IAAI8f,EAAOhG,EAED,IAAN9Z,GACA8f,EAAQ/S,EAAI,EACZ+M,EAAQjN,IAEPiT,EAAOhG,GAASY,EAAK1a,EAAI,GAG9B,IAAK,IAAIqM,EAAI,EAAGA,EAAI,EAAGA,IACnB+S,EAAmB,EAATS,EAAa,EAAIxT,GAAKU,EAChCqS,EAAmB,EAATS,EAAa,EAAIxT,EAAI,GAAKQ,EACpCwS,EAAuB,EAATQ,EAAa,EAAIxT,GAAKyT,EACpCT,EAAuB,EAATQ,EAAa,EAAIxT,EAAI,GAAKyN,EAG5CwF,EAAiB,EAATO,GAAuB,EAATA,EACtBP,EAAiB,EAATO,EAAa,GAAc,EAATA,EAAa,EACvCP,EAAiB,EAATO,EAAa,GAAc,EAATA,EAAa,EAEvCP,EAAiB,EAATO,EAAa,GAAc,EAATA,EAC1BP,EAAiB,EAATO,EAAa,GAAc,EAATA,EAAa,EACvCP,EAAiB,EAATO,EAAa,GAAc,EAATA,EAAa,EAEvCA,GACJ,CAGJ,MAAO,CACHT,YACAC,gBACA5I,WACA6I,UAER,CChFe,MAAMS,GAEjBtN,WAAAA,CAAYyB,GACR5R,KAAKqT,IAAMzB,EAEX5R,KAAKsT,SAAW3B,EAAgBC,EAAI8L,IAAUC,KAC9C3d,KAAK4d,eAAiBjM,EAAgBC,EAAIiM,KAAYC,KAEtD9d,KAAK+d,gBAAkBnM,EAAG8B,eAC1B1T,KAAKge,oBAAsBpM,EAAG8B,eAC9B1T,KAAKyT,cAAgB7B,EAAG8B,eACxB1T,KAAK2T,aAAe/B,EAAG8B,eACvB1T,KAAKie,uBAAyBrM,EAAG8B,eAE5B9B,EAAGgC,aAAa,2BACjBtB,QAAQC,MAAM,uDAEtB,CAEA2L,OAAAA,GAEA,CAEAC,KAAAA,GACI,MAAMvM,EAAK5R,KAAKqT,IACV9H,EAAQqG,EAAGwM,mBACXzI,EAAS/D,EAAGyM,oBAElBzM,EAAG0M,WAAW,EAAG,EAAG,EAAG,GACvB1M,EAAG2M,SAAS,EAAG,EAAGhT,EAAOoK,EAC7B,CAmBA9B,IAAAA,CAAKgD,EAAmB2H,GACpB,MAAM5M,EAAK5R,KAAKqT,IACV9H,EAAQqG,EAAGwM,mBACXzI,EAAS/D,EAAGyM,oBAClBzM,EAAGkC,WAAW9T,KAAKsT,UAEnB,MAAMmL,EAAYpJ,IAAemJ,EAAWjT,OAAS,IAAMiT,EAAWlE,YAAc,EAAI,IAClFoE,OAAuC7gB,IAA1B2gB,EAAWE,WAA2B,EAAIF,EAAWE,WAClE9R,EAAc4R,EAAW5R,aAAe,QACxCvB,EAASmT,EAAWnT,SAAU,EAC9BC,EAAckT,EAAWlT,aAAe,CAAC,EAAG,GAClD,GAAIkT,EAAWG,2BAAmD9gB,IAA3B2gB,EAAWI,aAA6BJ,EAAWK,aAEtF,YADA7e,KAAK8e,mBAAmBjI,EAAmB2H,GAI/C,MAAM,UAAC1B,EAAS,cAAEC,EAAa,SAAE5I,EAAQ,QAAE6I,GDyBpC,SAAyBnG,GAAmB,OAAExL,EAAM,YAAEC,IACjE,GAAIuL,GAAqBA,EAAkBE,MACvC,OAAO6F,GAAyB/F,EAAkBE,MAAO,CAAE1L,SAAQC,gBAGvE,IAAKqR,KAED,OAAOC,GADOhG,EAAUC,GACe,CAAExL,SAAQC,gBAGrD,MAAMuR,EAAcF,KAAUoC,iBAC1BlI,EAAkBK,SAAUL,EAAkBQ,QAASR,EAAkBO,WAAYP,EAAkBM,WACvG9L,EAAQC,EAAY,GAAIA,EAAY,IAGxC,IAAIwR,EAAY,IAAI1I,aAAyB,EAAZyI,GAC7BE,EAAgB,IAAI3I,aAAyB,EAAZyI,GACjC1I,EAAW,IAAIC,aAAyB,EAAZyI,GAC5BG,EAAU,IAAIC,YAAwB,EAAZJ,GAS9B,OAPAF,KAAUqC,iBACN3J,EACAwB,EAAkBK,SAAUL,EAAkBQ,QAASR,EAAkBO,WAAYP,EAAkBM,WACvG2F,EAAWC,EAAe5I,EAAU6I,EACpC3R,EAAQC,EAAY,GAAIA,EAAY,IAGjC,CACHwR,YACAC,gBACA5I,WACA6I,UAER,CC1D8DiC,CAAgBpI,EAAmB,CAAExL,SAAQC,gBAEnG,IAAKtL,KAAKsT,SAEN,YADAhB,QAAQC,MAAM,2DAIlB,MAAM2M,EAAgBtN,EAAG8C,kBAAkB1U,KAAKsT,SAAU,YACpD6L,EAAoBvN,EAAG8C,kBAAkB1U,KAAKsT,SAAU,gBACxD8L,EAAcxN,EAAG8C,kBAAkB1U,KAAKsT,SAAU,UAExD1B,EAAG+C,wBAAwBuK,GAC3BtN,EAAGyC,WAAWzC,EAAG0C,aAActU,KAAK+d,iBACpCnM,EAAG2C,WAAW3C,EAAG0C,aAAcwI,EAAWlL,EAAG4C,aAC7C5C,EAAGgD,oBAAoBsK,EAAe,EAAGtN,EAAGiD,OAAO,EAAO,EAAG,GAE7DjD,EAAG+C,wBAAwBwK,GAC3BvN,EAAGyC,WAAWzC,EAAG0C,aAActU,KAAKge,qBACpCpM,EAAG2C,WAAW3C,EAAG0C,aAAcyI,EAAenL,EAAG4C,aACjD5C,EAAGgD,oBAAoBuK,EAAmB,EAAGvN,EAAGiD,OAAO,EAAO,EAAG,GAEjEjD,EAAG+C,wBAAwByK,GAC3BxN,EAAGyC,WAAWzC,EAAG0C,aAActU,KAAKyT,eACpC7B,EAAG2C,WAAW3C,EAAG0C,aAAcH,EAAUvC,EAAG4C,aAC5C5C,EAAGgD,oBAAoBwK,EAAa,EAAGxN,EAAGiD,OAAO,EAAO,EAAG,GAE3DjD,EAAGyN,UAAUzN,EAAGsC,mBAAmBlU,KAAKsT,SAAU,SAAU/H,GAC5DqG,EAAGyN,UAAUzN,EAAGsC,mBAAmBlU,KAAKsT,SAAU,UAAWqC,GAC7D/D,EAAGyN,UAAUzN,EAAGsC,mBAAmBlU,KAAKsT,SAAU,aAAcmG,KAAKK,IAAI2E,EAAW,GAAGC,GACvF9M,EAAGyN,UAAUzN,EAAGsC,mBAAmBlU,KAAKsT,SAAU,cAAeoL,GACjE,MAAMY,EAAchO,EAAckN,EAAWzgB,OAC7C6T,EAAGqC,UAAUrC,EAAGsC,mBAAmBlU,KAAKsT,SAAU,YAAagM,GAC/D1N,EAAGqC,UAAUrC,EAAGsC,mBAAmBlU,KAAKsT,SAAU,kBAAmBhC,EAAc1E,IAEnF,MAAM2S,OAAiC1hB,IAAvB2gB,EAAWe,QAAwBf,EAAWe,SAAW,EACnE9E,OAA6C5c,IAA7B2gB,EAAW/D,cAA8B+D,EAAW/D,cAAgB,IAS1F,GAPA7I,EAAGyN,UAAUzN,EAAGsC,mBAAmBlU,KAAKsT,SAAU,WAAYiM,GAC9D3N,EAAGyN,UAAUzN,EAAGsC,mBAAmBlU,KAAKsT,SAAU,iBAAkBmH,GAEpE7I,EAAGyC,WAAWzC,EAAG4N,qBAAsBxf,KAAK2T,cAC5C/B,EAAG2C,WAAW3C,EAAG4N,qBAAsBxC,EAASpL,EAAG4C,aACnD5C,EAAG6N,aAAa7N,EAAGwD,UAAW4H,EAAQpf,OAAQgU,EAAG8N,aAAc,GAE3DlB,EAAWvS,qBAAsB,CACjC2F,EAAGkC,WAAW9T,KAAK4d,gBAEnBhM,EAAGyN,UAAUzN,EAAGsC,mBAAmBlU,KAAK4d,eAAgB,SAAUrS,GAClEqG,EAAGyN,UAAUzN,EAAGsC,mBAAmBlU,KAAK4d,eAAgB,UAAWjI,GACnE,MAAMgK,EAAYnB,EAAW/R,YAAuC,EAAzB+R,EAAW/R,YAAkB4I,EAAe,GAAGoJ,EAAU,GACpG7M,EAAGyN,UAAUzN,EAAGsC,mBAAmBlU,KAAK4d,eAAgB,aAAc+B,GAEtE,IAAI3F,EAAmBwE,EAAWoB,sBAElC,GAAIpB,EAAWtS,iBAAmB8N,EAAiBpc,OAAS,EAAG,CAC3D,MAAM0e,EAAe,GACrB,IAAIvD,GAAQ,IAEZ,IAAK,MAAMwD,KAASvC,EAAkB,CAClC,MAAOvP,GAAK8R,EACR9R,EAAIsO,GAASyF,EAAWtS,kBACxBoQ,EAAa7c,KAAK8c,GAClBxD,EAAQtO,EAEhB,CAEAuP,EAAmBsC,CACvB,CAEA,QAA+Bze,IAA3B2gB,EAAWI,aAA6BJ,EAAWI,YAAc,GAAKJ,EAAWK,aAAc,CAC/F,MAAM,aAAEA,GAAiBL,EACzB,IAAIqB,EAEJ,GAA+B,iBAApBhB,EAAa,IAA8C,IAA3BA,EAAa,GAAGjhB,OAAc,CACrE,MAAMkiB,EAAYrG,KAAKsG,MAAMvB,EAAWI,aAClCoB,EAAWxB,EAAWI,YAAckB,EAE1C,GAAiB,IAAbE,GAAkBF,GAAajB,EAAajhB,OAAS,EAAG,CACxD,MAAMqiB,EAAapB,EAAapF,KAAKC,IAAIoG,EAAWjB,EAAajhB,OAAS,IAAI,GAC9EiiB,EAAaI,aAAsBxR,KAAOwR,EAAWC,UAAYD,CACrE,KAAO,CACH,MAAME,EAActB,EAAaiB,GAAW,GACtCM,EAAWvB,EAAaiB,EAAY,GAAG,GACvCO,EAAcF,aAAuB1R,KAAO0R,EAAYD,UAAYC,EAE1EN,EAAaQ,EAAcL,IADVI,aAAoB3R,KAAO2R,EAASF,UAAYE,GACfC,EACtD,CACJ,CAEA,MAAMC,EAAkB,GAClBC,EAAmB,GAEzB,GAAI/B,EAAWgC,UAAW,CACtB,MAAMC,EAAiBjC,EAAWkC,gBAAgB3E,gBAAgBtN,KAAO+P,EAAWkC,gBAAgB3E,KAAKmE,UAAY1B,EAAWkC,gBAAgB3E,KAG1IrB,GADamF,EAAaY,KADTjC,EAAWkC,gBAAgB5E,gBAAgBrN,KAAO+P,EAAWkC,gBAAgB5E,KAAKoE,UAAY1B,EAAWkC,gBAAgB5E,MAC5E2E,GACnClV,EAEjC,IAAK,IAAI7N,EAAI,EAAGA,EAAIsc,EAAiBpc,OAAQF,IAAK,CAC9C,MAAOijB,EAAQC,GAAU5G,EAAiBtc,GACtCijB,EAASjG,EACT4F,EAAgB7gB,KAAKua,EAAiBtc,IAEtC6iB,EAAiB9gB,KAAKua,EAAiBtc,GAE/C,CACJ,MAAO,GAAK8gB,EAAWkC,gBAEhB,CACH,MAAMD,EAAiBjC,EAAWkC,gBAAgB3E,gBAAgBtN,KAC9D+P,EAAWkC,gBAAgB3E,KAAKmE,UAAY1B,EAAWkC,gBAAgB3E,KACrE8E,EAAiBrC,EAAWkC,gBAAgB5E,gBAAgBrN,KAC9D+P,EAAWkC,gBAAgB5E,KAAKoE,UAAY1B,EAAWkC,gBAAgB5E,KAE/E,GAAI+D,EAAaY,EACbF,EAAiB9gB,QAAQua,QACtB,GAAI6F,EAAagB,EACS,WAAzBrC,EAAWrS,UACXoU,EAAiB9gB,QAAQua,GAEzBsG,EAAgB7gB,QAAQua,OAEzB,CACH,MAEMU,GAFsBmF,EAAaY,IAAmBI,EAAiBJ,GACzDzgB,KAAKqT,IAAImC,OAAOjK,MAGpCyO,EAAiB/I,SAAQ,CAACsL,EAAOjX,KAC7B,MAAOqb,EAAQC,GAAUrE,EAErBoE,EAASjG,EACT4F,EAAgB7gB,KAAK8c,GAErBgE,EAAiB9gB,KAAK8c,EAC1B,GAEJ,CACJ,MA9BIgE,EAAiB9gB,QAAQua,GAgC7B,GAAIsG,EAAgB1iB,OAAS,EAAG,CAC5B,MAAMkjB,GAAsBhjB,EAAAA,EAAAA,qBAAoB0gB,EAAWzgB,MAAOygB,EAAW/D,eAAiB,KAC9F7I,EAAGqC,UAAUrC,EAAGsC,mBAAmBlU,KAAK4d,eAAgB,YAAatM,EAAcwP,IAEnFlP,EAAG+C,wBAAwB,GAC3B/C,EAAGyC,WAAWzC,EAAG0C,aAActU,KAAKie,wBACpCrM,EAAG2C,WAAW3C,EAAG0C,aAAc,IAAIF,aAAakM,EAAgBS,QAASnP,EAAG4C,aAC5E5C,EAAGgD,oBAAoB,EAAG,EAAGhD,EAAGiD,OAAO,EAAO,EAAG,GACjDjD,EAAGuD,WAAWvD,EAAGoP,OAAQ,EAAGV,EAAgB1iB,OAChD,CAEI2iB,EAAiB3iB,OAAS,IAC1BgU,EAAGqC,UAAUrC,EAAGsC,mBAAmBlU,KAAK4d,eAAgB,YAAatM,EAAckN,EAAWzgB,QAE9F6T,EAAG+C,wBAAwB,GAC3B/C,EAAGyC,WAAWzC,EAAG0C,aAActU,KAAKie,wBACpCrM,EAAG2C,WAAW3C,EAAG0C,aAAc,IAAIF,aAAamM,EAAiBQ,QAASnP,EAAG4C,aAC7E5C,EAAGgD,oBAAoB,EAAG,EAAGhD,EAAGiD,OAAO,EAAO,EAAG,GACjDjD,EAAGuD,WAAWvD,EAAGoP,OAAQ,EAAGT,EAAiB3iB,QAErD,MACIgU,EAAGqC,UAAUrC,EAAGsC,mBAAmBlU,KAAK4d,eAAgB,YAAatM,EAAckN,EAAWzgB,QAE9F6T,EAAG+C,wBAAwB,GAC3B/C,EAAGyC,WAAWzC,EAAG0C,aAActU,KAAKie,wBACpCrM,EAAG2C,WAAW3C,EAAG0C,aAAc,IAAIF,aAAa4F,EAAiB+G,QAASnP,EAAG4C,aAC7E5C,EAAGgD,oBAAoB,EAAG,EAAGhD,EAAGiD,OAAO,EAAO,EAAG,GAEjDjD,EAAGuD,WAAWvD,EAAGoP,OAAQ,EAAGhH,EAAiBpc,OAErD,CACJ,CAEAkhB,kBAAAA,CAAmBjI,EAAmB2H,GAClC,MAAM,YAAEI,EAAW,cAAEnE,EAAa,aAAEoE,EAAY,gBAAE6B,GAAoBlC,EAEtE,IAAIqB,EACJ,GAA+B,iBAApBhB,EAAa,IAA8C,IAA3BA,EAAa,GAAGjhB,OAAc,CACrE,MAAMkiB,EAAYrG,KAAKsG,MAAMnB,GACvBoB,EAAWpB,EAAckB,EAE/B,GAAiB,IAAbE,GAAkBF,GAAajB,EAAajhB,OAAS,EAAG,CACxD,MAAMqiB,EAAapB,EAAapF,KAAKC,IAAIoG,EAAWjB,EAAajhB,OAAS,IAAI,GAC9EiiB,EAAaI,aAAsBxR,KAAOwR,EAAWC,UAAYD,CACrE,KAAO,CACH,MAAME,EAActB,EAAaiB,GAAW,GACtCM,EAAWvB,EAAaiB,EAAY,GAAG,GACvCO,EAAcF,aAAuB1R,KAAO0R,EAAYD,UAAYC,EAE1EN,EAAaQ,EAAcL,IADVI,aAAoB3R,KAAO2R,EAASF,UAAYE,GACfC,EACtD,CACJ,MACIR,EAAajB,EAGjB,GAAIJ,EAAWgC,UAAW,CACtB,MAAM5O,EAAK5R,KAAKqT,IACVoN,EAAiBC,EAAgB3E,gBAAgBtN,KAAOiS,EAAgB3E,KAAKmE,UAAYQ,EAAgB3E,KAEzGvB,GAAaqF,EAAaY,KADTC,EAAgB5E,gBAAgBrN,KAAOiS,EAAgB5E,KAAKoE,UAAYQ,EAAgB5E,MAC3C2E,GAEpE,GAAIjG,EAAY,EACZxa,KAAK6T,KAAKgD,EAAmB,IAAK2H,EAAYG,sBAAsB,SACjE,GAAInE,EAAY,EAAG,CACtB,MAAMsG,GAAsBhjB,EAAAA,EAAAA,qBAAoB0gB,EAAWzgB,MAAO0c,GAClEza,KAAK6T,KAAKgD,EAAmB,IACtB2H,EACHzgB,MAAO+iB,EACPnC,sBAAsB,GAE9B,MACI/M,EAAGkD,OAAOlD,EAAGmD,OACbnD,EAAGoD,UAAUpD,EAAGqD,UAAWrD,EAAGsD,qBAE9BlV,KAAK6T,KAAKgD,EAAmB,IACtB2H,EACHG,sBAAsB,EACtBY,QAAS/E,EACTC,cAAeA,GAAiB,KAG5C,KAAO,CACH,IAAKiG,EAED,YADA1gB,KAAK6T,KAAKgD,EAAmB,IAAK2H,EAAYG,sBAAsB,IAIxE,MAAM8B,EAAiBC,EAAgB3E,gBAAgBtN,KAAOiS,EAAgB3E,KAAKmE,UAAYQ,EAAgB3E,KACzG8E,EAAiBH,EAAgB5E,gBAAgBrN,KAAOiS,EAAgB5E,KAAKoE,UAAYQ,EAAgB5E,KAE/G,GAAI+D,EAAaY,EACbzgB,KAAK6T,KAAKgD,EAAmB,IAAK2H,EAAYG,sBAAsB,SACjE,GAAIkB,EAAagB,EAAgB,CACpC,MAAMC,GAAsBhjB,EAAAA,EAAAA,qBAAoB0gB,EAAWzgB,MAAO0c,GAClEza,KAAK6T,KAAKgD,EAAmB,IACtB2H,EACHzgB,MAAO+iB,EACPnC,sBAAsB,GAE9B,KAAO,CACH,MAAMsC,GAAsBpB,EAAaY,IAAmBI,EAAiBJ,GAEvE7O,EAAK5R,KAAKqT,IAChBzB,EAAGkD,OAAOlD,EAAGmD,OACbnD,EAAGoD,UAAUpD,EAAGqD,UAAWrD,EAAGsD,qBAE9BlV,KAAK6T,KAAKgD,EAAmB,IACtB2H,EACHG,sBAAsB,EACtBY,QAAS0B,EACTxG,cAAeA,GAAiB,KAExC,CACJ,CACJ,E,8CClUW,MAAMyG,GACnB/Q,WAAAA,CAAYyB,GAKV,GAJA5R,KAAKqT,IAAMzB,EAEX5R,KAAKsT,SAAW3B,EAAgBC,EAAIuP,KAAYC,OAE3CphB,KAAKsT,SAGR,OAFAhB,QAAQC,MAAM,+CACdvS,KAAKsT,SAAW,MAIlB1B,EAAGqB,gBAAgBjT,KAAKsT,UACnB1B,EAAGmB,oBAAoB/S,KAAKsT,SAAU1B,EAAGsB,kBAC5CZ,QAAQC,MACN,oCACAX,EAAGuB,kBAAkBnT,KAAKsT,WAI9B,MAAM+N,EAAczP,EAAG8C,kBAAkB1U,KAAKsT,SAAU,YAClDgO,EAAqB1P,EAAG8C,kBAC5B1U,KAAKsT,SACL,mBAEIiO,EAAqB3P,EAAG8C,kBAC5B1U,KAAKsT,SACL,oBAIiB,IAAjB+N,IACwB,IAAxBC,IACwB,IAAxBC,GAEAjP,QAAQC,MAAM,sCAGhBvS,KAAK+d,gBAAkBnM,EAAG8B,eAC1B1T,KAAKwhB,uBAAyB5P,EAAG8B,eACjC1T,KAAKyhB,uBAAyB7P,EAAG8B,eACjC1T,KAAK2T,aAAe/B,EAAG8B,eAEvB1T,KAAK0hB,iBAAmB9P,EAAG+P,gBAEtB/P,EAAGgC,aAAa,2BACnBtB,QAAQC,MAAM,uDAElB,CAEA2L,OAAAA,GACE,MAAMtM,EAAK5R,KAAKqT,IACZrT,KAAK0hB,mBACP9P,EAAGgQ,cAAc5hB,KAAK0hB,kBACtB1hB,KAAK0hB,iBAAmB,KAE5B,CAOAG,yBAAAA,CAA0BC,GACxB,MAAMhF,EAAY,GACZiF,EAAkB,GAClBC,EAAkB,GAClBhF,EAAU,GAEhB,IAAIoC,EAAc,EAElB,IAAK,MAAM6C,KAAQH,EAAY,CAC7B,MAAM,GAAE7G,EAAE,GAAEC,EAAE,GAAEC,EAAE,GAAEC,EAAE,SAAE8G,EAAQ,SAAEC,GAAaF,EAEzC9N,EAAW,CACf,CAAC8G,EAAIC,GACL,CAACC,EAAIC,GACL,CAACD,EAAIgH,GACL,CAAClH,EAAIiH,IAGDvG,EAAS,CAACV,EAAIC,EAAIC,EAAIC,GACtBgH,EAAS,CAACnH,EAAIiH,EAAU/G,EAAIgH,GAElC,IAAK,IAAIzkB,EAAI,EAAGA,EAAI,EAAGA,IAAK,CAC1B,MAAO+M,EAAGF,GAAK4J,EAASzW,GAExBof,EAAUrd,KAAKgL,EAAGF,GAClBwX,EAAgBtiB,QAAQkc,GACxBqG,EAAgBviB,QAAQ2iB,EAC1B,CAEApF,EAAQvd,KACN2f,EACAA,EAAc,EACdA,EAAc,EACdA,EACAA,EAAc,EACdA,EAAc,GAGhBA,GAAe,CACjB,CAEA,MAAO,CACLtC,UAAW,IAAI1I,aAAa0I,GAC5BiF,gBAAiB,IAAI3N,aAAa2N,GAClCC,gBAAiB,IAAI5N,aAAa4N,GAClChF,QAAS,IAAIC,YAAYD,GAE7B,CAQAqF,aAAAA,CAAcpjB,EAAUqjB,GACtB,IAAKrjB,IAAaC,MAAMC,QAAQF,IAAaA,EAASrB,OAAS,EAAG,CAChE,MAAM2kB,EAAmBjR,EAAcgR,GACvC,MAAO,CACLE,YAAa,IAAIC,WAAW,CAC1B,EACA,EACA,EACA,IACAhJ,KAAKsG,MAA4B,IAAtBwC,EAAiB,IAC5B9I,KAAKsG,MAA4B,IAAtBwC,EAAiB,IAC5B9I,KAAKsG,MAA4B,IAAtBwC,EAAiB,IAC5B9I,KAAKsG,MAA4B,IAAtBwC,EAAiB,MAE9BG,aAAc,EACdC,cAAe,EACfL,cAAeC,EAEnB,CAEA,MAAMK,EAAS,GACTC,EAAQ,GAEd,IAAK,IAAInlB,EAAI,EAAGA,EAAIuB,EAASrB,OAAQF,IAAK,CACxC,MAAMuC,EAAOhB,EAASvB,GAElBwB,MAAMC,QAAQc,IAChB4iB,EAAMpjB,KAAKQ,EAAK,IAChB2iB,EAAOnjB,KAAK6R,EAAcrR,EAAK,OAE/B4iB,EAAMpjB,KAAK/B,GAAKuB,EAASrB,OAAS,IAClCglB,EAAOnjB,KAAK6R,EAAcrR,IAE9B,CAEA,MAAMyiB,EAA+B,EAAhBE,EAAOhlB,OACtB4kB,EAAc,IAAIC,WAA0B,EAAfC,GAEnC,IAAK,IAAIhlB,EAAI,EAAGA,EAAIklB,EAAOhlB,OAAQF,IAAK,CACtC,MAAMolB,EAAgB,EAAJplB,EACZqlB,EAAaD,EAAY,EAE/BN,EAAYM,GAAarJ,KAAKsG,MAAiB,IAAX8C,EAAMnlB,IAC1C8kB,EAAYM,EAAY,GAAK,EAC7BN,EAAYM,EAAY,GAAK,EAC7BN,EAAYM,EAAY,GAAK,IAE7BN,EAAYO,GAActJ,KAAKsG,MAAqB,IAAf6C,EAAOllB,GAAG,IAC/C8kB,EAAYO,EAAa,GAAKtJ,KAAKsG,MAAqB,IAAf6C,EAAOllB,GAAG,IACnD8kB,EAAYO,EAAa,GAAKtJ,KAAKsG,MAAqB,IAAf6C,EAAOllB,GAAG,IACnD8kB,EAAYO,EAAa,GAAKtJ,KAAKsG,MAAqB,IAAf6C,EAAOllB,GAAG,GACrD,CAEA,MAAO,CACL8kB,cACAE,eACAC,cAAeC,EAAOhlB,OACtB0kB,cAAehR,EAAcgR,GAEjC,CAOAzO,IAAAA,CAAKmG,EAAkBgJ,GAErB,IAAKhJ,GAAoBA,EAAiBpc,OAAS,EACjD,OAGF,MAAMgU,EAAK5R,KAAKqT,IACV9H,EAAQqG,EAAGwM,mBACXzI,EAAS/D,EAAGyM,oBAIlB,GAFAzM,EAAGkC,WAAW9T,KAAKsT,UAGjB0P,EAAOrE,2BACgB9gB,IAAvBmlB,EAAOpE,aACPoE,EAAOnE,aAGP,YADA7e,KAAKijB,qBAAqBjJ,EAAkBgJ,GAI9C,MAAMlB,EAAa,GACboB,EAAqB,GACrBC,EAAqB,IACrB,KAAE7K,EAAI,wBAAE8K,EAAuB,iBAAE/W,EAAgB,aAAEkM,GAAiByK,EAG1E,IAAK,IAAItlB,EAAI,EAAGA,EAAIsc,EAAiBpc,OAAS,EAAGF,IAAK,CACpD,MAAOud,EAAIC,GAAMlB,EAAiBtc,IAC3Byd,EAAIC,GAAMpB,EAAiBtc,EAAI,GAEtC,IAAIwkB,EAAW5J,EACX6J,EAAW7J,EAEf,MAAM+K,EAAmBnI,EAAK5C,EACxBgL,EAAmBlI,EAAK9C,EAG9B,GAFoB+K,EAAmBC,EAAmB,EAEzC,CACf,MAGMC,EAAStI,GAAME,EAAKF,IAFxBxB,KAAK+J,IAAIH,IACR5J,KAAK+J,IAAIH,GAAoB5J,KAAK+J,IAAIF,KAEnCG,EAASnL,EAEf,GAAImB,KAAK+J,IAAItI,EAAKuI,GAAU,GAAK,CAC/B,MAAMxB,EAAO,CACXhH,KACAC,KACAC,GAAIoI,EACJnI,GAAIqI,EACJvB,WACAC,SAAU7J,GAEZwJ,EAAWriB,KAAKwiB,GAGZ1J,GAAgBlM,IACd6O,GAAM5C,EACR4K,EAAmBzjB,KAAKwiB,GAExBkB,EAAmB1jB,KAAKwiB,GAG9B,CAEA,GAAIxI,KAAK+J,IAAIpI,EAAKqI,GAAU,GAAK,CAC/B,MAAMxB,EAAO,CACXhH,GAAIsI,EACJrI,GAAIuI,EACJtI,KACAC,KACA8G,SAAU5J,EACV6J,YAEFL,EAAWriB,KAAKwiB,GAGZ1J,GAAgBlM,IACd+O,GAAM9C,EACR4K,EAAmBzjB,KAAKwiB,GAExBkB,EAAmB1jB,KAAKwiB,GAG9B,CACF,KAAO,CAEL,GAAIhH,EAAK1P,GAAS4P,EAAK,EACrB,SAIF,IAAIuI,EAAUvI,EACVwI,EAAUvI,EACVwI,EAAgBzB,EAEpB,GAAIhH,EAAK5P,EAAO,CACd,MAAMsY,GAAStY,EAAQ0P,IAAOE,EAAKF,GACnCyI,EAAUnY,EACVoY,EAAUzI,GAAME,EAAKF,GAAM2I,EAC3BD,EAAgB1B,GAAYC,EAAWD,GAAY2B,CACrD,CAEA,MAAMC,EAAY,CAAE7I,KAAIC,KAAIC,GAAIuI,EAAStI,GAAIuI,EAASzB,WAAUC,SAAUyB,GAC1E9B,EAAWriB,KAAKqkB,GAGZvL,GAAgBlM,KAEJ6O,EAAKyI,GAAW,GAClBrL,EACV4K,EAAmBzjB,KAAKqkB,GAExBX,EAAmB1jB,KAAKqkB,GAG9B,CACF,CAEA,GAA0B,IAAtBhC,EAAWlkB,OACb,OAGF,MAAMyjB,EAAczP,EAAG8C,kBAAkB1U,KAAKsT,SAAU,YAClDgO,EAAqB1P,EAAG8C,kBAC5B1U,KAAKsT,SACL,mBAEIiO,EAAqB3P,EAAG8C,kBAC5B1U,KAAKsT,SACL,mBAGF1B,EAAGyN,UAAUzN,EAAGsC,mBAAmBlU,KAAKsT,SAAU,SAAU/H,GAC5DqG,EAAGyN,UAAUzN,EAAGsC,mBAAmBlU,KAAKsT,SAAU,UAAWqC,GAE7D/D,EAAGkD,OAAOlD,EAAGmD,OACbnD,EAAGoD,UAAUpD,EAAGqD,UAAWrD,EAAGsD,qBAG9B,MAAM6O,EAAqBA,CAACC,EAAS/kB,EAAUlB,KAC7C,GAAuB,IAAnBimB,EAAQpmB,OAAc,OAE1B,MAAMqmB,EAAWjkB,KAAK6hB,0BAA0BmC,GAEhDpS,EAAG+C,wBAAwB0M,GAC3BzP,EAAGyC,WAAWzC,EAAG0C,aAActU,KAAK+d,iBACpCnM,EAAG2C,WAAW3C,EAAG0C,aAAc2P,EAASnH,UAAWlL,EAAG4C,aACtD5C,EAAGgD,oBAAoByM,EAAa,EAAGzP,EAAGiD,OAAO,EAAO,EAAG,GAE3DjD,EAAG+C,wBAAwB2M,GAC3B1P,EAAGyC,WAAWzC,EAAG0C,aAActU,KAAKwhB,wBACpC5P,EAAG2C,WAAW3C,EAAG0C,aAAc2P,EAASlC,gBAAiBnQ,EAAG4C,aAC5D5C,EAAGgD,oBAAoB0M,EAAoB,EAAG1P,EAAGiD,OAAO,EAAO,EAAG,GAElEjD,EAAG+C,wBAAwB4M,GAC3B3P,EAAGyC,WAAWzC,EAAG0C,aAActU,KAAKyhB,wBACpC7P,EAAG2C,WAAW3C,EAAG0C,aAAc2P,EAASjC,gBAAiBpQ,EAAG4C,aAC5D5C,EAAGgD,oBAAoB2M,EAAoB,EAAG3P,EAAGiD,OAAO,EAAO,EAAG,GAElE,MAAMqP,EAAelkB,KAAKqiB,cAAcpjB,EAAUlB,GAElD6T,EAAGuS,cAAcvS,EAAGwS,UACpBxS,EAAGyS,YAAYzS,EAAG0S,WAAYtkB,KAAK0hB,kBAEnC9P,EAAG2S,WACD3S,EAAG0S,WACH,EACA1S,EAAG4S,KACHN,EAAaxB,aACb,EACA,EACA9Q,EAAG4S,KACH5S,EAAG6S,cACHP,EAAa1B,aAGf5Q,EAAG8S,cAAc9S,EAAG0S,WAAY1S,EAAG+S,mBAAoB/S,EAAGgT,SAC1DhT,EAAG8S,cAAc9S,EAAG0S,WAAY1S,EAAGiT,mBAAoBjT,EAAGgT,SAC1DhT,EAAG8S,cAAc9S,EAAG0S,WAAY1S,EAAGkT,eAAgBlT,EAAGmT,eACtDnT,EAAG8S,cAAc9S,EAAG0S,WAAY1S,EAAGoT,eAAgBpT,EAAGmT,eAEtDnT,EAAGqT,UAAUrT,EAAGsC,mBAAmBlU,KAAKsT,SAAU,mBAAoB,GACtE1B,EAAGqT,UACDrT,EAAGsC,mBAAmBlU,KAAKsT,SAAU,iBACrC4Q,EAAavB,eAEf/Q,EAAGsT,WACDtT,EAAGsC,mBAAmBlU,KAAKsT,SAAU,iBACrC4Q,EAAa5B,eAGf1Q,EAAGyC,WAAWzC,EAAG4N,qBAAsBxf,KAAK2T,cAC5C/B,EAAG2C,WAAW3C,EAAG4N,qBAAsByE,EAASjH,QAASpL,EAAG4C,aAE5D5C,EAAG6N,aAAa7N,EAAGwD,UAAW6O,EAASjH,QAAQpf,OAAQgU,EAAG8N,aAAc,EAAE,EAIxEnH,GAAgBlM,IAAqB6W,EAAmBtlB,OAAS,GAAKulB,EAAmBvlB,OAAS,IAEpGmmB,EAAmBb,EAAoBF,EAAO/jB,SAAU+jB,EAAOjlB,OAG/DgmB,EAAmBZ,EAAoB9W,EAAkB2W,EAAOjlB,QAGhEgmB,EAAmBjC,EAAYkB,EAAO/jB,SAAU+jB,EAAOjlB,OAGzD,MAAMwU,EAAQX,EAAGuT,WACb5S,IAAUX,EAAGwT,UACb9S,QAAQC,MAAM,mCAAoCA,EAIxD,CAOA0Q,oBAAAA,CAAqBjJ,EAAkBgJ,GAErC,MAAM,YAAEpE,EAAW,cAAEnE,EAAa,aAAEoE,EAAY,gBAAE6B,EAAe,KAAEpI,GACjE0K,EAMF,IAAInD,EAEJ,GANA7f,KAAKqlB,sBAAwB,KAC7BrlB,KAAKslB,YAAc,KAKfpmB,MAAMC,QAAQ0f,EAAa,KAAkC,IAA3BA,EAAa,GAAGjhB,OAAc,CAClE,MAAMkiB,EAAYrG,KAAKsG,MAAMnB,GACvBoB,EAAWpB,EAAckB,EAE/B,GAAiB,IAAbE,GAAkBF,GAAajB,EAAajhB,OAAS,EAAG,CAC1D,MACMqiB,EADapB,EAAapF,KAAKC,IAAIoG,EAAWjB,EAAajhB,OAAS,IAC5C,GAC9BiiB,EAAaI,aAAsBxR,KAAOwR,EAAWC,UAAYD,CACnE,KAAO,CACL,MAAMsF,EAAc1G,EAAaiB,GAC3B0F,EAAW3G,EAAaiB,EAAY,GACpCK,EAAcoF,EAAY,GAC1BnF,EAAWoF,EAAS,GACpBnF,EAAcF,aAAuB1R,KAAO0R,EAAYD,UAAYC,EAE1EN,EAAaQ,EAAcL,IADVI,aAAoB3R,KAAO2R,EAASF,UAAYE,GACfC,EACpD,CACF,MACER,EAAajB,EAGf,MAAM6G,EAAgBzC,EAAOtC,gBAC7B,IAAIgF,EAAWC,EAEf,GAAIF,QAAwC5nB,IAAvB4nB,EAAc1J,WAA6Cle,IAAvB4nB,EAAc3J,KACnE4J,EAAYD,EAAc1J,gBAAgBtN,KAAOgX,EAAc1J,KAAKmE,UAAYuF,EAAc1J,KAC9F4J,EAAWF,EAAc3J,gBAAgBrN,KAAOgX,EAAc3J,KAAKoE,UAAYuF,EAAc3J,SAC1F,CACH,MAAM8J,EAAY/G,EAAa,GACzBgH,EAAWhH,EAAaA,EAAajhB,OAAS,GAC9Cib,EAAS+M,EAAU,GACnB7M,EAAQ8M,EAAS,GAEvBH,EAAY7M,aAAkBpK,KAAOoK,EAAOqH,UAAYrH,EACxD8M,EAAW5M,aAAiBtK,KAAOsK,EAAMmH,UAAYnH,CACzD,CAEA,MAEMyB,GAFWqF,EAAa6F,IACZC,EAAWD,GAG7B,GAAIlL,EAAY,EACdxa,KAAK6T,KAAKmG,EAAkB,IAAKgJ,EAAQrE,sBAAsB,SAC1D,GAAInE,EAAY,EAAG,CACxB,MAAMsG,GAAsBhjB,EAAAA,EAAAA,qBAC1BklB,EAAOjlB,MACP0c,GAEIqL,GAAsB9mB,EAAAA,EAAAA,+BAC1BgkB,EAAO/jB,SACPwb,GAEFza,KAAK6T,KAAKmG,EAAkB,IACvBgJ,EACHjlB,MAAO+iB,EACP7hB,SAAU6mB,EACVnH,sBAAsB,GAE1B,MACE3e,KAAK+lB,0BACH/L,EACA,IAAKgJ,EAAQtC,gBAAiBsC,EAAOtC,iBACrClG,EACAqF,EAGN,CASAkG,yBAAAA,CAA0B/L,EAAkBgJ,EAAQxI,EAAWqF,GAC7D,MAAM,KAAEvH,EAAI,cAAEmC,EAAa,gBAAEiG,GAAoBsC,EAI3CtI,EAAeF,EAHVxa,KAAKqT,IAEOmC,OAAOjK,MAGxB+U,EAAkB,GAClBC,EAAmB,GAEzB,IAAK,IAAI7iB,EAAI,EAAGA,EAAIsc,EAAiBpc,OAAQF,IAAK,CAC9C,MAAOijB,EAAQC,GAAU5G,EAAiBtc,GAEtCijB,EAASjG,EACT4F,EAAgB7gB,KAAKua,EAAiBtc,IAEtC6iB,EAAiB9gB,KAAKua,EAAiBtc,GAE/C,CAEA,IAAI0b,EAAa,KACjB,GAAIkH,EAAgB1iB,OAAS,GAAK2iB,EAAiB3iB,OAAS,EAAG,CAC3D,MAAMmd,EAAeuF,EAAgBA,EAAgB1iB,OAAS,GACxDod,EAAiBuF,EAAiB,IAEjCtF,EAAIC,GAAMH,GACVI,EAAIC,GAAMJ,EAEbG,IAAOF,IAGP7B,EAAa,CAACsB,EADCQ,GADaR,EAAeO,IAAOE,EAAKF,IACbG,EAAKF,IAG/CoF,EAAgB7gB,KAAK2Z,GACrBmH,EAAiBlF,QAAQjC,GAEjC,CAEA,GAAIkH,EAAgB1iB,QAAU,EAAG,CAC/B,MAAMkjB,GAAsBhjB,EAAAA,EAAAA,qBAC1BklB,EAAOjlB,MACP0c,GAEI7I,EAAK5R,KAAKqT,IAEhBzB,EAAGoU,QAAQpU,EAAGqU,YAEdrU,EAAGkD,OAAOlD,EAAGmD,OACbnD,EAAGoD,UAAUpD,EAAGqD,UAAWrD,EAAGsD,qBAE9B,MAAM4Q,GAAsB9mB,EAAAA,EAAAA,+BAC1BgkB,EAAO/jB,SACPwb,GAGFza,KAAK6T,KAAKyM,EAAiB,IACtB0C,EACHjlB,MAAO+iB,EACP7hB,SAAU6mB,EACVnH,sBAAsB,GAE1B,CAGI4B,EAAiB3iB,QAAU,GAC7BoC,KAAK6T,KAAK0M,EAAkB,IACvByC,EACHrE,sBAAsB,GAI5B,EC/iBa,MAAMuH,WAA0BhW,EAE3CC,WAAAA,EAAY,gBAACgW,EAAe,cAAEC,EAAa,MAAEC,GAAM,EAAK,kBAAEC,GAAkB,IASxE,OARAC,QAEAvmB,KAAKwmB,iBAAmBL,EAExBnmB,KAAKymB,mBAAqBH,EAC1BtmB,KAAK0mB,QAAUN,EACfpmB,KAAK2mB,OAASN,EAETrmB,KAAK0mB,SAMNL,IACArmB,KAAK4mB,SAAW5mB,KAAK0mB,QAAQG,WAAW,SACpC7mB,KAAK4mB,UACL5mB,KAAK8mB,aAAe,IAAIrJ,GAAYzd,KAAK4mB,UACzC5mB,KAAK+mB,eAAiB,IAAI7F,GAAclhB,KAAK4mB,YAE7CtU,QAAQC,MAAM,mCACdyU,MAAM,sDACNhnB,KAAK2mB,QAAS,IAIjB3mB,KAAK2mB,SACN3mB,KAAK4mB,SAAW5mB,KAAK0mB,QAAQG,WAAW,MACxC7mB,KAAKinB,WAAajnB,KAAK4mB,UAGtB5mB,KAAK4mB,UAMV5mB,KAAKknB,aAAelnB,KAAKmnB,oBAEzBnnB,KAAKonB,aAAepnB,KAAKqnB,OAAOC,KAAKtnB,MACrCA,KAAKunB,iBAAmB,KACxBvnB,KAAKwnB,cAAiBC,IAClB,MAAMpjB,EAAQojB,EAAKC,QAAO,EAAGza,YAAaA,EAAOrP,OAAS,IAAGA,OACzDoC,KAAKunB,mBAAqBljB,IAC1BrE,KAAKunB,iBAAmBljB,EACxBrE,KAAKqnB,SACT,EAGJlB,EAAgB7V,GAAG,eAAgBtQ,KAAKwnB,eACxCrB,EAAgB7V,GAAG,qBAAsBtQ,KAAKonB,mBAC9CjB,EAAgB7V,GAAG,0BAA2BtQ,KAAKonB,gBAnB/C9U,QAAQC,MAAM,0DACdvS,KAAKknB,cAAe,MAxBpB5U,QAAQC,MAAM,gEACdvS,KAAKknB,cAAe,GA0C5B,CAKAhJ,OAAAA,GACIle,KAAKqQ,iBACLrQ,KAAK8mB,cAAgB9mB,KAAK8mB,aAAa5I,UACvCle,KAAK+mB,gBAAkB/mB,KAAK+mB,eAAe7I,UAC3Cle,KAAKunB,iBAAmB,KACxBvnB,KAAKwmB,iBAAiB7V,IAAI,eAAgB3Q,KAAKwnB,eAC/CxnB,KAAKwmB,iBAAiB7V,IAAI,qBAAsB3Q,KAAKonB,cAEjDpnB,KAAK2nB,iBACL3nB,KAAK2nB,gBAAgBC,aAGrB5nB,KAAK6nB,uBACL7nB,KAAK6nB,sBAAsBD,aAG3B5nB,KAAK8nB,iBAAmB9nB,KAAK8nB,gBAAgB7gB,aAC7CjH,KAAK8nB,gBAAgB7gB,WAAWC,YAAYlH,KAAK8nB,iBACjD9nB,KAAK8nB,gBAAkB,KACvB9nB,KAAK+nB,iBAAmB,KAEhC,CAEA5J,KAAAA,GACQne,KAAK2mB,QACL3mB,KAAK8mB,aAAa3I,QAEdne,KAAKgoB,iBACLhoB,KAAKgoB,gBAAgBC,UAAU,EAAG,EAAGjoB,KAAKkoB,eAAe3c,MAAOvL,KAAKkoB,eAAevS,QAGxF3V,KAAKmoB,2BAA4B,GAEjCnoB,KAAK4mB,SAASqB,UAAU,EAAG,EAAGjoB,KAAK4mB,SAASpR,OAAOjK,MAAOvL,KAAK4mB,SAASpR,OAAOG,OAEvF,CAEAyS,MAAAA,CAAOC,EAAcC,GAAe,YAAEhO,EAAW,qBAAErO,EAAoB,YAAEW,EAAW,WAAE8R,EAAU,MAAEnT,EAAK,iBAAEgd,EAAgB,OAAE5M,EAAM,aAAE6M,EAAY,wBAAEpF,IAC7I,IAAKpjB,KAAKknB,eAAiBlnB,KAAK4mB,WAAa5mB,KAAK0mB,QAE9C,YADApU,QAAQmW,KAAK,0FAIjB,IAAI7J,GAAe,EACfiB,EAAa,KACb6I,EAAaL,EAAajnB,KAiB9B,GAfuBinB,EAAajnB,MAAQinB,EAAajnB,KAAKxD,OAAS,GACjB,iBAAzByqB,EAAajnB,KAAK,KACxBlC,MAAMC,QAAQkpB,EAAajnB,KAAK,KAEjCinB,EAAaxI,aAC/B6I,EAAaL,EAAajnB,KAAKxC,KAAI2d,IAC/B,MAAMoM,EAASpM,EAAM8L,EAAatd,MAAQ,KACpC6d,EAASrM,EAAM8L,EAAard,MAAQ,KAI1C,MAAO,CAF8B,iBAAX2d,EAAsB,IAAIla,KAAKka,GAAUA,EAE/CC,EAAO,KAI/BP,EAAaxI,YAAcwI,EAAajnB,MAAQinB,EAAajnB,KAAKxD,OAAS,EAAG,CAC9E,IAAIqiB,EAEAA,EAD4B,QAA5BoI,EAAaxI,WACA,IAAIpR,KACyB,iBAA5B4Z,EAAaxI,WACd,IAAIpR,KAAK4Z,EAAaxI,YAEtBwI,EAAaxI,WAG9BA,EAAaI,aAAsBxR,KAAOwR,EAAWC,UAAYD,EAEjE,IAAK,IAAIviB,EAAI,EAAGA,EAAIgrB,EAAW9qB,OAAS,EAAGF,IAAK,CAC5C,MAAMmrB,EAAeH,EAAWhrB,GAC1BorB,EAAYJ,EAAWhrB,EAAI,GAE3B2iB,EAAcwI,EAAa,aAAcpa,KAAOoa,EAAa,GAAG3I,UAAY2I,EAAa,GACzFE,EAAWD,EAAU,aAAcra,KAAOqa,EAAU,GAAG5I,UAAY4I,EAAU,GAEnF,GAAIzI,GAAeR,GAAcA,GAAckJ,EAAU,CAErDnK,EAAclhB,GADKmiB,EAAaQ,IAAgB0I,EAAW1I,GAE3D,KACJ,CAAO,GAAIA,EAAcR,EAAY,CACjCjB,EAAclhB,EACd,KACJ,CACJ,EAEqB,IAAjBkhB,IACAA,EAAc8J,EAAW9qB,OAAS,EAE1C,CAEA,MAAMgiB,EAAsBA,CAACoJ,EAAcC,GAAsB,KAC7D,IAAKD,GAAgBV,GAAiBA,EAAcjR,UAAYpL,EAAsB,CAC7E0P,IACDA,EAAS0M,EAAa5c,KAAKyd,eAG/B,MAAMlP,EAAmB,IACnB,QAAE3C,EAAO,SAAEH,GAAaoR,EACxBa,EAAY9R,EAAQzZ,OAAS,EACnC,IAAIwrB,EAAgB,EACpB,MAAMC,EAAU,GAEhB,IAAK,IAAI1I,EAAS,EAAGA,EAAStJ,EAAQzZ,OAAQ+iB,IAC1C,GAAyB,IAArBzJ,EAASyJ,GAAe,CACxB,MAAM2I,EAAS3I,EAAStL,EACxB2E,EAAiBva,KAAK,CAAC6pB,EAAQjS,EAAQsJ,KAEnCA,EAASwI,IACTC,IACIC,EAAQzrB,OAAS,GAAGyrB,EAAQ5pB,KAAK,CAACkhB,SAAQ2I,SAAQpS,SAAUA,EAASyJ,KAEjF,CAGJ,OAAI3G,EAAiBpc,OAAS,GACnBgiB,GAAoB,EAAMqJ,GAG9BjP,CACX,CAEK2B,IACDA,EAAS0M,EAAa5c,KAAKyd,eAG/B,MAAMlP,EAAmB,GACzB,IAAI5Y,EAAOinB,EAAakB,gBAAgBnoB,KACpC4nB,IACA5nB,EAAOinB,EAAamB,aAGxB,IAAIC,EAAa9N,EAAOI,gBAAgBtN,KAAOkN,EAAOI,KAAKmE,UAAYvE,EAAOI,KAC1E2N,EAAa/N,EAAOG,gBAAgBrN,KAAOkN,EAAOG,KAAKoE,UAAYvE,EAAOG,KAE1E6N,GAAoB,EACpBC,EAAwB,KAE5B,IAAK,IAAIlsB,EAAI,EAAGA,EAAI0D,EAAKxD,OAAQF,IAAK,CAClC,IAAI+M,EAAGF,EAEP,GAAIrL,MAAMC,QAAQiC,EAAK1D,KAClB+M,EAAGF,GAAKnJ,EAAK1D,OACX,IAAuB,iBAAZ0D,EAAK1D,IAA+B,OAAZ0D,EAAK1D,GAI3C,SAHA+M,EAAIrJ,EAAK1D,GAAG2qB,EAAatd,MACzBR,EAAInJ,EAAK1D,GAAG2qB,EAAard,KAG7B,CAEA,GAAIT,QACA,SAGJ,IAAIoe,EAASle,aAAagE,KAAOhE,EAAEyV,UAAYzV,EAE/C,GAAIke,EAASc,EAAY,CACjBR,IACAW,EAAwB,CAACjB,EAAQpe,IAErC,QACJ,CAEA,GAAIoe,EAASe,EAAY,CACrB,IAAIT,GAAwBU,EAGxB,MAFAA,GAAoB,CAI5B,CAEA,MACML,GAAUX,EAASc,IAAeC,EAAaD,IADjCzpB,KAAK6pB,QAAQnT,YAAcrB,EACmC,GAAKA,EACjFyU,GAAU,GAAOvf,EAAIoR,EAAOrE,OAASqE,EAAOpE,KAAOoE,EAAOrE,OAAStX,KAAK6pB,QAAQlT,aAEtFqD,EAAiBva,KAAK,CAAC6pB,EAAQQ,GACnC,CAEA,GAAIF,GAAyBX,EAAqB,CAC9C,MAAOc,EAAcC,GAAWJ,EAE1BK,GAAgBF,EAAeN,IAAeC,EAAaD,IAD7CzpB,KAAK6pB,QAAQnT,YAAcrB,EAC+C,GAAKA,EAC7F6U,GAAgB,GAAOF,EAAUrO,EAAOrE,OAASqE,EAAOpE,KAAOoE,EAAOrE,OAAStX,KAAK6pB,QAAQlT,aAClGqD,EAAiBqB,QAAQ,CAAC4O,EAAcC,GAC5C,CAEA,OAAOlQ,CAAgB,EAwC3B,IAAImQ,EAEJ,GAHgD,QAA3B9B,EAAalc,WAAkD,SAA3Bkc,EAAalc,UAGpD,CACd,GAAInM,KAAK2mB,OAEL,YADArU,QAAQmW,KAAM,kBAAiBJ,EAAalc,mGAQhD,GAJKnM,KAAKinB,aACNjnB,KAAKinB,WAAajnB,KAAK0mB,QAAQG,WAAW,KAAM,CAAEuD,oBAAoB,MAGrEpqB,KAAKinB,WAEN,YADA3U,QAAQC,MAAM,8CAYlB,GARIvS,KAAK2mB,QACL3mB,KAAK4mB,SAASyD,QAGb1O,IACDA,EAAS0M,EAAa5c,MAAMyd,gBAG3BvN,EAED,YADArJ,QAAQC,MAAM,qCAIlB,MAAM+F,EAAkC,WAA3B+P,EAAa7b,UACtBxM,KAAK6pB,QAAQlT,cACZ,IAAQ0R,EAAa7b,WAAa,GAAKmP,EAAOrE,OAASqE,EAAOpE,KAAOoE,EAAOrE,OAAStX,KAAK6pB,QAAQlT,aAEvGwT,EAAkB,CACd1U,QAASzV,KAAKinB,WACdlpB,OAAOP,EAAAA,EAAAA,SAAS6qB,EAAatqB,MAAOsqB,EAAa/iB,MAAO+iB,EAAa1qB,yBACrE+Z,OAAQ1X,KAAK6pB,QACbvR,OACAC,eAAgB8P,EAAamB,YAAYc,MAAMC,GAAUA,EAAM,GAAK,IACpEne,cAAeic,EAAajc,cAC5BwL,UAAWyQ,EAAa/b,cACxBqL,UAAW0Q,EAAa9b,gBAGvB4d,EAAgB5R,cAAgB8P,EAAa3c,cAC9Cye,EAAgB5R,aAAe8P,EAAa3c,YAAY8e,MAAMjgB,GAAMA,EAAI,IAEhF,CAEA,GAA+B,QAA3B8d,EAAalc,UAAqB,CAClC,IAAIse,EAAY,IACTN,EACHO,YAAarC,EAAa5c,KAAKwB,OAAO0d,QAAQtC,GAC9CzM,gBAAiByM,EAAa5c,KAAKwB,OAAOrP,OAC1C8d,eAAgB8M,EAAa9M,eAC7BC,UAGJ,GAAI0M,EAAaxI,WAAY,CACzB4K,EAAU7L,YAAcA,EACxB6L,EAAUhQ,mBAA+C5c,IAA/BwqB,EAAa5N,cAA8B4N,EAAa5N,cAAgB,IAClGgQ,EAAU5L,aAAe6J,EACzB+B,EAAU9L,qBAAuBC,GAAe,EAEhD,MAAMgM,EAAY5qB,OAASA,KAAKwmB,iBAAiBqE,mBAC3C7qB,KAAKwmB,iBAAiBsE,QACrB9qB,KAAKwmB,iBAAiBuE,YAAc/qB,KAAKwmB,iBAAiBsE,QACjEL,EAAU/J,gBAAkBkK,CAChC,CAGA,YNhWG,SAAkB5Q,GAAkB,MAC/Cjc,EAAK,QAAE0X,EAAO,OAAEiC,EAAM,YAAEgT,EAAW,gBAAE9O,EAAe,KAAEtD,EAAI,aAAEC,EAAY,cAAEnM,EAAa,UAAEuL,EAAS,UAAEC,EAAS,eAAE8D,EAAc,OAAEC,EAAM,YAAEiD,EAAW,cAAEnE,EAAa,aAAEoE,EAAY,qBAAEF,EAAoB,gBAAE+B,IAEvM,IAAKjL,EAED,YADAnD,QAAQC,MAAM,sCAIlBkD,EAAQoC,YAAc9Z,EACtB0X,EAAQ+C,UAAYza,EAEpB,MAAM,SAACke,EAAQ,cAAED,GAAiBP,EAAa,CAAEC,iBAAgBC,SAAQjE,SAAQkE,oBAC3EoP,EAAYzS,EAAeD,EAAOZ,EAAOf,aAE/C,GAAIgI,QAAwC9gB,IAAhB+gB,GAA6BC,GA0E7D,SAA4B7E,GAAkB,MAC1Cjc,EAAK,QAAE0X,EAAO,OAAEiC,EAAM,YAAEgT,EAAW,gBAAE9O,EAAe,KAAEtD,EAAI,aAAEC,EAAY,cAAEnM,EAAa,UAAEuL,EAAS,UAAEC,EAAS,eAAE8D,EAAc,OAAEC,EAAM,YAAEiD,EAAW,cAAEnE,EAAa,aAAEoE,EAAY,gBAAE6B,EAAe,SAAEzE,EAAQ,cAAED,EAAa,UAAEgP,IAE3N,IAAInL,EACJ,GAA+B,iBAApBhB,EAAa,IAA8C,IAA3BA,EAAa,GAAGjhB,OAAc,CACrE,MAAMkiB,EAAYrG,KAAKsG,MAAMnB,GACvBoB,EAAWpB,EAAckB,EAE/B,GAAiB,IAAbE,GAAkBF,GAAajB,EAAajhB,OAAS,EAAG,CACxD,MAAMqiB,EAAapB,EAAapF,KAAKC,IAAIoG,EAAWjB,EAAajhB,OAAS,IAAI,GAC9EiiB,EAAaI,aAAsBxR,KAAOwR,EAAWC,UAAYD,CACrE,KAAO,CACH,MAAME,EAActB,EAAaiB,GAAW,GACtCM,EAAWvB,EAAaiB,EAAY,GAAG,GACvCO,EAAcF,aAAuB1R,KAAO0R,EAAYD,UAAYC,EAE1EN,EAAaQ,EAAcL,IADVI,aAAoB3R,KAAO2R,EAASF,UAAYE,GACfC,EACtD,CACJ,MACIR,EAAajB,EAGjB,IAAK,IAAIlhB,EAAI,EAAGA,EAAIsc,EAAiBpc,OAAQF,IAAK,CAC9C,MAAO+M,EAAGF,GAAKyP,EAAiBtc,GAEhC,IAAIutB,EAAWltB,EACXyd,GAAiB,EAErB,GAAI9d,EAAImhB,EAAajhB,OAAQ,CACzB,MAAMstB,EAAYrM,EAAanhB,GAE/B8d,GADkB0P,EAAU,aAAczc,KAAOyc,EAAU,GAAGhL,UAAYgL,EAAU,IACvDrL,EAEzBrE,IACAyP,GAAWntB,EAAAA,EAAAA,qBAAoBC,EAAO0c,GAE9C,CAEA,GAAIlC,EACA,GAAIhO,GAAK+N,EACL7C,EAAQ+C,UAAYyS,MACjB,CACH,MAAME,EAAW3P,GAAiB1d,EAAAA,EAAAA,qBAAoBsO,EAAeqO,GAAiBrO,EACtFqJ,EAAQ+C,UAAY2S,CACxB,MAEA1V,EAAQ+C,UAAYyS,EAGxBxV,EAAQ2V,SAAS3gB,EAAIuR,EAAgB,EAAIC,EAASyO,EAAangB,EAAG0R,EAAU+O,EAAUzgB,EAC1F,CAEIqN,GACAH,EAAauT,EAAW,CACpBvV,UAASiC,SAAQ3Z,QAAOua,OAAMX,YAAWC,aAGrD,CAlIQyT,CAAmBrR,EAAkB,CACjCjc,QAAO0X,UAASiC,SAAQgT,cAAa9O,kBAAiBtD,OAAMC,eAAcnM,gBAAeuL,YAAWC,YAAW8D,iBAAgBC,SAAQiD,cAAanE,gBAAeoE,eAAc6B,kBAAiBzE,WAAUD,gBAAegP,kBAFnO,CAOA,IAAK,IAAIttB,EAAI,EAAGA,EAAIsc,EAAiBpc,OAAQF,IAAK,CAC9C,MAAO+M,EAAGF,GAAKyP,EAAiBtc,GAE5B6a,IAEI9C,EAAQ+C,UADRjO,GAAK+N,EACeva,EAEAqO,GAI5BqJ,EAAQ2V,SAAS3gB,EAAIuR,EAAgB,EAAIC,EAASyO,EAAangB,EAAG0R,EAAU+O,EAAUzgB,EAC1F,CAEIqN,GACAH,EAAauT,EAAW,CACpBvV,UACAiC,SACA3Z,QACAua,OACAX,YACAC,aAvBR,CA0BJ,CMkTY0T,CAAS1L,GAAoB,GAAO6K,EAExC,CAEA,GAA+B,SAA3BpC,EAAalc,UAAsB,CACnC,IAAIof,EAAa,IACVpB,EACHle,qBAAmE,kBAAtCoc,EAAapc,qBAAqCoc,EAAapc,qBAAuBA,EACnHhN,SAAUopB,EAAappB,SACvBoN,iBAAkBgc,EAAahc,iBAC/BI,YAAa4b,EAAa5b,YAC1BP,gBAAiBmc,EAAanc,gBAC9BoO,cACA/O,MAAOA,GAAS8c,EAAa9c,OAASgd,EACtC3b,cACA8R,aACA0E,2BAGR,GAAIiF,EAAaxI,WAAY,CACzB0L,EAAW3M,YAAcA,EACzB2M,EAAW9Q,mBAA+C5c,IAA/BwqB,EAAa5N,cAA8B4N,EAAa5N,cAAgB,IACnG8Q,EAAW1M,aAAe6J,EAC1B6C,EAAW5M,qBAAuBC,GAAe,EACjD2M,EAAW/K,UAAYxgB,OAASA,KAAKwmB,iBAAiBqE,mBAEtD,MAAMD,EAAY5qB,OAASA,KAAKwmB,iBAAiBqE,mBAC3C7qB,KAAKwmB,iBAAiBsE,QACrB9qB,KAAKwmB,iBAAiBuE,YAAc/qB,KAAKwmB,iBAAiBsE,QACjES,EAAW7K,gBAAkBkK,CACjC,EP1XO,SACb5Q,EACAnD,GACA,MACE9Y,EAAK,QACL0X,EAAO,OACPiC,EAAM,KACNY,EAAI,aACJC,EAAY,SACZtZ,EAAQ,iBACRoN,EAAgB,UAChBsL,EAAS,UACTC,EAAS,qBACT3L,EAAoB,cACpBG,EAAa,YACbK,EAAW,gBACXP,EAAe,MACfX,EAAK,YACL+O,EAAW,YACX1N,EAAc,QAAO,WACrB8R,EAAa,EAAC,wBACd0E,EAAuB,YACvBxE,EAAW,cACXnE,EAAa,aACboE,EAAY,qBACZF,EAAoB,gBACpB+B,EAAe,UACfF,IAGF,IAAK/K,EAEH,YADAnD,QAAQC,MAAM,sCAQhB,GAJAkD,EAAQ+C,UAAYza,EACpB0X,EAAQ7I,YAAcA,EACtB6I,EAAQiJ,WAAaA,EAEjBzf,GAAYA,EAASrB,QAAU,EAAG,CACpC,MAAM6a,EAAiBhD,EAAQiD,qBAC7B,EACA,EACA,EACAhB,EAAOf,cAGT,IAAK,IAAIjZ,EAAI,EAAGA,EAAIuB,EAASrB,OAAQF,IAAK,CACxC,MAAM6L,EAAQtK,EAASvB,GACnBwB,MAAMC,QAAQoK,GAChBkP,EAAeE,aAAapP,EAAM,GAAIA,EAAM,IAE5CkP,EAAeE,aAAajb,GAAKuB,EAASrB,OAAS,GAAI2L,EAE3D,CAEAkM,EAAQ+C,UAAYC,EAEN,aAAV1a,IACF0X,EAAQoC,YAAcY,EAE1B,MACEhD,EAAQ+C,UAAYza,EAGtB,IAAKic,EAAiBpc,OACpB,OAIF,MAAMgb,EAAaL,EAAeD,EAAOZ,EAAOf,aAE1C6U,EAAuBjT,GAAgBlM,EACvCof,EAAY7U,EAAUC,EAAmB2U,EAAuB,CAAE1U,SAAUwB,QAASza,GACrFyb,EACJ8J,GAA2BxM,EAAUwM,EAAyBoI,EAAuB,CAAE1U,SAAUwB,QAASza,GAEtGwc,EAAYzD,EAAUC,EAAmB,CAC7CC,SAAUwB,IAGZ,GAAIqG,QAAwC9gB,IAAhB+gB,GAA6BC,GAyO3D,SACE7E,EACAyR,EACAnS,EACAe,GACA,MACEtc,EAAK,QACL0X,EAAO,OACPiC,EAAM,KACNY,EAAI,aACJC,EAAY,SACZtZ,EAAQ,UACR0Y,EAAS,UACTC,EAAS,qBACT3L,EAAoB,cACpBG,EAAa,YACbK,EAAW,MACXlB,EAAK,YACL+O,EAAW,YACX1N,EAAW,WACX8R,EAAU,wBACV0E,EAAuB,YACvBxE,EAAW,cACXnE,EAAa,aACboE,EAAY,gBACZ6B,EAAe,UACfF,IAGF,IAAIX,EAsBA6F,EAAWC,EArBf,GAA+B,iBAApB9G,EAAa,IAA8C,IAA3BA,EAAa,GAAGjhB,OAAc,CACvE,MAAMkiB,EAAYrG,KAAKsG,MAAMnB,GACvBoB,EAAWpB,EAAckB,EAE/B,GAAiB,IAAbE,GAAkBF,GAAajB,EAAajhB,OAAS,EAAG,CAC1D,MAAMqiB,EACJpB,EAAapF,KAAKC,IAAIoG,EAAWjB,EAAajhB,OAAS,IAAI,GAC7DiiB,EACEI,aAAsBxR,KAAOwR,EAAWC,UAAYD,CACxD,KAAO,CACL,MAAME,EAActB,EAAaiB,GAAW,GACtCM,EAAWvB,EAAaiB,EAAY,GAAG,GACvCO,EACJF,aAAuB1R,KAAO0R,EAAYD,UAAYC,EAExDN,EAAaQ,EAAcL,IADVI,aAAoB3R,KAAO2R,EAASF,UAAYE,GACfC,EACpD,CACF,MACER,EAAajB,EAIX4B,GAAaE,GACfgF,EAAYhF,EAAgB3E,gBAAgBtN,KAAOiS,EAAgB3E,KAAKmE,UAAYQ,EAAgB3E,KACpG4J,EAAWjF,EAAgB5E,gBAAgBrN,KAAOiS,EAAgB5E,KAAKoE,UAAYQ,EAAgB5E,OAEnG4J,EAAY7G,EAAa,GAAG,aAAcpQ,KAAOoQ,EAAa,GAAG,GAAGqB,UAAYrB,EAAa,GAAG,GAChG8G,EAAW9G,EAAaA,EAAajhB,OAAS,GAAG,aAAc6Q,KAC7DoQ,EAAaA,EAAajhB,OAAS,GAAG,GAAGsiB,UAAYrB,EAAaA,EAAajhB,OAAS,GAAG,IAG/F,MAAM4c,GAAaqF,EAAa6F,IAAcC,EAAWD,GAEzD,GAAIlL,EAAY,EACd,IAAK,IAAIkR,EAAQ,EAAGA,EAAQD,EAAU7tB,OAAQ8tB,IAI5CvT,EAHasT,EAAUC,GACApS,GAAmBA,EAAgBoS,GAEnB,CACrC3tB,QACA0X,UACAiC,SACAY,OACAC,eACAtZ,WACA0Y,YACAC,YACA0C,cACA1N,cACA8R,aACA0E,iCAGC,GAAI5I,EAAY,EAAG,CACxB,MAAMmR,EAAyB1sB,GAC3BD,EAAAA,EAAAA,+BAA8BC,EAAUwb,GACxC,KACJ,IAAK,IAAIiR,EAAQ,EAAGA,EAAQD,EAAU7tB,OAAQ8tB,IAI5CvT,EAHasT,EAAUC,GACApS,GAAmBA,EAAgBoS,GAEnB,CACrC3tB,OAAOD,EAAAA,EAAAA,qBAAoBC,EAAO0c,GAClChF,UACAiC,SACAY,OACAC,eACAtZ,SAAU0sB,EACVhU,YACAC,YACA0C,cACA1N,cACA8R,aACA0E,2BAGN,KAAO,CACL,GAAI5C,EAAW,CACb,IAAK,IAAIkL,EAAQ,EAAGA,EAAQD,EAAU7tB,OAAQ8tB,IAAS,CACrD,MAAMtT,EAAOqT,EAAUC,GACjBrT,EAAiBiB,GAAmBA,EAAgBoS,GAE1D,IAAKtT,EAAKxa,OACR,SAGF,MAAMguB,EAAoBpR,EAAYpC,EAAKxa,OACrCub,EAAaM,KAAKsG,MAAM6L,GACxB5L,EAAW4L,EAAoBzS,EAErC,IAAIC,EAAa,KACjB,GAAID,EAAaf,EAAKxa,OAAS,GAAKoiB,EAAW,EAAG,CAChD,MAAO/E,EAAIC,GAAM9C,EAAKe,IACfgC,EAAIC,GAAMhD,EAAKe,EAAa,GACnCC,EAAa,CAAC6B,EAAK+E,GAAY7E,EAAKF,GAAKC,EAAK8E,GAAY5E,EAAKF,GACjE,CAKA,GAFE/B,EAAa,GAAqB,IAAfA,GAAoB6G,EAAW,EAE/B,CACnB,MAAM6L,EAAgBzT,EAAK1Z,MAAM,EAAGya,EAAa,GAC7CC,GAAcD,EAAaf,EAAKxa,OAAS,GAC3CiuB,EAAcpsB,KAAK2Z,GAGrB,MAAM0S,EAA0BzT,EAC5BA,EAAe3Z,MAAM,EAAGya,EAAa,GACrC,KACJ,GACEC,GACA0S,GACA3S,EAAad,EAAeza,OAAS,EACrC,CACA,MAAMmuB,EAAmB,CAAC3S,EAAW,GAAId,GACzCwT,EAAwBrsB,KAAKssB,EAC/B,CAEA,MAAMJ,EAAyB1sB,GAC3BD,EAAAA,EAAAA,+BAA8BC,EAAUwb,GACxC,KACJtC,EAAiB0T,EAAeC,EAAyB,CACvD/tB,OAAOD,EAAAA,EAAAA,qBAAoBC,EAAO0c,GAClChF,UACAiC,SACAY,OACAC,eACAtZ,SAAU0sB,EACVhU,YACAC,YACA0C,cACA1N,cACA8R,aACA0E,2BAEJ,CAMA,GAHEjK,EAAaf,EAAKxa,OAAS,GAC1Bub,IAAef,EAAKxa,OAAS,GAAkB,IAAboiB,EAEf,CACpB,MAAMgM,EAAiB,GACnB5S,GAAcD,EAAaf,EAAKxa,OAAS,GAC3CouB,EAAevsB,KAAK2Z,GAEtB4S,EAAevsB,QAAQ2Y,EAAK1Z,MAAMya,EAAa,IAE/C,MAAM8S,EAA2B,GACjC,GACE7S,GACAf,GACAc,EAAad,EAAeza,OAAS,EACrC,CACA,MAAMmuB,EAAmB,CAAC3S,EAAW,GAAId,GACzC2T,EAAyBxsB,KAAKssB,EAChC,CACI1T,GACF4T,EAAyBxsB,QACpB4Y,EAAe3Z,MAAMya,EAAa,IAIzChB,EACE6T,EACAC,EAAyBruB,OAASquB,EAA2B,KAC7D,CACEluB,QACA0X,UACAiC,SACAY,OACAC,eACAtZ,WACA0Y,YACAC,YACA0C,cACA1N,cACA8R,aACA0E,2BAGN,CACF,CAEI/I,GAAaA,EAAUzc,OAAS,GAClC2c,EAAoBF,EAAWG,EAAW,CACxCzc,QACA0X,UACA8C,eACAnM,gBACAkM,OACA/M,QACA+O,cACAG,kBAKFxO,GACA+N,GACAA,EAAiBpc,OAAS,GAE1B2d,EAA4BvB,EAAkBQ,EAAW,CACvDzc,QACA0X,UACArJ,gBACAmM,eACAD,OACAX,YACAlL,cACAgO,iBAGN,MACE,GAAKiG,EAoBE,CACL,MAAMD,EACJC,EAAgB3E,gBAAgBtN,KAC5BiS,EAAgB3E,KAAKmE,UACrBQ,EAAgB3E,KAChB8E,EACJH,EAAgB5E,gBAAgBrN,KAC5BiS,EAAgB5E,KAAKoE,UACrBQ,EAAgB5E,KAEtB,GAAI+D,EAAaY,EAEf,IAAK,IAAIiL,EAAQ,EAAGA,EAAQD,EAAU7tB,OAAQ8tB,IAI5CvT,EAHasT,EAAUC,GACApS,GAAmBA,EAAgBoS,GAEnB,CACrC3tB,QACA0X,UACAiC,SACAY,OACAC,eACAtZ,WACA0Y,YACAC,YACA0C,cACA1N,cACA8R,aACA0E,iCAGC,GAAIvD,EAAagB,EAAgB,CAEtC,MAAM8K,EAAyB1sB,GAC3BD,EAAAA,EAAAA,+BAA8BC,EAAUwb,GACxC,KACJ,IAAK,IAAIiR,EAAQ,EAAGA,EAAQD,EAAU7tB,OAAQ8tB,IAI5CvT,EAHasT,EAAUC,GACApS,GAAmBA,EAAgBoS,GAEnB,CACrC3tB,OAAOD,EAAAA,EAAAA,qBAAoBC,EAAO0c,GAClChF,UACAiC,SACAY,OACAC,eACAtZ,SAAU0sB,EACVhU,YACAC,YACA0C,cACA1N,cACA8R,aACA0E,2BAGN,KAAO,CAEL,MAAM8I,GACHrM,EAAaY,IAAmBI,EAAiBJ,GAEpD,IAAK,IAAIiL,EAAQ,EAAGA,EAAQD,EAAU7tB,OAAQ8tB,IAAS,CACrD,MAAMtT,EAAOqT,EAAUC,GACjBrT,EAAiBiB,GAAmBA,EAAgBoS,GAE1D,IAAKtT,EAAKxa,OACR,SAGF,MAAMguB,EAAoBM,EAAmB9T,EAAKxa,OAC5Cub,EAAaM,KAAKsG,MAAM6L,GACxB5L,EAAW4L,EAAoBzS,EAGrC,IAAIC,EAAa,KACjB,GAAID,EAAaf,EAAKxa,OAAS,GAAKoiB,EAAW,EAAG,CAChD,MAAO/E,EAAIC,GAAM9C,EAAKe,IACfgC,EAAIC,GAAMhD,EAAKe,EAAa,GACnCC,EAAa,CACX6B,EAAK+E,GAAY7E,EAAKF,GACtBC,EAAK8E,GAAY5E,EAAKF,GAE1B,EAIE/B,EAAa,GAAqB,IAAfA,GAAoB6G,EAAW,IAGlD9G,EACEd,EACAC,EACAc,EACAC,GACA,EACA,CACErb,OAAOD,EAAAA,EAAAA,qBAAoBC,EAAO0c,GAClChF,UACAiC,SACAY,OACAC,eACAtZ,WACAqa,oBAMmBH,EAAaf,EAAKxa,OAAS,GAGlDsb,EACEd,EACAC,EACAc,EACAC,GACA,EACA,CACErb,QACA0X,UACAiC,SACAY,OACAC,eACAtZ,WACAqa,mBAIR,CACF,CACF,MApJE,IAAK,IAAIoS,EAAQ,EAAGA,EAAQD,EAAU7tB,OAAQ8tB,IAI5CvT,EAHasT,EAAUC,GACApS,GAAmBA,EAAgBoS,GAEnB,CACrC3tB,QACA0X,UACAiC,SACAY,OACAC,eACAtZ,WACA0Y,YACAC,YACA0C,cACA1N,cACA8R,aACA0E,4BAwIR,GAAI5I,GAAa,GAAKA,GAAa,IAAMgG,EACvC,GAAIE,EAAiB,CACnB,MAAMD,EACJC,EAAgB3E,gBAAgBtN,KAC5BiS,EAAgB3E,KAAKmE,UACrBQ,EAAgB3E,KAChB8E,EACJH,EAAgB5E,gBAAgBrN,KAC5BiS,EAAgB5E,KAAKoE,UACrBQ,EAAgB5E,KAGlB+D,EAAaY,EAEfrG,EAAkBC,EAAW,CAC3Btc,QACA0X,UACA8C,eACAnM,gBACAb,QACA+O,gBAEOuF,EAAagB,EAMtBzG,EAAkBC,EAAW,CAC3Btc,OALmBD,EAAAA,EAAAA,qBAAoBC,EAAO0c,GAM9ChF,UACA8C,eACAnM,cAP2BA,GACzBtO,EAAAA,EAAAA,qBAAoBsO,EAAeqO,GACnCrO,EAMFb,QACA+O,gBAMFC,EAAoBF,GADjBwF,EAAaY,IAAmBI,EAAiBJ,GACH,CAC/C1iB,QACA0X,UACA8C,eACAnM,gBACAkM,OACA/M,QACA+O,cACAG,iBAGN,MAEEL,EAAkBC,EAAW,CAC3Btc,QACA0X,UACA8C,eACAnM,gBACAb,QACA+O,qBAGMkG,GAEVpG,EAAkBC,EAAW,CAC3Btc,QACA0X,UACA8C,eACAnM,gBACAb,QACA+O,gBAiBJ,GAZI1C,GAEFH,EADmBc,EAAeD,EAAOZ,EAAOf,aACvB,CACvBlB,UACAiC,SACA3Z,QACAua,OACAX,YACAC,cAIA3L,IAAyBuU,EAC3B,GAAIhG,GAAa,GAAKA,GAAa,EACjC,GAAIkG,EAAiB,CACnB,MAAMD,EACJC,EAAgB3E,gBAAgBtN,KAC5BiS,EAAgB3E,KAAKmE,UACrBQ,EAAgB3E,KAChB8E,EACJH,EAAgB5E,gBAAgBrN,KAC5BiS,EAAgB5E,KAAKoE,UACrBQ,EAAgB5E,KAGlB+D,EAAaY,EAEf1G,EAAmBC,EAAkB,CACnCjc,QACA0X,UACArJ,gBACAmM,eACAD,OACAX,YACAlL,gBAEOoT,EAAagB,EAStB9G,EAAmBC,EAAkB,CACnCjc,OARmBD,EAAAA,EAAAA,qBAAoBC,EAAO0c,GAS9ChF,UACArJ,cAT2BA,GACzBtO,EAAAA,EAAAA,qBAAoBsO,EAAeqO,GACnCrO,EAQFmM,eACAD,OACAX,UATuBA,GACrB7Z,EAAAA,EAAAA,qBAAoB6Z,EAAW8C,GAC/B9C,EAQFlL,gBAMF8O,EAA4BvB,GADzB6F,EAAaY,IAAmBI,EAAiBJ,GACY,CAC9D1iB,QACA0X,UACArJ,gBACAmM,eACAD,OACAX,YACAlL,cACAgO,iBAGN,MAEEV,EAAmBC,EAAkB,CACnCjc,QACA0X,UACArJ,gBACAmM,eACAD,OACAX,YACAlL,qBAKJsN,EAAmBC,EAAkB,CACnCjc,QACA0X,UACArJ,gBACAmM,eACAD,OACAX,YACAlL,eAIR,CACF,CA/xBI0f,CACEnS,EACAyR,EACAnS,EACAe,EACA,CACEtc,QACA0X,UACAiC,SACAY,OACAC,eACAtZ,WACA0Y,YACAC,YACA3L,uBACAG,gBACAK,cACAlB,QACA+O,cACA1N,cACA8R,aACA0E,0BACAxE,cACAnE,gBACAoE,eACA6B,kBACAF,kBA3BN,CAiCA,IAAK,IAAIkL,EAAQ,EAAGA,EAAQD,EAAU7tB,OAAQ8tB,IAAS,CACrD,MAAMtT,EAAOqT,EAAUC,GACjBrT,EAAiBiB,GAAmBA,EAAgBoS,GAG1D,IAAIU,GAAa,EACjB,GAAI7T,GAAgBlM,GAAoB+L,EAAKxa,OAAS,EAAG,CAEvD,IAAIyuB,EAAO,EACX,IAAK,IAAI3uB,EAAI,EAAGA,EAAI0a,EAAKxa,OAAQF,IAC/B2uB,GAAQjU,EAAK1a,GAAG,GAGlB0uB,EADaC,EAAOjU,EAAKxa,QACJ0a,CACvB,CAGA,GAAIC,GAAgBlM,EAClB,GAAI+f,EAEF,GAAIntB,GAAYA,EAASrB,QAAU,EAAG,CACpC,MAAM6a,GAAiBhD,EAAQiD,qBAAqB,EAAG,EAAG,EAAGhB,EAAOf,cACpE,IAAK,IAAIjZ,GAAI,EAAGA,GAAIuB,EAASrB,OAAQF,KAAK,CACxC,MAAM6L,GAAQtK,EAASvB,IACnBwB,MAAMC,QAAQoK,IAChBkP,GAAeE,aAAapP,GAAM,GAAIA,GAAM,IAE5CkP,GAAeE,aAAajb,IAAKuB,EAASrB,OAAS,GAAI2L,GAE3D,CACAkM,EAAQ+C,UAAYC,EACtB,MACEhD,EAAQ+C,UAAYza,OAItB,GAAIsO,EAAiBzO,QAAU,EAAG,CAChC,MAAM0uB,GAAc7W,EAAQiD,qBAAqB,EAAG,EAAG,EAAGhB,EAAOf,cACjE,IAAK,IAAIjZ,GAAI,EAAGA,GAAI2O,EAAiBzO,OAAQF,KAAK,CAChD,MAAM6L,GAAQ8C,EAAiB3O,IAC3BwB,MAAMC,QAAQoK,IAChB+iB,GAAY3T,aAAapP,GAAM,GAAIA,GAAM,IAEzC+iB,GAAY3T,aAAajb,IAAK2O,EAAiBzO,OAAS,GAAI2L,GAEhE,CACAkM,EAAQ+C,UAAY8T,EACtB,MACE7W,EAAQ+C,UAAYpM,GAAiBrO,EAK3C0X,EAAQsC,YAER,MAAOc,EAAQC,GAAWV,EAAK,IACxBW,EAAOC,GAAUZ,EAAKA,EAAKxa,OAAS,GAEtC0b,GACH7D,EAAQuC,OAAOa,EAAQD,GAGzB,IAAK,IAAIlb,GAAI,EAAGA,GAAI0a,EAAKxa,OAAQF,KAAK,CACpC,MAAO+M,GAAGF,IAAK6N,EAAK1a,IACpB+X,EAAQwC,OAAOxN,GAAGF,GACpB,CAEA,GAAI8N,GAAkBA,EAAeza,OAAQ,CAC3C,IAAK,IAAIF,GAAI2a,EAAeza,OAAS,EAAGF,IAAK,EAAGA,KAAK,CACnD,MAAO+M,GAAGF,IAAK8N,EAAe3a,IAC9B+X,EAAQwC,OAAOxN,GAAGF,GACpB,CAEAkL,EAAQwC,UAAUG,EAAK,GACzB,MACE3C,EAAQwC,OAAOc,EAAOH,GAGxBnD,EAAQwD,MACV,CAEIqB,IACF/O,GAAS,GAGXA,GAAS8J,EACTI,EAAQoC,YAAc9Z,EACtB0X,EAAQqC,UAAYvM,EAEpB,IAAK,IAAI6M,MAAQiC,EACf,GAAKjC,GAAKxa,OAAV,CAIA,GAAI2a,GAAgBnM,EAAe,CACjC,IAAImgB,IAAW,EAEbA,GADEnU,GAAKxa,QAAU,EACNwa,GAAK,GAAG,IAAME,EAEdF,GAAK,GAAG,IAAME,EAIzB7C,EAAQoC,YADN0U,GACoBxuB,EAEAqO,CAE1B,MACEqJ,EAAQoC,YAAc9Z,EAGxB0X,EAAQsC,YAER,IAAK,IAAIra,GAAI,EAAGA,GAAI0a,GAAKxa,OAAQF,KAAK,CACpC,MAAO+M,GAAGF,IAAK6N,GAAK1a,IAEV,IAANA,GACF+X,EAAQuC,OAAOvN,GAAGF,IAElBkL,EAAQwC,OAAOxN,GAAGF,GAEtB,CAEAkL,EAAQyC,QA/BR,CA6CF,GAXIN,GACFH,EAAamB,EAAY,CACvBnD,UACAiC,SACA3Z,QACAua,OACAX,YACAC,cAIA3L,IAAyB0S,EAAsB,CAEjD,SAASxC,GAAkBC,EAAQC,GACjC,IAAKA,GAAcD,EAAOxe,QAAU,EAChC,OAAOwe,EAGX,MAAME,EAAe,GACrB,IAAIvD,GAAQ,IAEZ,IAAK,MAAMwD,KAASH,EAAQ,CACxB,MAAO3R,GAAK8R,EACR9R,EAAIsO,GAASsD,IACbC,EAAa7c,KAAK8c,GAClBxD,EAAQtO,EAEhB,CAEA,OAAO6R,CACT,CAEA,MAAMkQ,GAAiBrQ,GAAkBnC,EAAkB9N,GAC3D,IAAK,IAAKzB,GAAGF,MAAMiiB,GAAgB,CAEjC,IAAIvS,GAAalc,EACbqO,GAAiBmM,IAEjB0B,GADE1P,KAAM+N,GAAQX,EACHA,EACJpN,GAAI+N,EACAva,EAEAqO,GAIjBqJ,EAAQ+C,UAAYyB,GACpBxE,EAAQsC,YACRtC,EAAQyE,IAAIzP,GAAGF,GAAGkC,GAAe,EAAG,EAAG,EAAIgN,KAAKU,IAAI,GACpD1E,EAAQwD,MACV,CACF,CAnLA,CAoLF,COwFYwT,CAAS7M,GAAoB,GAAO0I,EAAeiD,EACvD,CAEA,GAA+B,WAA3BlD,EAAalc,UAAwB,CACrC,IAAKnM,KAAK2mB,SAAW3mB,KAAK+mB,eAMtB,YALAzU,QAAQmW,KAAK,kFAAmF,CAC5FpC,QAASrmB,KAAK2mB,OACd+F,gBAAiB1sB,KAAK+mB,eACtBpU,UAAW3S,KAAK+mB,gBAAgBzT,WAKxC,IAAKtT,KAAK+mB,eAAezT,SAErB,YADAhB,QAAQC,MAAM,4CAIlB,IAAK+V,EAED,YADAhW,QAAQC,MAAM,8CAQlB,GAJKoJ,IACDA,EAAS0M,EAAa5c,MAAMyd,gBAG3BvN,EAED,YADArJ,QAAQC,MAAM,4CAIlB,IAAI+F,EAEAA,EAD2B,WAA3B+P,EAAa7b,UACNxM,KAAK6pB,QAAQlT,kBACc9Y,IAA3BwqB,EAAa7b,WACZ,GAAQ6b,EAAa7b,UAAamP,EAAOrE,OAASqE,EAAOpE,KAAOoE,EAAOrE,OAAStX,KAAK6pB,QAAQlT,aAEjGgF,EAAOrE,MAAQ,GAAKqE,EAAOpE,MAAQ,GAC3B,GAAO,EAAIoE,EAAOrE,OAASqE,EAAOpE,KAAOoE,EAAOrE,OAAStX,KAAK6pB,QAAQlT,aAEvE3W,KAAK6pB,QAAQlT,aAI5B,MAAMgW,GAAiB3sB,KAAK4sB,aACxBjR,EAAOrE,OAAStX,KAAK4sB,YAAYtV,MACjCqE,EAAOpE,OAASvX,KAAK4sB,YAAYrV,MACjCvX,KAAK6pB,QAAQlT,eAAiB3W,KAAK6sB,kBAEvC7sB,KAAK4sB,YAAc,IAAIjR,GACvB3b,KAAK6sB,kBAAoB7sB,KAAK6pB,QAAQlT,aAElCgW,GAAiB3sB,KAAK8sB,mBACtB9sB,KAAK8sB,iBAAmB,MAGxBxU,EAAmC,IAA5BtY,KAAK6pB,QAAQlT,aACpB2B,EAAOtY,KAAK6pB,QAAQlT,aACb2B,EAAoC,IAA5BtY,KAAK6pB,QAAQlT,eAC5B2B,EAAO,GAGX,MAAM1L,GAAcpP,EAAAA,EAAAA,SAAS6qB,EAAatqB,MAAOsqB,EAAa/iB,MAAO+iB,EAAa1qB,yBAC5E4a,IAAiB8P,EAAamB,YAAYc,MAAMC,GAAUA,EAAM,GAAK,IAC3E,IAAIwC,EAAe,CACfhvB,MAAO6O,EACP3N,SAAUopB,EAAappB,WAAYK,EAAAA,EAAAA,uBAAsBsN,GACzDP,iBAAkBgc,EAAahc,iBAC/BkM,eACAD,OACAZ,OAAQ1X,KAAK6pB,QACbzG,2BAGJ,GAAIiF,EAAaxI,WAAY,CACzBkN,EAAanO,YAAcA,EAC3BmO,EAAatS,mBAA+C5c,IAA/BwqB,EAAa5N,cAA8B4N,EAAa5N,cAAgB,IACrGsS,EAAalO,aAAe6J,EAC5BqE,EAAapO,qBAAuBC,GAAe,EACnDmO,EAAavM,UAAYxgB,OAASA,KAAKwmB,iBAAiBqE,mBAExD,MAAMD,EAAY5qB,OAASA,KAAKwmB,iBAAiBqE,mBAC3C7qB,KAAKwmB,iBAAiBsE,QACrB9qB,KAAKwmB,iBAAiBuE,YAAc/qB,KAAKwmB,iBAAiBsE,QACjEiC,EAAarM,gBAAkBkK,GAAajP,CAChD,CAIA,GAFA3b,KAAK+mB,eAAelT,KAAK+L,GAAoB,GAAO,GAAOmN,GAEvD/sB,KAAK2mB,OAAQ,CACb,MAAM/U,EAAK5R,KAAK4mB,SAChBhV,EAAGoU,QAAQpU,EAAGmD,OACdnD,EAAGkD,OAAOlD,EAAGmD,OACbnD,EAAGoD,UAAUpD,EAAGqD,UAAWrD,EAAGsD,oBAClC,CAEImT,EAAa/b,eAAiB+b,EAAa/b,cAAgB,IACvDtM,KAAKinB,YACLjnB,KAAKinB,WAAW+F,OAChBhtB,KAAKinB,WAAWpP,YAAcwQ,EAAa9b,gBAAiB/O,EAAAA,EAAAA,SAAS6qB,EAAatqB,MAAOsqB,EAAa/iB,MAAO+iB,EAAa1qB,yBAC1HqC,KAAKinB,WAAWnP,UAAYuQ,EAAa/b,cACzCtM,KAAKinB,WAAWgG,yBAA2B,cAE3CjtB,KAAKinB,WAAWlP,YAChB/X,KAAKinB,WAAWjP,OAAO,EAAGM,GAC1BtY,KAAKinB,WAAWhP,OAAOjY,KAAK6pB,QAAQnT,YAAa4B,GACjDtY,KAAKinB,WAAW/O,SAChBlY,KAAKinB,WAAWiG,YAEXltB,KAAK8nB,kBACN9nB,KAAK8nB,gBAAkB/hB,SAASS,cAAc,UAC9CxG,KAAK8nB,gBAAgBliB,MAAMvG,SAAW,WACtCW,KAAK8nB,gBAAgBliB,MAAMunB,IAAM,IACjCntB,KAAK8nB,gBAAgBliB,MAAMwnB,KAAO,IAClCptB,KAAK8nB,gBAAgBliB,MAAMynB,cAAgB,OAC3CrtB,KAAK+nB,iBAAmB/nB,KAAK8nB,gBAAgBjB,WAAW,MACxD7mB,KAAK0mB,QAAQzf,WAAWqmB,aAAattB,KAAK8nB,gBAAiB9nB,KAAK0mB,QAAQ6G,cAG5EvtB,KAAK8nB,gBAAgBvc,MAAQvL,KAAK0mB,QAAQnb,MAC1CvL,KAAK8nB,gBAAgBnS,OAAS3V,KAAK0mB,QAAQ/Q,OAC3C3V,KAAK8nB,gBAAgBliB,MAAM2F,MAAQvL,KAAK0mB,QAAQ9gB,MAAM2F,MACtDvL,KAAK8nB,gBAAgBliB,MAAM+P,OAAS3V,KAAK0mB,QAAQ9gB,MAAM+P,OAEvD3V,KAAK+nB,iBAAiBE,UAAU,EAAG,EAAGjoB,KAAK8nB,gBAAgBvc,MAAOvL,KAAK8nB,gBAAgBnS,QACvF3V,KAAK+nB,iBAAiBlQ,YAAcwQ,EAAa9b,gBAAiB/O,EAAAA,EAAAA,SAAS6qB,EAAatqB,MAAOsqB,EAAa/iB,MAAO+iB,EAAa1qB,yBAChIqC,KAAK+nB,iBAAiBjQ,UAAYuQ,EAAa/b,cAE/CtM,KAAK+nB,iBAAiBhQ,YACtB/X,KAAK+nB,iBAAiB/P,OAAO,EAAGM,GAChCtY,KAAK+nB,iBAAiB9P,OAAOjY,KAAK6pB,QAAQnT,YAAa4B,GACvDtY,KAAK+nB,iBAAiB7P,UAGlC,CAEA,MACMsV,IADextB,OAASA,KAAKwmB,iBAAiBqE,sBAGA,kBAAtCxC,EAAapc,qBAAqCoc,EAAapc,qBAAuBA,GAMpG,IAAIqM,EAJCqD,IACDA,EAAS0M,EAAa5c,MAAMyd,eAAiBV,GAK7ClQ,EAD2B,WAA3B+P,EAAa7b,UACNxM,KAAK6pB,QAAQlT,kBACc9Y,IAA3BwqB,EAAa7b,WAA2BmP,GACvC,GAAQ0M,EAAa7b,UAAamP,EAAOrE,OAASqE,EAAOpE,KAAOoE,EAAOrE,OAAStX,KAAK6pB,QAAQlT,aAC9FgF,GACHA,EAAOrE,MAAQ,GAAKqE,EAAOpE,MAAQ,GAC3B,GAAO,EAAIoE,EAAOrE,OAASqE,EAAOpE,KAAOoE,EAAOrE,OAAStX,KAAK6pB,QAAQlT,aAK3E3W,KAAK6pB,QAAQlT,aAExB,MAAM4B,IAAiB8P,EAAamB,YAAYc,MAAMC,GAAUA,EAAM,GAAK,IAI3E,IAAIkD,EAAcztB,KAAK4mB,SAEvB,GAAI5mB,KAAK2mB,QAAqC,WAA3B0B,EAAalc,UAEvBnM,KAAKkoB,iBACNloB,KAAKkoB,eAAiBniB,SAASS,cAAc,UAC7CxG,KAAKkoB,eAAetiB,MAAMvG,SAAW,WACrCW,KAAKkoB,eAAetiB,MAAMunB,IAAM,IAChCntB,KAAKkoB,eAAetiB,MAAMwnB,KAAO,IACjCptB,KAAKkoB,eAAetiB,MAAMynB,cAAgB,OAC1CrtB,KAAKgoB,gBAAkBhoB,KAAKkoB,eAAerB,WAAW,MACtD7mB,KAAK0mB,QAAQzf,WAAWqmB,aAAattB,KAAKkoB,eAAgBloB,KAAK0mB,QAAQ6G,cAItEvtB,KAAKmoB,4BACNnoB,KAAKkoB,eAAe3c,MAAQvL,KAAK0mB,QAAQnb,MACzCvL,KAAKkoB,eAAevS,OAAS3V,KAAK0mB,QAAQ/Q,OAC1C3V,KAAKkoB,eAAetiB,MAAM2F,MAAQvL,KAAK0mB,QAAQ9gB,MAAM2F,MACrDvL,KAAKkoB,eAAetiB,MAAM+P,OAAS3V,KAAK0mB,QAAQ9gB,MAAM+P,OACtD3V,KAAKmoB,2BAA4B,GAErCsF,EAAcztB,KAAKgoB,qBAChB,GAAIhoB,KAAKinB,WAEZwG,EAAcztB,KAAKinB,gBAChB,GAAIjnB,KAAK2mB,OAAQ,CAGpB,GADArU,QAAQmW,KAAK,wDACRzoB,KAAK0tB,iBAAkB,CACxB,MAAMC,EAAiB5nB,SAASS,cAAc,UAC9CmnB,EAAepiB,MAAQvL,KAAK0mB,QAAQnb,MACpCoiB,EAAehY,OAAS3V,KAAK0mB,QAAQ/Q,OACrC3V,KAAK0tB,iBAAmBC,EAAe9G,WAAW,KACtD,CACA4G,EAAcztB,KAAK0tB,gBACvB,CAEA,MAAME,EAAa,CACf7vB,OAAOP,EAAAA,EAAAA,SAAS6qB,EAAatqB,MAAOsqB,EAAa/iB,MAAO+iB,EAAa1qB,yBACrE8X,QAASgY,EACTliB,MAAOA,GAAS8c,EAAa9c,OAASgd,EACtC3b,cACA8R,aACArT,OAAQgd,EAAahd,OACrBC,YAAa+c,EAAa/c,YAC1BgP,cACArO,qBAAsBuhB,EACtB/gB,YAAa4b,EAAa5b,YAC1BP,gBAAiBmc,EAAanc,gBAC9B0T,sBACAiO,UAAWxF,EAAaxb,SAnWVghB,KACTlS,IACDA,EAAS0M,EAAa5c,KAAKyd,eAG1Bb,EAAaxb,SAKG,YADAqE,EAAUmX,EAAc,CAAElX,eAAe,IAEnD,IAGHkX,EAAajX,YAAciX,EAAajnB,MAAMxC,KAAKgE,IACvD,MAAMkrB,EAAQlrB,EAAOylB,EAAaxb,UAElC,IAAKihB,EACD,OAAO,KAGX,MAAMpU,EAAMoU,EAAMpU,IACZI,EAAMgU,EAAMhU,IACZrP,EAAI7H,EAAOylB,EAAatd,MAE9B,MAAO,CACHN,IACAqjB,QAEAnN,QAASlW,EAAIkR,EAAOI,OAASJ,EAAOG,KAAOH,EAAOI,MAAQ/b,KAAK6pB,QAAQnT,YACvEqX,UAA0B,iBAARrU,GAAoB,GAAOA,EAAMiC,EAAOrE,OAASqE,EAAOpE,KAAOoE,EAAOrE,OAAStX,KAAK6pB,QAAQlT,aAAe,KAC7HqX,UAA0B,iBAARlU,GAAoB,GAAOA,EAAM6B,EAAOrE,OAASqE,EAAOpE,KAAOoE,EAAOrE,OAAStX,KAAK6pB,QAAQlT,aAAe,KAChI,IA1BM,IA6VoC,KAC/CxK,UAAWkc,EAAalc,UACxBC,cAAeic,EAAajc,cAC5BmM,eACAD,OACAX,UAAW0Q,EAAa9b,eAG5B,GAAIvM,KAAK2mB,QAAqC,WAA3B0B,EAAalc,WAA0Bkc,EAAaxI,aAAetU,EAAQ,GAAKiiB,GAA6B,CAC5HI,EAAWhP,YAAcA,EACzBgP,EAAWnT,mBAA+C5c,IAA/BwqB,EAAa5N,cAA8B4N,EAAa5N,cAAgB,IACnGmT,EAAW/O,aAAe6J,EAC1BkF,EAAWjP,qBAAuBC,GAAe,EAEjD,MAAMgM,EAAY5qB,OAASA,KAAKwmB,iBAAiBqE,mBAC3C7qB,KAAKwmB,iBAAiBsE,QACrB9qB,KAAKwmB,iBAAiBuE,YAAc/qB,KAAKwmB,iBAAiBsE,QACjE8C,EAAWlN,gBAAkBkK,GAAajP,EAC1CiS,EAAW1E,cAAgBvN,CAC/B,CAGA,GAAK2M,EAAL,CAKA,GAAID,EAAaxI,WAAY,CACzB+N,EAAWhP,YAAcA,EACzBgP,EAAWnT,mBAA+C5c,IAA/BwqB,EAAa5N,cAA8B4N,EAAa5N,cAAgB,IACnGmT,EAAW/O,aAAe6J,EAC1BkF,EAAWjP,qBAAuBC,GAAe,EACjDgP,EAAW1E,cAAgBvN,EAC3BiS,EAAWpN,UAAYxgB,OAASA,KAAKwmB,iBAAiBqE,mBAEtD,MAAMD,EAAY5qB,OAASA,KAAKwmB,iBAAiBqE,mBAC3C7qB,KAAKwmB,iBAAiBsE,QACrB9qB,KAAKwmB,iBAAiBuE,YAAc/qB,KAAKwmB,iBAAiBsE,QACjE8C,EAAWlN,gBAAkBkK,GAAajP,CAC9C,CAKI3b,KAAK2mB,QAAqC,WAA3B0B,EAAalc,UAC5BnM,KAAK8mB,aAAajT,KAAKyU,EAAesF,GLnoBnC,SAAkB/W,GAAmB,MAChD9Y,EAAK,MAAEwN,EAAM,EAAC,QAAEkK,EAAO,YAAE7I,EAAY,QAAO,WAAE8R,EAAW,EAAC,OAAErT,GAAO,EAAK,YAAEC,EAAY,KAAI,YAAEgP,GAAY,EAAK,qBAAErO,GAAqB,EAAK,YAAEQ,EAAW,gBAAEP,EAAe,oBAAE0T,EAAmB,UAAEiO,EAAS,YAAEjP,EAAW,cAAEnE,EAAa,aAAEoE,EAAY,qBAAEF,EAAoB,cAAEuK,EAAa,gBAAExI,EAAe,UAAEvU,EAAS,UAAEqU,EAAS,cAAEpU,EAAa,aAAEmM,EAAY,KAAED,EAAI,UAAEX,IAElW,IAAKlC,EAED,YADAnD,QAAQC,MAAM,sCAIlB,IAAKkD,EAAQwY,YAET,YADA3b,QAAQC,MAAM,4DAId+H,IACA/O,GAAS,GAEbA,GAAS8J,EAETI,EAAQoC,YAAc9Z,EACtB0X,EAAQqC,UAAYvM,EACpBkK,EAAQ7I,YAAcA,EACtB6I,EAAQiJ,WAAaA,EAEjBrT,EACAoK,EAAQwY,YAAY3iB,GAAe,CAAC,EAAG,IAEvCmK,EAAQwY,YAAY,IAIxB,MAAMlX,EAAQH,EAAUC,EAAmB0B,GAAgBnM,EAAgB,CAAE0K,SAAUwB,QAASza,GAEhG,IAAK,IAAIua,KAAQrB,EACb,GAAI4H,QAAwC9gB,IAAhB+gB,GAA6BC,EAAc,CACnE,IAAIgB,EACJ,GAA+B,iBAApBhB,EAAa,IAA8C,IAA3BA,EAAa,GAAGjhB,OAAc,CACrE,MAAMkiB,EAAYrG,KAAKsG,MAAMnB,GACvBoB,EAAWpB,EAAckB,EAE/B,GAAiB,IAAbE,GAAkBF,GAAajB,EAAajhB,OAAS,EAAG,CACxD,MAAMqiB,EAAapB,EAAapF,KAAKC,IAAIoG,EAAWjB,EAAajhB,OAAS,IAAI,GAC9EiiB,EAAaI,aAAsBxR,KAAOwR,EAAWC,UAAYD,CACrE,KAAO,CACH,MAAME,EAActB,EAAaiB,GAAW,GACtCM,EAAWvB,EAAaiB,EAAY,GAAG,GACvCO,EAAcF,aAAuB1R,KAAO0R,EAAYD,UAAYC,EAE1EN,EAAaQ,EAAcL,IADVI,aAAoB3R,KAAO2R,EAASF,UAAYE,GACfC,EACtD,CACJ,MACIR,EAAajB,EAGjB,GAAI4B,EAAW,CACX,MAAMkF,EAAY7G,EAAa,GAAG,aAAcpQ,KAAOoQ,EAAa,GAAG,GAAGqB,UAAYrB,EAAa,GAAG,GAGhGrE,GAAaqF,EAAa6F,KAFf7G,EAAaA,EAAajhB,OAAS,GAAG,aAAc6Q,KACjEoQ,EAAaA,EAAajhB,OAAS,GAAG,GAAGsiB,UAAYrB,EAAaA,EAAajhB,OAAS,GAAG,IACtC8nB,GAEzD,GAAIlL,EAAY,EAAG,CACf/E,EAAQqC,UAAYvM,EACpBkK,EAAQsC,YACR,IAAK,IAAIra,EAAI,EAAGA,EAAI0a,EAAKxa,OAAQF,IAAK,CAClC,MAAO+M,EAAGF,GAAK6N,EAAK1a,GACV,IAANA,EACA+X,EAAQuC,OAAOvN,EAAGF,GAElBkL,EAAQwC,OAAOxN,EAAGF,EAE1B,CACAkL,EAAQyC,QACZ,MAAO,GAAIsC,EAAY,EAAG,CACtB,MAAMc,GAAexd,EAAAA,EAAAA,qBAAoBC,EAAO0c,GAChDhF,EAAQoC,YAAcyD,EACtB7F,EAAQqC,UAAYvM,EACpBkK,EAAQsC,YACR,IAAK,IAAIra,EAAI,EAAGA,EAAI0a,EAAKxa,OAAQF,IAAK,CAClC,MAAO+M,EAAGF,GAAK6N,EAAK1a,GACV,IAANA,EACA+X,EAAQuC,OAAOvN,EAAGF,GAElBkL,EAAQwC,OAAOxN,EAAGF,EAE1B,CACAkL,EAAQyC,QACZ,KAAO,CACH,MAAM0T,EAAoBpR,GAAapC,EAAKxa,OAAS,GAC/Cub,EAAaM,KAAKsG,MAAM6L,GACxB5L,EAAW4L,EAAoBzS,EAErC,IAAIC,EAAa,KACjB,GAAID,EAAaf,EAAKxa,OAAS,GAAKoiB,EAAW,EAAG,CAC9C,MAAO/E,EAAIC,GAAM9C,EAAKe,IACfgC,EAAIC,GAAMhD,EAAKe,EAAa,GACnCC,EAAa,CACT6B,EAAK+E,GAAY7E,EAAKF,GACtBC,EAAK8E,GAAY5E,EAAKF,GAE9B,CAEA,GAAI/B,EAAa,GAAqB,IAAfA,GAAoB6G,EAAW,EAAI,CACtD,MAAM1E,GAAexd,EAAAA,EAAAA,qBAAoBC,EAAO0c,GAChDhF,EAAQoC,YAAcyD,EACtB7F,EAAQqC,UAAYvM,EACpBkK,EAAQsC,YAER,IAAK,IAAIra,EAAI,EAAGA,GAAKyb,EAAYzb,IAAK,CAClC,MAAO+M,EAAGF,GAAK6N,EAAK1a,GACV,IAANA,EACA+X,EAAQuC,OAAOvN,EAAGF,GAElBkL,EAAQwC,OAAOxN,EAAGF,EAE1B,CAEI6O,GACA3D,EAAQwC,OAAOmB,EAAW,GAAIA,EAAW,IAG7C3D,EAAQyC,QACZ,CAEA,GAAIiB,EAAaf,EAAKxa,OAAS,EAAG,CAC9B6X,EAAQoC,YAAc9Z,EACtB0X,EAAQqC,UAAYvM,EACpBkK,EAAQsC,YAEJqB,EACA3D,EAAQuC,OAAOoB,EAAW,GAAIA,EAAW,IAEzC3D,EAAQuC,OAAOI,EAAKe,EAAa,GAAG,GAAIf,EAAKe,EAAa,GAAG,IAGjE,IAAK,IAAIzb,EAAIyb,EAAa,EAAGzb,EAAI0a,EAAKxa,OAAQF,IAAK,CAC/C,MAAO+M,EAAGF,GAAK6N,EAAK1a,GACpB+X,EAAQwC,OAAOxN,EAAGF,EACtB,CAEAkL,EAAQyC,QACZ,CACJ,CACJ,KAAO,CACH,IAAKwI,EAAiB,CACtBjL,EAAQqC,UAAYvM,EACpBkK,EAAQsC,YACR,IAAK,IAAIra,EAAI,EAAGA,EAAI0a,EAAKxa,OAAQF,IAAK,CAClC,MAAO+M,EAAGF,GAAK6N,EAAK1a,GACV,IAANA,EACA+X,EAAQuC,OAAOvN,EAAGF,GAElBkL,EAAQwC,OAAOxN,EAAGF,EAE1B,CACAkL,EAAQyC,SACR,QACJ,CAEA,MAAMuI,EAAiBC,EAAgB3E,gBAAgBtN,KAAOiS,EAAgB3E,KAAKmE,UAAYQ,EAAgB3E,KACzG8E,EAAiBH,EAAgB5E,gBAAgBrN,KAAOiS,EAAgB5E,KAAKoE,UAAYQ,EAAgB5E,KAE/G,GAAI+D,EAAaY,EAAgB,CAC7BhL,EAAQqC,UAAYvM,EACpBkK,EAAQsC,YACR,IAAK,IAAIra,EAAI,EAAGA,EAAI0a,EAAKxa,OAAQF,IAAK,CAClC,MAAO+M,EAAGF,GAAK6N,EAAK1a,GACV,IAANA,EACA+X,EAAQuC,OAAOvN,EAAGF,GAElBkL,EAAQwC,OAAOxN,EAAGF,EAE1B,CACAkL,EAAQyC,QACZ,MAAO,GAAI2H,EAAagB,EAAgB,CACpC,MAAMvF,GAAexd,EAAAA,EAAAA,qBAAoBC,EAAO0c,GAChDhF,EAAQoC,YAAcyD,EACtB7F,EAAQqC,UAAYvM,EACpBkK,EAAQsC,YACR,IAAK,IAAIra,EAAI,EAAGA,EAAI0a,EAAKxa,OAAQF,IAAK,CAClC,MAAO+M,EAAGF,GAAK6N,EAAK1a,GACV,IAANA,EACA+X,EAAQuC,OAAOvN,EAAGF,GAElBkL,EAAQwC,OAAOxN,EAAGF,EAE1B,CACAkL,EAAQyC,SACRzC,EAAQoC,YAAc9Z,CAC1B,KAAO,CACH,MACM6tB,GADa/L,EAAaY,IAAmBI,EAAiBJ,GAC9BrI,EAAKxa,OAEzCiuB,EAAgB,GAChBG,EAAiB,GACvB,IAAI5S,EAAa,KAEjB,GAAIwS,EAAoB,GAAKA,EAAoBxT,EAAKxa,OAAS,EAAG,CAC9D,MAAMswB,EAAczU,KAAKsG,MAAM6L,GACzBuC,EAAa1U,KAAK2U,KAAKxC,GAE7B,GAAIsC,IAAgBC,EAAY,CAC5B,MAAMnO,EAAW4L,EAAoBsC,EAC/BG,EAAcjW,EAAK8V,GACnBI,EAAalW,EAAK+V,GAExB/U,EAAa,CACTiV,EAAY,GAAKrO,GAAYsO,EAAW,GAAKD,EAAY,IACzDA,EAAY,GAAKrO,GAAYsO,EAAW,GAAKD,EAAY,IAGjE,MACIjV,EAAahB,EAAKwT,EAE1B,CAEA,IAAK,IAAIluB,EAAI,EAAGA,EAAI0a,EAAKxa,OAAQF,IACzBA,EAAIkuB,EACJC,EAAcpsB,KAAK2Y,EAAK1a,IAExBsuB,EAAevsB,KAAK2Y,EAAK1a,IAajC,GATI0b,IACIyS,EAAcjuB,OAAS,GACvBiuB,EAAcpsB,KAAK2Z,GAEnB4S,EAAepuB,OAAS,GACxBouB,EAAe3Q,QAAQjC,IAI3ByS,EAAcjuB,OAAS,EAAG,CAC1B,MAAM0d,GAAexd,EAAAA,EAAAA,qBAAoBC,EAAO0c,GAChDhF,EAAQoC,YAAcyD,EACtB7F,EAAQqC,UAAYvM,EACpBkK,EAAQsC,YACR,IAAK,IAAIra,EAAI,EAAGA,EAAImuB,EAAcjuB,OAAQF,IAAK,CAC3C,MAAO+M,EAAGF,GAAKshB,EAAcnuB,GACnB,IAANA,EACA+X,EAAQuC,OAAOvN,EAAGF,GAElBkL,EAAQwC,OAAOxN,EAAGF,EAE1B,CACAkL,EAAQyC,QACZ,CAEA,GAAI8T,EAAepuB,OAAS,EAAG,CAC3B6X,EAAQoC,YAAc9Z,EACtB0X,EAAQqC,UAAYvM,EACpBkK,EAAQsC,YACR,IAAK,IAAIra,EAAI,EAAGA,EAAIsuB,EAAepuB,OAAQF,IAAK,CAC5C,MAAO+M,EAAGF,GAAKyhB,EAAetuB,GACpB,IAANA,EACA+X,EAAQuC,OAAOvN,EAAGF,GAElBkL,EAAQwC,OAAOxN,EAAGF,EAE1B,CACAkL,EAAQyC,QACZ,CACA,CACA,CACJ,KAAO,CACH,GAAIK,GAAgBnM,EAAe,CAC/B,IAAImgB,GAAW,EACXnU,EAAKxa,QAAU,EACf2uB,EAAWnU,EAAK,GAAG,IAAME,EAClBF,EAAKxa,OAAS,IACrB2uB,EAAWnU,EAAK,GAAG,IAAME,GAE7B7C,EAAQoC,YAAc0U,EAAWxuB,EAAQqO,CAC7C,MACIqJ,EAAQoC,YAAc9Z,EAG1B0X,EAAQsC,YAER,IAAK,IAAIra,EAAI,EAAGA,EAAI0a,EAAKxa,OAAQF,IAAK,CAClC,MAAO+M,EAAGF,GAAK6N,EAAK1a,GAEV,IAANA,EACA+X,EAAQuC,OAAOvN,EAAGF,GAElBkL,EAAQwC,OAAOxN,EAAGF,EAE1B,CAEAkL,EAAQyC,QACZ,CAGJ,GAAI2V,EAAW,CACX,MAAMU,EAASV,IAEfpY,EAAQqC,UAAYvM,EACpBkK,EAAQoC,YAAc9Z,EACtB0X,EAAQwY,YAAY,IACpB,MAAMO,EAAqB,EAAInZ,EAE/B,IAAK,IAAIyY,KAASS,EAAQ,CACtB,IAAKT,EACD,SAGJ,MAAM,OAAEnN,EAAM,UAAEoN,EAAS,UAAEC,GAAcF,EAEvB,OAAdC,IACAtY,EAAQsC,YACRtC,EAAQuC,OAAO2I,EAAU6N,EAAqB,EAAIT,GAClDtY,EAAQwC,OAAO0I,EAAU6N,EAAqB,EAAIT,GAClDtY,EAAQyC,UAGM,OAAd8V,IACAvY,EAAQsC,YACRtC,EAAQuC,OAAO2I,EAAU6N,EAAqB,EAAIR,GAClDvY,EAAQwC,OAAO0I,EAAU6N,EAAqB,EAAIR,GAClDvY,EAAQyC,UAGM,OAAd6V,GAAoC,OAAdC,IAI1BvY,EAAQsC,YACRtC,EAAQuC,OAAO2I,EAAQoN,GACvBtY,EAAQwC,OAAO0I,EAAQqN,GACvBvY,EAAQyC,SACZ,CACJ,CAEA,GAAIjM,EAAsB,CACtB,MAAM+N,EAAmB4F,IAEzB,GAAIjB,QAAwC9gB,IAAhB+gB,GAA6BC,GAAgB6B,EAAiB,CACtF,MAAM+E,EAAgB/E,EACtB,IAAIgF,EAAWC,EAeX9F,EAbJ,GAAI4F,QAAwC5nB,IAAvB4nB,EAAc1J,WAA6Cle,IAAvB4nB,EAAc3J,KACnE4J,EAAYD,EAAc1J,gBAAgBtN,KAAOgX,EAAc1J,KAAKmE,UAAYuF,EAAc1J,KAC9F4J,EAAWF,EAAc3J,gBAAgBrN,KAAOgX,EAAc3J,KAAKoE,UAAYuF,EAAc3J,SAC1F,CACH,MAAM8J,EAAY/G,EAAa,GACzBgH,EAAWhH,EAAaA,EAAajhB,OAAS,GAC9Cib,EAAS+M,EAAU,GACnB7M,EAAQ8M,EAAS,GAEvBH,EAAY7M,aAAkBpK,KAAOoK,EAAOqH,UAAYrH,EACxD8M,EAAW5M,aAAiBtK,KAAOsK,EAAMmH,UAAYnH,CACzD,CAGA,GAA2B,iBAAhB6F,GAA4C,QAAhBA,EACnCiB,EAAapR,KAAKggB,WACf,GAA+B,iBAApB5P,EAAa,IAA8C,IAA3BA,EAAa,GAAGjhB,OAAc,CAC5E,MAAMkiB,EAAYrG,KAAKsG,MAAMnB,GACvBoB,EAAWpB,EAAckB,EAE/B,GAAiB,IAAbE,GAAkBF,GAAajB,EAAajhB,OAAS,EAAG,CACxD,MAAMqiB,EAAapB,EAAapF,KAAKC,IAAIoG,EAAWjB,EAAajhB,OAAS,IAAI,GAC9EiiB,EAAaI,aAAsBxR,KAAOwR,EAAWC,UAAYD,CACrE,KAAO,CACH,MAAME,EAActB,EAAaiB,GAAW,GACtCM,EAAWvB,EAAaiB,EAAY,GAAG,GACvCO,EAAcF,aAAuB1R,KAAO0R,EAAYD,UAAYC,EAE1EN,EAAaQ,EAAcL,IADVI,aAAoB3R,KAAO2R,EAASF,UAAYE,GACfC,EACtD,CACJ,MACIR,EAAajB,EAGjB,GAAmB,OAAfiB,IACiBA,EAAa6F,IACZC,EAAWD,GAGb,EAAG,CACf,MAAMpJ,EAAeH,EAAkBnC,EAAkB9N,GACzD,IAAK,IAAIxO,EAAI,EAAGA,EAAI4e,EAAa1e,OAAQF,IAAK,CAC1C,MAAO+M,EAAGF,GAAK+R,EAAa5e,GAE5B,IAAIuc,EAAalc,EACbqO,GAAiBmM,IAEb0B,EADA1P,IAAM+N,GAAQX,EACDA,EACNpN,EAAI+N,EACEva,EAEAqO,GAIrB,MAAM,oBAAEtO,GAAwB4wB,EAAQ,KAClC5N,EAAsBhjB,EAAoBmc,EAAYQ,GAC5DhF,EAAQ+C,UAAYsI,EACpBrL,EAAQsC,YACRtC,EAAQyE,IAAIzP,EAAGF,EAAGkC,GAAe,EAAG,EAAG,EAAIgN,KAAKU,IAAI,GACpD1E,EAAQwD,MACZ,CACA,MACJ,CAGJ,GAAIuH,EAAW,CACX,MAAMC,EAAiBC,EAAgB3E,gBAAgBtN,KAAOiS,EAAgB3E,KAAKmE,UAAYQ,EAAgB3E,KACzG8E,EAAiBH,EAAgB5E,gBAAgBrN,KAAOiS,EAAgB5E,KAAKoE,UAAYQ,EAAgB5E,KAEzGQ,EAAeH,EAAkBnC,EAAkB9N,GACzD,IAAK,IAAIxO,EAAI,EAAGA,EAAI4e,EAAa1e,OAAQF,IAAK,CAC1C,MAAO+M,EAAGF,GAAK+R,EAAa5e,GAE5B,IAAI8d,GAAiB,EAEjBA,IADAqE,EAAaY,KAENZ,EAAagB,EACY,WAAd1U,EAID1B,GAFWoV,EAAaY,IAAmBI,EAAiBJ,GACnChL,EAAQD,OAAOjK,OAI7D,IAAI0O,EAAalc,EAWjB,GAVIqO,GAAiBmM,IAEb0B,EADA1P,IAAM+N,GAAQX,EACDA,EACNpN,EAAI+N,EACEva,EAEAqO,GAIjBoP,EAAgB,CAChB,MAAMsF,GAAsBhjB,EAAAA,EAAAA,qBAAoBmc,EAAYQ,GAC5DhF,EAAQ+C,UAAYsI,CACxB,MACIrL,EAAQ+C,UAAYyB,EAGxBxE,EAAQsC,YACRtC,EAAQyE,IAAIzP,EAAGF,EAAGkC,GAAe,EAAG,EAAG,EAAIgN,KAAKU,IAAI,GACpD1E,EAAQwD,MACZ,CACJ,MAAO,GAAKyH,EAqBL,CACH,MAAMD,EAAiBC,EAAgB3E,gBAAgBtN,KAAOiS,EAAgB3E,KAAKmE,UAAYQ,EAAgB3E,KACzG8E,EAAiBH,EAAgB5E,gBAAgBrN,KAAOiS,EAAgB5E,KAAKoE,UAAYQ,EAAgB5E,KAEzGQ,EAAeH,EAAkBnC,EAAkB9N,GACzD,IAAK,IAAIxO,EAAI,EAAGA,EAAI4e,EAAa1e,OAAQF,IAAK,CAC1C,MAAO+M,EAAGF,GAAK+R,EAAa5e,GAE5B,IAAI8d,GAAiB,EAEjBA,IADAqE,EAAaY,KAENZ,EAAagB,EACY,WAAd1U,EAID1B,GAFWoV,EAAaY,IAAmBI,EAAiBJ,GACnChL,EAAQD,OAAOjK,OAI7D,IAAI0O,EAAalc,EAWjB,GAVIqO,GAAiBmM,IAEb0B,EADA1P,IAAM+N,GAAQX,EACDA,EACNpN,EAAI+N,EACEva,EAEAqO,GAIjBoP,EAAgB,CAChB,MAAMsF,GAAsBhjB,EAAAA,EAAAA,qBAAoBmc,EAAYQ,GAC5DhF,EAAQ+C,UAAYsI,CACxB,MACIrL,EAAQ+C,UAAYyB,EAGxBxE,EAAQsC,YACRtC,EAAQyE,IAAIzP,EAAGF,EAAGkC,GAAe,EAAG,EAAG,EAAIgN,KAAKU,IAAI,GACpD1E,EAAQwD,MACZ,CACJ,KA9D6B,CACzB,MAAMqD,EAAeH,EAAkBnC,EAAkB9N,GACzD,IAAK,IAAIxO,EAAI,EAAGA,EAAI4e,EAAa1e,OAAQF,IAAK,CAC1C,MAAO+M,EAAGF,GAAK+R,EAAa5e,GAE5B,IAAIuc,EAAalc,EACbqO,GAAiBmM,IAEb0B,EADA1P,IAAM+N,GAAQX,EACDA,EACNpN,EAAI+N,EACEva,EAEAqO,GAIrBqJ,EAAQ+C,UAAYyB,EACpBxE,EAAQsC,YACRtC,EAAQyE,IAAIzP,EAAGF,EAAGkC,GAAe,EAAG,EAAG,EAAIgN,KAAKU,IAAI,GACpD1E,EAAQwD,MACZ,CACJ,CA0CJ,KAAO,CACH,MAAMqD,EAAeH,EAAkBnC,EAAkB9N,GACzD,IAAK,IAAIxO,EAAI,EAAGA,EAAI4e,EAAa1e,OAAQF,IAAK,CAC1C,MAAO+M,EAAGF,GAAK+R,EAAa5e,GAG5B,IAAIuc,EAAalc,EACbqO,GAAiBmM,IAEb0B,EADA1P,IAAM+N,GAAQX,EACDA,EACNpN,EAAI+N,EACEva,EAEAqO,GAIrBqJ,EAAQ+C,UAAYyB,EACpBxE,EAAQsC,YACRtC,EAAQyE,IAAIzP,EAAGF,EAAGkC,GAAe,EAAG,EAAG,EAAIgN,KAAKU,IAAI,GACpD1E,EAAQwD,MACZ,CACJ,CACJ,CACJ,CKgHY0V,CAASrG,EAAesF,EAtB5B,MAFItb,QAAQC,MAAM,2CA2BtB,CAEAqc,gBAAAA,CAAiBC,GACRA,IAID7uB,KAAK2mB,QACA3mB,KAAK8uB,qBACN9uB,KAAK8uB,mBAAqB,IAAI1b,EAAkBpT,KAAK4mB,WAGzD5mB,KAAK8uB,mBAAmBjb,KAAKgb,ICrqB1B,UAAwB,KAAEztB,IAAQ,QAAEqU,IAC/C,IAAKA,EAED,YADAnD,QAAQC,MAAM,4CAIlB,MAAMhH,EAAQkK,EAAQD,OAAOjK,MACvBoK,EAASF,EAAQD,OAAOG,OAE9B,IAAK,IAAI,MAAE5B,EAAK,MAAEC,EAAK,MAAEjW,KAAWqD,EAChCqU,EAAQ+C,UAAYza,EACpB0X,EAAQ2V,SAASrX,EAAMxI,EAAO,GAAIyI,EAAQD,GAAOxI,EAAOoK,EAEhE,CD0pBYoZ,CAAeF,EAAmB,CAC9BpZ,QAASzV,KAAK4mB,WAG1B,CAMA,uBAAMO,GAMF,GALAnnB,KAAK6pB,cAAgBtU,EAAWvV,KAAK0mB,QAAS1mB,KAAK4mB,UAEnD5mB,KAAK8Q,KAAK,eAAgB9Q,KAAK6pB,SAC/B7pB,KAAKwmB,iBAAiBwI,kBAElB/oB,OAAOgpB,eAAgB,CACvB,IAAIC,GAAQ,EACRC,GAAW,EAEfnvB,KAAK2nB,gBAAkB,IAAI1hB,OAAOgpB,gBAAgB,KAC1CC,EACAA,GAAQ,EAIRC,IAIJA,GAAW,EACXnvB,KAAKqnB,SAASld,MAAK,KACfglB,GAAW,CAAK,IAClB,IAGNnvB,KAAK2nB,gBAAgBtW,QAAQrR,KAAK0mB,QAAQzf,WAC9C,CAEIjH,KAAKymB,oBAAsBxgB,OAAOmpB,uBAClCpvB,KAAK6nB,sBAAwB,IAAI5hB,OAAOmpB,sBAAsBC,IAC1DC,aAAatvB,KAAKuvB,sBAEbF,EAAQ,GAAGG,iBAIhBxvB,KAAKuvB,qBAAuBE,YAAW,KACnCzvB,KAAKqnB,QAAQ,GACd,IAAG,GACP,CACC8B,UAAW,KAGfnpB,KAAK6nB,sBAAsBxW,QAAQrR,KAAK0mB,QAAQzf,YAExD,CAEA,YAAMogB,GACF,MAAMqI,EAAgBna,EAAWvV,KAAK0mB,QAAS1mB,KAAK4mB,SAAU,CAAElR,OAAO,IACvE1V,KAAKknB,aAAewI,EAEpB1vB,KAAK6pB,cAAgB7pB,KAAKknB,aACtBlnB,KAAKknB,eAAiBwI,IAI1B1vB,KAAK8Q,KAAK,eAAgB9Q,KAAK6pB,SAC/B7pB,KAAKwmB,iBAAiBwI,gBAAgBhvB,MAC1C,CAEA2vB,eAAAA,GACQ3vB,KAAK4vB,gBACLN,aAAatvB,KAAK4vB,gBAGtB5vB,KAAK4vB,eAAiBH,YAAW,KAC7BzvB,KAAKqnB,SACLrnB,KAAK4vB,eAAiB,IAAI,GAC3B,GACP,CAEAC,mBAAAA,GACS7vB,KAAK6pB,UAIV7pB,KAAK6pB,QAAQhU,aAAe7V,KAAK0mB,QAAQ5Q,wBAC7C,CAOA,gBAAID,GACA,OAAO7V,KAAK6pB,SAAShU,YACzB,CAEA,UAAI6B,GACA,OAAO1X,KAAK6pB,OAChB,EElxBG,SAASiG,GAAmBvmB,GAC/B,OAAOkQ,KAAKK,IAAmC,EAA9BL,KAAKsW,MAAMtW,KAAK+J,IAAIja,IAAa,EACtD,CAgBO,SAASymB,GAAiBzmB,EAAO0mB,EAAU,MAK9C,GAJkB,OAAdA,IACAA,EAAYH,GAAmBvmB,IAG/B2mB,MAAMD,IAAcA,EAAY,IAChC,OAAO1mB,EAAMxJ,WAGjB,MAAMowB,EAAU5mB,EAAM6mB,QAAQ3W,KAAK2U,KAAK6B,IACxC,IAAII,EAAWF,EAKf,OAJIA,EAAQG,SAAS,OACjBD,EAAWA,EAASE,QAAQ,UAAW,KAG1B,KAAbF,EACO,IAGJA,CACX,CAEA,MAAMG,GAAuB,CAAC,EAU9B,SAASC,GAAmBC,EAAUC,GAClC,IACI,IAAIC,EAAoBJ,GAAqBE,GAC7C,IAAKE,EAAmB,CACpB,IAAIC,EAAiBH,EAChBA,GAAyB,UAAbA,IACbG,EAAiBC,KAAKC,iBAAiBC,kBAAkBN,UAG7DE,EAAoB,IAAIE,KAAKC,eAAe,QAAS,CACjDL,SAAUG,EACVI,aAAc,eAElBT,GAAqBE,GAAYE,CACrC,CAEA,MACMM,EADQN,EAAkBO,cAAcR,GACrBrG,MAAK9Y,GAAsB,iBAAdA,EAAK1G,OAE3C,IAAKomB,EACD,OAAO,KAGX,GAAyB,QAArBA,EAAW3nB,MACX,OAAO,EAGX,IAAK,uBAAuBkI,KAAKyf,EAAW3nB,OACxC,OAAO,KAGX,MAAO6nB,EAAOC,GAAWH,EAAW3nB,MAAM7K,MAAM,GAAGC,MAAM,KAEzD,OAAuB,GAAhBI,SAASqyB,GAAU,GAAG,IAAyB,GAAlBryB,SAASsyB,GAAY,GAC7D,CAAE,MAAOhrB,GAGL,OAFAiM,QAAQC,MAAM,IAAIrQ,MAAO,uCAAsCyuB,QAAiBD,MAChFpe,QAAQC,MAAMlM,GACP,IACX,CACJ,CAWO,SAASirB,GAAqBC,EAAMC,GACvC,IAAKA,EAAU,CACX,MAAMC,EAAa,IAAIhjB,KAAK8iB,GAE5B,OADAE,EAAWC,SAAS,EAAG,EAAG,EAAG,GACtBD,CACX,CAEA,MAAME,EAASlB,GAAmBe,EAAUD,GAC5C,IAAIE,EAAa,IAAIhjB,KAAK8iB,GAU1B,OATAE,EAAWG,YAAY,EAAG,EAAG,EAAG,GAEbH,EAAWI,UAAYN,EAAKM,UAG9BF,IACbF,EAAa,IAAIhjB,KAAKgjB,EAAWI,UAAY,QAG1C,IAAIpjB,KAAKgjB,EAAWI,UAAYF,EAC3C,CAmEO,SAASG,GAAQrnB,GAAG,MAACsnB,GAAM,EAAK,UAAE9B,EAAU,KAAI,SAAE+B,GAAS,EAAK,SAAEC,GAAS,EAAK,gBAAEC,GAAgB,EAAK,WAAEC,EAAW,MAAK,aAAEC,EAAY,SAAE1B,EAAQ,aAAE2B,GAAa,EAAK,eAAEC,GAAgB,CAAC,GAC3L,OAAIP,GAAWtnB,aAAagE,OACxBhE,EAAI,IAAIgE,KAAKhE,IAETylB,MAAMzlB,IAKVA,aAAagE,KA1ErB,SAAoB8jB,GAAM,UAACtC,EAAS,SAAE+B,EAAQ,SAAEC,EAAQ,gBAAEC,EAAe,aAAEE,EAAY,WAAED,EAAW,MAAK,SAAEzB,IACvG,MAAM8B,EAAM9B,GAAuC,QAA3BA,EAAS+B,cACjC,GAAI/B,IAAa8B,GAAoB,UAAb9B,GAAwBzqB,OAAO6qB,MAAQ7qB,OAAO6qB,KAAKC,eAAgB,CACvF,MAAMY,EAASlB,GAAmBC,EAAU6B,GACtCG,EAAcjC,GAAmB,QAAS8B,GAE1B,iBAAXZ,GAA8C,iBAAhBe,IACrCH,EAAO,IAAI9jB,KAAK8jB,EAAKV,UAAYF,EAASe,GAElD,CAEA,MAAMC,EAAOH,EAAMD,EAAKK,iBAAmBL,EAAKM,cAC1CC,GAASN,EAAMD,EAAKQ,cAAgBR,EAAKS,YAAc,EACvDC,EAAMT,EAAMD,EAAKW,aAAgBX,EAAKY,UAE5C,GAAqB,SAAjBf,EACA,OAAOO,EAAK5yB,WAGhB,GAAIkyB,EACA,OAAOO,EAAO,GAAEM,KAASG,KAAON,IAASJ,EAAKa,qBAGlD,GAAIlB,EAGA,MAAQ,GADW,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAC5EY,EAAQ,MAAMG,IAGvC,MAAM7B,EAAQoB,EAAMD,EAAKc,cAAgBd,EAAKe,WACxCjC,EAAUmB,EAAMD,EAAKgB,gBAAkBhB,EAAKiB,aAC5CC,EAAUjB,EAAMD,EAAKmB,gBAAkBnB,EAAKoB,aAC5CC,EAAepB,EAAMD,EAAKsB,qBAAuBtB,EAAKuB,kBAE5D,IAAIC,EAoBJ,OAjBIA,EADe,QAAf5B,EACc,KAAIf,EAAQ,IAAM,GAAK,GAAGrxB,cAAcsxB,EAAQtxB,WAAWi0B,SAAS,EAAG,OAEvE,GAAE5C,EAAMrxB,WAAWi0B,SAAS,EAAG,QAAQ3C,EAAQtxB,WAAWi0B,SAAS,EAAG,OAGtE,MAAd/D,GAAmC,OAAdA,IACrB8D,GAAe,IAAGN,EAAQ1zB,WAAWi0B,SAAS,EAAG,QAGnC,OAAd/D,IACA8D,GAAe,IAAGH,EAAa7zB,WAAWi0B,SAAS,EAAG,QAGvC,QAAf7B,IACA4B,GAAc3C,GAAS,GAAK,KAAO,MAGnCY,EACO+B,GAGPvB,IACAuB,GAAc,SAGVvB,EAAO,GAAEM,KAASG,KAAON,IAASJ,EAAKa,sBAAwB,IAAMW,EACjF,CAYeE,CAAWxpB,EAAG,CAACwlB,YAAW+B,WAAUC,WAAUC,kBAAiBE,eAAcD,aAAYzB,aAGhGR,MAAMzlB,GACC,MAGP6nB,EACI7Y,KAAK+J,IAAI/Y,EAAIgP,KAAKya,MAAMzpB,IAAM,MACvB,GAGJ6nB,EAAe7Y,KAAKya,MAAMzpB,IAGjC4nB,GAAgB5Y,KAAK+J,IAAI/Y,EAAIgP,KAAKya,MAAMzpB,IAAM,MACvC,GAGJulB,GAAiBvlB,EAAGwlB,GAxBZ,cAyBnB,CAEO,SAASkE,GAAQ5pB,GAAG,UAAC0lB,EAAU,KAAI,IAAEmE,GAAI,GAAO,CAAC,GACpD,OAAU,OAAN7pB,EACO,OAGP2lB,MAAM3lB,GACC,MAGP6pB,EACQ,MAAKpE,GAAiBvW,KAAKsW,MAAMxlB,GAAI0lB,KAG1CD,GAAiBzlB,EAAG0lB,EAC/B,CCxOO,MAAMoE,GAAe,G,uOCM5B,SAASC,IAAiB,OAAEnpB,EAAM,EAAEZ,EAAC,eAAEgqB,IACnC,OAAIA,IAAmBppB,OACTtN,IAAN0M,EACO,YAGD,OAANA,EACO,OAGJA,EAAExK,WAGS,iBAAXoL,EACHopB,EACOppB,EAAOpL,WAEPo0B,GAAQhpB,GAID,iBAAXA,EACAgpB,GAAQ5pB,GAGZY,GAAUgpB,GAAQ5pB,EAC7B,CAEA,SAASiqB,IAAa,UAAEC,EAAS,EAAEhqB,EAAC,EAAEF,EAAC,OAAEW,EAAM,OAAEC,EAAM,SAAEupB,EAAQ,QAAE/kB,EAAO,mBAAEhC,EAAkB,cAAEG,EAAa,cAAEC,EAAa,cAAEH,EAAa,cAAEC,EAAa,eAAE0mB,EAAc,eAAEI,IACxK,IAAIj3B,EAAI,EAER,OACIk3B,EAAAA,QAAAA,cAAA,SAEQjnB,GACAinB,EAAAA,QAAAA,cAAA,QAAMnqB,EAAGiqB,EAAUnqB,EAAGoF,EAAgB,GAALjS,KAC5B+2B,GAKL3mB,GACA8mB,EAAAA,QAAAA,cAAA,QAAMnqB,EAAGiqB,EAAUnqB,EAAGoF,EAAkB,GAAPjS,KAC5BkQ,GAAiB,MAAO1C,GAAU4mB,GAAQrnB,EAAGkqB,IAKlD5mB,GACA6mB,EAAAA,QAAAA,cAAA,QAAMnqB,EAAGiqB,EAAUnqB,EAAGoF,EAAkB,GAAPjS,KAC5BmQ,GAAiB,MAAOymB,GAAiB,CAAEnpB,SAAQZ,IAAGgqB,oBAK3E,CAEAC,GAAaK,UAAY,CACrBJ,UAAW9wB,IAAAA,OACX8G,EAAG9G,IAAAA,UAAoB,CAACA,IAAAA,OAAkBA,IAAAA,WAAqB8K,QAC/DlE,EAAG5G,IAAAA,OACHuH,OAAQvH,IAAAA,OACRwH,OAAQxH,IAAAA,UAAoB,CAACA,IAAAA,OAAkBA,IAAAA,SAC/C+wB,SAAU/wB,IAAAA,OAAiBtB,WAC3BsN,QAAShM,IAAAA,OAAiBtB,WAC1BkyB,eAAgB5wB,IAAAA,KAChBgxB,eAAgBhxB,IAAAA,UACbmxB,EAAgBpnB,mBAGR,MAAMqnB,WAAgBH,EAAAA,QAAAA,cAEjCxM,MAAAA,GAEI,IAAIzS,EAAS,GAER3V,KAAK2B,MAAMgM,qBACZgI,GAAU,IAGT3V,KAAK2B,MAAMmM,gBACZ6H,GAAU,IAGT3V,KAAK2B,MAAMoM,gBACZ4H,GAAU,IAGd,MACMqf,EAAarf,EAAO,EAGpBhG,EAnBc,EAmBHqlB,EAEXL,EAAiB,CACnBxC,WAAYnyB,KAAK2B,MAAMwwB,WACvBzB,SAAU1wB,KAAK2B,MAAM+uB,UAGnBuE,EAAmB,CACrBtnB,mBAAoB3N,KAAK2B,MAAMgM,mBAC/BC,cAAe5N,KAAK2B,MAAMiM,cAC1BC,cAAe7N,KAAK2B,MAAMkM,cAC1BC,cAAe9N,KAAK2B,MAAMmM,cAC1BC,cAAe/N,KAAK2B,MAAMoM,cAC1B4mB,kBAGEO,EAAmBl1B,KAAK2B,MAAMwzB,SAASv2B,KAAKw2B,IAC9C,MAAM,EAAE3qB,EAAC,EAAEF,EAAC,OAAEqW,EAAM,OAAED,EAAM,OAAE1T,EAAM,MAAE3H,EAAK,OAAE4F,EAAM,OAAEC,EAAM,eAAEopB,GAAmBa,EAEhF,GAAsB,iBAAXzU,EACP,OAAO,KAGX,MAAM8T,GAAaxnB,EAAO9K,MAAQ8K,EAAOjC,MAAQ1F,GAAOvF,WACxD,IAAIwL,EAAmJ,IAA3IkO,KAAKK,IAAI2a,EAAU72B,QAASsN,GAAU4mB,GAAQrnB,EAAGkqB,IAAiB/2B,OAAS,EAAG02B,GAAiB,CAAEnpB,SAAQZ,IAAGgqB,mBAAiB32B,OAAS,GAC9IqP,EAAOP,eACPnB,EAAQ0B,EAAOP,cAGnB,IAAI2oB,EAAgBr1B,KAAK2B,MAAM6U,aAAgBjL,EAAQ,GAAc,EAEjE+pB,EAAa,EACb3U,GAAU3gB,KAAK2B,MAAM6U,cAAgBjL,EAAQ,GAlChC,KAmCb+pB,GAAc,GAGd3U,EAASpV,EAAQ,GAtCJ,IAsCkD,IAAhB+pB,IAC/CD,GAAgB,GAGV,OAAN9qB,IACA8qB,GAAgB,GAGhBr1B,KAAK2B,MAAMsM,sBACXonB,GAAgB,GAGpB,IAAIX,EAAWa,GAOf,GANID,EAAa,EACbZ,GAAYnpB,EAAQmpB,EAEpBA,GAAY,GAGXc,SAAS7U,GACV,OAAO,KAGX,MAAM8U,EAAa,aAAY9U,KAAUC,KAEnC8U,EAAmB,CACrBnB,eAAgBA,GAAkBv0B,KAAK2B,MAAMg0B,aAC7ClrB,IACAF,IACAkqB,YACAvpB,SACAC,YACG8pB,GAGP,IACIW,EADAC,EAAe,EA2BnB,OAxBIR,IACAX,EAAW,EAEXkB,EAAW51B,KAAK2B,MAAM6U,aAAe,EAAIjL,EAAQ,EAE7CA,EAAQvL,KAAK2B,MAAM6U,eAAiBxW,KAAK2B,MAAMqM,WAC/C4nB,GAAYvB,GAAer0B,KAAK2B,MAAMm0B,UAAY,GAGtDD,EAAe,GAEX71B,KAAK2B,MAAMqM,WAEP6nB,EAD6B,WAA7B71B,KAAK2B,MAAMuM,cACIlO,KAAK2B,MAAM8U,cAAgBue,EAAa,GAEvCrf,EAGhB3V,KAAK2B,MAAMwM,aACX0nB,GAAgB71B,KAAK2B,MAAMwM,cAKhC,IACAinB,EACHhoB,MAAOqnB,EACP/J,YAAazd,GAAQxB,MAAMwB,QAAQ0d,QAAQ1d,GAC3CwnB,YACAlpB,QACA8pB,gBACAC,aACAZ,WACAe,YACAC,mBACA/lB,UACAgG,SACA4f,UAnHU,EAoHVP,aACAe,aAnHa,EAoHbF,eACAD,WACH,IACFlO,OAAOsO,SAEJC,EAAyBj2B,KAAK2B,MAAM0M,cAE1C,IAAI6nB,EACJ,GAAIl2B,KAAK2B,MAAM2M,gBAAiB,CAC5B,IAAI6nB,EAAuB,GACe,iBAA/Bn2B,KAAK2B,MAAM2M,kBAClB6nB,EAAuBn2B,KAAK2B,MAAM2M,iBAGtC4nB,EAAkB,GAElB,IAAK,IAAId,KAAWF,EAAkB,CAClC,IAAIkB,GAAQ,EACZ,IAAK,IAAIC,KAASH,EACd,GAAIzc,KAAK+J,IAAI6S,EAAM1V,OAASyU,EAAQzU,SAAWwV,EAAsB,CACjEE,EAAMlB,SAAS11B,KAAK21B,GAChBA,EAAQzU,OAAS0V,EAAM1V,SACvB0V,EAAM1V,OAASyU,EAAQzU,OACvB0V,EAAMf,WAAaF,EAAQE,YAG3BF,EAAQxU,OAASyV,EAAMzV,SACvByV,EAAMzV,OAASwU,EAAQxU,QAG3BwV,GAAQ,EACR,KACJ,CAGCA,GACDF,EAAgBz2B,KAAK,CACjBkhB,OAAQyU,EAAQzU,OAChBC,OAAQwU,EAAQxU,OAChB0U,WAAYF,EAAQE,WACpBH,SAAU,CAACC,IAGvB,CAEA,IAAK,IAAIiB,KAASH,EAAiB,CAC/B,IAAII,EAAc,EACdC,EAAW,EAGfF,EAAMlB,SAASqB,MAAK,CAACj4B,EAAGD,IAAMC,EAAEmsB,YAAcpsB,EAAEosB,cAEhD,IAAK,IAAIhtB,EAAI,EAAGA,EAAI24B,EAAMlB,SAASv3B,OAAQF,IACvC24B,EAAMlB,SAASz3B,GAAGiS,QAAU2mB,EAC5BA,GAAeD,EAAMlB,SAASz3B,GAAGiY,OACjC4gB,EAAW9c,KAAKK,IAAIyc,EAAUF,EAAMlB,SAASz3B,GAAG6N,OAGpD,IAAK,IAAI7N,EAAI,EAAGA,EAAI24B,EAAMlB,SAASv3B,OAAQF,IACvC24B,EAAMlB,SAASz3B,GAAGiS,SAAW2mB,EAAY,EACzCD,EAAMlB,SAASz3B,GAAGiS,SAjMV,EAoMZ0mB,EAAM1gB,OAAS2gB,EACfD,EAAMrB,WAAasB,EAAc,EACjCD,EAAMd,UAvLI,EAwLVc,EAAM9qB,MAAQgrB,CAClB,CACJ,CAEA,OACI3B,EAAAA,QAAAA,cAAA,OAAK6B,UAAU,mBACX7B,EAAAA,QAAAA,cAAA,WAEQM,EAAiBt2B,KAAI,CAACw2B,EAAS13B,KAC3B,MAAM,MAAEK,EAAK,cAAEs3B,EAAa,MAAE9pB,EAAK,UAAEkqB,EAAS,SAAEG,EAAQ,iBAAEF,EAAgB,aAAEG,EAAY,WAAEP,EAAU,SAAEZ,EAAQ,QAAE/kB,GAAYylB,EAE5H,OAAIp1B,KAAK2B,MAAM0M,eAAiB6nB,EAExBtB,EAAAA,QAAAA,cAAA,KAAGzsB,IAAKzK,EAAG+3B,UAAWA,EAAWgB,UAAU,gBACvC7B,EAAAA,QAAAA,cAAA,UAAQx2B,EAAG,EAAG6a,KAAMlb,KAM5Bs3B,EAEIT,EAAAA,QAAAA,cAAA,KAAGzsB,IAAKzK,EAAG+4B,UAAU,mCACjB7B,EAAAA,QAAAA,cAAA,UAAQx2B,EAAG,EAAG6a,KAAMlb,EAAO03B,UAAWA,IAEtCb,EAAAA,QAAAA,cAAA,KAAGa,UAAY,aAAYG,MAAaC,MACpCjB,EAAAA,QAAAA,cAAA,QAAM1c,OAAQna,EAAOkK,EAAI,UAAS+sB,MAAezpB,MAAUypB,OAAgBzpB,SAE3EqpB,EAAAA,QAAAA,cAACJ,GAAYkC,GAAA,CACThC,SAAUA,EAAU/kB,QAASA,GACzB+lB,MAQpBd,EAAAA,QAAAA,cAAA,KAAGzsB,IAAKzK,EAAG+3B,UAAWA,EAAWgB,UAAU,gBACvC7B,EAAAA,QAAAA,cAAA,UAAQx2B,EAAG,EAAG6a,KAAMlb,IAEpB62B,EAAAA,QAAAA,cAAA,QAAM1c,OAAQna,EAAOkK,EAAI,IA/NhC,EA+NmCqtB,QAjOtC,EAiOoEA,EAAqB,UAAqBN,MAAeM,EAAW/pB,MAAUypB,MAAeM,GAAY/pB,SA/N1K,EA+NkM+pB,QAE3LV,EAAAA,QAAAA,cAACJ,GAAYkC,GAAA,CACThC,SAAUA,EAAU/kB,QAASA,GACzB+lB,IAER,KAMX11B,KAAK2B,MAAM0M,eAAiB6nB,GAC7BA,EAAgBt3B,KAAI,EAAGu2B,WAAUxU,SAAQC,SAAQoU,aAAYM,aAAYv3B,QAAOwN,SAAS7N,IACrFk3B,EAAAA,QAAAA,cAAA,KAAGzsB,IAAKzK,EAAG+3B,UAAY,aAAY9U,KAAUC,KAAW6V,UAAU,gBAC9D7B,EAAAA,QAAAA,cAAA,QAAM1c,OAAQna,EAAOkK,EAAI,IA9O5B,EA8O+BqtB,QAhPlC,EAgPgEA,EAAqB,UAAqBN,MAAeM,EAAW/pB,MAAUypB,MAAeM,GAAY/pB,SA9OtK,EA8O8L+pB,QAGvLH,EAASv2B,KAAI,CAACw2B,EAASrrB,IACnB6qB,EAAAA,QAAAA,cAACJ,GAAYkC,GAAA,CACTvuB,IAAK4B,EACL4F,QAASylB,EAAQzlB,QACjB+kB,SAAUU,EAAQV,UACdU,EAAQM,yBAUpC11B,KAAK2B,MAAM0M,gBACV6nB,GAAmBhB,GAAkBt2B,KAAI,CAACw2B,EAAS13B,IAChDk3B,EAAAA,QAAAA,cAAA,OACIzsB,IAAKzK,EACL+4B,UAAU,2BACV7wB,MAAO,CAACunB,IAAKiI,EAAQxU,OAAQwM,KAAMgI,EAAQzU,SAE3CiU,EAAAA,QAAAA,cAACqB,EAA2Bb,MAMpD,EAIJL,GAAQ4B,aAAe,CACnBhpB,oBAAoB,EACpBC,eAAe,EACfC,eAAe,EACfC,eAAe,EACfC,eAAe,GAGnBgnB,GAAQF,UAAY,CAChB+B,OAAQjzB,IAAAA,OAAiBtB,WACzBw0B,OAAQlzB,IAAAA,OAAiBtB,WACzBoU,cAAe9S,IAAAA,OAAiBtB,WAChCmU,aAAc7S,IAAAA,OAAiBtB,WAC/B8yB,SAAUxxB,IAAAA,QAAkBA,IAAAA,MAAgB,CACxC8G,EAAG9G,IAAAA,UAAoB,CAACA,IAAAA,OAAkBA,IAAAA,WAAqB8K,QAC/DlE,EAAG5G,IAAAA,OACHid,OAAQjd,IAAAA,OACR5F,MAAO4F,IAAAA,OACPuH,OAAQvH,IAAAA,OACRwH,OAAQxH,IAAAA,IACR4wB,eAAgB5wB,IAAAA,QAEpBmyB,UAAWnyB,IAAAA,OAAiBtB,WAC5BszB,aAAchyB,IAAAA,KAAetB,WAC7B8vB,WAAYxuB,IAAAA,MAAgB,CAAC,MAAO,QACpC+sB,SAAU/sB,IAAAA,UACPmxB,EAAgBpnB,mBCxYR,MAAMopB,WAAoBlC,EAAAA,QAAAA,cACrCzkB,WAAAA,CAAYxO,GACR4kB,MAAM5kB,GACN3B,KAAK+2B,WAAa/2B,KAAK+2B,WAAWzP,KAAKtnB,KAC3C,CAEA+2B,UAAAA,CAAWC,GAGP,GAFAh3B,KAAKi3B,QAAUD,EAEXh3B,KAAK2B,MAAMu1B,YAAYC,SAAWn3B,KAAKi3B,QAAS,CAChD,MAAMnJ,EAAQ/nB,SAASqxB,cACjBxM,EAAY3kB,OAAOoxB,eAEzBzM,EAAU0M,kBAEVxJ,EAAMyJ,mBAAmBv3B,KAAKi3B,SAC9BrM,EAAU4M,SAAS1J,GACnB9tB,KAAKi3B,QAAQQ,OACjB,CACJ,CAEAC,cAAAA,CAAeC,GACX,MAAOC,EAAUC,GAAYF,EAAYh5B,MAAM,OAExCm0B,EAAOG,EAAKN,GAAQiF,EAASj5B,MAAM,KACpCm5B,EAAiB,GAAEhF,EAAMkB,SAAS,EAAG,QAAQf,EAAIe,SAAS,EAAG,QAAQrB,KAEpEJ,EAAMwF,GAAUF,EAASl5B,MAAM,MAC/ByyB,EAAOC,GAAWkB,EAAK5zB,MAAM,KAIpC,MAAQ,GAAEm5B,KAHa1G,EAAM4C,SAAS,EAAG,QACE3C,KAAW0G,GAG1D,CAEA3P,MAAAA,GACI,MAAM,EAAE3d,EAAC,EAAEF,EAAC,QAAE4sB,EAAO,MAAE5tB,GAAUvJ,KAAK2B,MAAMu1B,YAEtCtxB,EAAQ,CAAEwnB,KAAM3iB,EAAG0iB,IAAK5iB,EAAGgB,MAAO,SAExC,IAAK4rB,IAAY5tB,GAAoC,iBAA3BA,EAAMyuB,kBAAuC9H,MAAMzlB,IAAMylB,MAAM3lB,GACrF,OAAO,KAGX,MAAM0tB,EAAe1uB,aAAiBkF,KAAOzO,KAAK03B,eAAenuB,EAAMyuB,kBAAoBzuB,EAC3F,OACIqrB,EAAAA,QAAAA,cAAA,OAAK6B,UAAU,uBAAuB7wB,MAAOA,GACzCgvB,EAAAA,QAAAA,cAAA,OAAK6B,UAAU,aACX7B,EAAAA,QAAAA,cAAA,OAAK6B,UAAU,YAAYyB,WAAW,EAAMlB,IAAKh3B,KAAK+2B,YACjDkB,IAKrB,EC/CW,SAASE,GAAwB9P,EAAcpkB,EAAQ,CAAC,GACnE,MAAM6G,EAAOoG,EAAUmX,EAAc,CAAElX,eAAe,EAAM/P,KAAM6C,EAAQ7C,OAC1E,IAAKsJ,EAAkB4lB,SAASxlB,GAC5B,MAAM,IAAI5I,MAAO,oBAAmB4I,8BAGxC,MAAM0e,EAAc,CAChB4O,OAAQC,GACRC,OAAQC,GACRC,QAASC,IACX3tB,GAAM7G,EAAQ7C,MAAQinB,EAAajX,YAAciX,EAAajnB,KAAMinB,EAAcpkB,GAEpF,GAAIokB,EAAazc,OAAQ,CACrB,MAAMA,EAAS,GACf,IAAI4L,EAAQvT,EAAQuT,MACpB,IAAK,IAAI+S,KAASf,OACA3rB,IAAV2Z,GACA5L,EAAOnM,KAAK,CAAC8qB,EAAM,GAAI/S,IAE3B5L,EAAOnM,KAAK8qB,GACZ/S,EAAQ+S,EAAM,GAGlB,OAAO3e,CACX,CAEA,GAAIyc,EAAaxc,SACb,IAAK,IAAI0e,KAASf,EACd,GAAwB,iBAAbe,EAAM,GAAiB,CAC9B,MAAMmO,EAAiBnO,EAAM,GAC7BA,EAAM,GAAK,IAAI9b,KAAK,IAAIA,KAAK8b,EAAM,IAAIsH,UAAYxJ,EAAaxc,UAC5DqkB,MAAM3F,EAAM,MACZA,EAAM,GAAKtmB,EAAQkiB,gBAAgBwS,aAAaD,EAAgBrQ,GAExE,MAAWkC,EAAM,aAAc9b,KAC3B8b,EAAM,GAAK,IAAI9b,KAAK8b,EAAM,GAAGsH,UAAYxJ,EAAaxc,UAC3B,iBAAb0e,EAAM,KACpBA,EAAM,IAAMlC,EAAaxc,UAKrC,GAAIwc,EAAapd,WACb,IAAK,IAAIsf,KAASf,EACU,iBAAbe,EAAM,KACbA,EAAM,GAAK,IAAI9b,KAAc,IAAT8b,EAAM,KAKtC,OAAOf,CACX,CAYA,SAAS+O,GAAkBn3B,EAAMinB,EAAcpkB,GAC3C,MAAMulB,EAAc,GAEpB,IAAK,IAAI9rB,EAAI,EAAGA,EAAI0D,EAAKxD,OAAQF,IAAK,CAClC,IAAIkrB,EAASxnB,EAAK1D,GAEI,iBAAXkrB,IACPA,EAAS3kB,EAAQkiB,gBAAgBwS,aAAa/P,EAAQP,IAGpC,kBAAXO,IACPA,GAAUA,GAGdY,EAAY/pB,KAAK,CAAC/B,GAAKuG,EAAQ20B,aAAe,GAAIhQ,GACtD,CAEA,OAAOY,CACX,CAWA,SAAS6O,GAAkBj3B,EAAMinB,EAAcpkB,GAC3C,MAAO,IAAI7C,EAAKxC,KAAI,EAAG+pB,EAAQC,MAK3B,QAJe/qB,IAAX+qB,IACAA,EAAS,MAGS,iBAAXD,EAAqB,CAC5B,MAAM+P,EAAiB/P,EACvBA,EAAS,IAAIla,KAAKka,GAEduH,MAAMvH,KACNA,EAAS1kB,EAAQkiB,gBAAgBwS,aAAaD,EAAgBrQ,GAAc,GAEpF,CAUA,MARsB,iBAAXO,IACPA,EAAS3kB,EAAQkiB,gBAAgBwS,aAAa/P,EAAQP,IAGpC,kBAAXO,IACPA,GAAUA,GAGP,CAACD,EAAQC,EAAO,IAE/B,CAEA,SAASiQ,GAAsBC,EAAMnH,EAAQrsB,GACzC,MAAMotB,EAAcoG,EAAKC,UAAUpH,EAAS,EAAI1U,YAAY+b,kBAAkB1zB,GAAO,GAErF,GAAoB,IAAhBotB,EACA,OAAO,KAGX,MAAM5nB,EAAOguB,EAAKG,SAASvG,GAE3B,GAAa,IAAT5nB,EACA,OAAOguB,EAAKI,WAAWvH,EAASe,EAAc,GAAG,GAC9C,GAAa,IAAT5nB,GAAuB,IAATA,EACrB,OAAO,KACJ,GAAa,IAATA,EACP,OAAO,IAAI2D,KAAKqqB,EAAKI,WAAWvH,EAASe,EAAc,GAAG,IAE1D,MAAM,IAAIxwB,MAAO,sBAAqB4I,kBAE9C,CAWA,SAAS2tB,GAAmBr3B,EAAM6L,EAAQhJ,GACtC,IAAKgJ,EAAOlC,MAA+B,iBAAhBkC,EAAOlC,KAC9B,MAAM,IAAI7I,MAAM,uCAGpB,IAAK+K,EAAOjC,MAA+B,iBAAhBiC,EAAOjC,KAC9B,MAAM,IAAI9I,MAAM,uCAGpB,MAAMsnB,EAAc,GAEpB,IAAK,IAAIjN,KAASnb,EACd,GAAImb,EAAM4c,kBAAkBC,YAAa,CACrC,MAAMN,EAAO,IAAIO,SAAS9c,EAAM4c,QAC1BG,EAAS/c,EAAMgd,SAAStsB,EAAOlC,MAC/ByuB,EAASjd,EAAMgd,SAAStsB,EAAOjC,MAErC,IAAK,IAAI2mB,KAAUpV,EAAMkd,QACrBjQ,EAAY/pB,KAAK,CAACo5B,GAAsBC,EAAMnH,EAAQ2H,GAAST,GAAsBC,EAAMnH,EAAQ6H,IAE3G,MAAO,GAAIt6B,MAAMC,QAAQod,EAAMtP,EAAOjC,OAClC,GAAIuR,EAAMtP,EAAOjC,MAAMpN,SAAWsB,MAAMC,QAAQod,EAAMtP,EAAOjC,MAAM,KAAwC,iBAA1BuR,EAAMtP,EAAOjC,MAAM,GAChG,IAAK,IAAI0uB,KAAYnd,EAAMtP,EAAOjC,MAAO,CACrC,IAAI4d,EAAS8Q,EAASzsB,EAAOjC,WACdnN,IAAX+qB,IACAA,EAAS,MAGS,iBAAXA,IACPA,EAAS3kB,EAAQkiB,gBAAgBwS,aAAa/P,EAAQ3b,IAGpC,kBAAX2b,IACPA,GAAUA,GAGd,IAAID,EAAS+Q,EAASzsB,EAAOlC,MACP,iBAAX4d,IACPA,EAAS,IAAIla,KAAKka,IAGtBa,EAAY/pB,KAAK,CAACkpB,EAAQC,GAC9B,MAEAY,EAAY/pB,QAAQ8c,EAAMtP,EAAOjC,WAElC,CACH,IAAI4d,EAASrM,EAAMtP,EAAOjC,WACXnN,IAAX+qB,IACAA,EAAS,MAGb,IAAID,EAASpM,EAAMtP,EAAOlC,MACJ,iBAAX4d,IACPA,EAAS,IAAIla,KAAKka,IAGA,iBAAXC,IACPA,EAAS3kB,EAAQkiB,gBAAgBwS,aAAa/P,EAAQ3b,IAGpC,kBAAX2b,IACPA,GAAUA,GAGdY,EAAY/pB,KAAK,CAACkpB,EAAQC,GAC9B,CAGJ,OAAOY,CACX,CCpOA,SAASmQ,GAAehe,GAAQ,MAAEoW,IAC9B,MAAM6H,EAA2B,OAAhBje,EAAOI,MAAiC,OAAhBJ,EAAOG,MAAkC,OAAhBH,EAAOrE,MAAiC,OAAhBqE,EAAOpE,KAEjG,IAAK,IAAIpP,KAAOE,OAAOQ,KAAK8S,GACG,iBAAhBA,EAAOxT,KACdwT,EAAOxT,GAAO,GAOtB,OAHAwT,EAAOie,QAAUA,EACjBje,EAAOoW,MAAQA,EAERpW,CACX,CAsCe,SAASke,GAAoBrQ,GAAa,WAACsQ,EAAW,IAAG,oBAAEC,EAAoB,GAAG,CAAC,GAC9F,IAAIpe,EAAS,CACTI,KAAM,KACND,KAAM,KACNxE,KAAM,KACNC,KAAM,KACNmE,eAAgB,MAGpB,GAAmB,MAAfoe,GAAsBtQ,EAAY5rB,OAClC,OA9CR,SAA0B4rB,EAAa7N,GAAQ,WAACme,EAAW,IAAG,oBAAEC,EAAoB,GAAG,CAAC,GACpF,IAAIhI,GAAQ,EAEZpW,EAAOI,KAAOyN,EAAY,GAAG,GACzB7N,EAAOI,gBAAgBtN,OACvBkN,EAAOI,KAAOJ,EAAOI,KAAK8V,UAC1BE,GAAQ,GAGZpW,EAAOG,KAAO0N,EAAYA,EAAY5rB,OAAS,GAAG,GAC9C+d,EAAOG,gBAAgBrN,OACvBkN,EAAOG,KAAOH,EAAOG,KAAK+V,UAC1BE,GAAQ,GAGZ,MAAMiI,EAAYxQ,EACb9B,QAAO,EAAEuS,EAAI1vB,KAAoB,iBAANA,IAC3BisB,MAAK,EAAE0D,EAAKhf,IAAMif,EAAK/e,KAAQF,EAAKE,IAEzC,IAAK4e,EAAUp8B,OACX,OAAO+7B,GAAehe,EAAQ,CAACoW,UAGnC,MAAMqI,EAAY3gB,KAAKC,IAAID,KAAK+J,IAAIuW,IAAuB,IAAID,GAAY,IAAMC,EAAsB,GAAK,EAAI,GAC1GM,GAAsB,IAAIP,GAAY,EAAIM,EAC1CE,GAAmB,IAAIR,GAAY,EAAIM,EAEvCxgB,EAAaH,KAAKsG,OAAOia,EAAUp8B,OAAO,GAAGy8B,EAAmB,KAChE7gB,EAAWC,KAAKsG,OAAOia,EAAUp8B,OAAO,IAAI,IAAI08B,GAAiB,KAKvE,OAHA3e,EAAOrE,KAAO0iB,EAAUpgB,GAAY,GACpC+B,EAAOpE,KAAOyiB,EAAUxgB,GAAU,GAE3BmgB,GAAehe,EAAQ,CAACoW,SACnC,CAYewI,CAAiB/Q,EAAa7N,EAAQ,CAACme,aAAYC,wBAG9D,IAAIhI,GAAQ,EACRvU,EAAQ,KAEZ,IAAK,IAAK/S,EAAGF,KAAMif,EAAa,CAc5B,GAbI/e,aAAagE,OACbhE,EAAIA,EAAEonB,UACNE,GAAQ,IAGe,iBAAhBpW,EAAOI,MAAqBtR,EAAIkR,EAAOI,QAC9CJ,EAAOI,KAAOtR,IAGS,iBAAhBkR,EAAOG,MAAqBrR,EAAIkR,EAAOG,QAC9CH,EAAOG,KAAOrR,GAGG,iBAAV+S,GAAmC,iBAAN/S,EAAgB,CACpD,MAAM+vB,EAAU/vB,EAAI+S,GACiB,iBAA1B7B,EAAOD,gBAA+B8e,EAAU7e,EAAOD,kBAC9DC,EAAOD,eAAiB8e,EAEhC,CACAhd,EAAQ/S,EAES,iBAANF,KAIgB,iBAAhBoR,EAAOrE,MAAqB/M,EAAIoR,EAAOrE,QAC9CqE,EAAOrE,KAAO/M,IAGS,iBAAhBoR,EAAOpE,MAAqBhN,EAAIoR,EAAOpE,QAC9CoE,EAAOpE,KAAOhN,GAEtB,CAEA,OAAOovB,GAAehe,EAAQ,CAACoW,SACnC,CCvGe,SAAS0I,GAAYC,GAChC,MAAMC,EAAe,CACjB5e,KAAM,KACND,KAAM,KACNxE,KAAM,KACNC,KAAM,KACNmE,eAAgB,KAChBqW,OAAO,EACP6H,SAAS,GAGb,IAAK,IAAI,KAAE7d,EAAI,KAAED,EAAI,KAAExE,EAAI,KAAEC,EAAI,MAAEwa,EAAK,QAAE6H,EAAO,eAAEle,KAAoBgf,EAC/D3I,IACA4I,EAAa5I,OAAQ,GAGrB6H,IAGJe,EAAaf,SAAU,GAEG,OAAtBe,EAAa5e,MAAiBA,EAAO4e,EAAa5e,QAClD4e,EAAa5e,KAAOA,IAGE,OAAtB4e,EAAa7e,MAAiBA,EAAO6e,EAAa7e,QAClD6e,EAAa7e,KAAOA,IAGY,OAAhC6e,EAAajf,gBAA2BA,EAAiBif,EAAajf,kBACtEif,EAAajf,eAAiBA,IAGR,OAAtBif,EAAarjB,MAAiBA,EAAOqjB,EAAarjB,QAClDqjB,EAAarjB,KAAOA,IAGE,OAAtBqjB,EAAapjB,MAAiBA,EAAOojB,EAAapjB,QAClDojB,EAAapjB,KAAOA,IAwB5B,OApB0B,OAAtBojB,EAAa5e,OACb4e,EAAa5e,KAAO,GAGE,OAAtB4e,EAAa7e,OACb6e,EAAa7e,KAAO,GAGY,OAAhC6e,EAAajf,iBACbif,EAAajf,eAAiB,GAGR,OAAtBif,EAAarjB,OACbqjB,EAAarjB,KAAO,GAGE,OAAtBqjB,EAAapjB,OACbojB,EAAapjB,KAAO,GAGjBojB,CACX,CCnDe,SAASC,GAAajf,GAAQ,YAACjQ,EAAc,GAAE,gBAAEmvB,EAAgB,IAC5E,MAAMC,EAAiBzyB,OAAO0yB,OAAO,CAAC,EAAGpf,GACzC,IAAK,IAAIpR,KAAKmB,EACNnB,WAI+B,iBAAxBuwB,EAAexjB,MAAqB/M,EAAIuwB,EAAexjB,QAC9DwjB,EAAexjB,KAAO/M,IAGS,iBAAxBuwB,EAAevjB,MAAqBhN,EAAIuwB,EAAevjB,QAC9DujB,EAAevjB,KAAOhN,IAI9BuwB,EAAeE,aAAeF,EAAexjB,KAC7CwjB,EAAeG,aAAeH,EAAevjB,KAE7C,MAAMuW,EAAQgN,EAAevjB,KAAOujB,EAAexjB,KAC7C4jB,EAAWJ,EAAexjB,KAAOwW,EAAM,EAiB7C,GAhBAgN,EAAexjB,KAAO4jB,EAAW,KAAKpN,EAAM,EAC5CgN,EAAevjB,KAAO2jB,EAAW,KAAKpN,EAAM,EAExCgN,EAAexjB,OAASwjB,EAAevjB,MAAgC,OAAxBujB,EAAexjB,OAC1DwjB,EAAexjB,KAAO,GACtBwjB,EAAexjB,MAAQ,IACvBwjB,EAAevjB,MAAQ,MAChBujB,EAAexjB,KAAO,GAC7BwjB,EAAexjB,MAAQ,KACvBwjB,EAAevjB,MAAQ,MAEvBujB,EAAexjB,MAAQ,EACvBwjB,EAAevjB,MAAQ,IAI3BsjB,GAAmBC,EAAe/e,OAAS+e,EAAehf,MAAgC,OAAxBgf,EAAe/e,MAAyC,OAAxB+e,EAAehf,KAAe,CAEhI,MAAMG,GAAY6e,EAAehf,KAAOgf,EAAe/e,MAAQ8e,EAC/DC,EAAe/e,MAAQE,EAAS,EAChC6e,EAAehf,MAAQG,EAAS,CACpC,CAEA,OAAO6e,CACX,CC7Ce,SAASK,GAAa/5B,EAAMg6B,EAASC,EAAa,CAAC,EAAGzhB,EAAW,EAAGJ,OAAS3b,GAKxF,QAJiBA,IAAb2b,IACAA,EAAWpY,EAAKxD,OAAS,GAGT,IAAhBwD,EAAKxD,OACL,OAAOy9B,EAAaC,aAAe,EAAI,CAAC,KAAM,MAGlD,MAAMC,EAAc9hB,KAAKsG,OAAOnG,EAAaJ,GAAU,GAEvD,GAAI4hB,IAAYh6B,EAAKm6B,GAAa,IAAOn6B,EAAKm6B,GAAa,aAAc9sB,MAAQrN,EAAKm6B,GAAa,GAAG1J,YAAcuJ,EAChH,OAAIC,EAAaC,YACNC,EAEAn6B,EAAKm6B,GAIpB,GAAI3hB,IAAeJ,EACf,OAAIpY,EAAKwY,GAAY,GAAKwhB,GAAuC,WAA5BC,EAAaG,YAEvCp6B,EAAKwY,GAAY,GAAKwhB,GAAuC,UAA5BC,EAAaG,WAD9CH,EAAaC,YAAc1hB,EAAaxY,EAAKwY,GAI7CyhB,EAAaC,aAAe,EAAI,CAAC,KAAM,MAItD,GAAI9hB,EAAW,IAAMI,EAAY,CAC7B,IAAItU,EAcJ,OAXIA,EAD4B,WAA5B+1B,EAAaG,WACL5hB,EAE2B,UAA5ByhB,EAAaG,YAIZ/hB,KAAK+J,IAAIpiB,EAAKwY,GAAY,GAAKwhB,GAAW3hB,KAAK+J,IAAIpiB,EAAKoY,GAAU,GAAK4hB,GAHvE5hB,EAKJI,EAGDyhB,EAAaC,YAAch2B,EAAQlE,EAAKkE,EACnD,CAEA,OAAI81B,EAAUh6B,EAAKm6B,GAAa,GACrBJ,GAAa/5B,EAAMg6B,EAASC,EAAcE,EAAa/hB,GAG9D4hB,EAAUh6B,EAAKm6B,GAAa,GACrBJ,GAAa/5B,EAAMg6B,EAASC,EAAczhB,EAAY2hB,QADjE,CAGJ,CCnBe,SAASE,IAAyB,KAAEr6B,EAAI,KAAEs6B,EAAI,KAAE3f,EAAI,KAAED,EAAI,sBAAE1Q,EAAqB,OAAEQ,IAC9F,IAAKxK,EAAKxD,QAAUwD,EAAKxD,QAAUme,EAAO3a,EAAKA,EAAKxD,OAAS,GAAG,IAAMwD,EAAKxD,QAAUke,EAAO1a,EAAK,GAAG,GAEhG,MAAO,CACHA,KAAM,CACF,CAAC2a,EAAM,MACP,CAACD,EAAM,OAEX6f,YAAY,EACZC,WAAW,GAKnB,IAcIrS,EAdA2E,EAAciN,GAAa/5B,EAAM2a,EAAM,CAAEyf,WAAY,SAAUF,aAAa,KAAW,EACvFnN,EAAagN,GAAa/5B,EAAM0a,EAAM,CAAE0f,WAAY,QAASF,aAAa,KAAW,EAKzF,KAJoB,IAAhBnN,IACAA,EAAa,GAGVD,GAAe,GAAK9sB,EAAK8sB,GAAa,IAAMnS,GAC/CmS,IAGJ,KAAOC,EAAa/sB,EAAKxD,QAAUwD,EAAK+sB,GAAY,IAAMrS,GACtDqS,IAIJ,IAAI0N,GAAe,EAEfF,GAAa,EACbC,GAAY,EAEZE,EAA8B5N,EAC9B6N,EAAwB5N,EAC5B,GAAI/iB,EAAuB,CACvB,KAAO0wB,GAA+B,GAA8C,OAAzC16B,EAAK06B,GAA6B,IACzEA,IAEJ,KAAOC,EAAwB36B,EAAKxD,QAA6C,OAAnCwD,EAAK26B,GAAuB,IACtEA,GAER,CAEA,GAAIL,EAAM,CAQN,GAPAnS,EAAkBmS,EAAKt6B,KACnBs6B,EAAKE,WACLrS,EAAgByS,MAEhBjgB,IAAS2f,EAAK3f,OACd8f,GAAe,GAEf3N,IAAgBwN,EAAKxN,YAAa,CAClC2N,GAAe,EACXH,EAAKC,YACLpS,EAAgB0S,QAEpB,IAAI32B,EAAQo2B,EAAKxN,YACjB,KAAO5oB,GAAS,GAAKikB,EAAgB3rB,QAAU2rB,EAAgB,GAAG,IAAMxN,GAC/D3Q,IAAyBhK,EAAKkE,GAAO,IAAyB,IAAnBlE,EAAKkE,GAAO,IACxDikB,EAAgBlO,QAAQja,EAAKkE,IAEjCA,IAEJ,KAAOA,EAAQlE,EAAKxD,QAAU2rB,EAAgB3rB,QAAU2rB,EAAgB,GAAG,GAAKxN,GAC5EwN,EAAgB0S,QAChB32B,GAER,CAMA,GAJI8F,IAA0BswB,EAAKtwB,wBAC/Bme,EAAkBA,EAAgB7B,QAAO,EAAEuS,EAAI1vB,KAAQA,WAGvD2jB,IAAgBwN,EAAKxN,aAAewN,EAAKC,WAAY,CACrDA,GAAa,EAEb,IAAIO,EAAqBhO,EAAc,EACvC,GAAI9iB,EACA,KAAO8wB,EAAqB96B,EAAKxD,QAA0C,OAAhCwD,EAAK86B,GAAoB,IAChEA,KAI6B,IAAjCJ,GAAsCvS,EAAgB3rB,OACtD2rB,EAAgB,GAAK,CAACxN,EAAM,MAExBnQ,GAAU2d,EAAgB3rB,OAC1B2rB,EAAgB,GAAK,CAACxN,EAAM3a,EAAK06B,GAA6B,IAE1DvS,EAAgB3rB,SAChB2rB,EAAgB,GAAK,CAACxN,EAAMogB,GAAY/6B,EAAM06B,EAA6BI,EAAoBngB,KAIvG3a,EAAK8sB,EAAc,GAAG,KAAO3E,EAAgB,GAAG,IAAMnoB,EAAK8sB,EAAc,GAAG,KAAO3E,EAAgB,GAAG,KACtGoS,GAAa,EAErB,CACA,IAAIS,EAAeV,EAAKvN,WACxB,GAAIuN,EAAKtwB,wBAA0BA,EAAuB,CACtD,IAAIixB,EAAYnO,EAAc,EAC1BoO,EAAgB,EAIpB,IAHIX,GACAW,IAEGA,GAAiB/S,EAAgB3rB,QAAUy+B,EAAYj7B,EAAKxD,QAAUy+B,EAAYlO,GACjF/sB,EAAKi7B,GAAW,IAAMvgB,GAA+B,OAAvB1a,EAAKi7B,GAAW,MAAiB9S,EAAgB+S,IAAkB/S,EAAgB+S,GAAe,KAAOl7B,EAAKi7B,GAAW,IAAM9S,EAAgB+S,GAAe,KAAOl7B,EAAKi7B,GAAW,MACnN9S,EAAgBzkB,OAAOw3B,EAAe,EAAGl7B,EAAKi7B,IAC1CA,GAAaD,IACbA,EAAeC,EAAY,IAGnCA,IACAC,GAER,CAEA,IAAIC,EAAYH,GAAgB,EAChC,KAAOG,EAAYn7B,EAAKxD,QAAUwD,EAAKm7B,GAAW,IAAMzgB,GAChD1a,EAAKm7B,GAAW,IAAMxgB,IACjB3Q,IAAyBhK,EAAKm7B,GAAW,IAA6B,IAAvBn7B,EAAKm7B,GAAW,IAChEhT,EAAgB9pB,KAAK2B,EAAKm7B,KAGlCA,IAEJ,KAAOhT,EAAgB3rB,QAAU2rB,EAAgBA,EAAgB3rB,OAAS,GAAG,GAAKke,GAC9EyN,EAAgByS,KAGxB,MACIzS,EAAkBnoB,EAAK1C,MAAMwvB,EAAc,EAAGC,GAC1C/iB,IACAme,EAAkBA,EAAgB7B,QAAO,EAAEuS,EAAI1vB,KAAQA,WAkB/D,GAdKgf,EAAgB3rB,SAGT2rB,EAFJ3d,EACIkwB,EAA8B,EACZ,CAAC,CAAC/f,EAAM,MAAO,CAACD,EAAM,OAEtB,CAAC,CAACC,EAAM3a,EAAK06B,GAA6B,IAAK,CAAChgB,EAAM1a,EAAK06B,GAA6B,KAG5F,CAAC,CAAC/f,EAAMogB,GAAY/6B,EAAM06B,EAA6BC,EAAuBhgB,IAAQ,CAACD,EAAMqgB,GAAY/6B,EAAM06B,EAA6BC,EAAuBjgB,KAEzL6f,GAAa,EACbC,GAAY,IAGXC,EAAc,CACf,IAAIK,EAAqBhO,EAAc,EACvC,GAAI9iB,EACA,KAAO8wB,EAAqB96B,EAAKxD,QAA0C,OAAhCwD,EAAK86B,GAAoB,IAChEA,IAIJ3S,EAAgB3rB,QAAU2rB,EAAgB,GAAG,GAAKxN,IAClD4f,GAAa,GACwB,IAAjCG,EACAvS,EAAgBlO,QAAQ,CAACU,EAAM,OAE3BnQ,EACA2d,EAAgBlO,QAAQ,CAACU,EAAM3a,EAAK06B,GAA6B,KAEjEvS,EAAgBlO,QAAQ,CAACU,EAAMogB,GAAY/6B,EAAM06B,EAA6BI,EAAoBngB,KAIlH,CAEA,GAAIwN,EAAgB3rB,QAAU2rB,EAAgBA,EAAgB3rB,OAAS,GAAG,GAAKke,EAAM,CACjF8f,GAAY,EAEZ,IAAIM,EAAqB/N,EAAa,EACtC,GAAI/iB,EACA,KAAO8wB,GAAsB,GAAqC,OAAhC96B,EAAK86B,GAAoB,IACvDA,IAIJH,IAA0B36B,EAAKxD,OAC/B2rB,EAAgB9pB,KAAK,CAACqc,EAAM,OAExBlQ,EACA2d,EAAgB9pB,KAAK,CAACqc,EAAMyN,EAAgBA,EAAgB3rB,OAAS,GAAG,KAExE2rB,EAAgB9pB,KAAK,CAACqc,EAAMqgB,GAAY/6B,EAAM86B,EAAoBH,EAAuBjgB,IAGrG,CAEA,GAA+B,IAA3ByN,EAAgB3rB,OAAc,CAC9B,IAAI4+B,EACAC,EACA7wB,GAEI4wB,EADAV,EAA8B,EACnB,CAAC/f,EAAM,MAEP,CAACA,EAAM3a,EAAK06B,GAA6B,IAExDW,EAAW,CAAC3gB,EAAMyN,EAAgB,GAAG,MAErCiT,EAAW,CAACzgB,EAAMogB,GAAY/6B,EAAM06B,EAA6B5N,EAAc,EAAGnS,IAClF0gB,EAAW,CAAC3gB,EAAMqgB,GAAY/6B,EAAM+sB,EAAa,EAAG4N,EAAuBjgB,KAE/EyN,EAAgBlO,QAAQmhB,GACxBjT,EAAgB9pB,KAAKg9B,GACrBd,GAAa,EACbC,GAAY,CAChB,CAEA,MAAO,CACHx6B,KAAMmoB,EACNxN,OACAD,OACAoS,cACAC,aACAwN,aACAC,YACAxwB,wBAGR,CAmBA,SAAS+wB,GAAY/6B,EAAMs7B,EAAYC,EAAaC,GAChD,GAAIF,EAAa,GAAKC,EAAc,EAChC,OAAO,KAGX,GAAID,GAAct7B,EAAKxD,QAAU++B,GAAev7B,EAAKxD,OACjD,OAAO,KAGX,GAAI8+B,IAAeC,EACf,OAAOv7B,EAAKs7B,GAAY,GAG5B,MAAOG,EAASC,GAAW17B,EAAKs7B,IACzBK,EAAQC,GAAU57B,EAAKu7B,GAE9B,GAAIC,IAAaC,GAAuB,OAAZC,EACxB,OAAOA,EAGX,GAAIF,IAAaG,GAAqB,OAAXC,EACvB,OAAOA,EAGX,GAAgB,OAAZF,GAA+B,OAAXE,EACpB,OAAO,KAGX,MAAMC,GAAWL,EAAWC,IAAUE,EAASF,GAC/C,OAAII,EAAU,GAAKA,EAAU,EAClB,KAGJA,GAASD,EAASF,GAAWA,CACxC,CC/Te,SAASI,IAAY,KAAE5lB,EAAI,KAAEC,EAAI,MAAEpK,IAe9C,MAdc,QAAVA,IACAoK,EAAOkC,KAAKsW,MAAMxY,GAIVD,EAFJA,GAAQ,EACJC,EAAO,GACCA,EAED,EAAEA,EAGNkC,KAAKsW,MAAMzY,IAInB,CACHA,OACAC,OAER,CC0Ee,SAAS4lB,IAA2B,KAAE/7B,EAAI,KAAEs6B,EAAI,YAAEhlB,EAAW,aAAEC,EAAY,KAAEoF,EAAI,KAAED,EAAI,KAAExE,EAAI,KAAEC,EAAI,MAAEpK,EAAK,YAAEiwB,IACnH1B,GAAQA,EAAKrkB,QAAQzZ,SAAW8Y,IAChCglB,EAAO,MAGX,MAAMxkB,EAAYwkB,GAAQA,EAAKxkB,UAAa,IAAIuL,WAAW/L,GAC3DQ,EAAS+B,KAAK,GACd,MAAM5B,EAAU,IAAIgmB,aAAa3mB,GAC3BU,EAAa,IAAIimB,aAAa3mB,GAC9BS,EAAa,IAAIkmB,aAAa3mB,GAE9B4mB,EAAeJ,GAAY,CAAE5lB,OAAMC,OAAMpK,UAIzCowB,EAAW,CAAEn8B,OAAMsV,cAAaC,eAAcoF,OAAMD,OAAMxE,KAHhEA,EAAOgmB,EAAahmB,KAGkDC,KAFtEA,EAAO+lB,EAAa/lB,KAEwDpK,SAE5E,IAAIqwB,EAASC,EAEb,GAAI9gB,KAAW,CACX,IAAI+gB,EAAiB,EAErB,MAAMC,EAAUjC,GAAQA,EAAK+B,cAAgB/B,EAAK8B,QAC5CI,GAAWR,GAAeO,GAAWjC,EAAK3f,OAASA,GAAQ2f,EAAK5f,MAAQA,GAAQ4f,EAAK99B,QAAUwD,EAAKxD,OAE1G,IAAKggC,GAAWlC,EAAK+B,aAAa7/B,OAASwD,EAAKxD,OAAQ,CACpD,MAAMigC,EAAmB,KACzBL,EAAU,IAAIH,aAAa5jB,KAAKsG,MAAkB,EAAZ3e,EAAKxD,OAASigC,IACpDJ,EAAe,IAAIhb,WAAWhJ,KAAKsG,MAAM3e,EAAKxD,OAAOigC,IAEjDD,IACAH,EAAatgB,IAAIue,EAAK+B,cACtBD,EAAQrgB,IAAIue,EAAK8B,SAEzB,MACIA,EAAU9B,EAAK8B,QACfC,EAAe/B,EAAK+B,aAGpBG,IACAF,EAAiBjkB,KAAKK,IAAI4hB,EAAK99B,OAAS,EAAG,IAG/C,IAAK,IAAIF,EAAIggC,EAAgBhgC,EAAI0D,EAAKxD,OAAQF,IAC1C8/B,EAAQ,EAAE9/B,GAAK0D,EAAK1D,GAAG,GACvB8/B,EAAQ,EAAE9/B,EAAI,GAAK0D,EAAK1D,GAAG,GAER,OAAf0D,EAAK1D,GAAG,GACR+/B,EAAa//B,GAAK,EAElB+/B,EAAa//B,GAAK,EAG1Bif,KAAUmhB,+BAA+B18B,EAAKxD,OAAQ4/B,EAASC,EAAcF,EAAUrmB,EAAUG,EAASD,EAAYD,EAC1H,MAvJJ,UAA2C,KAAE/V,EAAI,YAAEsV,EAAW,aAAEC,EAAY,KAAEoF,EAAI,KAAED,EAAI,KAAExE,EAAI,KAAEC,EAAI,MAAEpK,IAAS,SAAE+J,EAAQ,QAAEG,EAAO,WAAED,EAAU,WAAED,IAC5I,IAAIzZ,EAAI,EACJqgC,EAAQrgC,EAAI,EAEhB,IAAK,IAAIijB,EAAS,EAAGA,EAASjK,EAAaiK,IAAU,CAEjD,MAAMlW,EAAKkW,GAAQjK,EAAc,IAAKoF,EAAOC,GAAQA,EAGrD,IAAIiiB,EAAW,KACXC,EAAW,KAUf,IARIvgC,EAAI,GAAKA,GAAK0D,EAAKxD,QAA6B,OAAnBwD,EAAK1D,EAAI,GAAG,IACzCA,IAGAA,EAAI0D,EAAKxD,OAAS,GAAKwD,EAAK1D,EAAI,GAAG,GAAK+M,GACxC/M,IAGIA,EAAI0D,EAAKxD,OAAS,GAAKwD,EAAK1D,EAAI,GAAG,GAAK+M,EAAG/M,IAAK,CACpD,MAAMwgC,EAAO98B,EAAK1D,GAAG,GAER,OAATwgC,KAIa,OAAbF,GAAqBE,EAAOF,KAC5BA,EAAWE,IAGE,OAAbD,GAAqBC,EAAOD,KAC5BA,EAAWC,GAEnB,CAMA,GAJA9mB,EAAWuJ,GAAuB,OAAbqd,EAAoB,EAAIrnB,GAAc,IAAgB,QAAVxJ,EAAkBsM,KAAKsW,MAAMiO,GAAYA,GAAY1mB,IAAOC,EAAOD,IACpIH,EAAWwJ,GAAuB,OAAbsd,EAAoB,EAAItnB,GAAc,IAAgB,QAAVxJ,EAAkBsM,KAAKsW,MAAMkO,GAAYA,GAAY3mB,IAAOC,EAAOD,IAGhI5Z,GAAK0D,EAAKxD,OAAS,GAAoB,OAAfwD,EAAK1D,GAAG,IAAkC,OAAnB0D,EAAK1D,EAAI,GAAG,GAAa,CACxE,MAAM6M,EAAI7M,GAAK0D,EAAKxD,OAAS,EAAI,KAAOwD,EAAK1D,GAAG,GAEhDwZ,EAASyJ,GAAkB,OAANpW,GAAmC,OAAbyzB,IAAsB,GAAoB,OAAbC,IAAsB,EAC9F5mB,EAAQsJ,GAAgB,OAANpW,EAAa,EAAIoM,GAAc,IAAgB,QAAVxJ,EAAkBsM,KAAKsW,MAAMxlB,GAAKA,GAAK+M,IAAOC,EAAOD,IAE5G5Z,IAEA,QACJ,CAGA,MAAOm/B,EAASC,GAAW17B,EAAK1D,IACzBq/B,EAAQC,GAAU57B,EAAK1D,EAAI,GAGlC,IAAI6M,GADaE,EAAIoyB,IAAYE,EAASF,IACvBG,EAASF,GAAWA,EAGnCiB,IAAUrgC,IACV6M,EAAIuyB,GAeRzlB,EAAQsJ,GAAgB,OAANpW,EAAa,EAAIoM,GAAc,IAAgB,QAAVxJ,EAAkBsM,KAAKsW,MAAMxlB,GAAKA,GAAK+M,IAAOC,EAAOD,IAC5GJ,EAASyJ,GAAkB,OAANpW,GAAmC,OAAbyzB,IAAsB,GAAoB,OAAbC,IAAsB,EAE9FF,EAAQrgC,CACZ,CACJ,CAwEQygC,CAAkCZ,EAAU,CAAErmB,WAAUG,UAASD,aAAYD,eAGjF,MAAO,CACHD,WACAG,UACAD,aACAD,aACAqmB,UACAC,eACA1hB,OACAD,OACAle,OAAQwD,EAAKxD,OAErB,CCjKe,SAASwgC,GAAkBhtB,GAAY,OAACnE,EAAM,YAAEuc,IAC3D,MAAM6U,EAAY,GAClB,IAAIC,EAAK,EAET,IAAK,IAAI/hB,KAASnL,EAAY,CAC1B,MAAMwX,EAAS2V,GAAchiB,EAAOtP,GAEpC,GAAIA,EAAOjC,MAAQ9L,MAAMC,QAAQypB,GAAS,CACtC,IAAK,IAAI8Q,KAAYnd,EAAMtP,EAAOjC,MAAO,CACrC,GAAIiC,EAAO7B,uBAA0D,iBAA1BsuB,EAASzsB,EAAOjC,QAAuB9L,MAAMC,QAAQu6B,GAC5F,SAGJ,MAAMjvB,EAAI+e,EAAY8U,KAAM,GAExBrxB,EAAOrB,QAAUyyB,EAAUzgC,OAAS,GACpCygC,EAAU5+B,KAAK,CAACgL,EAAG4zB,EAAUA,EAAUzgC,OAAS,GAAG,KAGvDygC,EAAU5+B,KAAK,CAACgL,EAAGivB,GACvB,CAEA,QACJ,CAEA,GAAIzsB,EAAO7B,uBAAyB,MAACwd,EACjC,SAGJ,MAAMne,EAAI+e,EAAY8U,KAAM,GAExBrxB,EAAOrB,QAAUyyB,EAAUzgC,OAAS,GACpCygC,EAAU5+B,KAAK,CAACgL,EAAG4zB,EAAUA,EAAUzgC,OAAS,GAAG,KAGvDygC,EAAU5+B,KAAK,CAACgL,EAAG8R,GACvB,CAMA,OAJI8hB,EAAUzgC,SAAW4rB,EAAY5rB,QACjC0U,QAAQmW,KAAK,kEAGV4V,CACX,CAEO,SAASE,GAAchiB,EAAOtP,GACjC,OAAIA,EAAOjC,KACAuR,EAAMtP,EAAOjC,MAGpB9L,MAAMC,QAAQod,GACO,IAAjBA,EAAM3e,OACC2e,EAAM,GAENA,EAAM,GAIdA,CACX,CAEO,SAASiiB,GAAcjiB,EAAOtP,GACjC,OAAIA,EAAOlC,KACAwR,EAAMtP,EAAOlC,MAGpB7L,MAAMC,QAAQod,GACPA,EAAM,GAGVA,CACX,CC4IO,SAASkiB,IAAY,OAAE7H,EAAM,OAAEC,EAAM,OAAEnf,GAAU0d,GACpD,MAAM,EAAE3qB,EAAC,EAAEF,GAAM6qB,EAEXjoB,EAAQioB,EAAQnoB,OAAOxB,KAAK0B,MAC5BwO,EAASyZ,EAAQnoB,OAAOxB,KAAKyd,eAC7B,KAAE5R,EAAI,KAAEC,GAAS2lB,GAAY,IAAIvhB,EAAQxO,UAEzCwT,GAAUlW,EAAIkR,EAAOI,OAAOJ,EAAOG,KAAOH,EAAOI,MAAQrE,EAAOlB,aAChEoK,GAAU,IAAgB,QAAVzT,EAAkBsM,KAAKsW,MAAMxlB,GAAKA,GAAK+M,IAAOC,EAAOD,IAASI,EAAOjB,cAErFioB,EAAWjlB,KAAKklB,MAAMhe,EAASiW,IAAS,GAAKhW,EAASiW,IAAS,GAC/D+H,EAAYnlB,KAAK+J,IAAI7C,EAASiW,GAEpCvuB,OAAO0yB,OAAO3F,EAAS,CACnByJ,WAAYnnB,EAAOlB,aACnBmK,OAAQA,EACRC,OAAQsP,MAAMtP,GAAUlJ,EAAOjB,cAAc,EAAImK,EACjDge,YACAF,YAER,CVnLA5H,GAAYjC,UAAY,CACpBqC,YAAavzB,IAAAA,MAAgB,CACzB8G,EAAG9G,IAAAA,OACH4G,EAAG5G,IAAAA,OACHwzB,QAASxzB,IAAAA,KACT4F,MAAO5F,IAAAA,UAAoB,CACvBA,IAAAA,WAAqB8K,MACrB9K,IAAAA,OACAA,IAAAA,WAELtB,YWvEP,MAwCA,GAxC0B,CACtBuG,IAAKA,OACLk2B,WAAatW,IACT,GAAKA,EAAauJ,MAIlB,MAAO,CACHhW,KAAMtC,KAAKK,IAAI,IAAIrL,KAAK+Z,EAAa1M,MAAM+V,UAAY,IAASrJ,EAAazM,MAChF,EAELgjB,cAAgBvW,IACZ,GAAKA,EAAauJ,MAIlB,MAAO,CACHhW,KAAMtC,KAAKK,IAAI,IAAIrL,KAAK+Z,EAAa1M,MAAM+V,UAAY,IAAYrJ,EAAazM,MACnF,EAELijB,SAAWxW,IACP,GAAKA,EAAauJ,MAIlB,MAAO,CACHhW,KAAMtC,KAAKK,IAAI,IAAIrL,KAAK+Z,EAAa1M,MAAM+V,UAAY,KAAYrJ,EAAazM,MACnF,EAELkjB,QAAUzW,IACN,GAAKA,EAAauJ,MAIlB,MAAO,CACHhW,KAAMtC,KAAKK,IAAI,IAAIrL,KAAK+Z,EAAa1M,MAAM+V,UAAY,MAAerJ,EAAazM,MACtF,GCpBM,SAASmjB,IAAkB,KAAE99B,EAAI,KAAEs6B,EAAI,KAAE3f,EAAI,KAAED,EAAI,YAAEpF,EAAW,YAAE0mB,IAC7E,MAAM+B,EAjBgB,EAiBIzoB,EAI1B,IAAI0oB,EAgBJ,IAlBiBhC,GAAe1B,GAAQA,EAAK3f,OAASA,GAAQ2f,EAAK5f,MAAQA,GAAQ4f,EAAK99B,QAAUwD,EAAKxD,QAInGwhC,EAAyB1D,EAAKt6B,KAE1BA,EAAKxD,OAAS89B,EAAK99B,SAEfwD,EAAKxD,OAAS,GAAKwhC,EAAuBxhC,OAAS,IACnDwhC,EAAuBA,EAAuBxhC,OAAS,GAAKwD,EAAKs6B,EAAK99B,OAAS,IAGnFwhC,EAAyBA,EAAuBh/B,OAAOgB,EAAK1C,MAAMg9B,EAAK99B,WAG3EwhC,EAAyB,IAAIh+B,GAG7Bg+B,EAAuBxhC,OAASuhC,EAAoBE,EACpD,MAAO,CACHj+B,KAAMg+B,EACNrjB,OACAD,OACAle,OAAQwD,EAAKxD,QAIrB,MAAM0hC,EAAgB,GAChBC,GAAczjB,EAAOC,GAAMojB,EACjC,IAAIK,EAAc,KACdC,EAAc,KACdC,EAAqB,EAGrBt+B,EAAKxD,QACL0hC,EAAc7/B,KAAK2B,EAAK,IAG5B,IAAK,IAAImpB,KAAS6U,EAAwB,CACtC,MAAO30B,EAAGF,GAAKggB,EAEf,GAAU,OAANhgB,EACA,SAGJ,MAAMo1B,EAAclmB,KAAKsG,OAAOtV,EAAIsR,GAAMwjB,GAEtCI,IAAgBD,IACZF,GAAeC,IACXD,IAAgBC,EACZH,EAAcA,EAAc1hC,OAAS,KAAO4hC,GAC5CF,EAAc7/B,KAAK+/B,GAEhBA,EAAY,GAAKC,EAAY,GACpCH,EAAc7/B,KAAKggC,EAAaD,GAEhCF,EAAc7/B,KAAK+/B,EAAaC,IAIxCD,EAAc,KACdC,EAAc,KACdC,EAAqBC,KAGpBH,GAAej1B,EAAIi1B,EAAY,MAChCA,EAAcjV,KAGbkV,GAAel1B,EAAIk1B,EAAY,MAChCA,EAAclV,EAEtB,CAiBA,OAfIiV,GAAeC,IACXD,IAAgBC,EAChBH,EAAc7/B,KAAK+/B,GACZA,EAAY,GAAKC,EAAY,GACpCH,EAAc7/B,KAAKggC,EAAaD,GAEhCF,EAAc7/B,KAAK+/B,EAAaC,IAKpCr+B,EAAKxD,QAAU,GAAKwD,EAAKA,EAAKxD,OAAS,KAAO4hC,GAAep+B,EAAKA,EAAKxD,OAAS,KAAO6hC,GACvFH,EAAc7/B,KAAK2B,EAAKA,EAAKxD,OAAS,IAGnC,CACHwD,KAAMk+B,EACNvjB,OACAD,OACAle,OAAQwD,EAAKxD,OAErB,CC3Ge,SAASgiC,GAAcvX,EAAc/iB,GAChD,IAAInD,EAAOkmB,EAAalmB,MAAQkmB,EAAard,KAM7C,OAJK7I,IACDA,EAAOmD,EAAMvF,YAGVoC,CACX,CCfO,SAAS09B,IAA+B,KAAEz+B,EAAI,WAAE2K,EAAU,KAAEgQ,EAAI,KAAED,IACrE,IAAK/P,EACD,OAAO,KAGX,MAAM+zB,EAAa,GACnB,IAAK,IAAK33B,EAAKpK,KAAUsK,OAAOgnB,QAAQtjB,GAAa,CACjD,GAAqB,iBAAVhO,EAAoB,CAC3B,GAA+B,mBAApBA,EAAMgiC,UACb,MAAM,IAAI79B,MAAM,mCAAqCiG,EAAM,mCAG/D23B,EAAWrgC,KAAK4I,OAAO0yB,OAAO,CAC1B5yB,MACA63B,WAAY,SACZC,gBAAiB,MAClBliC,IACH,QACJ,CAEA,GAAY,SAARoK,EAAgB,CAChB23B,EAAWrgC,KAAK,CACZsgC,UAAYx1B,GAAY,OAANA,GAAcxM,EAChCA,QACAoK,MACA63B,WAAY,IACZC,gBAAiB,OAErB,QACJ,CAEA,MAAOD,EAAYz2B,GAASpB,EAAIxJ,MAAM,KACtC,IAAKqhC,IAAez2B,GAAS2mB,MAAM1xB,WAAW+K,IAC1C,MAAM,IAAIrH,MAAM,mCAAqCiG,GAGzD,MAAM+3B,EAAc1hC,WAAW+K,GAE/B,IAAIw2B,EACJ,GAAmB,MAAfC,EACAD,EAAax1B,GAAmB,iBAANA,GAAkBA,IAAM21B,GAAeniC,OAC9D,GAAmB,MAAfiiC,EACPD,EAAax1B,GAAmB,iBAANA,GAAkBA,EAAI21B,GAAeniC,OAC5D,GAAmB,MAAfiiC,EACPD,EAAax1B,GAAmB,iBAANA,GAAkBA,EAAI21B,GAAeniC,OAC5D,GAAmB,OAAfiiC,EACPD,EAAax1B,GAAmB,iBAANA,GAAkBA,GAAK21B,GAAeniC,MAC7D,IAAmB,OAAfiiC,EAGP,MAAM,IAAI99B,MAAM,mCAAqCiG,GAFrD43B,EAAax1B,GAAmB,iBAANA,GAAkBA,GAAK21B,GAAeniC,CAGpE,CAEA+hC,EAAWrgC,KAAK,CACZsgC,YACAhiC,QACAoK,MACA63B,aACAC,gBAAiBC,GAEzB,CAEA,MAAMrR,EAAoB,GAC1B,IAAIsR,EAAiB,KAErB,IAAK,IAAIziC,EAAI,EAAGA,EAAI0D,EAAKxD,OAAQF,IAAK,CAClC,IAAK+M,EAAGF,GAAKnJ,EAAK1D,GACd+M,aAAagE,OACbhE,EAAIA,EAAEonB,WAGV,IAAK,IAAIuO,KAAaD,EAAiB,CAACA,EAAeC,aAAcN,GAAcA,EAAY,CAC3F,MAAM/hC,EAAQqiC,EAAUL,UAAUx1B,GAElC,GAAI41B,EAAgB,CAChB,GAAIA,EAAepiC,QAAUA,EACzB,MAGJ,IAAIsiC,EAAmB51B,EACvB,GAAI/M,EAAI,EAAG,CACP,IAAK8f,EAAOhG,GAASpW,EAAK1D,EAAI,GAC1B8f,aAAiB/O,OACjB+O,EAAQA,EAAMqU,WAIdwO,EAD6C,OAA7CF,EAAeC,UAAUH,gBACNx1B,EACN,OAANF,EACYiT,EAEAA,GAAS4iB,EAAUH,gBAAkBzoB,IAAQjN,EAAIiN,IAAQ/M,EAAI+S,EAExF,CAEAqR,EAAkBpvB,KAAK,IAChB0gC,EACHrkB,KAAMukB,EACNrsB,OAAQqsB,EAAmBtkB,IAAOD,EAAOC,KAE7CokB,EAAiB,IACrB,CAEA,GAAIpiC,EAAO,CACP,IAAIuiC,EAAmB71B,EACvB,GAAI/M,EAAI,EAAG,CACP,IAAK8f,EAAOhG,GAASpW,EAAK1D,EAAI,GAC1B8f,aAAiB/O,OACjB+O,EAAQA,EAAMqU,WAIdyO,EAD8B,OAA9BF,EAAUH,gBACSziB,EACF,OAAVhG,EACY/M,EAEA+S,GAAS4iB,EAAUH,gBAAkBzoB,IAAQjN,EAAIiN,IAAQ/M,EAAI+S,EAExF,CAEA2iB,EAAiB,CACbpkB,KAAMukB,EACNvsB,OAAQusB,EAAmBvkB,IAAOD,EAAOC,GACzChe,QACAqiC,aAGJ,KACJ,CACJ,CACJ,CAUA,OARID,GACAtR,EAAkBpvB,KAAK,IAChB0gC,EACHrkB,KAAM1a,EAAKA,EAAKxD,OAAS,GAAG,GAC5BoW,OAAQ5S,EAAKA,EAAKxD,OAAS,GAAG,GAAKme,IAAOD,EAAOC,KAIlD,CACH3a,KAAMytB,EAEd,CCzHe,MAAM0R,WAAwBrwB,EAEzCC,WAAAA,EAAY,wBAAEqwB,EAAuB,sBAAEC,EAAqB,YAAEC,EAAW,4BAAEC,EAA2B,mBAAEC,EAAkB,uBAAEC,EAAsB,mBAAEC,EAAkB,SAAEC,EAAQ,UAAEC,EAAS,gBAAEC,EAAe,oBAAEC,EAAmB,WAAEC,IAC/N5a,QAEAvmB,KAAKohC,aAAeV,EAChBA,GACAjkB,GAAetS,MAAK,KAChBnK,KAAKqhC,YAAY,IAIzBrhC,KAAKshC,QAAU,GACfthC,KAAKuhC,0BAA4B,IAAIC,IAErCxhC,KAAKyhC,MAAQ,CACT,CACIx0B,OAAQ,GACRE,MAAO,SACPD,KAAM,OACNF,UAAW,IAGnBhN,KAAK0hC,mBAAqB,KAE1B1hC,KAAK2hC,sBAAwBhB,IAA+B,EAC5D3gC,KAAK4hC,aAAc,EACnB5hC,KAAK6hC,YAAc,IACnB7hC,KAAK8hC,qBAAuB,EAC5B9hC,KAAK+hC,gBAAkBjB,EACvB9gC,KAAKgiC,eAAgB,EACrBhiC,KAAKiiC,gBAAkBrB,IAAsB,EAC7C5gC,KAAKkiC,oBAAsBrB,IAA0B,EACrD7gC,KAAKmiC,WAAanB,EAClBhhC,KAAKoiC,YAAcjB,IAAc,EAEjCnhC,KAAKqiC,kBAAoB,IAAI5xB,IAC7BzQ,KAAKsiC,cAAgB,CACjBC,cAAc,EACd3L,OAAQ,EACRC,OAAQ,EACRrgB,aAAc,EACdC,cAAe,EACf0e,SAAU,IAEdn1B,KAAKwiC,qBAAuB,CACxB/3B,EAAG,EACHF,EAAG,EACH4sB,SAAS,EACT5tB,MAAO,MAEXvJ,KAAKyiC,eAAiB,GACtBziC,KAAK0iC,YAAa,EAClB1iC,KAAK2iC,aAAe,GACpB3iC,KAAK4iC,kBAAoB,CACrBpsB,aAAc,EACdqsB,YAAa,IAEjB7iC,KAAK8iC,SAAW,CAAC,EACjB9iC,KAAK+iC,WAAY,EAEjB/iC,KAAKgjC,cAAgB,GACrBhjC,KAAKijC,aAAe,EACpBjjC,KAAKkjC,kBAAoB,EAEzBljC,KAAKmjC,gBAAkB,IAAI1yB,IAC3BzQ,KAAKojC,mBAAqB,CAAC,EAC3BpjC,KAAKqjC,2BAA6B,CAAC,EACnCrjC,KAAKsjC,gBAAkB,KACvBtjC,KAAK6qB,mBAAqB,KAE1B7qB,KAAKujC,kBC3FE,SAAoCC,EAAYC,GAC3D,GAAIC,GAAkBF,GAClB,OAAOE,GAAkBF,GAG7B,IAAK,IAAI,MAAEp2B,EAAK,WAAEG,KAAgBk2B,EAC9B,GAAID,IAAep2B,EACf,OAAOG,EAIf,OAAOm2B,GAAkB96B,GAC7B,CD+EiC+6B,CAA2BnD,EAAyBC,GAC7EzgC,KAAK4jC,eAAiB,CAAC5jC,KAAKujC,mBAC5BvjC,KAAK6jC,aAAe,EAEpB7jC,KAAK8jC,WAAa7C,GAAmB,IAAIO,IACzCxhC,KAAK+jC,eAAiB7C,GAAuB,IAAIM,IACjDxhC,KAAKgkC,uBAAyB9C,EAC9BlhC,KAAKikC,qBAAuB,IAAIzC,IAChCxhC,KAAKkkC,YAAc,IAAIzzB,IACvBzQ,KAAKmkC,oBAAsB,IAAI3C,IAC/BxhC,KAAKokC,mBAAqB,IAAI5C,IAC9BxhC,KAAKqkC,2BAA6B,IAAI5zB,IAEtCzQ,KAAKskC,UAAYvD,EACb/gC,KAAKskC,WACLtkC,KAAKskC,UAAU5zB,IAAI1Q,MAGvBA,KAAKukC,eACT,CAEArmB,OAAAA,GAKI,GAJAle,KAAK8Q,KAAK,UAAW9Q,MAErBA,KAAKqQ,kBAEArQ,KAAKgkC,qBAAsB,CAC5B,IAAK,IAAIQ,KAAYxkC,KAAK+jC,eAAezL,SACrCkM,EAASC,cAEbzkC,KAAK+jC,eAAe5lB,OACxB,CAEA,IAAK,IAAIkK,KAAgBroB,KAAKshC,QAC1BthC,KAAK0kC,cAAcrc,GAGnBroB,KAAKskC,WACLtkC,KAAKskC,UAAUn/B,OAAOnF,MAG1BA,KAAK2kC,UAAW,CACpB,CAEAC,SAAAA,CAAU33B,GACN,MAAM43B,EAAa7kC,KAAKshC,QAAQ5Z,QAAQW,GAAiBA,EAAayc,cAChEC,EAAc/kC,KAAKshC,QAAQ5Z,QAAQW,IAAkBA,EAAayc,cAExE,GAAI73B,EAAOrP,SAAWmnC,EAAYnnC,OAAQ,CACtC,IAAIonC,GAAe,EACnB,IAAK,IAAItnC,EAAI,EAAGA,EAAIuP,EAAOrP,OAAQF,IAC/B,GAAIuP,EAAOvP,KAAOsC,KAAKshC,QAAQ5jC,GAAGunC,eAAgB,CAC9CD,GAAe,EACf,KACJ,CAGJ,IAAKA,EACD,MAER,MACIhlC,KAAKklC,YAAcllC,KAAKklC,aAAellC,KAAKoiC,YAGhD,MAAM+C,EAAe,IAAI10B,IAAIxD,GAC7B,IAAK,IAAIob,KAAgB0c,EAChBI,EAAaC,IAAI/c,EAAa4c,iBAC/BjlC,KAAK0kC,cAAcrc,GAI3BroB,KAAKshC,QAAQx8B,OAAO,GACpB,IAAK,IAAIpH,EAAI,EAAGA,EAAIuP,EAAOrP,OAAQF,IAAK,CACpC,MAAMunC,EAAiBh4B,EAAOvP,GAE9B,IAAI2qB,EAAeroB,KAAKuhC,0BAA0B/4B,IAAIy8B,GACjD5c,IACDA,EAAe,IACR4c,EACHA,kBAEJjlC,KAAKuhC,0BAA0BpkB,IAAI8nB,EAAgB5c,GAE/CA,EAAa1c,0BACb3L,KAAKqiC,kBAAkB3xB,IAAI2X,GAC3BroB,KAAKqlC,kBAAmB,EACxBrlC,KAAKslC,aAAa,4BAA6BtlC,KAAKqiC,qBAI5Dha,EAAa/iB,MAAQ5H,EACrBsC,KAAKshC,QAAQ7hC,KAAK4oB,GAClBroB,KAAKulC,cAAcld,GAEfA,EAAamd,QACbxlC,KAAKylC,YAAYpd,EAEzB,CAEA,IAAK,IAAI3qB,EAAI,EAAGA,EAAImnC,EAAWjnC,OAAQF,IAAK,CACxC,MAAM2qB,EAAewc,EAAWnnC,GAChC2qB,EAAa/iB,MAAQ5H,EAAIuP,EAAOrP,OAChCoC,KAAKshC,QAAQ7hC,KAAK4oB,EACtB,CAEAroB,KAAKslC,aAAa,iBAAkBtlC,KAAKshC,SAEzCthC,KAAK0lC,cAAe,EACpB1lC,KAAKqhC,YACT,CAEAA,UAAAA,GACI,GAAIrhC,KAAK2lC,gBACL,OAGJ,GAAI3lC,KAAKohC,eAAiBzkB,GACtB,OAGJ,MAAMipB,EAAoBC,YAAYpX,MACtCzuB,KAAK2lC,iBAAkB,EACvB/vB,uBAAsB,KAClB,GAAI5V,KAAK2kC,SACL,OAGJ,MAAMmB,EAAsBD,YAAYpX,MAElCsX,EAAsBF,YAAYpX,MACpCzuB,KAAK0lC,cACL1lC,KAAKukC,gBACLvkC,KAAKgmC,eAAgB,EACrBhmC,KAAKqlC,kBAAmB,EACxBrlC,KAAKimC,qBAAsB,GACpBjmC,KAAKmjC,gBAAgBtyB,MAC5B7Q,KAAKkmC,WAAWlmC,KAAKmjC,iBACrBnjC,KAAKgmC,eAAgB,EACrBhmC,KAAKqlC,kBAAmB,EACxBrlC,KAAKimC,qBAAsB,IAEvBjmC,KAAKmmC,sBACLnmC,KAAKomC,kCACLpmC,KAAKgmC,eAAgB,GAErBhmC,KAAKqmC,yBACLrmC,KAAKsmC,qCACLtmC,KAAKgmC,eAAgB,IAG7B,MAAMO,EAAoBV,YAAYpX,MAEhC+X,EAAsBX,YAAYpX,MACpCzuB,KAAKgmC,eACLhmC,KAAKymC,UAET,MAAMC,EAAoBb,YAAYpX,MAEhCkY,EAAkBd,YAAYpX,MAChCzuB,KAAK4mC,qBACL5mC,KAAK6mC,kBAET,MAAMC,EAAgBjB,YAAYpX,MAE5BsY,EAAelB,YAAYpX,MAC7BzuB,KAAKqlC,kBACLrlC,KAAKgnC,uBAET,MAAMC,EAAapB,YAAYpX,MAEzByY,EAAmBrB,YAAYpX,MACjCzuB,KAAKmnC,qBACLnnC,KAAKonC,0BAET,MAAMC,EAAiBxB,YAAYpX,MAE7B6Y,EAAkBzB,YAAYpX,MAChCzuB,KAAKimC,qBACLjmC,KAAKunC,0BAET,MAAMC,EAAgB3B,YAAYpX,MAE9BzuB,KAAKklC,cACLllC,KAAKsjC,gBAAgB3T,kBACrB3vB,KAAK6qB,oBAAsB7qB,KAAK6qB,mBAAmB8E,mBAGvD3vB,KAAK2lC,iBAAkB,EACvB3lC,KAAKgmC,eAAgB,EACrBhmC,KAAK0lC,cAAe,EACpB1lC,KAAKmmC,qBAAsB,EAC3BnmC,KAAKqmC,wBAAyB,EAC9BrmC,KAAKmjC,gBAAgBhlB,QACrBne,KAAKqkC,2BAA2BlmB,QAChCne,KAAKqlC,kBAAmB,EACxBrlC,KAAKmnC,qBAAsB,EAC3BnnC,KAAKimC,qBAAsB,EAC3BjmC,KAAK4mC,qBAAsB,EAC3B5mC,KAAKklC,aAAc,EAEnB,MAAMuC,EAAiB5B,YAAYpX,MACnC,IAAK,IAAIiZ,IAAY,IAAIr/B,OAAOiwB,OAAOt4B,KAAKqjC,+BAAgCh7B,OAAOiwB,OAAOt4B,KAAKojC,qBAC3FpjC,KAAK8Q,QAAQ42B,GAEjB,MAAMC,EAAe9B,YAAYpX,MACjCzuB,KAAKojC,mBAAqB,CAAC,EAC3BpjC,KAAKqjC,2BAA6B,CAAC,EAEnC,MAAMuE,EAAiB/B,YAAYpX,MAC7BoZ,EAAW,CACbC,eAAgBF,EAAiB9B,EACjCiC,yBAA0BH,EAAiBhC,EAC3CoC,WAAYlB,EAAgBH,EAC5BsB,eAAgB1B,EAAoBR,EACpCmC,eAAgBxB,EAAoBF,EACpCrR,SAAU8R,EAAaF,EACvB7P,YAAamQ,EAAiBH,EAC9BrE,YAAa2E,EAAgBF,EAC7Ba,UAAWR,EAAeF,GAE9BznC,KAAKooC,aAAeP,EAChB7nC,KAAKkjC,oBACDljC,KAAKgjC,cAAcplC,OAASoC,KAAKkjC,kBACjCljC,KAAKgjC,cAAcvjC,KAAKooC,GAExB7nC,KAAKgjC,cAAchjC,KAAKijC,aAAejjC,KAAKkjC,mBAAqB2E,EAErE7nC,KAAKijC,gBAETjjC,KAAK8Q,KAAK,cAAe82B,EAAiB9B,EAAqB+B,EAAS,GAEhF,CAEAvC,YAAAA,IAAgBv0B,GACZ/Q,KAAKojC,mBAAmBryB,EAAK,IAAMA,CACvC,CAEAs3B,oBAAAA,IAAwBt3B,GACpB/Q,KAAKqjC,2BAA2BtyB,EAAK,IAAMA,CAC/C,CAEAu3B,mBAAAA,CAAoBjgB,GAChB,MAAMvd,EAAOoG,EAAUmX,GACvB,GAAI3d,EAAkB4lB,SAASxlB,GAC3B,OAAOud,EAAajnB,KAIxB,IAAImnC,EAAcvoC,KAAK8jC,WAAWt7B,IAAI6f,EAAajnB,MAEnD,GAAImnC,GAAevoC,KAAKqkC,2BAA2Be,IAAI/c,EAAajnB,MAChE,OAAOmnC,EASX,GANKA,IACDA,EAAc,GACdvoC,KAAK8jC,WAAW3mB,IAAIkL,EAAajnB,KAAMmnC,GACvClgB,EAAajX,WAAam3B,GAGjB,sBAATz9B,GAAyC,qBAATA,EAA6B,CAC7D,IAAI09B,EAAcxoC,KAAKikC,qBAAqBz7B,IAAI6f,EAAajnB,MAC7D,GAAIonC,EAAa,CACb,MAAMC,EAAsBD,EAAYlQ,SAASoQ,OAAOn/B,MAExD,GADAg/B,EAAcE,EAAoBr3B,YAC7Bm3B,EACD,MAAM,IAAIrmC,MAAO,6BAA4BumC,EAAoBtmC,MAAQsmC,EAAoBz9B,MAAQy9B,EAAoBrnC,QAE7HpB,KAAK8jC,WAAW3mB,IAAIkL,EAAajnB,KAAMmnC,GACvClgB,EAAajX,WAAam3B,CAC9B,MACIC,EAAc,IAAI/3B,IAClB4X,EAAajX,WAAam3B,EAC1BvoC,KAAKikC,qBAAqB9mB,IAAIkL,EAAajnB,KAAMonC,GAGrDA,EAAY93B,IAAI2X,GAEhBroB,KAAK2oC,wBAAwB,CACzBC,WAAYvgB,EAAajnB,KACzBmnC,eAER,CAgBA,MAda,cAATz9B,IACK9K,KAAKmkC,oBAAoBiB,IAAI/c,EAAajnB,OAC3CpB,KAAKmkC,oBAAoBhnB,IAAIkL,EAAajnB,KAAM,IAAIqP,KAGxDzQ,KAAKmkC,oBAAoB37B,IAAI6f,EAAajnB,MAAMsP,IAAI2X,GAE/CroB,KAAKkkC,YAAYkB,IAAI/c,EAAajnB,QACnCpB,KAAKkkC,YAAYxzB,IAAI2X,EAAajnB,MAClCpB,KAAK6oC,eAAexgB,EAAajnB,QAKlCmnC,CACX,CAEAO,gBAAAA,CAAiBzgB,EAAc0gB,GAC3BA,EAAY5+B,MAAM6+B,IACdhpC,KAAK8jC,WAAW3mB,IAAIkL,EAAajnB,KAAM4nC,GACvC3gB,EAAajX,WAAa43B,EAC1BhpC,KAAKqkC,2BAA2B3zB,IAAI2X,EAAajnB,MACjDpB,KAAK0lC,cAAe,EACpB1lC,KAAKqhC,YAAY,GAEzB,CAEAsH,uBAAAA,EAAwB,WAAEC,EAAU,YAAEL,IAClC,GAAIvoC,KAAK+jC,eAAeqB,IAAIwD,GACxB,OAEJ5oC,KAAK+jC,eAAe5mB,IAAIyrB,GAAY,GAGpC,MAAMpE,EAAWoE,EAAWv3B,SAASkL,IACjC,GAAIrd,MAAMC,QAAQod,GACd,IAAK,IAAI0sB,KAAS1sB,EACdgsB,EAAY9oC,KAAKwpC,QAGrBV,EAAY9oC,KAAK8c,GAGrBvc,KAAK8Q,KAAK,sBAAuB83B,GAEjC5oC,KAAKkpC,uBAAuBN,EAAW,IAE3C5oC,KAAK+jC,eAAe5mB,IAAIyrB,EAAYpE,EACxC,CAEA0E,sBAAAA,CAAuBN,GACnB,GAAK5oC,KAAKikC,qBAAqBmB,IAAIwD,GAAnC,CAIA,IAAK,IAAIvgB,KAAgBroB,KAAKikC,qBAAqBz7B,IAAIogC,GACnD5oC,KAAKmjC,gBAAgBzyB,IAAI2X,GAE7BroB,KAAKqhC,YALL,CAMJ,CAEA8H,2BAAAA,GACI,MAAMC,EAAgB,IAAI34B,IAAIzQ,KAAKshC,SACnC,IAAK,IAAKsH,EAAYS,KAAcrpC,KAAKikC,qBAAsB,CAC3D,IAAIqF,GAAmB,EAEvB,IAAK,IAAIjhB,KAAgBghB,EACrB,GAAID,EAAchE,IAAI/c,GAAe,CACjCihB,GAAmB,EACnB,KACJ,CAGCA,IACDtpC,KAAK+jC,eAAev7B,IAAIogC,GAAYnE,cACpCzkC,KAAK+jC,eAAenzB,OAAOg4B,GAC3B5oC,KAAKikC,qBAAqBrzB,OAAOg4B,GAEzC,CAEA,IAAK,IAAKW,EAAWF,KAAerpC,KAAKmkC,oBAAqB,CAC1D,IAAIqF,GAAiB,EAErB,IAAK,IAAInhB,KAAgBghB,EACrB,GAAID,EAAchE,IAAI/c,GAAe,CACjCmhB,GAAiB,EACjB,KACJ,CAGCA,IACDxpC,KAAKmkC,oBAAoBvzB,OAAO24B,GAChCvpC,KAAKkkC,YAAYtzB,OAAO24B,GACxBvpC,KAAKokC,mBAAmBxzB,OAAO24B,GAEvC,CACJ,CAEA,oBAAMV,CAAeU,GACjB,MAAM/qB,EAAa,CACfzC,KAAM/b,KAAK+qB,WAAWhP,KACtBD,KAAM9b,KAAK+qB,WAAWjP,KACtBpE,OAAQ1X,KAAKsjC,gBAAgB5rB,QAGjC,GElewCpZ,EFkeyBkgB,OEje3D3gB,KAD+BU,EFkeZyB,KAAKokC,mBAAmB57B,IAAI+gC,UEje5B1rC,IAANS,EACZC,IAAMD,EAGTC,EAAEwd,OAASzd,EAAEyd,MAChBxd,EAAEud,OAASxd,EAAEwd,MACbvd,EAAEmZ,OAAOlB,eAAiBlY,EAAEoZ,OAAOlB,cACnCjY,EAAEmZ,OAAOhB,cAAgBpY,EAAEoZ,OAAOhB,YF2d/B,OEneG,IAA8BnY,EAAGD,EFqexC0B,KAAKokC,mBAAmBjnB,IAAIosB,EAAW/qB,GAIvC,MAAMpd,QAAauH,QAAQ0B,QAAQk/B,EAAU/qB,IAG7C,GAAKpd,GAKApB,KAAKmkC,oBAAoBiB,IAAImE,GAOlC,GAHAvpC,KAAK0lC,cAAe,EACpB1lC,KAAKqhC,aAEuB,mBAAjBjgC,EAAKiQ,QAAwB,CACpC,MAAMk3B,EAAc,GACpBvoC,KAAK8jC,WAAW3mB,IAAIosB,EAAWhB,GAC/B,IAAK,IAAIlgB,KAAgBroB,KAAKmkC,oBAAoB37B,IAAI+gC,GAClDlhB,EAAajX,WAAam3B,EAG9B,IAAK,IAAIlgB,KAAgBroB,KAAKmkC,oBAAoB37B,IAAI+gC,GAC7CvpC,KAAKikC,qBAAqBmB,IAAIhkC,IAC/BpB,KAAKikC,qBAAqB9mB,IAAI/b,EAAM,IAAIqP,KAG5CzQ,KAAKikC,qBAAqBz7B,IAAIpH,GAAMsP,IAAI2X,GAG5CroB,KAAK2oC,wBAAwB,CACzBC,WAAYxnC,EACZmnC,eAER,KAAO,CACHvoC,KAAK8jC,WAAW3mB,IAAIosB,EAAWnoC,GAC/B,IAAK,IAAIinB,KAAgBroB,KAAKmkC,oBAAoB37B,IAAI+gC,GAClDlhB,EAAajX,WAAahQ,CAElC,CACJ,CAEAylC,eAAAA,GACI,IAAK,IAAI0C,KAAavpC,KAAKkkC,YACvBlkC,KAAK6oC,eAAeU,EAE5B,CAEAvC,oBAAAA,GACShnC,KAAKsjC,iBAAoBtjC,KAAKsjC,gBAAgB5rB,SAInD1X,KAAKsiC,cLxgBE,UAA+B,aAACC,EAAY,OAAE3L,EAAM,OAAEC,EAAM,OAAEnf,EAAM,OAAEzK,EAAM,iBAAEw8B,EAAgB,cAAEC,EAAa,cAAEC,EAAa,eAAEjuB,IAEzIguB,EAAgBA,EAAchiB,QAAQ0N,GAAYA,EAAQnoB,OAAOxB,OAEjE,IAAK,IAAIm+B,KAAgBF,EACrBjL,GAAY,CAAE7H,SAAQC,SAAQnf,UAASkyB,GAG3C,IAAKrH,EACD,MAAO,CACH3L,SACAC,SACArgB,aAAckB,EAAOlB,aACrBC,cAAeiB,EAAOjB,cACtB0e,SAAU,IAAIuU,IAItB,MAAMvU,EAAW,GAEjB,IAAI0U,EAAcC,IAElB,IAAK,IAAIpsC,EAAI,EAAGA,EAAIuP,EAAOrP,OAAQF,IAAK,CACpC,MAAM2qB,EAAepb,EAAOvP,GAE5B,GAAI2qB,EAAamd,OACb,SAGJ,MAAM/5B,EAAO4c,EAAa5c,KAEpB0B,EAAQ1B,EAAK0B,MACbwO,EAASlQ,EAAKyd,eACd,KAAE5R,EAAI,KAAEC,GAAS2lB,GAAY,IAAIvhB,EAAQxO,UAEzC48B,EAAQnT,EAAOlf,EAAOlB,cAAgBmF,EAAOG,KAAOH,EAAOI,MAAQJ,EAAOI,KAEhF,IAAI3a,EAAOinB,EAAamB,YAKxB,GAJInB,EAAajd,wBACbhK,EAAOA,EAAKsmB,QAAQ6C,GAA8B,iBAAbA,EAAM,MAG3B,IAAhBnpB,EAAKxD,OACL,SAGJ,IAAIosC,EAAW5oC,EAAK,GAAG,GACnB6oC,EAAW7oC,EAAKA,EAAKxD,OAAS,GAAG,GAEjCosC,aAAoBv7B,OACpBu7B,EAAWA,EAAS9pB,WAEpB+pB,aAAoBx7B,OACpBw7B,EAAWA,EAAS/pB,WAGxB,MACMgqB,EAAU,EAEhB,GAAIH,EAAQC,EAAWE,GAAWH,EAAQE,EAAWC,EACjD,SAGJ,MAAMC,EAAehP,GAAa/5B,EAAM2oC,EAAO,CAAEzO,aAAa,IACxD8O,EAAehpC,EAAK+oC,GAE1B,IAAKC,EACD,SAGJ,MAAO3/B,EAAGF,GAAK6/B,EAEf,GAAU,OAAN3/B,EACA,SAGJ,IAAIkW,GAAUlW,EAAIkR,EAAOI,OAAOJ,EAAOG,KAAOH,EAAOI,MAAQrE,EAAOlB,aACpE,MAAMoK,GAAU,IAAgB,QAAVzT,EAAkBsM,KAAKsW,MAAMxlB,GAAKA,GAAK+M,IAAOC,EAAOD,IAASI,EAAOjB,cAE3F,GAAImK,EAASlJ,EAAOjB,eAAiBmK,EAAS,EAC1C,SAGJ,MAAMypB,EAAuBZ,EAAiBrE,IAAI/c,IAAiBshB,EACnE,IAAIW,EApGe,GAqGfC,EArGe,GAsGfC,EAtGe,GAwGnB,GAA+B,QAA3BniB,EAAalc,UAAqB,CAClC,MAAMue,EAAcrC,EAAa5c,KAAKwB,OAAO0d,QAAQtC,GAC/CzM,EAAkByM,EAAa5c,KAAKwB,OAAOrP,QAE3C,cAAEoe,EAAa,SAAEC,GAAaR,EAAa,CAC7CC,iBACAC,SACAjE,SACAkE,oBAKJ+E,GAAU3E,EAAc,EAAEtE,EAAOnB,WACjCoK,GAAW1E,GAAUyO,EAAc,IAAMhT,EAAOnB,WAEhD+zB,EAAqBruB,EAAS,EAAEvE,EAAOnB,WACvCg0B,EAAqB,IACrBC,EAAoBF,EAAqBC,CAC7C,CAEA,MAAM3L,EAAYnlB,KAAK+J,IAAI7C,EAASiW,GAC9B6T,EAAYhxB,KAAK+J,IAAI5C,EAASiW,GAC9B6H,EAAWjlB,KAAKklB,KAAMC,GAAY,GAAKhe,EAASiW,IAAS,GAE/D,IAAKwT,IAAyBzL,EAAY0L,GAAsBG,EAAYF,GAAsB7L,EAAW8L,GACzG,SAGJ,IAAIt/B,EAAQC,EAEZ,MAAMiG,EAAaiX,EAAajX,YAAciX,EAAajnB,KAErDspC,EAAWt5B,EAAWxT,UAAYyqB,EAAasiB,QACrD,GAAItiB,EAAand,QAAUmd,EAAald,QAAUu/B,EAAU,CACxD,IAAIE,EAGAA,EADAx5B,EAAWxT,SAAWwD,EAAKxD,OACbwT,EAAW+4B,GAEH/L,GAAkBhtB,EAAY,CAAEnE,OAAQob,EAAcmB,YAAapoB,IAE7D+oC,GAAc,GAG1C9hB,EAAand,OACbA,EAAS0/B,EAAYviB,EAAand,QAC3Bmd,EAAawiB,WACpB3/B,EAASszB,GAAcoM,EAAaviB,IAGpCA,EAAald,OACbA,EAASy/B,EAAYviB,EAAald,QAC3Bu/B,IACPv/B,EAASozB,GAAcqM,EAAaviB,GAE5C,CAEIqW,EAAWmL,IACXA,EAAcnL,GAGlB,IAAI3gC,GAAQP,EAAAA,EAAAA,SAAS6qB,EAAatqB,MAAOL,EAAG2qB,EAAa1qB,yBACrD4M,EAAI,GAAK8d,EAAajc,cACtBrO,EAAQsqB,EAAajc,cACR,IAAN7B,GAAW8d,EAAa9b,gBAC/BxO,EAAQsqB,EAAa9b,eAGzB4oB,EAAS11B,KAAK,CACVo/B,WAAYnnB,EAAOlB,aACnBmK,OAAQA,EACRC,OAAQsP,MAAMtP,GAAUlJ,EAAOjB,cAAc,EAAImK,EACjDnW,IACAF,IACAxM,QACA2gC,WACAE,YACAt5B,MAAO5H,EACPuP,OAAQob,EACRnd,SACAC,SACAopB,eAAgBlM,EAAakM,eAC7B8V,wBAER,CAEA,MAAMS,EAAkB3V,EAASzN,QAAO,EAAGgX,WAAU2L,0BAC1C3L,IAAamL,GAAeQ,IACpC7T,MAAK,CAACj4B,EAAGD,IAAMA,EAAEogC,SAAWngC,EAAEmgC,WAEjC,MAAO,CACH6D,eACA3L,SACAC,SACArgB,aAAckB,EAAOlB,aACrBC,cAAeiB,EAAOjB,cACtBs0B,qBAAsBD,EAAgBltC,OACtCu3B,SAAU,IAAIuU,KAAkBoB,GAExC,CK4U6BE,CAAsB,CACvCzI,aAAcviC,KAAKsiC,cAAcC,aACjC3L,OAAQ52B,KAAKsiC,cAAc1L,OAC3BC,OAAQ72B,KAAKsiC,cAAczL,OAC3Bnf,OAAQ1X,KAAKsjC,gBAAgB5rB,OAC7BzK,OAAQjN,KAAKshC,QACbmI,iBAAkBzpC,KAAKqiC,kBACvBqH,cAAe1pC,KAAKyiC,eACpBkH,cAAe3pC,KAAKirC,gBACpBvvB,eAAgB1b,KAAKkrC,cAAcxvB,iBAEvC1b,KAAKirC,iBAAkB,EACvBjrC,KAAKslC,aAAa,wBAAyBtlC,KAAKsiC,cAAetiC,KAAKmrC,kBACpEnrC,KAAKmrC,iBAAmB,KAC5B,CAEA/D,uBAAAA,GACI,IAAKpnC,KAAKsjC,kBAAoBtjC,KAAKsjC,gBAAgB5rB,OAC/C,OAGJ,MAAM7B,EAAe7V,KAAKsjC,gBAAgBztB,aACpC6B,EAAS1X,KAAKsjC,gBAAgB5rB,OACpC,IAAInO,EAAQ,KACR6hC,EAAO,KAEX,IAAK,IAAIn+B,KAAUjN,KAAKshC,QAAS,CAC7B,MAAM3lB,EAAS1O,EAAOxB,KAAKyd,cAE3BkiB,EAAOprC,KAAKwiC,qBAAqB/3B,EAAIoL,EAAauX,KAG9CptB,KAAKwiC,qBAAqB/3B,EAAiD,GAA5CoL,EAAaw1B,MAAQ3zB,EAAOlB,gBAAmB40B,GAAQ,KAGtF7hC,EADgB,cAAhB0D,EAAOlC,MAAwC,SAAhBkC,EAAOlC,MAAmC,SAAhBkC,EAAOlC,KACxD,IAAI0D,MAAMzO,KAAKwiC,qBAAqB/3B,EAAIoL,EAAauX,MAAQ1V,EAAOlB,cAAgBmF,EAAOG,KAAOH,EAAOI,MAAQJ,EAAOI,OAEvH/b,KAAKwiC,qBAAqB/3B,EAAIoL,EAAauX,MAAQ1V,EAAOlB,cAAgBmF,EAAOG,KAAOH,EAAOI,MAAQJ,EAAOI,IAE/H,CACA/b,KAAKwiC,qBAAuB,CACxB/3B,EAAG2gC,EACH7gC,EAAGvK,KAAKwiC,qBAAqBj4B,EAAIsL,EAAasX,IAC9CgK,QAASn3B,KAAKwiC,qBAAqBrL,QACnC5tB,MAAOA,GAEXvJ,KAAKslC,aAAa,gCAAiCtlC,KAAKwiC,qBAC5D,CAEA+E,uBAAAA,GACSvnC,KAAKsjC,iBAAoBtjC,KAAKsjC,gBAAgB5rB,SAInD1X,KAAK4iC,kBGllBE,UAAmC,YAAEC,EAAW,OAAE51B,EAAM,OAAEyK,EAAM,UAAEkT,IAC7E,MAAM0gB,EAAc,IAAI76B,IAAIxD,EAAOrO,KAAI,CAACypB,EAAc3qB,KAC3C,CACHyE,KAAMy9B,GAAcvX,EAAc3qB,GAClC8nC,OAAQnd,EAAamd,WAE1B9d,QAAO,EAAG8d,aAAcA,IAAQ5mC,KAAI,EAAGuD,UAAWA,MAE/C,aAAEqU,GAAiBkB,GACnB,KAAEqE,EAAI,KAAED,GAAS8O,EACjB2gB,EAASzvB,EAAOC,EAGtB,OAAe,IAAXwvB,EACO,CACH1I,YAAa,GACbrsB,gBA8ED,CACHqsB,YA3E0BA,EAAYnb,QAAQ8jB,IAC9C,IAAKA,EAAWv+B,OACZ,OAAO,EAGX,IAAK,IAAIw+B,KAAcD,EAAWv+B,OAC9B,GAAIq+B,EAAYlG,IAAIqG,GAChB,OAAO,EAIf,OAAO,CAAK,IACb7sC,KAAK4sC,IACJ,MAAME,OAAgC7tC,IAAtB2tC,EAAW98B,aAA4C7Q,IAApB2tC,EAAW78B,KACxDg9B,OAA2B9tC,IAAjB2tC,EAAW/gC,EAE3B,IAAImhC,EAAcJ,EAAW98B,OACzBm9B,EAAYL,EAAW78B,KAE3B,IAAK+8B,GAAWC,EACZC,EAAcJ,EAAW/gC,EACzBohC,EAAYL,EAAW/gC,OACpB,IAAKihC,IAAYC,EACpB,OAAO,KAGX,MAAMG,EAAmBC,GACF,iBAARA,EAAyB,IAAIt9B,KAAKs9B,GAAKla,UAC9Cka,aAAet9B,KAAas9B,EAAIla,UAC7Bka,EAGX,IAAIr9B,EAASo9B,EAAgBF,GACzBj9B,EAAOm9B,EAAgBD,GAEvBn9B,EAASC,KACRD,EAAQC,GAAQ,CAACA,EAAMD,IAG5B,IAAIs9B,GAAet9B,EAASqN,GAAQwvB,EAAS/0B,EACzCy1B,GAAat9B,EAAOoN,GAAQwvB,EAAS/0B,EAGzCw1B,EAAcvyB,KAAKK,IAAI,EAAGL,KAAKC,IAAIlD,EAAcw1B,IACjDC,EAAYxyB,KAAKK,IAAI,EAAGL,KAAKC,IAAIlD,EAAcy1B,IAE/C,IAAIpN,EAAaoN,EAAYD,EAe7B,OAdInN,EAAa,GAAKoN,EAAY,GAAKD,EAAcx1B,KAC3Ck1B,GAAWC,GACZ9M,EAAa,EACbmN,GAAe,IAEfnN,EADO6M,EACM,EAEA,GAItBM,EAAcvyB,KAAKK,IAAI,EAAGL,KAAKC,IAAIlD,EAAeqoB,EAAYmN,IAG1DnN,GAAc,EACP,KAIJ,IACA2M,EACHE,UACAM,cACAnN,aACH,IACFnX,QAAO8jB,GAA6B,OAAfA,IAIpBh1B,eAER,CHgfiC01B,CAA0B,CAC/CrJ,YAAa7iC,KAAK2iC,aAClB11B,OAAQjN,KAAKshC,QACb5pB,OAAQ1X,KAAKsjC,gBAAgB5rB,OAC7BkT,UAAW5qB,KAAK+qB,aAEpB/qB,KAAKslC,aAAa,sBAAuBtlC,KAAK4iC,mBAClD,CAEA2B,aAAAA,GACIvkC,KAAKmsC,aAAe,GACpB,MAAMC,EAAiB,GAEvB,IAAK,IAAI/jB,KAAgBroB,KAAKshC,QAAS,CACnC,GAAIjZ,EAAamd,OACb,SAGJ,MAAMp0B,EAAapR,KAAKsoC,oBAAoBjgB,GAC5CA,EAAamB,YAAc2O,GAAwB,IAC5C9P,EACHjnB,KAAMgQ,GACP,CACC+U,gBAAiBnmB,OAErBqoB,EAAagkB,qBAAuBj7B,EAAWxT,OAC/CyqB,EAAaikB,WAAazS,GAAoBxR,EAAamB,aAC5B,QAA3BnB,EAAalc,YACbkc,EAAaikB,WAAa1R,GAAavS,EAAaikB,WAAY,CAAEzR,gBAAiBxS,EAAamB,YAAY5rB,OAAQ8N,YAAa2c,EAAa3c,eAGlJ0gC,EAAe3sC,KAAK4oB,EAAaikB,YAE7BjkB,EAAa3c,aACb1L,KAAKmsC,aAAa1sC,KAAK4oB,EAAa3c,YAE5C,CAEA1L,KAAKmpC,8BAELnpC,KAAKusC,YAAc9R,GAAY2R,GAE/BpsC,KAAKwsC,sBAAsB,CAAEC,aAAa,IAE1C,IAAK,IAAIpkB,KAAgBroB,KAAKshC,QACtBjZ,EAAamd,SAIjBnd,EAAaqkB,eAAiB7S,GAAoBxR,EAAakB,gBAAgBnoB,KAAM,CAAE04B,WAAY95B,KAAK6hC,YAAa9H,oBAAqB/5B,KAAK8hC,uBAC3IzZ,EAAa1b,gBACb0b,EAAaskB,sBAAwBtkB,EAAaqkB,eAClDrkB,EAAaukB,yBAA2B/S,GAAoBxR,EAAawkB,0BAA0BzrC,KAAM,CAAE04B,WAAY95B,KAAK6hC,YAAa9H,oBAAqB/5B,KAAK8hC,uBAEnKzZ,EAAaqkB,eAAiBjS,GAAY,CACtCpS,EAAaskB,sBACbtkB,EAAaukB,6BAKzB5sC,KAAK8sC,yBAEL,IAAK,IAAIzkB,KAAgBroB,KAAKshC,QACtBjZ,EAAamd,SAIjBxlC,KAAKomC,gCAAgC/d,EAAc,CAAE+U,aAAa,IAClEp9B,KAAKsmC,mCAAmCje,EAAc,CAAE+U,aAAa,IAE7E,CAEA8I,UAAAA,CAAW6G,GACP,MAAMC,EAAU,IAAIxL,IACdyL,EAAe,IAAIx8B,IAEnBy8B,EAA8B,IAAIz8B,IACxC,IAAK,IAAI4X,KAAgB0kB,EACrBG,EAA4Bx8B,IAAI2X,GAGpC,IAAK,IAAIA,KAAgB0kB,EAAgB,CAGrC,GAFAE,EAAav8B,IAAI2X,EAAa5c,OAEzB4c,EAAamB,YACd,MAAM,IAAItnB,MAAM,0DAGpB,MAAMkP,EAAapR,KAAKsoC,oBAAoBjgB,GAE5C,IAAI7Q,EACA6Q,EAAamB,YAAY5rB,SACzB4Z,EAAQ6Q,EAAamB,YAAYnB,EAAamB,YAAY5rB,OAAS,GAAG,IAG1E,MAAMuvC,EAAqBhV,GAAwB9P,EAAc,CAC7DjnB,KAAMgQ,EAAW1S,MAAM2pB,EAAagkB,sBAAwB,GAC5DzT,YAAavQ,EAAamB,YAAY5rB,OACtC4Z,QACA2O,gBAAiBnmB,OAKrB,GAHAgtC,EAAQ7vB,IAAIkL,EAAc8kB,GAC1B9kB,EAAagkB,qBAAuBj7B,EAAWxT,OAE3CuvC,EAAmBvvC,OAAS,GAC5ByqB,EAAamB,YAAY/pB,QAAQ0tC,QAEjC,IAAK,IAAI5wB,KAAS4wB,EACd9kB,EAAamB,YAAY/pB,KAAK8c,GAItC,IAAI6wB,EAAgBvT,GAAoBsT,GACT,QAA3B9kB,EAAalc,YACbihC,EAAgBxS,GAAawS,EAAe,CAAEvS,gBAAiBxS,EAAamB,YAAY5rB,OAAQ8N,YAAa2c,EAAa3c,eAG9H2c,EAAaikB,WAAa7R,GAAY,CAACpS,EAAaikB,WAAYc,IAChEptC,KAAKusC,YAAc9R,GAAY,CAACz6B,KAAKusC,YAAaa,IAGlD/kB,EAAaglB,cAAgBF,EAAmBvvC,OAChDyqB,EAAa+kB,cAAgBA,CACjC,CAEA,MAAME,EAAoBttC,KAAK+qB,WAC/B/qB,KAAKwsC,wBAEL,IAAK,IAAInkB,KAAgB0kB,EAAgB,CACrC,IAAK1kB,EAAakB,gBAAgBnoB,KAAKxD,OAAQ,CAC3CyqB,EAAaqkB,eAAiB7S,GAAoBxR,EAAakB,gBAAgBnoB,MAC/E,QACJ,CAEA,MAAMyX,EAASwP,EAAakB,gBAAgBnoB,KAAK,GAAG,GAC9C2X,EAAQsP,EAAakB,gBAAgBnoB,KAAKinB,EAAakB,gBAAgBnoB,KAAKxD,OAAS,GAAG,GAI9F,KAFkC0vC,EAAkBvxB,MAAQlD,GAAUy0B,EAAkBxxB,MAAQ/C,IAEzC,MAArB/Y,KAAK6hC,YAAqB,CAGxDxZ,EAAaqkB,eAAiB7S,GAAoBxR,EAAakB,gBAAgBnoB,KAAM,CAAE04B,WAAY95B,KAAK6hC,YAAa9H,oBAAqB/5B,KAAK8hC,uBAC3IzZ,EAAa1b,gBACb0b,EAAaskB,sBAAwBtkB,EAAaqkB,eAClDrkB,EAAaukB,yBAA2B/S,GAAoBxR,EAAawkB,0BAA0BzrC,KAAM,CAAE04B,WAAY95B,KAAK6hC,YAAa9H,oBAAqB/5B,KAAK8hC,uBAEnKzZ,EAAaqkB,eAAiBjS,GAAY,CACtCpS,EAAaskB,sBACbtkB,EAAaukB,4BAGrB,QACJ,CAGA,MAAMW,EAAkBP,EAAQxkC,IAAI6f,GAC/BX,QAAQ6C,GAAUA,EAAM,IAAMvqB,KAAK+qB,WAAWhP,MAAQwO,EAAM,IAAMvqB,KAAK+qB,WAAWjP,OAEvFuM,EAAaklB,gBAAkBA,EAC/BllB,EAAaqkB,eAAiBjS,GAAY,CAACpS,EAAaqkB,eAAgB7S,GAAoB0T,IAChG,CAEAvtC,KAAK8sC,yBAEL9sC,KAAKqoC,qBAAqB,sBAAuBroC,KAAKyhC,MAAM7iC,KAAI,EAAGsqB,mBAAoBA,KAEvF,IAAK,IAAIzd,KAAQwhC,EACb,IAAK,IAAI5kB,KAAgB5c,EAAKwB,OAC1BjN,KAAKomC,gCAAgC/d,GACrCroB,KAAKsmC,mCAAmCje,EAGpD,CAEAykB,sBAAAA,GACI,IAAK,IAAIrhC,KAAQzL,KAAKyhC,MAAO,CACzB,GAAIzhC,KAAK+qB,WAAWyiB,SAAWxtC,KAAK4hC,YAAa,CAC7Cn2B,EAAKgiC,aAAeztC,KAAK+qB,WACrBtf,EAAKgiC,aAAaC,SAClBjiC,EAAKgiC,aAAehiC,EAAKgiC,aAAaC,OAAOjiC,EAAKuB,YAGtDvB,EAAKyd,cAAgBzd,EAAKgiC,aAC1B,QACJ,CAEA,MAAME,EAAqB,GACrBjiC,EAAc,GAEpB,IAAK,IAAI2c,KAAgB5c,EAAKwB,OAC1B0gC,EAAmBluC,KAAK4oB,EAAaqkB,gBAEjCrkB,EAAa3c,aACbA,EAAYjM,QAAQ4oB,EAAa3c,aAGN,QAA3B2c,EAAalc,WACbT,EAAYjM,KAAK4oB,EAAaqkB,eAAep1B,KAAM+Q,EAAaqkB,eAAen1B,MAIvF9L,EAAKmiC,mBAAqBnT,GAAYkT,GACtCliC,EAAKgiC,aAAehiC,EAAKyd,cAAgB0R,GAAanvB,EAAKmiC,mBAAoB,CAACliC,eACpF,CACA1L,KAAKqoC,qBAAqB,sBAAuBroC,KAAKyhC,MAAM7iC,KAAI,EAAGsqB,mBAAoBA,IAC3F,CAQAsjB,qBAAAA,EAAsB,YAACC,GAAc,GAAO,CAAC,GACzCzsC,KAAKkrC,cAAgBtQ,GAAa56B,KAAKusC,YAAa,CAAC7gC,YAAa1L,KAAKmsC,aAAaprB,SACpF/gB,KAAKqoC,qBAAqB,wBAAyBroC,KAAKkrC,eACxDlrC,KAAK+qB,WI9yBE,SAAmCvC,EAAcqlB,GAC5D,MAAMJ,EAAeplC,OAAO0yB,OAAO,CAAC,EAAGvS,EAAcqlB,EAAiBrlB,IAsBtE,OApBIilB,EAAa3xB,gBAAgBrN,OAC7Bg/B,EAAa3xB,KAAO2xB,EAAa3xB,KAAK+V,WAGtC4b,EAAa1xB,gBAAgBtN,OAC7Bg/B,EAAa1xB,KAAO0xB,EAAa1xB,KAAK8V,WAGtC4b,EAAa3xB,KAAO2xB,EAAa1xB,OACjC0xB,EAAa3xB,KAAO2xB,EAAa1xB,MAGjC0xB,EAAa1xB,KAAOyM,EAAazM,OACjC0xB,EAAa1xB,KAAOyM,EAAazM,MAGjC0xB,EAAa3xB,KAAO0M,EAAa1M,OACjC2xB,EAAa3xB,KAAO0M,EAAa1M,MAG9B2xB,CACX,CJsxB0BK,CAA0B9tC,KAAKkrC,cAAelrC,KAAKujC,mBACrEvjC,KAAKqoC,qBAAqB,oBAAqBroC,KAAK+qB,YAEpD,IAAK,IAAI1C,KAAgBroB,KAAKshC,QACtBjZ,EAAamd,SAIjBnd,EAAakB,gBAAkBkS,GAAyB,CACpDr6B,KAAMinB,EAAa1b,cAAgB0b,EAAamB,YAAY9B,QAAO,CAACqmB,EAAGrwC,IAAMA,EAAI,GAAM,IAAK2qB,EAAamB,YACzGkS,KAAM+Q,EAAc,KAAOpkB,EAAakB,gBACxCxN,KAAM/b,KAAK+qB,WAAWhP,KACtBD,KAAM9b,KAAK+qB,WAAWjP,KACtB1Q,sBAAuBid,EAAajd,sBACpCQ,OAAQyc,EAAazc,SAGrByc,EAAa1b,gBACb0b,EAAawkB,0BAA4BpR,GAAyB,CAC9Dr6B,KAAKinB,EAAamB,YAAY9B,QAAO,CAACqmB,EAAGrwC,IAAMA,EAAI,GAAM,IACzDg+B,KAAM+Q,EAAc,KAAOpkB,EAAawkB,0BACxC9wB,KAAM/b,KAAK+qB,WAAWhP,KACtBD,KAAM9b,KAAK+qB,WAAWjP,KACtB1Q,sBAAuBid,EAAajd,sBACpCQ,OAAQyc,EAAazc,UAIrC,CAEA66B,OAAAA,GACI,GAAKzmC,KAAKsjC,iBAAoBtjC,KAAKsjC,gBAAgB5rB,OAAnD,CAIA1X,KAAKsjC,gBAAgBnlB,QACjBne,KAAK6qB,oBACL7qB,KAAK6qB,mBAAmB1M,QAG5B,IAAK,IAAIkK,KAAgBroB,KAAKshC,QAAS,CACnC,GAAIjZ,EAAamd,OACb,SAGJ,MAAM54B,EAAcyb,EAAazb,aAAe,CAC5CqmB,IAAK,QACL+a,OAAQ,cACRC,MAAO,SACTjuC,KAAKkuC,SAAW,QAEZxvB,OAAa7gB,EAcnB,GAZAmC,KAAKsjC,gBAAgB1U,iBAAiBvG,EAAa8lB,0BAEnDnuC,KAAKsjC,gBAAgBlb,OAAOC,EAAcA,EAAa+lB,qBAAsB,CACzE9zB,YAAata,KAAK0hC,qBAAuBrZ,EAAa/iB,MACtD2G,qBAAsBjM,KAAK2hC,sBAC3B/0B,cACA8R,aACA6J,iBAAkBvoB,KAAKquC,kBACvB7lB,aAAcxoB,KAAKkrC,cACnB9nB,wBAAyBiF,EAAaimB,iCAGtCtuC,KAAK6qB,oBAAsB7qB,KAAK6qB,mBAAmBnT,OAAQ,CAE3D,MAAM62B,EAAmB,IAClBvuC,KAAKkrC,cACR5zB,UAA0CzZ,IAApCmC,KAAKkrC,cAAclQ,aAA6Bh7B,KAAKkrC,cAAclQ,aAAeh7B,KAAKkrC,cAAc5zB,KAC3GC,UAA0C1Z,IAApCmC,KAAKkrC,cAAcjQ,aAA6Bj7B,KAAKkrC,cAAcjQ,aAAej7B,KAAKkrC,cAAc3zB,MAG/GvX,KAAK6qB,mBAAmBzC,OAAOC,EAAcA,EAAammB,wBAAyB,CAC/E5hC,YAAa,cACb8R,WAAY,EACZnT,MAAO,EACPU,sBAAsB,EACtB0P,OAAQ4yB,EACR/lB,aAAc+lB,EACdnrB,wBAAyBiF,EAAaomB,mCAE9C,CACJ,CAlDA,CAmDJ,CAEArI,+BAAAA,CAAgC/d,GAAc,YAAE+U,GAAY,GAAU,CAAC,GACnE,IAAKp9B,KAAKsjC,kBAAoBtjC,KAAKsjC,gBAAgB5rB,OAC/C,OAGJ,IAAK2Q,EAAc,CACf,IAAK,IAAIqmB,KAAK1uC,KAAKshC,QACfthC,KAAKomC,gCAAgCsI,GAEzC,MACJ,CAEA,IAAK1uC,KAAKshC,QAAQhR,SAASjI,GACvB,MAAM,IAAInmB,MAAM,2BAGpB,GAAImmB,EAAamd,OACb,OAGJ,MAAM,cAAEtc,EAAa,MAAE/b,GAAUkb,EAAa5c,KACxCiL,EAAc+C,KAAK2U,KAAKpuB,KAAKsjC,gBAAgB5rB,OAAOhB,YAAYrB,GAChEsB,EAAe8C,KAAK2U,KAAKpuB,KAAKsjC,gBAAgB5rB,OAAOf,cAErDg4B,EAAiC,CACnC5yB,KAAMmN,EAAcnN,KACpBD,KAAMoN,EAAcpN,KACpBpF,cACA0mB,eAGJ/U,EAAaumB,gCAAkC1P,GAAkB,CAC7D99B,KAAMinB,EAAakB,gBAAgBnoB,KACnCs6B,KAAMrT,EAAaumB,mCAChBD,IAGP,MAAME,EAAsB,CACxB9yB,KAAMmN,EAAcnN,KACpBD,KAAMoN,EAAcpN,KACpBxE,KAAM4R,EAAc5R,KACpBC,KAAM2R,EAAc3R,KACpBb,cACAC,eACAxJ,QACAiwB,eAGJ/U,EAAa+lB,qBAAuBjR,GAA2B,CAC3D/7B,KAAMinB,EAAaumB,gCAAgCxtC,KACnDs6B,KAAMrT,EAAa+lB,wBAChBS,IAGPxmB,EAAa8lB,yBAA2BtO,GAA+B,CACnEz+B,KAAMinB,EAAaumB,gCAAgCxtC,KACnD2K,WAAYsc,EAAatc,WACzB2vB,KAAMrT,EAAa8lB,yBACnBpyB,KAAMmN,EAAcnN,KACpBD,KAAMoN,EAAcpN,OAGpBuM,EAAa1b,gBACb0b,EAAaymB,0CAA4C5P,GAAkB,CACvE99B,KAAMinB,EAAawkB,0BAA0BzrC,KAC7Cs6B,KAAMrT,EAAaymB,6CAChBH,IAGPtmB,EAAaimB,+BAAiCnR,GAA2B,CACrE/7B,KAAMinB,EAAaymB,0CAA0C1tC,KAC7Ds6B,KAAMrT,EAAaimB,kCAChBO,IAGPxmB,EAAa0mB,mCAAqClP,GAA+B,CAC7Ez+B,KAAMinB,EAAaymB,0CAA0C1tC,KAC7D2K,WAAYsc,EAAatc,WACzB2vB,KAAMrT,EAAa0mB,mCACnBhzB,KAAMmN,EAAcnN,KACpBD,KAAMoN,EAAcpN,OAGhC,CAEAwqB,kCAAAA,CAAmCje,GAAc,YAAE+U,GAAY,GAAU,CAAC,GACtE,IAAKp9B,KAAK6qB,qBAAuB7qB,KAAK6qB,mBAAmBnT,OACrD,OAGJ,IAAK2Q,EAAc,CACf,IAAK,IAAIqmB,KAAK1uC,KAAKshC,QACfthC,KAAKsmC,mCAAmCoI,GAE5C,MACJ,CAEA,IAAK1uC,KAAKshC,QAAQhR,SAASjI,GACvB,MAAM,IAAInmB,MAAM,2BAGpB,GAAImmB,EAAamd,OACb,OAGJ,MAAM,MAAEr4B,GAAUkb,EAAa5c,KACzB+c,EAAexoB,KAAKkrC,cAEpBqD,EAAmB,IAClB/lB,EACHlR,UAAoCzZ,IAA9B2qB,EAAawS,aAA6BxS,EAAawS,aAAexS,EAAalR,KACzFC,UAAoC1Z,IAA9B2qB,EAAayS,aAA6BzS,EAAayS,aAAezS,EAAajR,MAGvFb,EAAc+C,KAAK2U,KAAKpuB,KAAK6qB,mBAAmBnT,OAAOhB,YAAYrB,GACnEsB,EAAe8C,KAAK2U,KAAKpuB,KAAK6qB,mBAAmBnT,OAAOf,cAExDq4B,EAAwB,CAC1BjzB,KAAMyM,EAAazM,KACnBD,KAAM0M,EAAa1M,KACnB1Q,sBAAuBid,EAAajd,sBACpCQ,OAAQyc,EAAazc,QAGzByc,EAAa4mB,0BAA4BxT,GAAyB,CAC9Dr6B,KAAMinB,EAAa1b,cAAgB0b,EAAamB,YAAY9B,QAAO,CAACqmB,EAAGrwC,IAAMA,EAAI,GAAM,IAAK2qB,EAAamB,YACzGkS,KAAMrT,EAAa4mB,6BAChBD,IAGP,MAAML,EAAiC,CACnC5yB,KAAMyM,EAAazM,KACnBD,KAAM0M,EAAa1M,KACnBpF,cACA0mB,eAGJ/U,EAAa6mB,mCAAqChQ,GAAkB,CAChE99B,KAAMinB,EAAa4mB,0BAA0B7tC,KAC7Cs6B,KAAMrT,EAAa6mB,qCAGvB,MAAML,EAAsB,CACxB9yB,KAAMwyB,EAAiBxyB,KACvBD,KAAMyyB,EAAiBzyB,KACvBxE,KAAMi3B,EAAiBj3B,KACvBC,KAAMg3B,EAAiBh3B,KACvBb,cACAC,eACAxJ,QACAiwB,eAGJ/U,EAAammB,wBAA0BrR,GAA2B,CAC9D/7B,KAAMinB,EAAa6mB,mCAAmC9tC,KACtDs6B,KAAMrT,EAAammB,2BAChBK,IAGHxmB,EAAa1b,gBACb0b,EAAa8mB,oCAAsC1T,GAAyB,CACxEr6B,KAAMinB,EAAamB,YAAY9B,QAAO,CAACqmB,EAAGrwC,IAAMA,EAAI,GAAM,IAC1Dg+B,KAAMrT,EAAa8mB,uCAChBH,IAGP3mB,EAAa+mB,6CAA+ClQ,GAAkB,CAC1E99B,KAAMinB,EAAa8mB,oCAAoC/tC,KACvDs6B,KAAMrT,EAAa+mB,gDAChBT,IAGPtmB,EAAaomB,kCAAoCtR,GAA2B,CACxE/7B,KAAMinB,EAAa+mB,6CAA6ChuC,KAChEs6B,KAAMrT,EAAaomB,qCAChBI,IAGf,CAEAQ,WAAAA,EAAY,KAAEniC,IACV,MAAMzB,EAAO,CACTwB,OAAQ,GACRE,MAAO,SACPD,OACAF,UAAWhN,KAAKyhC,MAAM7jC,QAG1B,OADAoC,KAAKyhC,MAAMhiC,KAAKgM,GACTA,CACX,CAEA6jC,SAAAA,CAAUjnB,EAAcrb,GACpB,IAAKhN,KAAKshC,QAAQhR,SAASjI,GACvB,MAAM,IAAInmB,MAAM,2BAGpB,IAAIqtC,EAOJ,GALIA,EADc,aAAdviC,GAA0C,cAAdA,EAClBhN,KAAKqvC,YAAY,CAAEniC,KAAMF,EAAUrO,MAAM,KAAK,KAE9CqB,KAAKyhC,MAAM1iC,SAASiO,IAG9Bqb,EAAa5c,OAAS8jC,EACtB,OAGJ,MAAMC,EAAUnnB,EAAa5c,KACvBgkC,EAAWD,EAAQviC,OAAO0d,QAAQtC,GACxC,IAAkB,IAAdonB,EACA,MAAM,IAAIvtC,MAAM,8BAEpBstC,EAAQviC,OAAOnI,OAAO2qC,EAAU,GAEhCF,EAAQtiC,OAAOxN,KAAK4oB,GACpBA,EAAa5c,KAAO8jC,EAEpBvvC,KAAK0lC,cAAe,EACpB1lC,KAAKslC,aAAa,eAAgBtlC,KAAKyhC,OACvCzhC,KAAKslC,aAAa,oBAAqBtlC,KAAK0vC,UAC5C1vC,KAAKslC,aAAa,qBAAsBtlC,KAAK2vC,WAC7C3vC,KAAKslC,aAAa,wBAAyBtlC,KAAK4vC,cAChD5vC,KAAKqhC,YACT,CAEAkE,aAAAA,CAAcld,GACV,GAAIA,EAAa5c,MAAqC,iBAAtB4c,EAAa5c,KACzC,OAGJ,IAAIA,EAEJ,GAAI4c,EAAarb,UAAW,CACxB,MAAM,UAAEA,GAAcqb,EAGlB5c,EADc,aAAduB,GAA0C,cAAdA,EACrBhN,KAAKqvC,YAAY,CAAEniC,KAAMF,EAAUrO,MAAM,KAAK,KAE9CqB,KAAKyhC,MAAM1iC,SAASiO,GAEnC,MAAO,GAAIqb,EAAa5c,KAAM,CAC1B4c,EAAawnB,aAAexnB,EAAa5c,KACzC,IAAKyB,EAAMvK,GAAU0lB,EAAa5c,KAAK9M,MAAM,KAC7C8M,EKhnCG,UAA0B,KAAEgc,EAAI,KAAEva,EAAI,OAAEvK,IAOnD,IAAI8I,EALA9I,EADAA,GACS5D,SAAS4D,IAET,EAIb,IAAImtC,EAAO,EACX,IAAK,IAAIC,KAAiBtoB,EACtB,GAAIsoB,EAAc7iC,OAASA,EAA3B,CAIA,GAAI4iC,IAASntC,EAAQ,CACjB8I,EAAOskC,EACP,KACJ,CAEAD,GAPA,CAUJ,OAAOrkC,CACX,CLylCmBukC,CAAiB,CAAEvoB,KAAMznB,KAAKyhC,MAAOv0B,OAAMvK,WAE7C8I,IACDA,EAAOzL,KAAKqvC,YAAY,CACpBniC,SAGZ,MACIzB,EAAOzL,KAAKyhC,MAAM,GAGtBh2B,EAAKwB,OAAOxN,KAAK4oB,GACjBA,EAAa5c,KAAOA,EAEpBzL,KAAKslC,aAAa,eAAgBtlC,KAAKyhC,OACvCzhC,KAAKslC,aAAa,wBAAyBtlC,KAAK4vC,cAEjB,SAA3BvnB,EAAa5c,KAAKyB,KAClBlN,KAAKslC,aAAa,oBAAqBtlC,KAAK0vC,UAE5C1vC,KAAKslC,aAAa,qBAAsBtlC,KAAK2vC,UAErD,CAEAjL,aAAAA,CAAcrc,GACVroB,KAAKuhC,0BAA0B3wB,OAAOyX,EAAa4c,gBAEnD,MAAM,KAAEx5B,EAAI,KAAErK,GAASinB,EACvB5c,EAAKwB,OAAOnI,OAAO2G,EAAKwB,OAAO0d,QAAQtC,GAAe,GACtD,MAAMmgB,EAAcxoC,KAAKikC,qBAAqBz7B,IAAIpH,GAC9ConC,IACAA,EAAY53B,OAAOyX,GACM,IAArBmgB,EAAY33B,MACZ7Q,KAAKikC,qBAAqBrzB,OAAOxP,IAIrCpB,KAAKmkC,oBAAoBiB,IAAIhkC,KAC7BpB,KAAKmkC,oBAAoB37B,IAAIpH,GAAMwP,OAAOyX,GACM,IAA5CroB,KAAKmkC,oBAAoB37B,IAAIpH,GAAMyP,OACnC7Q,KAAKmkC,oBAAoBvzB,OAAOxP,GAChCpB,KAAKkkC,YAAYtzB,OAAOxP,KAIhCpB,KAAKqiC,kBAAkBzxB,OAAOyX,GAE9BA,EAAa5c,KAAO4c,EAAawnB,oBAC1BxnB,EAAawnB,oBACbxnB,EAAamB,mBACbnB,EAAakB,uBACblB,EAAa4nB,2BACb5nB,EAAa6nB,8BACb7nB,EAAa+lB,4BACb/lB,EAAammB,+BACbnmB,EAAaglB,qBACbhlB,EAAa+kB,qBACb/kB,EAAagkB,qBAEpBrsC,KAAKslC,aAAa,eAAgBtlC,KAAKyhC,OACvCzhC,KAAKslC,aAAa,wBAAyBtlC,KAAK4vC,cAE9B,SAAdnkC,EAAKyB,KACLlN,KAAKslC,aAAa,oBAAqBtlC,KAAK0vC,UAE5C1vC,KAAKslC,aAAa,qBAAsBtlC,KAAK2vC,UAErD,CAEAlK,WAAAA,CAAYpd,GACR,MAAM,KAAE5c,GAAS4c,EACXqC,EAAcjf,EAAKwB,OAAO0d,QAAQtC,GACxCA,EAAaqC,YAAcA,EAC3Bjf,EAAKwB,OAAOnI,OAAO4lB,EAAa,GAEhC1qB,KAAKslC,aAAa,eAAgBtlC,KAAKyhC,OAErB,SAAdh2B,EAAKyB,KACLlN,KAAKslC,aAAa,oBAAqBtlC,KAAK0vC,UAE5C1vC,KAAKslC,aAAa,qBAAsBtlC,KAAK2vC,UAErD,CAEAQ,WAAAA,CAAY9nB,GACR,MAAM,KAAE5c,GAAS4c,EACjB5c,EAAKwB,OAAOnI,OAAOujB,EAAaqC,YAAa,EAAGrC,GAEhDroB,KAAKslC,aAAa,eAAgBtlC,KAAKyhC,OAErB,SAAdh2B,EAAKyB,KACLlN,KAAKslC,aAAa,oBAAqBtlC,KAAK0vC,UAE5C1vC,KAAKslC,aAAa,qBAAsBtlC,KAAK2vC,UAErD,CAOA,mBAAIS,GACA,OAAOpwC,KAAKujC,iBAChB,CAEA,QAAI9b,GACA,OAAOznB,KAAKyhC,KAChB,CAEA,YAAIiO,GACA,MAAMA,EAAW1vC,KAAKyhC,MAAM/Z,QAAO,EAAGxa,OAAMD,YAAsB,SAATC,GAAmBD,EAAOrP,OAAS,IAAGyyC,UAM/F,OAJwB,IAApBX,EAAS9xC,QAA0C,IAA1BoC,KAAK2vC,UAAU/xC,QACxC8xC,EAASjwC,KAAKO,KAAKyhC,MAAM,IAGtBiO,CACX,CAEA,aAAIC,GACA,OAAO3vC,KAAKyhC,MAAM/Z,QAAO,EAAGxa,OAAMD,YAAsB,UAATC,GAAoBD,EAAOrP,OAAS,GACvF,CAEA,UAAI+d,GACA,OAAO3b,KAAKyhC,MAAM7iC,KAAI,EAAG6uC,kBAAmBA,GAChD,CAEA,aAAI7iB,GACA,OAAO5qB,KAAK+qB,UAChB,CAEA,gBAAIvC,GACA,OAAOxoB,KAAKkrC,aAChB,CAEA,UAAIj+B,GACA,OAAOjN,KAAKshC,OAChB,CAEA,qBAAIgP,GACA,OAAOtwC,KAAK0hC,kBAChB,CAEA,wBAAIz1B,GACA,OAAOjM,KAAK2hC,qBAChB,CAEA,cAAI4O,GACA,OAAOvwC,KAAK4hC,WAChB,CAEA,gBAAI4O,GACA,MAAO,CACHC,cAAezwC,KAAK6jC,aAAe7jC,KAAK4jC,eAAehmC,OAAS,EAChE8yC,kBAAmB1wC,KAAK6jC,aAAe,EAE/C,CAEA,gBAAI8M,GACA,OAAO3wC,KAAKsiC,aAChB,CAEA,oBAAIsO,GACA,OAAO5wC,KAAKwiC,oBAChB,CAEA,oBAAIiH,GACA,OAAOzpC,KAAKqiC,iBAChB,CAEA,aAAIwO,GACA,OAAO7wC,KAAK0iC,UAChB,CAEA,mBAAIoO,GACA,OMvyCD,SAA0BC,GAC7B,MAAMhtC,EAAS,CAAC,EAEhB,IAAK,IAAI8jC,KAAYkJ,EACjB,IAAK,IAAK5oC,EAAKoB,KAAUlB,OAAOgnB,QAAQwY,GACpC9jC,EAAOoE,IAAQpE,EAAOoE,IAAQ,GAAKoB,EAI3C,IAAK,IAAKpB,EAAKoB,KAAUlB,OAAOgnB,QAAQtrB,GACpCA,EAAOoE,GAAOoB,EAAMwnC,EAAUnzC,OAGlC,OAAOmG,CACX,CNyxCeitC,CAAiBhxC,KAAKgjC,cACjC,CAEA,gBAAI4M,GACA,MAAMqB,EAAa,IAAIzP,IACvB,IAAI0P,EAAY,EACZC,EAAa,EAEjB,IAAK,IAAI1lC,KAAQzL,KAAKyhC,MAAO,CACzB,IAAIt/B,EACc,SAAdsJ,EAAKyB,MACL/K,EAAQ,QAAO+uC,IACfA,MAEA/uC,EAAQ,SAAQgvC,IAChBA,KAGJ,IAAK,IAAI9oB,KAAgB5c,EAAKwB,OAC1BgkC,EAAW9zB,IAAIkL,EAAclmB,EAErC,CAEA,OAAOnC,KAAKiN,OAAOrO,KAAKypB,IACb,IACAA,EAAa4c,eAChBx5B,KAAMwlC,EAAWzoC,IAAI6f,MAGjC,CAEA,cAAIyR,GACA,OAAO95B,KAAK6hC,WAChB,CAEA,uBAAI9H,GACA,OAAO/5B,KAAK8hC,oBAChB,CAEA,kBAAIsP,GACA,OAAOpxC,KAAK+hC,eAChB,CAEA,gBAAIpM,GACA,OAAO31B,KAAKgiC,aAChB,CAEA,kBAAIqP,GACA,OAAOrxC,KAAKiiC,eAChB,CAEA,sBAAIqP,GACA,OAAOtxC,KAAKkiC,mBAChB,CAEA,qBAAIqP,GACA,OAAOvxC,KAAKshC,QAAQ5Z,QAAQW,GAAiBA,EAAayc,aAC9D,CAEA,aAAI9D,GACA,OAAOhhC,KAAKmiC,UAChB,CAEA,mBAAIqP,GACA,OAAOxxC,KAAK4iC,iBAChB,CAEA,UAAIlrB,GACA,OAAO1X,KAAKsjC,iBAAmBtjC,KAAKsjC,gBAAgB5rB,MACxD,CAEA,SAAI+5B,GACA,OAAOzxC,KAAKkuC,MAChB,CAEA,cAAIwD,GACA,OAAO1xC,KAAK2xC,WAChB,CAEA,WAAIC,GACA,OAAO5xC,KAAK8iC,QAChB,CAEA,YAAI+H,GACA,OAAO7qC,KAAK+iC,SAChB,CAOA/T,eAAAA,CAAgB6iB,GACRA,IAAa7xC,KAAKsjC,iBAClBtjC,KAAKslC,aAAa,sBAAuBtlC,KAAKsjC,gBAAgB5rB,QAC9D1X,KAAKslC,aAAa,+BAAgCtlC,KAAKsjC,gBAAgBztB,cACvE7V,KAAKmmC,qBAAsB,GACpB0L,IAAa7xC,KAAK6qB,qBACzB7qB,KAAKslC,aAAa,0BAA2BtlC,KAAK6qB,mBAAmBnT,QACrE1X,KAAKslC,aAAa,mCAAoCtlC,KAAK6qB,mBAAmBhV,cAC9E7V,KAAKqmC,wBAAyB,GAGlCrmC,KAAKgmC,eAAgB,EACrBhmC,KAAKqlC,kBAAmB,EACxBrlC,KAAKimC,qBAAsB,EAC3BjmC,KAAK4mC,qBAAsB,EAC3B5mC,KAAKqhC,YACT,CAEA,SAAIoQ,CAAMloC,GACNvJ,KAAKkuC,OAAS3kC,EACdvJ,KAAKgmC,eAAgB,EACrBhmC,KAAKslC,aAAa,eAAgBtlC,KAAKkuC,QACvCluC,KAAKqhC,YACT,CAEA,cAAIqQ,CAAWnoC,GACXvJ,KAAK2xC,YAAcpoC,EAEfA,GACAvJ,KAAK8xC,gBAAkB9xC,KAAKyxC,MAC5BzxC,KAAKyxC,MAAQ,UAEbzxC,KAAKyxC,MAAQzxC,KAAK8xC,gBAGtB9xC,KAAKslC,aAAa,qBAAsBtlC,KAAK2xC,aAC7C3xC,KAAKqhC,YACT,CAEA,oBAAI9Y,CAAiBhf,GACjBvJ,KAAKquC,kBAAoB9kC,EACzBvJ,KAAKgmC,eAAgB,EACrBhmC,KAAKqhC,YACT,CAEA,mBAAI+O,CAAgB2B,GACXA,GAIDA,IAAqB/xC,KAAKujC,oBAI1BwO,EAAiBC,iBACjB1iB,aAAatvB,KAAKiyC,8BAClBjyC,KAAKiyC,6BAA+BxiB,YAAW,KAC3CzvB,KAAKkyC,6BAA6BH,EAAiB,GACpD,MAEH/xC,KAAKkyC,6BAA6BH,GAGtC/xC,KAAKujC,kBAAoBwO,EACzB/xC,KAAKslC,aAAa,2BAA4BtlC,KAAKujC,mBACnDvjC,KAAK0lC,cAAe,EACpB1lC,KAAK4mC,qBAAsB,EAC3B5mC,KAAKqhC,aACT,CAEA,yBAAIZ,CAAsB0R,GACtBnyC,KAAKoyC,uBAAyBpyC,KAAKoyC,wBAA0B,CAAC,EAE9D,MAAMC,EAA8B,CAAC,EAErC,IAAK,IAAI,MAAEjlC,EAAK,WAAEG,KAAgB4kC,EAC9BE,EAA4BjlC,GAASG,EAEjCvN,KAAKujC,oBAAsBvjC,KAAKoyC,uBAAuBhlC,IAAUpN,KAAKujC,oBAAsBh2B,IAC5FvN,KAAKowC,gBAAkB7iC,GAI/BvN,KAAKoyC,uBAAyBC,CAClC,CAEAH,4BAAAA,CAA6BH,GACzB/xC,KAAK6jC,eACL7jC,KAAK4jC,eAAiB5jC,KAAK4jC,eAAellC,MAAM,EAAGsB,KAAK6jC,cACxD7jC,KAAK4jC,eAAenkC,KAAKsyC,GACzB/xC,KAAK8Q,KAAK,wBAAyB9Q,KAAKwwC,aAC5C,CAEA8B,mBAAAA,CAAoBC,GAChBvyC,KAAK8Q,KAAK,eAAgB9Q,KAAKshC,QAAQiR,GAAsBA,EACjE,CAEAC,oBAAAA,CAAqBlC,GACjBtwC,KAAK0hC,mBAAqB4O,EAC1BtwC,KAAKslC,aAAa,6BAA8BgL,GAChDtwC,KAAKgmC,eAAgB,EACrBhmC,KAAKqhC,YACT,CAEAoR,sBAAAA,GACIzyC,KAAK2hC,uBAAyB3hC,KAAK2hC,sBACnC3hC,KAAKslC,aAAa,iCAAkCtlC,KAAK2hC,uBACzD3hC,KAAKgmC,eAAgB,EACrBhmC,KAAKqhC,YACT,CAEAqR,kBAAAA,GACI1yC,KAAK4hC,aAAe5hC,KAAK4hC,YACzB5hC,KAAKslC,aAAa,sBAAuBtlC,KAAK4hC,aAC9C5hC,KAAKqhC,YACT,CAEAsR,gBAAAA,GACI3yC,KAAK0xC,YAAc1xC,KAAK2xC,WAC5B,CAEAiB,sBAAAA,CAAuBC,GACnB7yC,KAAKowC,gBO3/CE,UAAsC,UAAEvgC,EAAS,UAAEC,EAAS,UAAEgjC,EAAS,UAAEC,IAAY,aAAEv8B,EAAY,cAAEC,EAAa,UAAEmU,EAAS,KAAEnD,IAC1I,GAAIhO,KAAK+J,IAAI1T,EAAYD,GAAa,GAAK4J,KAAK+J,IAAIuvB,EAAYD,GAAa,EACzE,OAGJ,MAAM/2B,EAAQlM,EAAU2G,GAAeoU,EAAU9O,KAAO8O,EAAU7O,MAAQ6O,EAAU7O,KAC9ED,EAAQhM,EAAU0G,GAAeoU,EAAU9O,KAAO8O,EAAU7O,MAAQ6O,EAAU7O,KAE9E2xB,EAAS,GACf,IAAK,IAAI,cAAExkB,EAAa,MAAE/b,KAAWsa,EAAM,CACvC,MAAM6V,EAAeJ,GAAY,IAAKhU,EAAe/b,UACrD,IAAIoK,GAAQ,EAAIu7B,EAAUr8B,IAAgB6mB,EAAa/lB,KAAO+lB,EAAahmB,MAAQgmB,EAAahmB,KAC5FA,GAAQ,EAAIy7B,EAAUt8B,IAAgB6mB,EAAa/lB,KAAO+lB,EAAahmB,MAAQgmB,EAAahmB,KAElF,QAAVnK,IACAmK,EAAOmC,KAAKu5B,IAAI,GAAI17B,GACpBC,EAAOkC,KAAKu5B,IAAI,GAAIz7B,IAExBm2B,EAAOjuC,KAAK,CACRsc,OACAD,OACAxE,OACAC,QAER,CAEA,MAAO,KACI,CACHwE,OACAD,OACA4xB,UAGZ,CP09C+BuF,CAA6BJ,EAAgB,CAChEr8B,aAAcxW,KAAKsjC,gBAAgB5rB,OAAOlB,aAC1CC,cAAezW,KAAKsjC,gBAAgB5rB,OAAOjB,cAC3CmU,UAAW5qB,KAAK+qB,WAChBtD,KAAMznB,KAAKyhC,OAEnB,CAEAyR,UAAAA,GACIlzC,KAAK6jC,eACL7jC,KAAKujC,kBAAoBvjC,KAAK4jC,eAAe5jC,KAAK6jC,cAClD7jC,KAAKslC,aAAa,2BAA4BtlC,KAAKujC,mBACnDvjC,KAAKslC,aAAa,wBAAyBtlC,KAAKwwC,cAChDxwC,KAAK0lC,cAAe,EACpB1lC,KAAKqhC,YACT,CAEA8R,cAAAA,GACInzC,KAAK6jC,eACL7jC,KAAKujC,kBAAoBvjC,KAAK4jC,eAAe5jC,KAAK6jC,cAClD7jC,KAAKslC,aAAa,2BAA4BtlC,KAAKujC,mBACnDvjC,KAAKslC,aAAa,wBAAyBtlC,KAAKwwC,cAChDxwC,KAAK0lC,cAAe,EACpB1lC,KAAKqhC,YACT,CAEA+R,QAAAA,EAAS,UAAEpmC,EAAS,MAAEI,IAClBpN,KAAKyhC,MAAMz0B,GAAWI,MAAQA,EAC9BpN,KAAKslC,aAAa,eAAgB,IAAItlC,KAAKyhC,QAC3CzhC,KAAKqhC,YACT,CAEAgS,WAAAA,EAAY,UAAErmC,IACV,MAAMsmC,EAAWtzC,KAAKyhC,MAAMz0B,GAAWG,MACvCnN,KAAKyhC,MAAMz0B,GAAWG,MAAqB,QAAbmmC,EAAqB,SAAW,MAE9DtzC,KAAK0lC,cAAe,EACpB1lC,KAAKslC,aAAa,eAAgB,IAAItlC,KAAKyhC,QAC3CzhC,KAAKqhC,YACT,CAEAkS,mBAAAA,GACIvzC,KAAKsjC,gBAAgBzT,sBACrB7vB,KAAKwzC,wBAAwB,CACzBC,QAASzzC,KAAK0zC,gBACdC,QAAS3zC,KAAK4zC,gBACdC,SAAU7zC,KAAK8zC,sBACfC,eAAgB/zC,KAAKirC,gBACrB+I,gBAAiBh0C,KAAKmrC,kBAE9B,CAEAqI,uBAAAA,EAAwB,QAAEC,EAAO,QAAEE,EAAO,SAAEE,EAAQ,OAAEjd,EAAM,OAAEC,EAAM,eAAEkd,EAAc,gBAAEC,IAClF,MAAMt8B,EAAS1X,KAAKsjC,gBAAgB5rB,OACpC,IAAKA,EACD,OAGJ,GAAuB,iBAAZ+7B,GAGP,GAFAzzC,KAAK0zC,gBAAkBD,EAEnBA,EAAU/7B,EAAO7B,aAAauX,MAAQqmB,EAAU/7B,EAAO7B,aAAaw1B,MAEpE,YADArrC,KAAKi0C,6BAGN,GAAsB,iBAAXpd,EACd,OAGJ,GAAuB,iBAAZ8c,GAGP,GAFA3zC,KAAK4zC,gBAAkBD,EAEnBA,EAAUj8B,EAAO7B,aAAasX,KAAOwmB,EAAUj8B,EAAO7B,aAAauM,OAEnE,YADApiB,KAAKi0C,6BAGN,GAAsB,iBAAXpd,EACd,OAGJ,MAAMqd,EAAYtd,GAAW6c,EAAU/7B,EAAO7B,aAAauX,KACrD+mB,EAAYtd,GAAW8c,EAAUj8B,EAAO7B,aAAasX,IACvDntB,KAAKsiC,cAAcC,cAAgB2R,IAAcl0C,KAAKsiC,cAAc1L,QAAUud,IAAcn0C,KAAKsiC,cAAczL,SAInH72B,KAAKqlC,kBAAmB,EACxBrlC,KAAKsiC,cAAcC,cAAe,EAClCviC,KAAKsiC,cAAc1L,OAASsd,EAC5Bl0C,KAAKsiC,cAAczL,OAASsd,EAC5Bn0C,KAAK8zC,sBAAwBD,EAC7B7zC,KAAKirC,gBAAkB8I,EACvB/zC,KAAKmrC,iBAAmB6I,EACxBh0C,KAAKqhC,aACT,CAEA+S,2BAAAA,EAA4B,QAAEX,EAAO,QAAEE,IACnC3zC,KAAKwiC,qBAAuB,CAAE/3B,EAAGgpC,EAASlpC,EAAGopC,EAASxc,SAAUn3B,KAAKwiC,qBAAqBrL,SAC1Fn3B,KAAKmnC,qBAAsB,EAC3BnnC,KAAKqhC,YACT,CAEAgT,sBAAAA,CAAuBhsB,EAAcwrB,GACjC,GAAI7zC,KAAKqiC,kBAAkB+C,IAAI/c,GACvBwrB,EACA7zC,KAAKqiC,kBAAkBlkB,QAEvBne,KAAKqiC,kBAAkBzxB,OAAOyX,QAGlC,GAAIwrB,EACA,IAAK,IAAI5mC,KAAUjN,KAAKshC,QACpBthC,KAAKqiC,kBAAkB3xB,IAAIzD,QAG/BjN,KAAKqiC,kBAAkB3xB,IAAI2X,GAInCroB,KAAKqlC,kBAAmB,EACxBrlC,KAAKslC,aAAa,4BAA6BtlC,KAAKqiC,mBACpDriC,KAAKqhC,YACT,CAEA4S,qBAAAA,CAAsBD,GACbh0C,KAAKsiC,cAAcC,eAIxBviC,KAAKqlC,kBAAmB,EACxBrlC,KAAKsiC,cAAcC,cAAe,EAClCviC,KAAKmrC,iBAAmB6I,EACxBh0C,KAAKqhC,aACT,CAEAiT,aAAAA,EAAc,QAAEb,IACZ,IAAKzzC,KAAKoQ,WAAyB,aAC/B,OAGJ,MAAMyF,EAAe7V,KAAKsjC,gBAAgBztB,aACpC6B,EAAS1X,KAAKsjC,gBAAgB5rB,OAEpC,IAAK,IAAIzK,KAAUjN,KAAKshC,QAAS,CAC7B,MAAM3lB,EAAS1O,EAAOxB,KAAKyd,cAErBze,GAAKgpC,EAAU59B,EAAauX,MAAQ1V,EAAOlB,cAAgBmF,EAAOG,KAAOH,EAAOI,MAAQJ,EAAOI,KACrG/b,KAAK8Q,KAAK,eAAgB,CAAErG,IAAGwC,UACnC,CACJ,CAEAsnC,kBAAAA,GACI,MAAMC,EAAmBx0C,KAAKyiC,eAC9BziC,KAAKyiC,eLp6CN,UAA4B,gBAAEgS,EAAe,cAAE/K,IAClD,IAAK+K,EAAgB72C,OACjB,OAAO8rC,EAGX,MAAMgL,EAAcD,EAAgBA,EAAgB72C,OAAS,GAC7D,GAAI82C,EAAY9V,UAlPO,KAkP6B8V,EAAYrK,sBAAwBqK,EAAYhW,SAlP7E,GAmPnB,OAAOgL,EAGX,MAAMiL,EAAsBjL,EAAckL,WAAWxf,GAC1CA,EAAQ3qB,IAAMiqC,EAAYjqC,GAAK2qB,EAAQ7qB,IAAMmqC,EAAYnqC,IAGpE,OAA6B,IAAzBoqC,EACO,IAAIjL,EAAegL,GAEnBhL,EAAchiB,QAAO,CAACqmB,EAAGzoC,IAAUA,IAAUqvC,GAE5D,CKi5C8BJ,CAAmB,CACrCE,gBAAiBz0C,KAAKsiC,cAAcnN,SACpCuU,cAAe1pC,KAAKyiC,iBAExBziC,KAAKqlC,iBAAmBrlC,KAAKyiC,iBAAmB+R,EAChDx0C,KAAKqhC,YACT,CAEAwT,kBAAAA,GACuC,IAA/B70C,KAAKyiC,eAAe7kC,SAIxBoC,KAAKyiC,eAAiB,GACtBziC,KAAKqlC,kBAAmB,EACxBrlC,KAAKqhC,aACT,CAEAyT,aAAAA,GACQ90C,KAAK0iC,aAIT1iC,KAAK0iC,YAAa,EAClB1iC,KAAKslC,aAAa,qBAAsBtlC,KAAK0iC,YAC7C1iC,KAAKqhC,aACT,CAEA0T,YAAAA,CAAaC,EAAehoC,EAAWg0B,GACnC,IAAKhhC,KAAK0iC,WACN,OAGJ1iC,KAAK0iC,YAAa,EAClB1iC,KAAKslC,aAAa,qBAAsBtlC,KAAK0iC,YAE7C,MAAMuS,EAAUjoC,GAA2B,IAAdA,EACvBkoC,EAAgBlU,IAAchhC,KAAKmiC,WAErC8S,GAAWC,GACXl1C,KAAKsvC,UAAU0F,EAAehoC,GAC9BhN,KAAKslC,aAAa,uBAAwB,CAAE0P,gBAAehoC,YAAWg0B,eAC/DA,GACPhhC,KAAKslC,aAAa,uBAAwB,CAAE0P,gBAAehoC,YAAWg0B,cAG1EhhC,KAAKqhC,YACT,CAEA,oBAAI8T,CAAiB5rC,GACI,iBAAVA,IAIXvJ,KAAKgjC,cAAgB,GACrBhjC,KAAKijC,aAAe,EACpBjjC,KAAKkjC,kBAAoB35B,EAC7B,CAEA,cAAIuwB,CAAWvwB,QACG1L,IAAV0L,IAIJvJ,KAAKslC,aAAa,qBAAsB/7B,GAE1B,KAAVA,IACAA,EAAQ,KAGZA,EAAQ/K,WAAW+K,IACd2mB,MAAM3mB,IAAUA,GAAS,KAAOA,GAAS,IAC1CvJ,KAAK6hC,YAAct4B,EACnBvJ,KAAK0lC,cAAe,GAGxB1lC,KAAKqhC,aACT,CAEA,uBAAItH,CAAoBxwB,QACN1L,IAAV0L,IAIJvJ,KAAKslC,aAAa,+BAAgC/7B,GAEpC,KAAVA,IACAA,EAAQ,GAGZA,EAAQ/K,WAAW+K,IACd2mB,MAAM3mB,IAAUA,GAAS,IAAMA,IAAU,KAC1CvJ,KAAK8hC,qBAAuBv4B,EAC5BvJ,KAAK0lC,cAAe,GAGxB1lC,KAAKqhC,aACT,CAEA,kBAAI+P,CAAe7nC,QACD1L,IAAV0L,IAIJvJ,KAAK+hC,gBAAkBx4B,EACvBvJ,KAAKslC,aAAa,0BAA2B/7B,GAC7CvJ,KAAKqhC,aACT,CAEA+T,oBAAAA,GACIp1C,KAAKoxC,gBAAkBpxC,KAAKoxC,cAChC,CAEAiE,kBAAAA,GACIr1C,KAAKgiC,eAAiBhiC,KAAKgiC,cAC3BhiC,KAAKslC,aAAa,wBAAyBtlC,KAAKgiC,eAChDhiC,KAAKqhC,YACT,CAEAiU,wBAAAA,GACIt1C,KAAKkiC,qBAAuBliC,KAAKkiC,oBACjCliC,KAAKslC,aAAa,8BAA+BtlC,KAAKkiC,qBACtDliC,KAAKqhC,YACT,CAEAkU,oBAAAA,GACIv1C,KAAKiiC,iBAAmBjiC,KAAKiiC,gBAC7BjiC,KAAKslC,aAAa,0BAA2BtlC,KAAKiiC,iBAClDjiC,KAAKqhC,YACT,CAEAmU,UAAAA,CAAWntB,EAAc8O,GACrB9O,EAAamd,QAAUrO,EACvBn3B,KAAKshC,QAAU,IAAIthC,KAAKshC,SAEpBjZ,EAAamd,OACbxlC,KAAKylC,YAAYpd,GAEjBroB,KAAKmwC,YAAY9nB,GAGrBroB,KAAKslC,aAAa,iBAAkBtlC,KAAKshC,QAAS,CAAEmU,YAAY,IAChEz1C,KAAK0lC,cAAe,EACpB1lC,KAAKqhC,YACT,CAEA,eAAIwB,CAAYt5B,GACZvJ,KAAK2iC,aAAep5B,GAAS,GAC7BvJ,KAAKimC,qBAAsB,EAC3BjmC,KAAKqhC,YACT,CAUA1I,YAAAA,CAAapvB,EAAO8e,EAAcqtB,GAC9B,MAAMC,EAAgB31C,KAAK8iC,SAASv5B,GACpC,GAA6B,iBAAlBosC,EACP,OAAOA,EAGX,MAAMC,EAAavtC,OAAOQ,KAAK7I,KAAK8iC,UAAUllC,OAc9C,OAbAoC,KAAK8iC,SAASv5B,GAASqsC,EAGvB51C,KAAKshC,QAAQjZ,EAAa/iB,OAAOqlC,SAAU,EACvC+K,IACA11C,KAAKshC,QAAQjZ,EAAa/iB,OAAOulC,UAAW,EAC5C7qC,KAAK+iC,WAAY,EACjB/iC,KAAKslC,aAAa,oBAAqBtlC,KAAK+iC,WAC5C/iC,KAAKslC,aAAa,oBAAqBtlC,KAAK8iC,WAGhD9iC,KAAKslC,aAAa,kBAAmBtlC,KAAK8iC,UAEnC8S,CACX,CAEAC,aAAAA,GACI71C,KAAKklC,aAAc,EACnBllC,KAAKqhC,YACT,EQ90DG,SAASyU,GAASC,EAAaxlC,EAAWylC,EAAa,KAAMC,EAAM,IACtE,GAA4B,mBAAjBD,EAA6B,CACpC,MAAME,EAAuBF,EAC7BA,EAAeA,IAAME,CACzB,CAEA,MAAO3sC,EAAO4sC,IAAYC,EAAAA,EAAAA,UAASJ,GAiBnC,OAfAK,EAAAA,EAAAA,YAAU,KACN,MAAM7R,EAAY8R,IACd,GAA4B,mBAAjBA,EAA6B,CACpC,MAAMC,EAAuBD,EAC7BA,EAAeA,IAAMC,CACzB,CACAJ,EAASG,EAAa,EAI1B,OADAP,EAAYzlC,GAAGC,EAAWi0B,GACnB,KACHuR,EAAYplC,IAAIJ,EAAWi0B,EAAS,CACvC,GACF,IAAIyR,EAAOE,EAAUJ,IAEjBxsC,CACX,CAEO,SAASitC,GAAerwB,GAC3B,OAAO2vB,GAAS3vB,EAAiB,sBAAuBA,EAAgBmd,gBAAkBnd,EAAgBmd,gBAAgB5rB,OAAS,CAC/HlB,aAAc,EACdC,cAAe,EACfC,YAAa,EACbC,aAAc,GAEtB,CAEO,SAAS8/B,GAAQtwB,GACpB,OAAO2vB,GAAS3vB,EAAiB,eAAgBA,EAAgBsB,KACrE,CAEO,SAASivB,GAAUvwB,GACtB,OAAO2vB,GAAS3vB,EAAiB,iBAAkBA,EAAgBlZ,OACvE,CAEO,SAAS0pC,GAAqBxwB,GACjC,OAAO2vB,GAAS3vB,EAAiB,6BAA8BA,EAAgBmqB,kBACnF,CAEO,SAASsG,GAAkBzwB,GAC9B,OAAO0wB,GAAa1wB,GAAiBvoB,MACzC,CAEO,SAASk5C,GAAiB3wB,GAC7B,OAAO4wB,GAAY5wB,GAAiBvoB,MACxC,CAEO,SAASi5C,GAAa1wB,GACzB,OAAO2vB,GAAS3vB,EAAiB,qBAAsBA,EAAgBwpB,UAC3E,CAEO,SAASoH,GAAY5wB,GACxB,OAAO2vB,GAAS3vB,EAAiB,oBAAqBA,EAAgBupB,SAC1E,CAUO,SAASsH,GAAc7wB,GAC1B,OAAO2vB,GAAS3vB,EAAiB,sBAAuBA,EAAgBsB,KAAK7oB,KAAI,EAAGsqB,mBAAoBA,IAC5G,CAUO,SAAS+tB,GAAc9wB,GAC1B,OAAO2vB,GAAS3vB,EAAiB,sBAAuBA,EAAgBoqB,WAC5E,CAkBO,SAAS2G,GAAa/wB,GACzB,OAAO2vB,GAAS3vB,EAAiB,qBAAsBA,EAAgB0qB,UAC3E,CAMO,SAASsG,GAAkBhxB,GAC9B,OAAO2vB,GAAS3vB,EAAiB,0BAA2BA,EAAgBirB,eAChF,CAEO,SAASgG,GAAgBjxB,GAC5B,OAAO2vB,GAAS3vB,EAAiB,wBAAyBA,EAAgBwP,aAC9E,CAMO,SAAS0hB,GAAkBlxB,GAC9B,OAAO2vB,GAAS3vB,EAAiB,0BAA2BA,EAAgBkrB,eAChF,CAEO,SAASiG,GAAsBnxB,GAClC,OAAO2vB,GAAS3vB,EAAiB,8BAA+BA,EAAgBmrB,mBACpF,CAUO,SAASiG,GAAUpxB,GACtB,OAAO2vB,GAAS3vB,EAAiB,sBAAuBA,EAAgBzO,OAC5E,CAEO,SAAS8/B,GAASrxB,GACrB,OAAO2vB,GAAS3vB,EAAiB,eAAgBA,EAAgBsrB,MACrE,CChJe,MAAM5iC,WAAoB+lB,EAAAA,QAAAA,cAErCxM,MAAAA,GACI,MAAM,WAAEqvB,EAAU,gBAAEjG,GAAoBxxC,KAAK2B,OACvC,YAAEkhC,EAAW,aAAErsB,GAAiBg7B,EAEhCkG,EAAmB7U,EAAYnb,QAAOnpB,QAAuBV,IAAlBU,EAAEytC,kBAA8CnuC,IAAjBU,EAAEsgC,aAElF,OACIjK,EAAAA,QAAAA,cAAA,OAAK6B,UAAU,uBAEPihB,EAAiB94C,KAAI,EAAGotC,cAAanN,aAAY3+B,UAASwrC,UAAS98B,YAAYlR,KAC3E,MAAMi6C,EAAkB,CACpBvqB,KAAM4e,GAGV,GAAIN,EACA,OACI9W,EAAAA,QAAAA,cAAA,OAAKzsB,IAAM,SAAQzK,IAAK+4B,UAAU,8CAA8C7wB,MAAO+xC,GACnF/iB,EAAAA,QAAAA,cAAA,OACI6B,UAAU,0BACV7wB,MAAO,CAAE2F,MAAOszB,EAAYlpB,OAAQ8hC,MAI7C,CACH,MAAMG,EAAmBhpC,EAAWiwB,EAAaplB,KAAKK,IAAI+kB,EAAY,GAEhEjvB,EAAY,CAAC,EACnB,GAAI1P,EAAS,CACT0P,EAAUud,IAAM,GAAKzvB,EACrBkS,EAAUvQ,SAAW,WACrB,MAAMw4C,EAA2C,KAAxB33C,GAAW,IAAItC,OACpC4Y,EAAe,GAAKA,EAAew1B,EAAc6L,EAAkB,IACnEjoC,EAAUwd,MAAQyqB,EAAkB,EACpCjoC,EAAUkoC,UAAY,SAEtBloC,EAAUwd,KAAOwqB,EAAmB,CAE5C,CAEA,OACIhjB,EAAAA,QAAAA,cAAA,OAAKzsB,IAAM,SAAQzK,IAAK+4B,UAAU,8CAA8C7wB,MAAO+xC,GACnF/iB,EAAAA,QAAAA,cAAA,OACI6B,UAAU,oBACV7wB,MAAO,CAAE2F,MAAOqsC,EAAkBjiC,OAAQ8hC,KAE7Cv3C,IAAY0O,GACTgmB,EAAAA,QAAAA,cAAA,OAAK6B,UAAU,kBAAkB7wB,MAAOgK,GACnC1P,GAKrB,KAKpB,EAGJ2O,GAAYgmB,UAAY,CACpB2c,gBAAiB7tC,IAAAA,MAAgB,CAC7Bk/B,YAAal/B,IAAAA,QAAkBA,IAAAA,MAAgB,CAC3CqoC,YAAaroC,IAAAA,OACbk7B,WAAYl7B,IAAAA,OACZzD,QAASyD,IAAAA,OACT+nC,QAAS/nC,IAAAA,KACTiL,SAAUjL,IAAAA,QACVtB,WACJmU,aAAc7S,IAAAA,OAAiBtB,aAEnCo1C,WAAY9zC,IAAAA,QCrEhB,SAAeixB,EAAAA,QAAAA,KAAWvlB,IAE1B,SAASA,IAAgB,gBAAE8W,EAAe,gBAAE4xB,EAAe,YAAEC,EAAW,6BAAEC,IACtE,MAAMt8B,EAASq7B,GAAc7wB,GAAiB,GACxCzO,EAAS6/B,GAAUpxB,GAEzB,IAAKzO,EACD,OAAO,KAGX,MAAMwgC,EAAyBD,GAAgC,CAAEE,IAC7D,MAAMC,GAASD,EAAM1E,QAAU/7B,EAAO7B,aAAauX,MAAM1V,EAAOlB,aAC1D6hC,EAAQ,GAAKF,EAAMxE,QAAUj8B,EAAO7B,aAAasX,KAAKzV,EAAOjB,cAEnEwhC,EAA6BE,EAAO,CAChC1tC,EAAG2tC,GAAOz8B,EAAOG,KAAOH,EAAOI,MAAQJ,EAAOI,KAC9CxR,EAAG8tC,GAAO18B,EAAOpE,KAAOoE,EAAOrE,MAAQqE,EAAOrE,MAErD,GAED,OACIsd,EAAAA,QAAAA,cAAA,OAAK6B,UAAU,2BAA2BrnB,cAAe8oC,GACrDtjB,EAAAA,QAAAA,cAAA,OAAKrpB,MAAOmM,EAAOlB,aAAcb,OAAQ+B,EAAOjB,eAExCshC,EAAgBn5C,KAAI,CAAC2d,EAAOjX,KACxB,MAAMgzC,GAAM/7B,EAAM9R,EAAIkR,EAAOI,OAAOJ,EAAOG,KAAOH,EAAOI,MACnDw8B,EAAM,GAAKh8B,EAAMhS,EAAIoR,EAAOrE,OAAOqE,EAAOpE,KAAOoE,EAAOrE,MAE9D,GAAIghC,EAAK,GAAKA,EAAK,GAAKC,EAAK,GAAKA,EAAK,EACnC,OAAO,KAGX,MAAM53B,EAAS23B,EAAK5gC,EAAOlB,aACrBoK,EAAS23B,EAAK7gC,EAAOjB,cAErB1H,EAASwN,EAAMxN,QAAU,EACzBC,EAAYuN,EAAMvN,WAAazR,EAAAA,YAAY,GAC3C0R,EAAcsN,EAAMtN,aAAe,QACnCC,EAAcqN,EAAMrN,aAAe,EAiCnCC,EAAUoN,EAAMpN,SAAW,CAAEgpC,IAC/B57B,EAAMpN,QAAQgpC,EAAO57B,EACxB,GAEKnN,EAAgBmN,EAAMnN,eAAiB,CAAE+oC,IAC3CA,EAAMK,kBACNj8B,EAAMnN,cAAc+oC,EAAO57B,EAC9B,GAED,OACIqY,EAAAA,QAAAA,cAAA,UACIzsB,IAAK7C,EACLmzC,GAAI93B,EACJ+3B,GAAI93B,EACJxiB,EAAG2Q,EACHkK,KAAMjK,EACNkJ,OAAQjJ,EACRC,YAAaA,EACbypC,YAjDaR,IAGjB,GAFAA,EAAMK,mBAEDR,EACD,OAGJ,MAAMY,EAAUj4B,EAASw3B,EAAM1E,QACzBoF,EAAUj4B,EAASu3B,EAAMxE,QAEzBmF,EAAeC,IACjB,MAAMX,GAASW,EAAUtF,QAAUmF,GAASlhC,EAAOlB,aAC7C6hC,EAAQ,GAAKU,EAAUpF,QAAUkF,GAASnhC,EAAOjB,cAEvDuhC,EAAY,CACR1yC,QACAiX,QACA9R,EAAG2tC,GAAOz8B,EAAOG,KAAOH,EAAOI,MAAQJ,EAAOI,KAC9CxR,EAAG8tC,GAAO18B,EAAOpE,KAAOoE,EAAOrE,MAAQqE,EAAOrE,MAC/CyhC,EAAU,EAGXC,EAAYA,KACd/yC,OAAOgzC,oBAAoB,YAAaH,GACxC7yC,OAAOgzC,oBAAoB,UAAWD,EAAU,EAGpD/yC,OAAOizC,iBAAiB,YAAaJ,GACrC7yC,OAAOizC,iBAAiB,UAAWF,EAAU,EAsBzC7pC,QAASA,EACTC,cAAeA,GACjB,KAO9B,CAEAC,GAAgBwlB,UAAY,CACxB1O,gBAAiBxiB,IAAAA,WAAqB48B,IAAiBl+B,WACvD01C,gBAAiBjjB,EAAgBzlB,gBAAgBhN,WACjD21C,YAAar0C,IAAAA,KACbs0C,6BAA8Bt0C,IAAAA,MC1GlC,SAAeixB,EAAAA,QAAAA,KAAW3kB,IAE1B,SAASA,IAAc,gBAAEkW,EAAe,cAAEgzB,EAAa,aAAEC,EAAY,OAAEz9B,EAAM,aAAEnF,EAAY,cAAEC,IACzFkF,EAASA,GAAUq7B,GAAc7wB,GAAiB,GAClD,MAAMzO,EAAS6/B,GAAUpxB,GAEzB,IAAKzO,EACD,OAAO,KAGX,MAAM2hC,EAAwBF,EAAczxB,QAAO4xB,KAC3CF,IAAiBE,EAAKvpC,cAItBupC,EAAKtpC,mBAAqBopC,KAOlC,OAAqC,IAAjCC,EAAsBz7C,OACf,KAIPg3B,EAAAA,QAAAA,cAAA,OAAK6B,UAAU,0BACX7B,EAAAA,QAAAA,cAAA,OAAKrpB,MAAOiL,GAAgBkB,EAAOlB,aAAcb,OAAQc,GAAiBiB,EAAOjB,eAEzE4iC,EAAsBz6C,KAAI,CAAC06C,EAAMh0C,KACzB8zC,GAA6C,iBAAtBE,EAAKvpC,eAC5BupC,EAAO,IACAA,KACAA,EAAKvpC,eAIhB,MAAMuoC,GAAMgB,EAAK7uC,EAAIkR,EAAOI,OAAOJ,EAAOG,KAAOH,EAAOI,MAExD,GAAIu8B,EAAK,GAAKA,EAAK,EACf,OAAO,KAGX,MAAM33B,EAAS23B,GAAM9hC,GAAgBkB,EAAOlB,cAC5C,GAA8B,iBAAnB8iC,EAAKzpC,WAA0B8Q,EAAS24B,EAAKzpC,UACpD,OAAO,KAGX,GAA8B,iBAAnBypC,EAAKxpC,WAA0B6Q,EAAS24B,EAAKxpC,UACpD,OAAO,KAGX,MAAMypC,EAAY,CACdrhC,OAAQohC,EAAKv7C,MACbmR,YAAaoqC,EAAK/tC,SACd+tC,EAAK1zC,OAAS,CAAC,GAGjB6J,EAAc,CAChBwJ,KAAMqgC,EAAKv7C,SACPu7C,EAAK7pC,aAAe,CAAC,GAGvBG,EAAY,CAEV4pC,SAAU,OACVvgC,KAAMqgC,EAAKv7C,MACXma,OAAQ,OACRuhC,WAAY,SACZC,iBAAkB,aAElBJ,EAAK1pC,WAAa,CAAC,GAG3B,IAAIL,EAAU,EACc,iBAAjB+pC,EAAK/pC,QACZA,EAAU+pC,EAAK/pC,QACR+pC,EAAK5pC,OACZH,EAAU,IAGd,IAAII,EAAU,EAKd,MAJ4B,iBAAjB2pC,EAAK3pC,UACZA,EAAU2pC,EAAK3pC,SAIfilB,EAAAA,QAAAA,cAACA,EAAAA,QAAAA,SAAc,CAACzsB,IAAK7C,GACjBsvB,EAAAA,QAAAA,cAAA,QACI3Z,GAAI0F,EACJzF,GAAI3L,EACJ4L,GAAIwF,EACJvF,GAAK3E,GAAiBiB,EAAOjB,cAC7B7Q,MAAO2zC,IAIPD,EAAK9pC,SACLolB,EAAAA,QAAAA,cAAA,WACIxY,OAAS,GAAEuE,EAAS,OAAOA,EAAS,OAAOA,MAC3C/a,MAAO6J,IAKX6pC,EAAK5pC,MACLklB,EAAAA,QAAAA,cAAA,QACInqB,EAAGkW,EACHpW,EAAGoF,EACH/J,MAAOgK,GAEN0pC,EAAK5pC,MAGD,KAO7C,C,uOAEAO,GAAc4kB,UAAY,CACtB1O,gBAAiBxiB,IAAAA,WAAqB48B,IAAiBl+B,WACvD82C,cAAerkB,EAAgB7kB,cAAc5N,WAC7C+2C,aAAcz1C,IAAAA,KACdgY,OAAQhY,IAAAA,OACR6S,aAAc7S,IAAAA,OACd8S,cAAe9S,IAAAA,QCnHnB,SAAeixB,EAAAA,QAAAA,KAAW+kB,IAE1B,SAASA,IAAU,gBAAExzB,EAAe,MAAEE,EAAK,WAAEoxB,EAAU,uBAAEmC,EAAsB,aAAEC,EAAY,gBAAEC,GAAgB,EAAI,eAAEC,EAAc,kBAAEzzB,EAAiB,gBAAEyxB,EAAe,YAAEC,EAAW,6BAAEC,EAA4B,cAAEkB,EAAa,WAAEhnB,EAAU,SAAEzB,EAAQ,aAAEspB,IACrP,MAAMC,GAAWC,EAAAA,EAAAA,cAAaC,IAK1B,GAJIh0B,EAAgBmd,iBAChBnd,EAAgBmd,gBAAgBplB,WAG/Bi8B,EACD,OAGJ,MAAMtI,EAAW,IAAI3rB,GAAkB,CACnCC,gBAAiBA,EACjBC,cAAe+zB,EACf9zB,QACAC,sBAGJH,EAAgBmd,gBAAkBuO,EAClCA,EAASxqB,QAAQ,GAClB,CAAChB,EAAOF,KAGJi0B,EAAiBC,IAAsBjE,EAAAA,EAAAA,UAAS,CACnDjf,SAAS,EACTmjB,MAAO,CAAC,EACR10C,MAAO,CAAC,IAGN2qC,EAAa0G,GAAc9wB,GAE3B2P,EAAY2gB,GAAQtwB,GAAiBvoB,OAErCw3B,EJ0CH,SAAyBjP,GAC5B,OAAO2vB,GAAS3vB,EAAiB,wBAAyBA,EAAgBwqB,aAC9E,CI5CoB4J,CAAgBp0B,GAC1BwP,EAAeyhB,GAAgBjxB,GAC/Bq0B,EAAkBlD,GAAsBnxB,GACxCqrB,EJ+EH,SAA4BrrB,GAC/B,OAAO2vB,GAAS3vB,EAAiB,sBAAuBA,EAAgBqrB,gBAC5E,CIjF4BiJ,CAAmBt0B,GACrC+Q,EJ0CH,SAAwB/Q,GAC3B,OAAO2vB,GAAS3vB,EAAiB,gCAAiCA,EAAgByqB,iBACtF,CI5CwB8J,CAAev0B,GAsOnC,OArJAkwB,EAAAA,EAAAA,YAAU,KACN,MAAMsE,EAAWA,KACRd,GAIL1zB,EAAgBotB,qBAAqB,EAGnCqH,EAAqBzC,IAClB0B,GAIL1zB,EAAgBqtB,wBAAwB,CACpCC,QAAS0E,EAAM1E,QACfE,QAASwE,EAAMxE,QACfE,SAAUsE,EAAMtE,UAClB,EAGAgH,EAAY1C,GAAUA,EAAM2C,UAAU,IAAM3C,EAAM4C,iBAAiB,GAEnEC,EAAsB7C,IACxB,IAAK0B,EACD,OAEJ,MAAMoB,EAAQJ,EAAS1C,GAClB8C,IACL90B,EAAgBqtB,wBAAwB,CACpCC,QAASwH,EAAMxH,QACfE,QAASsH,EAAMtH,UAIfwE,EAAM+C,YAAc/C,EAAMtyC,OAAOs1C,QAAQ,gBACzChD,EAAMiD,iBACV,EAGEC,EAAqBlD,IACvB,IAAK0B,EACD,OAEJ,MAAMoB,EAAQJ,EAAS1C,GAClB8C,IACL90B,EAAgBqtB,wBAAwB,CACpCC,QAASwH,EAAMxH,QACfE,QAASsH,EAAMtH,UAIfwE,EAAM+C,YAAc/C,EAAMtyC,OAAOs1C,QAAQ,gBACzChD,EAAMiD,iBACV,EAGEE,EAAmBA,KACrBn1B,EAAgB8tB,uBAAuB,EAU3C,OAPAhuC,OAAOizC,iBAAiB,SAAUyB,EAAU,CAAEY,SAAS,IACvDt1C,OAAOizC,iBAAiB,YAAa0B,EAAmB,CAAEW,SAAS,IACnEt1C,OAAOizC,iBAAiB,aAAc8B,EAAoB,CAAEO,SAAS,IACrEt1C,OAAOizC,iBAAiB,YAAamC,EAAmB,CAAEE,SAAS,IACnEt1C,OAAOizC,iBAAiB,WAAYoC,EAAkB,CAAEC,SAAS,IACjEt1C,OAAOizC,iBAAiB,cAAeoC,EAAkB,CAAEC,SAAS,IAE7D,KACHt1C,OAAOgzC,oBAAoB,SAAU0B,GACrC10C,OAAOgzC,oBAAoB,YAAa2B,GACxC30C,OAAOgzC,oBAAoB,aAAc+B,GACzC/0C,OAAOgzC,oBAAoB,YAAaoC,GACxCp1C,OAAOgzC,oBAAoB,WAAYqC,GACvCr1C,OAAOgzC,oBAAoB,cAAeqC,EAAiB,CAC9D,GACF,IA0EC1mB,EAAAA,QAAAA,cAAA,OAAK6B,UAAU,gCACVqiB,YA5KYX,IACjB,GAAIiC,EAAgBjjB,QAAS,CACzB,MAAMthB,EAAesQ,EAAgBmd,gBAAgBztB,aAC/CpL,EAAI0tC,EAAM1E,QAAU59B,EAAauX,KACjC7iB,EAAI4tC,EAAMxE,QAAU99B,EAAasX,IAEvCktB,GAAmB,EAAGC,YACX,CACHnjB,SAAS,EACTmjB,QACA10C,MAAO,CACHwnB,KAAM3T,KAAKC,IAAIjP,EAAG6vC,EAAM7vC,GACxB0iB,IAAKojB,EAAa,EAAI92B,KAAKC,IAAInP,EAAG+vC,EAAM/vC,GACxCgB,MAAOkO,KAAK+J,IAAI/Y,EAAI6vC,EAAM7vC,GAC1BkL,OAAQ46B,EAAa16B,EAAaF,OAAS8D,KAAK+J,IAAIjZ,EAAI+vC,EAAM/vC,OAI9E,GA2JKixC,aA1EYA,KACjBr1B,EAAgBiuB,4BAA4B,CACxCjd,SAAS,GACX,EAwEGwhB,YAxOYR,IACjB,IAAKyB,EACD,OAGJ,IAAI6B,EAActD,EAAMtyC,OACxB,IAAK,IAAInI,EAAI,EAAGA,EAAI,IAAM+9C,EAAa/9C,IAAK,CACxC,GAAI+9C,EAAYC,UAAUC,SAAS,mBAC/B,OAEJF,EAAcA,EAAYx0C,UAC9B,CAEA,MAAM4O,EAAesQ,EAAgBmd,gBAAgBztB,aAE/CykC,EAAQ,CACV7vC,EAAG0tC,EAAM1E,QAAU59B,EAAauX,KAChC7iB,EAAG4tC,EAAMxE,QAAU99B,EAAasX,KAIpCktB,EAAmB,CACfljB,SAAS,EACTmjB,QACA10C,MAAO,CACHwnB,KAAMktB,EAAM7vC,EACZ0iB,IAAKmtB,EAAM/vC,EACXgB,MAAO,EACPoK,OAAQ,KAIhB,MAAMqjC,EAAab,IAGf,GAFAlyC,OAAOgzC,oBAAoB,UAAWD,IAEjCY,EACD,OAGJ,MAAMnvC,EAAI0tC,EAAM1E,QAAU59B,EAAauX,KACjC7iB,EAAI4tC,EAAMxE,QAAU99B,EAAasX,IAEvChH,EAAgBysB,uBAAuB,CACnC/iC,UAAW4J,KAAKC,IAAIjP,EAAG6vC,EAAM7vC,GAC7BqF,UAAW2J,KAAKK,IAAIrP,EAAG6vC,EAAM7vC,GAC7BqoC,UAAWr5B,KAAKC,IAAInP,EAAG+vC,EAAM/vC,GAC7BwoC,UAAWt5B,KAAKK,IAAIvP,EAAG+vC,EAAM/vC,KAGjC8vC,EAAmB,CACfljB,SAAS,EACTvxB,MAAO,CAAC,GACV,EAGNK,OAAOizC,iBAAiB,UAAWF,EAAU,EAkLxC7pC,QAtEQgpC,IAMb,GALAhyB,EAAgBmuB,cAAc,CAC1Bb,QAAS0E,EAAM1E,QACfE,QAASwE,EAAMxE,UAGfoG,GAAkBA,EAAe3rC,eACjC+X,EAAgB0uB,0BAepB,GAVKsD,EAAMtyC,OAAOs1C,QAAQ,0BACtBh1B,EAAgBiuB,4BAA4B,CACxCjd,SAAS,IAIZlxB,OAAOoxB,cAA+C,UAA/BpxB,OAAOoxB,eAAevsB,MAC9Cqb,EAAgBouB,qBAGhByF,EAAc,CACd,MAAM4B,EAAuB,CAAC,EAExB3uC,EAASkZ,EAAgBlZ,OAC/B,IAAK,IAAIvP,EAAI,EAAGA,EAAIuP,EAAOrP,OAAQF,IAAK,CACpC,MAAM2qB,EAAepb,EAAOvP,GAEtBga,EAASyO,EAAgBzO,OACzBiE,EAAS0M,EAAa5c,KAAKyd,cAE3B6gB,EAAQ5jB,EAAgBwqB,aAAa/Z,OAAOlf,EAAOlB,cAAgBmF,EAAOG,KAAOH,EAAOI,MAAQJ,EAAOI,KAE7G,IAAI3a,EAAOinB,EAAamB,YACpBnB,EAAajd,wBACbhK,EAAOA,EAAKsmB,QAAQ6C,GAA8B,iBAAbA,EAAM,MAG/C,MACM6f,EAAehpC,EADA+5B,GAAa/5B,EAAM2oC,EAAO,CAAEzO,aAAa,KAG9DsgB,EAAqBvzB,EAAalmB,MAAQioC,EAAa,EAC3D,CAIA4P,EAAa7B,EAAOyD,EACxB,GAuBKxsC,cArBaA,KAClB+W,EAAgB0uB,oBAAoB,EAqB/BgH,cAlBc1D,IACnBA,EAAMiD,kBACkB,IAApBtB,GACA3zB,EAAgBiuB,4BAA4B,CACxCX,QAAS0E,EAAM1E,QACfE,QAASwE,EAAMxE,QACfxc,SAAS,GAEjB,EAWKvxB,MAA6B,iBAAf6xC,EAA0B,CAAE9hC,OAAQ8hC,QAAe55C,GAElE+2B,EAAAA,QAAAA,cAAA,UAAQoC,IAAKijB,IAGTJ,GACAjlB,EAAAA,QAAAA,cAACG,GAAO2B,GAAA,CACJZ,UAAWA,EACXH,aAAcA,EACdxD,WAAYA,EACZzB,SAAUA,GACLqpB,GAAkB,CAAC,EACpB3kB,IAKR8B,EAAYC,SACZvC,EAAAA,QAAAA,cAACkC,GAAW,CACRI,YAAaA,IAKjBsjB,GACA5lB,EAAAA,QAAAA,cAAC/lB,GAAW,CACR4oC,WAAYA,GAActxB,GAAiBmd,iBAAiBztB,cAAcF,OAC1E67B,gBAAiBA,IAKrB2H,GACAvkB,EAAAA,QAAAA,cAAC3kB,GAAa,CACVkW,gBAAiBA,EACjBgzB,cAAeA,IAKnBpB,GACAnjB,EAAAA,QAAAA,cAACvlB,GAAe,CACZ8W,gBAAiBA,EACjB4xB,gBAAiBA,EACjBC,YAAaA,EACbC,6BAA8BA,IAKlC2B,GAA0BQ,EAAgBjjB,SAC1CvC,EAAAA,QAAAA,cAAA,OAAK6B,UAAU,mBACV7wB,MAAOw0C,EAAgBx0C,QAK5C,CAEA+zC,GAAU9kB,UAAY,CAClB1O,gBAAiBxiB,IAAAA,WAAqB48B,IAAiBl+B,WACvDgkB,MAAO1iB,IAAAA,KACP2iB,kBAAmB3iB,IAAAA,KACnB8zC,WAAY9zC,IAAAA,OACZi2C,uBAAwBj2C,IAAAA,KAAetB,WACvCw3C,aAAcl2C,IAAAA,KAAetB,WAC7B03C,eAAgBjlB,EAAgBvmB,eAChC4qC,cAAerkB,EAAgB7kB,cAC/B8nC,gBAAiBjjB,EAAgBzlB,gBACjC2oC,YAAar0C,IAAAA,KACbs0C,6BAA8Bt0C,IAAAA,KAC9Bq2C,aAAcr2C,IAAAA,KACdwuB,WAAYxuB,IAAAA,MAAgB,CAAC,MAAO,QACpC+sB,SAAU/sB,IAAAA,Q,0ICvWVM,GAAU,CAAC,ECTf,SAAS63C,GAAUC,GAAW,MAAC5uC,EAAK,IAAEuM,EAAG,IAAEI,EAAG,SAAEkiC,EAAQ,UAAEC,EAAS,UAAEhsB,EAAS,UAAEisB,EAAS,MAAEnqB,EAAK,SAAEC,EAAQ,SAAEC,EAAQ,cAAEkqB,EAAc,CAAC,GAAKC,EAAK,CAAC,GAC5I,IAAIC,EAAcN,EAEJ,QAAV5uC,IACAkvC,EAAc,IAAIN,GAGtB,IAAI9e,GAAW8e,EAAYriC,IAAMI,EAAMJ,GACnCsiC,IACA/e,EAAU,EAAMA,GAGpB,IAAIqf,EAAarf,EAAUgf,EAK3B,OAJI/rB,MAAMosB,KACNA,EAAa,GAGV,CACHA,aACAP,UAAWM,EACXjvC,MAAO8uC,EAAUG,EAAa,IAAKF,EAAelsB,YAAWmE,IAAe,QAAVjnB,EAAiB4kB,QAAOC,WAAUC,aACpGphB,KAAM,WACHurC,EAEX,CAEA,SAASG,GAAiBD,GAAY,MAACnvC,EAAK,IAAEuM,EAAG,IAAEI,EAAG,SAAEkiC,EAAQ,UAAEC,EAAS,UAAEhsB,EAAS,UAAEisB,EAAS,MAAEnqB,EAAK,SAAEC,EAAQ,SAAEC,EAAQ,cAAEkqB,EAAc,CAAC,GAAKC,EAAK,CAAC,GACpJ,IAAInf,EAAUqf,EAAWL,EACrBD,IACA/e,EAAU,EAAMA,GAGpB,IAAI8e,EAAY9e,GAAWnjB,EAAMJ,GAAOA,EAMxC,MAJc,QAAVvM,IACA4uC,EAAYtiC,KAAKu5B,IAAI,GAAI+I,IAGtB,CACHO,aACAP,YACA3uC,MAAO8uC,EAAUH,EAAW,IAAKI,EAAelsB,YAAWmE,IAAe,QAAVjnB,EAAiB4kB,QAAOC,WAAUC,aAClGphB,KAAM,WACHurC,EAEX,CAiBA,SAASI,GAAejzC,EAAOkzC,GAC3B,GAAIlzC,GAAS,EACT,OAAO,EAGX,GAAgB,IAAZkzC,EACA,OAAOhjC,KAAKya,MAAM3qB,GAGtB,GAAIA,GAASkzC,EACT,OAAOhjC,KAAKya,MAAM3qB,EAAMkzC,GAASA,EAGrC,IAAIC,EACJ,GAAgB,KAAZD,EACAC,EAAW,CAAC,EAAG,EAAG,EAAG,GAAI,QACtB,IAAgB,KAAZD,EAGP,MAAM,IAAIv6C,MAAM,mBAFhBw6C,EAAW,CAAC,EAAG,EAAG,EAAG,GAAI,GAAI,GAAI,GAGrC,CAEA,IAAIC,EAAY7S,IACZ8S,EAAc,EAClB,IAAK,IAAIl/C,EAAI,EAAGA,EAAIg/C,EAAS9+C,OAAQF,IAAK,CACtC,MAAMm/C,EAAQpjC,KAAK+J,IAAIk5B,EAASh/C,GAAK6L,GACjCszC,EAAQF,IACRC,EAAcF,EAASh/C,GACvBi/C,EAAYE,EAEpB,CAEA,OAAOD,CACX,CAEA,SAASE,GAAuBC,EAAMC,EAAc5qB,GAChD,MAAM6qB,EAAUF,EAAOC,EAEvB,OAAIC,EAAU,OAAa7qB,GAAiC,WAAjBA,GAChC,CACH8qB,OAAQV,GAAeS,EAAQ,IAAM,IACrCE,KAAM,KAIVF,EAAU,QAAgB7qB,GAAiC,WAAjBA,GACnC,CACH8qB,OAAQV,GAAeS,EAAO,IAAY,IAC1CE,KAAM,KAIVF,EAAU,SAAmB7qB,GAAiC,SAAjBA,GACtC,CACH8qB,OAAQV,GAAeS,EAAO,KAAe,IAC7CE,KAAM,KAIO,QAAjB/qB,GAA2B6qB,EAAU,SAAqB7qB,EACnD,CACH8qB,OAAQV,GAAeS,EAAO,MAAkB,GAChDE,KAAM,KAIVF,EAAU,UAAsB7qB,GAAiC,UAAjBA,GACzC,CACH8qB,OAAQV,GAAeS,EAAQ,GAAG,GAAG,GAAG,GAAG,IAAM,GACjDE,KAAM,SAIO,SAAjB/qB,EACO,CACH8qB,OAAQV,GAAeS,EAAQ,IAAI,GAAG,GAAG,GAAG,IAAM,GAClDE,KAAM,QAIP,CACHA,KAAM,IACND,OAAQ,GAEhB,CAiUe,SAASE,GAAUhB,GAC9B,OAAIA,EAAKrqB,MAzSb,UAAwB,IAAErY,EAAG,IAAEI,EAAG,UAAEmW,EAAS,kBAAEotB,EAAiB,aAAEC,EAAY,UAAErB,EAAS,UAAEsB,GAAU,EAAK,SAAEC,GAAS,EAAK,MAAErwC,EAAM,SAAQ,UAAE+uC,EAAS,SAAEF,GAAS,EAAK,cAAEG,IACnK,MAAMsB,EAAkBJ,EAAoB,EAAEC,EAExCI,EAAQ,GACRC,EAAkB,CAACxwC,QAAOuM,MAAKI,MAAKkiC,WAAUC,YAAWhsB,YAAWisB,YAAWC,gBAAepqB,OAAO,IAErG,OAAEmrB,EAAM,KAAEC,GAASL,GAAuBhjC,EAAMJ,EAAKuiC,EAAUwB,EAAiBtB,EAAc/pB,cAE9FH,EAAoB,UAATkrB,EAEZI,GACDG,EAAMj+C,KAAK88C,GAAiB,EAAG,IAAIoB,EAAiB1rB,YAAW,CAAC5yB,SAAU,WAG9E,IAAI8gB,EAAc,IAAI1R,KAAKiL,GAEd,MAATyjC,EACAh9B,EAAYy9B,WAAW,EAAG,EAAG,GACb,MAATT,EACPh9B,EAAY09B,WAAW,EAAG,GACV,MAATV,EACPh9B,EAAY29B,gBAAgB,GACZ,UAATX,GACPh9B,EAAcmR,GAAqBnR,EAAag8B,EAAczrB,UAC9DvQ,EAAY49B,QAAQ,IACJ,MAATZ,IACPh9B,EAAcmR,GAAqBnR,EAAag8B,EAAczrB,WAGlE,IAAIstB,EAAiB9B,EAAU/7B,EAAa,IAAIg8B,KAAkBwB,EAAiB1rB,UAAU,IAC7F,KAAO9R,EAAcrG,GAAK,CACtB,IAAI+iC,EAAQ,MAEC,MAATM,EACAN,EAAmD,IAA1CK,EAAS/8B,EAAYmT,WAAa4pB,GAAW,GAAG,IACzC,MAATC,EACPN,EAAqD,IAA5CK,EAAS/8B,EAAYqT,aAAe0pB,GAAW,IACxC,MAATC,EACPN,EAAqD,KAA5CK,EAAS/8B,EAAYwT,aAAeupB,GAC7B,UAATC,GACPN,EAAQ,EAEJ18B,EAD2B,KAA3BA,EAAY6S,WACE,IAAIvkB,KAAK0R,EAAY0S,cAAgB,EAAG,EAAG,GAE3C,IAAIpkB,KAAK0R,EAAY0S,cAAe1S,EAAY6S,WAAa,EAAG,IAElE,SAATmqB,IACPh9B,EAAc,IAAI1R,KAAK0R,EAAY0S,cAAgB,EAAG,EAAG,IAG7D1S,EAAc,IAAI1R,KAAK0R,EAAY0R,UAAYgrB,GAE/C,MAAM7qB,EAAWkqB,EAAU/7B,EAAa,IAAIg8B,KAAkBwB,EAAiB1rB,UAAU,MAAY+rB,EAE/FC,EAAOnC,GAAU37B,EAAa,IAAIw9B,EAAiB3rB,WAAUC,aAE/DyrB,EAAM9/C,QAAWqgD,EAAK3B,WAAaoB,EAAMA,EAAM9/C,OAAS,GAAG0+C,WAAee,GAAqBC,GAAgB,IAI/GW,EAAK3B,WAAae,EAAkB,GAAKpB,IAI7CyB,EAAMj+C,KAAKw+C,GACXD,EAAiB9B,EAAU/7B,EAAa,IAAIg8B,KAAkBwB,EAAiB1rB,UAAU,IAC7F,CAEA,MAAMD,EAAWgsB,IAAmB9B,EAAUpiC,EAAK,IAAIqiC,KAAkBwB,EAAiB1rB,UAAU,IAMpG,OAJKurB,GAAYE,EAAMA,EAAM9/C,OAAS,GAAG0+C,WAAae,EAAoBpB,GACtEyB,EAAMj+C,KAAK88C,GAAiBN,EAAW,IAAI0B,EAAiB3rB,WAAUC,YAAW,CAAC5yB,SAAU,UAGzFq+C,EAAMh2B,QAAO,EAAG40B,gBAAiBA,GAAcL,GAAaK,GAAc,GACrF,CA+Ne4B,CAAe9B,GAjU9B,UAA0B,IAAE1iC,EAAG,IAAEI,EAAG,UAAEmW,EAAS,kBAAEotB,EAAiB,aAAEC,EAAY,UAAErB,EAAS,MAAE9uC,EAAM,SAAQ,UAAE+uC,EAAS,SAAEF,GAAS,EAAK,cAAEG,IACpI,MAAMsB,EAAkBJ,EAAoB,EAAEC,EAExCI,EAAQ,GACRC,EAAkB,CAACxwC,QAAOuM,MAAKI,MAAKkiC,WAAUC,YAAWhsB,YAAWisB,YAAWC,gBAAepqB,OAAO,GAGrGosB,EAxGV,SAA4BpB,EAAMC,GAC9B,MAAMC,EAAUF,EAAKC,EAEf/sB,EAA6C,EAAhCxW,KAAKsW,MAAMtW,KAAK+J,IAAIy5B,IACjC3nB,EAAcrF,EAAYxW,KAAKsG,MAAMkQ,GAAc,GAAM,EAAI,EAE7DmuB,EAAU,IAAI3kC,KAAKsG,MAAMkQ,GAAaqF,EAE5C,OAAO7b,KAAKya,MAAM+oB,EAAUmB,GAASA,CACzC,CA+FwBC,CAAmBvkC,EAAMJ,EAD1BD,KAAKsG,OAAOk8B,EAA8B,EAAlBoB,GAAqBI,IAEhE,GAAIU,EAAc,EACd,IAAK,IAAI50C,EA9GjB,SAA2BA,EAAO40C,GAC9B,OAAO1kC,KAAKya,MAAM3qB,EAAM40C,GAAaA,CACzC,CA4GyBG,CAAkB5kC,EAAKykC,GAAc50C,EAAQuQ,EAAKvQ,GAAS40C,EACxET,EAAMj+C,KAAKq8C,GAAUvyC,EAAOo0C,IAUpC,OANID,EAAM9/C,QACFo+C,GAAY0B,EAAMA,EAAM9/C,OAAS,GAAG0+C,WAAagB,GACjDI,EAAMj+C,KAAK88C,GAAiBc,EAAoB,EAAGM,IAIpDD,EAAMh2B,QAAO,EAAG40B,gBAAiBA,GAAcL,GAAaK,GAAc,GACrF,CA8SeiC,CAAiBnC,EAEhC,CD9cAn4C,GAAQ8C,kBAAoB,KAC5B9C,GAAQwC,cAAgB,KAElBxC,GAAQ0B,OAAS,UAAc,KAAM,QAE3C1B,GAAQe,OAAS,KACjBf,GAAQ6C,mBAAqB,KAEhB,KAAI,KAAS7C,IAKJ,MAAW,KAAQu6C,QAAS,KAAQA,OEnB1D,SAAe5pB,EAAAA,QAAAA,KAAW6pB,IAE1B,SAASA,IAAM,SAAEC,EAAQ,SAAEC,EAAQ,gBAAEx4B,EAAe,UAAEy4B,EAAS,UAAEC,EAAS,WAAE1sB,EAAU,SAAEzB,EAAQ,aAAE2B,EAAY,iBAAEysB,IAC5G,IAAKJ,IAAaC,EACd,OAAO,KAGX,MAAM,aAAEnoC,EAAY,cAAEC,GAAkB+/B,GAAerwB,IACjD,KAACpK,EAAI,KAAED,EAAI,MAAEiW,GPkDhB,SAAsB5L,GACzB,OAAO2vB,GAAS3vB,EAAiB,oBAAqBA,EAAgByE,UAC1E,COpDgCm0B,CAAa54B,GACnC0kB,EPyIH,SAAqB1kB,GACxB,OAAO2vB,GAAS3vB,EAAiB,oBAAqBA,EAAgB0kB,SAC1E,CO3IqBmU,CAAY74B,GACvByrB,EP4IH,SAAoBzrB,GACvB,OAAO2vB,GAAS3vB,EAAiB,kBAAmBA,EAAgByrB,QACxE,CO9IoBqN,CAAW94B,GAE3B,IAAI8J,EAEAA,EADA8B,EjChBD,SAAgCmtB,EAASC,GAC5CD,EAAU,IAAIzwC,KAAKywC,GAGnB,MAAMpxB,GAFNqxB,EAAU,IAAI1wC,KAAK0wC,IAEGttB,UAAYqtB,EAAQrtB,UAC1C,OAAI/D,EAAQ,IACD,KACAA,EAAQ,IACR,IAEA,GAEf,CiCKoBsxB,CAAuBrjC,EAAMD,GAE7BgU,GAAmBhU,EAAOC,GAG1C,IAAIuW,EAAiB,KACrB,GAAIuY,EAAU,CACVvY,EAAiB,CAAC,EAClB,IAAK,MAAOnqB,EAAKoB,KAAUlB,OAAOgnB,QAAQuiB,GACtCtf,EAAe/oB,GAASpB,CAEhC,CAEA,MAAMg0C,EAAgB,CAClB/pB,aAAcysB,EACd1sB,aACAzB,WACA2B,eACAC,iBACA4pB,UAAW4C,GAGTO,EAAWvtB,GAAQ/V,EAAM,IAAIogC,EAAepqB,QAAO9B,cAAalwB,WAChEu/C,EAAWxtB,GAAQhW,EAAM,IAAIqgC,EAAepqB,QAAO9B,cAAalwB,WAEtE,IAAIw/C,EAAqB9lC,KAAKK,IAAIulC,EAASzhD,OAAQ0hD,EAAS1hD,QACxDghD,IACAW,GAAsB,GAK1B,IAAIC,EAAY,KACZC,EAAY,KACZC,EAAe,KAEf3tB,GACAytB,EDgMR,UAA2B,IAAE9lC,EAAG,IAAEI,EAAG,UAAEmW,EAAS,kBAAEotB,EAAiB,aAAEC,EAAY,UAAErB,EAAS,UAAEsB,GAAU,EAAK,SAAEC,GAAS,EAAK,MAAErwC,EAAM,SAAQ,UAAE+uC,EAAS,SAAEF,GAAS,EAAK,cAAEG,EAAc,CAAC,IACrL,MAAMsB,EAAkBJ,EAAoB,EAAEC,EACxCI,EAAQ,GACRC,EAAkB,CAAExwC,QAAOuM,MAAKI,MAAKkiC,WAAUC,YAAWhsB,YAAWisB,YAAWC,gBAAepqB,OAAO,GAEtGirB,EAAevjC,KAAKsG,MAAMk8B,EAAUwB,GAG1C,IAAIN,EAAMD,EAEV,MAAMyC,GAJO7lC,EAAMJ,GAIK,KAGpBimC,GAA2B,EAAf3C,GACZG,EAAO,IACPD,EAASzjC,KAAKK,IAAI,EAAGL,KAAK2U,KAAKuxB,EAAW3C,IACtCE,GAAU,IAEVA,EADOA,GAAU,GACR,GACFA,GAAU,GACR,GAEyB,GAAzBzjC,KAAK2U,KAAK8uB,EAAS,OAGhCC,EAAO,IACPD,EAAS,IAGRK,GACDG,EAAMj+C,KAAK88C,GAAiB,EAAG,IAAIoB,EAAiB3rB,UAAU,GAAO,CAAC3yB,SAAU,WAGpF,IAAI8gB,EAAc,IAAI1R,KAAKiL,GAE3B,GAAa,MAATyjC,EAEA,GADAh9B,EAAYy9B,WAAW,EAAG,EAAG,GACd,KAAXV,EACA/8B,EAAYuR,SAAS,QAClB,GAAe,KAAXwrB,EAAe,CACtB,MACM0C,EADcz/B,EAAYmT,WACE,GAAK,EAAI,GAC3CnT,EAAYuR,SAASkuB,EACzB,KAAO,CACH,MAAMC,EAAc1/B,EAAYmT,WAC1BssB,EAAcnmC,KAAKsG,MAAM8/B,EAAc3C,GAAUA,EACvD/8B,EAAYuR,SAASkuB,EACzB,MACG,GAAa,MAATzC,EAAc,CACrBh9B,EAAY09B,WAAW,EAAG,GAC1B,MAAMiC,EAAgB3/B,EAAYqT,aAC5BusB,EAAgBtmC,KAAKsG,MAAM+/B,EAAgB5C,GAAUA,EAC3D/8B,EAAYy9B,WAAWmC,EAC3B,MAAO,GAAa,MAAT5C,EAAc,CACrBh9B,EAAY29B,gBAAgB,GAC5B,MAAMkC,EAAgB7/B,EAAYwT,aAC5BssB,EAAgBxmC,KAAKsG,MAAMigC,EAAgB9C,GAAUA,EAC3D/8B,EAAY09B,WAAWoC,EAC3B,CAEA,KAAO9/B,EAAczG,GACJ,MAATyjC,EACAh9B,EAAc,IAAI1R,KAAK0R,EAAY0R,UAAqB,GAATqrB,EAAc,GAAK,KAClD,MAATC,EACPh9B,EAAc,IAAI1R,KAAK0R,EAAY0R,UAAqB,GAATqrB,EAAc,KAC7C,MAATC,IACPh9B,EAAc,IAAI1R,KAAK0R,EAAY0R,UAAqB,IAATqrB,IAIvD,KAAO/8B,EAAcrG,GAAK,CACtB,MAAMmkC,EAAOnC,GAAU37B,EAAa,IAAIw9B,EAAiB3rB,UAAU,IAG7DkuB,EAAyBjE,GADFoB,EAAoBC,GAGjD,GAAII,EAAM9/C,QAAWqgD,EAAK3B,WAAaoB,EAAMA,EAAM9/C,OAAS,GAAG0+C,WAAee,EAAoBC,OAC3F,MAAIW,EAAK3B,WAAae,EAAoB6C,GAG7C,MAFAxC,EAAMj+C,KAAKw+C,EAGf,CAEA,GAAa,MAATd,EACAh9B,EAAc,IAAI1R,KAAK0R,EAAY0R,UAAqB,GAATqrB,EAAc,GAAK,UAC/D,GAAa,MAATC,EACPh9B,EAAc,IAAI1R,KAAK0R,EAAY0R,UAAqB,GAATqrB,EAAc,SAC1D,IAAa,MAATC,EAGP,MAFAh9B,EAAc,IAAI1R,KAAK0R,EAAY0R,UAAqB,IAATqrB,EAGnD,CACJ,CAEA,IAAKM,EAAU,CACX,MAAM2C,EAAWrE,GAAUhiC,EAAK,IAAI6jC,EAAiB3rB,UAAU,GAAO,CAAC3yB,SAAU,SAC5D,IAAjBq+C,EAAM9/C,QAAiBuiD,EAAS7D,WAAaoB,EAAMA,EAAM9/C,OAAS,GAAG0+C,YAAgBe,EAAoBC,EAAa,EACtHI,EAAMj+C,KAAK0gD,GAEXzC,EAAMA,EAAM9/C,OAAS,GAAKuiD,CAElC,CAEA,OAAOzC,EAAMh2B,QAAO,EAAG40B,gBAAiBA,GAAcL,GAAaK,GAAc,GACrF,CCxSoB8D,CAAkB,CAC1B1mC,IAAKqC,EACLjC,IAAKgC,EACLmgC,UAAWzlC,EACXyZ,YACAotB,kBAAmBkC,EACnBjC,aAAcA,GACdpB,UAAW4C,GAAoBhtB,GAC/BqqB,kBAGJsD,ED+RR,UAA2B,IAAE/lC,EAAG,IAAEI,EAAG,UAAEmW,EAAS,kBAAEotB,EAAiB,aAAEC,EAAY,UAAErB,EAAS,UAAEsB,GAAU,EAAK,SAAEC,GAAS,EAAK,MAAErwC,EAAM,SAAQ,UAAE+uC,EAAS,SAAEF,GAAS,EAAK,cAAEG,EAAc,CAAC,IACrL,MAAMsB,EAAkBJ,EAAoB,EAAEC,EACxCI,EAAQ,GAIR2C,EAFU,IAAI5xC,KAAKiL,GAAKmZ,gBACd,IAAIpkB,KAAKqL,GAAK+Y,cAiBxB8qB,EAAkB,CAAExwC,QAAOuM,MAAKI,MAAKkiC,WAAUC,YAAWhsB,YAAWisB,UAd/CoE,CAAC/uB,EAAMttB,KAC/B,MACMgE,EAAI,IAAIwG,KAAK8iB,GACbuB,EAFa,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAExE7qB,EAAE+qB,YACrBC,EAAMhrB,EAAEkrB,UACRR,EAAO1qB,EAAE4qB,cAEf,OAAIwtB,EACQ,GAAEvtB,KAASG,KAAON,IAElB,GAAEG,KAASG,GACvB,EAGuGkpB,gBAAepqB,OAAO,GAE3HgrB,EAAOjjC,EAAMJ,EACbimC,EAAW5C,EAAO,KAExB,IAAI,OAAEG,EAAM,KAAEC,GAASL,GAAuBC,EAAMd,EAAUwB,EAAiBtB,EAAc/pB,cAE7F,IAAc,MAAT+qB,GAAyB,MAATA,GAAyB,MAATA,IAAiBwC,GAAY,GAC9DxC,EAAO,IACPD,EAASzjC,KAAKK,IAAI,EAAGL,KAAK2U,KAAKuxB,EAAW,GAAKlmC,KAAKsG,MAAMk8B,EAAUwB,UACjE,IAAc,MAATN,GAAyB,MAATA,GAAyB,MAATA,IAAiBwC,EAAW,GAAI,CACxE,MAAMY,EAAYzE,GAAUpiC,EAAK,IAAIikC,EAAiB1rB,UAAU,GAAO,CAAC5yB,SAAU,UAC5EmhD,EAAU1E,GAAUhiC,EAAK,IAAI6jC,EAAiB1rB,UAAU,GAAO,CAAC5yB,SAAU,SAE1Eq+C,EAAQ,CAAC6C,GAKf,OAJKC,EAAQlE,WAAaiE,EAAUjE,YAAgBe,EAAoBC,GACpEI,EAAMj+C,KAAK+gD,GAGR9C,EAAMh2B,QAAO,EAAG40B,gBAAiBA,GAAcL,GAAaK,GAAc,GACrF,CAEKiB,GACDG,EAAMj+C,KAAK88C,GAAiB,EAAG,IAAIoB,EAAiB1rB,UAAU,GAAO,CAAC5yB,SAAU,WAGpF,IAAI8gB,EAAc,IAAI1R,KAAKiL,GAU3B,IARa,UAATyjC,GACAh9B,EAAcmR,GAAqBnR,EAAag8B,EAAczrB,UAC9DvQ,EAAY49B,QAAQ,IACJ,MAATZ,IACPh9B,EAAcmR,GAAqBnR,EAAag8B,EAAczrB,UAC9DvQ,EAAYuR,SAAS,EAAG,EAAG,EAAG,IAG3BvR,EAAcrG,GAAK,CACtB,IAAI+iC,EAAQ,MAEC,UAATM,GACAN,EAAQ,EAEJ18B,EAD2B,KAA3BA,EAAY6S,WACE,IAAIvkB,KAAK0R,EAAY0S,cAAgB,EAAG,EAAG,GAE3C,IAAIpkB,KAAK0R,EAAY0S,cAAe1S,EAAY6S,WAAa,EAAG,IAElE,SAATmqB,GACPh9B,EAAc,IAAI1R,KAAK0R,EAAY0S,cAAgB,EAAG,EAAG,GACzDgqB,EAAQ,GACQ,MAATM,IACPN,EAAiB,GAATK,EAAc,GAAK,GAAK,KAGhCL,EAAQ,IACR18B,EAAc,IAAI1R,KAAK0R,EAAY0R,UAAYgrB,IAGnD,MAAMoB,EAAOnC,GAAU37B,EAAa,IAAIw9B,EAAiB1rB,UAAU,IAG7DiuB,EAAyBjE,GADFoB,EAAoBC,GAGjD,KAAII,EAAM9/C,QAAWqgD,EAAK3B,WAAaoB,EAAMA,EAAM9/C,OAAS,GAAG0+C,WAAee,GAAqBC,GAAgB,IAAnH,CAIA,KAAIW,EAAK3B,WAAae,EAAoB6C,GAGtC,MAFAxC,EAAMj+C,KAAKw+C,EAHf,CAOJ,CAEA,IAAKT,EAAU,CACX,MAAM2C,EAAWrE,GAAUhiC,EAAK,IAAI6jC,EAAiB1rB,UAAU,GAAO,CAAC5yB,SAAU,SAC5D,IAAjBq+C,EAAM9/C,QAAiBuiD,EAAS7D,WAAaoB,EAAMA,EAAM9/C,OAAS,GAAG0+C,YAAgBe,EAAoBC,EAAa,EACtHI,EAAMj+C,KAAK0gD,GAEXzC,EAAMA,EAAM9/C,OAAS,GAAKuiD,CAElC,CAMA,OAJqB,IAAjBzC,EAAM9/C,QAAgB+hD,GAAY,IAClCjC,EAAMj+C,KAAK88C,GAAiB,EAAG,IAAIoB,EAAiB1rB,UAAU,GAAO,CAAC5yB,SAAU,WAG7Eq+C,EAAMh2B,QAAO,EAAG40B,gBAAiBA,GAAcL,GAAaK,GAAc,GACrF,CC5YoBmE,CAAkB,CAC1B/mC,IAAKqC,EACLjC,IAAKgC,EACLmgC,UAAWzlC,EACXyZ,YACAotB,kBAAwC,EAArBkC,EACnBjC,aAAcA,GACdpB,UAAW4C,GAAoBhtB,GAC/BqqB,mBAGJuD,EAAetC,GAAU,CACrB1jC,IAAKqC,EACLjC,IAAKgC,EACLmgC,UAAWzlC,EACXyZ,YACA8B,QACAmqB,UAAW4C,GAAoBhtB,GAC/BurB,kBAAmBkC,EACnBjC,aArCa,GAsCbnB,kBAIR,MAAMuE,EAAc3uB,EAAQ,GAAK,GAEjC,OACI6C,EAAAA,QAAAA,cAAA,OAAK6B,UAAY,eAAa1E,EAAQ,eAAiB,IAAMnsB,MAAO84C,OAAW7gD,EAAY,CAAC8iD,cAAe,KAEnGjC,GACA9pB,EAAAA,QAAAA,cAAA,QAAM3sB,EAAI,UAASuO,IAAgBigB,UAAU,cAK7C1E,GAASytB,GAAaA,EAAU5gD,KAAI,EAAG09C,aAAYlvC,QAAOyD,OAAMxR,WAAUuhD,YAAYljD,KAElF,MAAMmjD,EAAkC,IAArBrB,EAAU5hD,OAE7B,GAAIsyB,MAAMosB,GACN,OAAO,KAGX,MAAMwE,EAAU,CAAC,YAAc,aAAYjwC,IAAS,aAAYxR,KAKhE,OAJIu/C,GACAkC,EAAQrhD,KAAK,wBAIbm1B,EAAAA,QAAAA,cAAA,KAAGzsB,IAAM,QAAOzK,IAAK+4B,UAAWqqB,EAAQhiD,KAAK,MAErC4/C,GACA9pB,EAAAA,QAAAA,cAAA,QAAM3sB,EAAI,IAAGq0C,UAAoB7lB,UAAU,cAI3CkoB,IAAaiC,GACbhsB,EAAAA,QAAAA,cAAA,QAAM3sB,EAAI,IAAGq0C,SAAkB7lC,MAI/BioC,GACA9pB,EAAAA,QAAAA,cAAA,QACInqB,EAAiB,SAAbpL,GAAwBwhD,EAA+BvE,EAAa,EAA9BA,EAAa,EACvD/xC,EAAG,GACHkvC,WAA0B,SAAbp6C,GAAwBwhD,EAAsB,QAAR,MACnDpqB,UAAU,gCAETrpB,GAGT,IAOZ2kB,GAAS0tB,GAAaA,EAAU7gD,KAAI,EAAG09C,aAAYlvC,QAAOyD,OAAMxR,WAAU08C,aAAar+C,KAEnF,GAAIwyB,MAAMosB,GACN,OAAO,KAGX,MAAMwE,EAAU,CAAC,YAAc,aAAYjwC,IAAS,aAAYxR,KAKhE,IAAI0hD,EAOJ,OAXInC,GACAkC,EAAQrhD,KAAK,wBAIbixB,GACU,IAANhzB,IACAqjD,EAA2C,QAA3BrwB,EAAS+B,cAA0B,MAAQ/B,GAK/DkE,EAAAA,QAAAA,cAAA,KAAGzsB,IAAM,QAAOzK,IAAK+4B,UAAWqqB,EAAQhiD,KAAK,MAErC4/C,GACA9pB,EAAAA,QAAAA,cAAA,QACInqB,EAAgB,SAAbpL,EAAsBi9C,EAAa,EAAIA,EAAa,EACvD/xC,EAAG,GACHkvC,WAAyB,SAAbp6C,EAAsB,MAAQ,QAC1Co3B,UAAU,gCAEV7B,EAAAA,QAAAA,cAAA,SAAO6B,UAAU,qBACZrpB,GAEJ2zC,GACGnsB,EAAAA,QAAAA,cAAA,SAAO6B,UAAU,yBACZ,IAAI,IAAEsqB,EAAc,MAKrC,KAOXhvB,GAAS2tB,GAAgBA,EAAa9gD,KAAI,EAAG09C,aAAYlvC,QAAOyD,OAAMxR,WAAUuhD,YAAYljD,KACzF,GAAIwyB,MAAMosB,GACN,OAAO,KAGX,MAAMwE,EAAU,CAAC,YAAc,aAAYjwC,IAAS,aAAYxR,KAKhE,OAJIu/C,GACAkC,EAAQrhD,KAAK,wBAIbm1B,EAAAA,QAAAA,cAAA,KAAGzsB,IAAKzK,EAAG+4B,UAAWqqB,EAAQhiD,KAAK,MAE3B4/C,GACA9pB,EAAAA,QAAAA,cAAA,QAAM3sB,EAAI,IAAGq0C,UAAoB7lB,UAAU,cAI3CkoB,IAAaiC,GACbhsB,EAAAA,QAAAA,cAAA,QAAM3sB,EAAI,IAAGq0C,SAAkB7lC,MAI/BioC,GACA9pB,EAAAA,QAAAA,cAAA,QACInqB,EAAgB,SAAbpL,EAAsBi9C,EAAa,EAAIA,EAAa,EACvD/xC,EAAGm2C,EAAc,EACjBjH,WAAyB,SAAbp6C,EAAsB,MAAQ,QAC1Co3B,UAAU,eAETrpB,GAGT,IAM5B,CAEAqxC,GAAM5pB,UAAY,CACd1O,gBAAiBxiB,IAAAA,WAAqB48B,IAAiBl+B,WACvDq8C,SAAU/6C,IAAAA,KAAetB,WACzBs8C,SAAUh7C,IAAAA,KAAetB,WACzBu8C,UAAWj7C,IAAAA,KACXk7C,UAAWl7C,IAAAA,MAAgB,CAAC,SAC5BwuB,WAAYxuB,IAAAA,MAAgB,CAAC,MAAO,QACpC+sB,SAAU/sB,IAAAA,OACV0uB,aAAc1uB,IAAAA,KACdm7C,iBAAkBn7C,IAAAA,MCvOtB,SAAeixB,EAAAA,QAAAA,KAAWosB,IAE1B,SAASA,IAAM,gBAAE76B,EAAe,SAAEu4B,EAAQ,SAAEC,EAAQ,cAAEsC,EAAa,KAAEx1C,EAAI,UAAEy1C,EAAS,WAAEzJ,EAAU,MAAEhG,EAAK,UAAEzQ,EAAS,oBAAEmgB,EAAoB,EAAC,UAAEvC,EAAS,eAAEwC,IAClJ,IAAK1C,IAAaC,EACd,OAAO,KAGX,MAAM,KAAEzxC,EAAI,MAAEC,EAAK,UAAEH,EAAS,MAAEI,GAAUqpC,GAAQtwB,GAAiB1a,EAAKuB,YAElE,aAAEwJ,EAAY,cAAEC,GAAkB+/B,GAAerwB,GACvD,IAAI,KAAE7O,EAAI,KAAEC,GAASy/B,GAAc7wB,GAAiBnZ,GAEpD,MAAMswB,EAAeJ,GAAY,CAAE5lB,OAAMC,OAAMpK,UAC/CmK,EAAOgmB,EAAahmB,KACpBC,EAAO+lB,EAAa/lB,KAEpB,MAAMmmC,EAAQN,GAAU,CACpB1jC,IAAKpC,EACLwC,IAAKvC,EACL0kC,UAAWxlC,EACXtJ,QACA8iB,UAAWH,GAAmBvY,EAAOD,GACrC4kC,UAAW/nB,GACX6nB,UAAU,EACVqB,kBAAmBuB,EAAY,GAAK,GACpCtB,aAAc,KAMlB,IAAI+D,EAAc,EAEJ,QAAVl0C,IACAk0C,EAAc,GAGlB,MAAM/Q,EAAoBqG,GAAqBxwB,IAExC6uB,EAAesM,IAAoBlL,EAAAA,EAAAA,UAAS,OAC5CmL,EAAWC,IAAgBpL,EAAAA,EAAAA,UAAS,CAAEqL,GAAI,EAAGC,GAAI,IA8ClDC,EAA+B,QAAVlQ,EAAkB,EAAM,GAC7CmQ,EAAiC,QAAVnQ,EAAkB,GAAM,GAErD,OACI7c,EAAAA,QAAAA,cAAA,OAAK6B,UAAY,sBAAqBvpB,IACjC,kBAAiBF,EACjB,kBAAiBg0B,EACjBp7B,MAAO,CACH2F,MAAO8oB,GACPwtB,WAAYnD,OAAW7gD,GAAY,GACnC8X,OAA8B,iBAAf8hC,EAA0BA,OAAa55C,IAIvD6gD,GACA0C,GACA31C,EAAKwB,OAAOrO,KAAI,CAACypB,EAAc3qB,KAC3B,MAAMiY,EAASc,EAAchL,EAAKwB,OAAOrP,OAEzC,OACIg3B,EAAAA,QAAAA,cAAA,QACInqB,EAAY,SAATyC,EAAkB,EAAI,EACzB3C,EAAG7M,EAAEiY,EACLpK,MAAO8oB,GACP1e,OAAQA,EACRxN,IAAKkgB,EAAa/iB,MAClB2T,MAAMzb,EAAAA,EAAAA,SAAS6qB,EAAatqB,MAAOsqB,EAAa/iB,MAAO+iB,EAAa1qB,yBACpEmkD,QAASz5B,EAAa/iB,QAAUgrC,EAAoBqR,EAAqBC,EACzE,sBAAqBnrC,EACrB,qBAAoBhL,EAAKwB,OAAOrP,QAClC,IAMV8gD,GACA9pB,EAAAA,QAAAA,cAAA,QAAM3sB,EAAI,IAAY,SAATiF,EAAkBmnB,GAAiB,QAAQ5d,IAAiBggB,UAAU,cAInFinB,EAAM9+C,KAAI,EAAG09C,aAAYlvC,QAAOyD,OAAM+vC,YAAYljD,KAC9C,MAAMqkD,EAAgB,SAAT70C,GAAmBg0C,EAAY,GAAK7sB,IAAgB6sB,EAAU7sB,GACrEz2B,GAAmB,SAATsP,EAAkB,GAAM,IAAMsJ,EAAa,GAErDsqC,EAAU,CAAC,YAAc,aAAYjwC,KAK3C,OAJI+tC,GACAkC,EAAQrhD,KAAK,wBAIbm1B,EAAAA,QAAAA,cAAA,KAAGzsB,IAAKzK,EAAG+4B,UAAWqqB,EAAQhiD,KAAK,MAE3B6/C,IACCiC,GACDhsB,EAAAA,QAAAA,cAAA,QAAM3sB,EAAI,IAAG85C,KAAQzF,MAAe1+C,MAIpC+gD,IACCiC,GACDM,EAAY,GACZtsB,EAAAA,QAAAA,cAAA,QACI3sB,EAAI,IAAY,SAATiF,EAAkBmnB,GAAe,KAAKioB,OAAyB,SAATpvC,EAAkB,GAAK,GAAKg0C,EAAY7sB,KACrG2tB,gBAAiB,QAKrBtD,GACA9pB,EAAAA,QAAAA,cAAA,QAAMnqB,EAAY,SAATyC,EAAkBmnB,GAAagtB,EAAcA,EAAa92C,EAAG+xC,GACjElvC,GAGT,IAMZ6zC,GAAiBvC,GACjBjzC,EAAKwB,OAAOrO,KAAI,CAACypB,EAAc3qB,KAE3B,IAAI+M,EAAK4pB,GAA2D,IAAT32B,EAAI,EAAI,GAC/D6M,GAAK,GAAmCkP,KAAK2U,KAAK3iB,EAAKwB,OAAOrP,OAAS,GAAK,GAAmC6b,KAAKsG,MAAMriB,EAAI,GAOlI,OALI2qB,IAAiB2sB,IACjBvqC,GAAK82C,EAAUE,GACfl3C,GAAKg3C,EAAUG,GAAKP,GAIpBvsB,EAAAA,QAAAA,cAAA,QACI6B,UAAU,mBACVkiB,YAAcR,GA1IpB8J,EAAC9J,EAAO9vB,KACtB,IAAI3Z,EAASypC,EAAM1E,QACfyO,EAAS/J,EAAMxE,QAEN,SAATzmC,IACAwB,GAAU2lB,IAGD,UAATnnB,IACAwB,GAAU2lB,IAGdmtB,EAAa,CACTC,GAAI,EACJC,GAAI,IAGR,MAAM5I,EAAeC,IACjByI,EAAa,CACTC,GAAI1I,EAAUtF,QAAU/kC,EACxBgzC,GAAI3I,EAAUpF,QAAUuO,GAC1B,EAGAlJ,EAAamJ,IACfl8C,OAAOgzC,oBAAoB,YAAaH,GACxC7yC,OAAOgzC,oBAAoB,UAAWD,GAEtC,IAAInzC,EAASs8C,EAAat8C,OAC1B,KAAOA,KAAYA,EAAOu8C,SAAW,CAAC,GAAGp1C,WACrCnH,EAASA,EAAOoB,WAGpBq6C,EAAiB,MACjBn7B,EAAgB4uB,aAAa1sB,EAAcxiB,IAAWA,EAAOu8C,SAAW,CAAC,GAAGp1C,UAAWnH,IAAWA,EAAOu8C,SAAW,CAAC,GAAGC,UAAU,EAGtIp8C,OAAOizC,iBAAiB,YAAaJ,GACrC7yC,OAAOizC,iBAAiB,UAAWF,GAEnCsI,EAAiBj5B,GACjBlC,EAAgB2uB,eAAe,EAiGamN,CAAU9J,EAAO9vB,GACzC5d,EAAGA,EACHF,EAAGA,EACHgB,MA3JH,GA4JGoK,OA5JH,GA6JGxN,IAAKkgB,EAAa/iB,MAClB2T,MAAMzb,EAAAA,EAAAA,SAAS6qB,EAAatqB,MAAOsqB,EAAa/iB,MAAO+iB,EAAa1qB,yBACpE2kD,YAAaA,IAAMn8B,EAAgBqsB,qBAAqBnqB,EAAa/iB,OACrEi9C,WAAYA,IAAMp8B,EAAgBqsB,qBAAqB,OACzD,IAMVkM,KAActxC,GACdwnB,EAAAA,QAAAA,cAAA,QACI6B,UAAY,gBAAcmoB,EAAY,oBAAsB,IAC5Dn0C,EAAY,SAATyC,EAAkB,GAAKmnB,GAC1B9pB,EAAGkM,EAAc,GAAc,SAATvJ,GAAmB,EAAI,IAAIF,EAAY,IAAI4xC,EjCjN9C,GiCiNoF,GACvGnpB,UAAY,UAAkB,SAATvoB,GAAmB,GAAK,OAAgB,SAATA,EAAkB,GAAKmnB,OAAsB5d,EAAc,MAE9GrJ,GAKrB,CAEA4zC,GAAMnsB,UAAY,CACd1O,gBAAiBxiB,IAAAA,WAAqB48B,IACtCme,SAAU/6C,IAAAA,KAAetB,WACzBs8C,SAAUh7C,IAAAA,KAAetB,WACzB++C,eAAgBz9C,IAAAA,KAAetB,WAC/B4+C,cAAet9C,IAAAA,KAAetB,WAC9BoJ,KAAMqpB,EAAgB/nB,KAAK1K,WAC3B6+C,UAAWv9C,IAAAA,OAAiBtB,WAC5Bo1C,WAAY9zC,IAAAA,OACZ8tC,MAAO9tC,IAAAA,OACPq9B,UAAWr9B,IAAAA,OACXw9C,oBAAqBx9C,IAAAA,OACrBi7C,UAAWj7C,IAAAA,MCrOf,SAAeixB,EAAAA,QAAAA,KAAW4tB,IAE1B,SAASA,IAAyB,SAAEC,EAAQ,SAAEtzB,EAAQ,UAAEsH,EAAS,QAAEtnB,EAAO,SAAEuzC,EAAQ,YAAEC,IAClF,MAAM7B,EAAU,CACZ,gBAmBJ,OAhBI2B,GACA3B,EAAQrhD,KAAK,yBAGb0vB,GACA2xB,EAAQrhD,KAAK,yBAGbg3B,GACAqqB,EAAQrhD,KAAKg3B,GAGbksB,GACA7B,EAAQrhD,KAAK,kBAIbm1B,EAAAA,QAAAA,cAAA,OACI6B,UAAWqqB,EAAQhiD,KAAK,KACxBqQ,QAASA,GAAW,CAAEgpC,GAAUhpB,GAAYhgB,EAAQgpC,KAEnDuK,EAGGC,GACA/tB,EAAAA,QAAAA,cAAA,OAAK6B,UAAU,uBACVksB,GAKrB,CAEAH,GAAyB3tB,UAAY,CACjC4tB,SAAU9+C,IAAAA,KAAetB,WACzB8M,QAASxL,IAAAA,KACT++C,SAAU/+C,IAAAA,KAAetB,WACzB8sB,SAAUxrB,IAAAA,KACV8yB,UAAW9yB,IAAAA,OACXg/C,YAAah/C,IAAAA,QC5CjB,SAAeixB,EAAAA,QAAAA,KAAWguB,IAE1B,SAASA,IAAqB,gBAAEz8B,EAAe,uBAAE08B,EAAsB,gBAAEzS,EAAe,SAAEsS,EAAQ,SAAEvzB,IAChG,OACIyF,EAAAA,QAAAA,cAAC4tB,GAAwB,CACrBC,SAAUI,IAA2BzS,EACrCjhC,QAASA,IAAMgX,EAAgBiqB,gBAAkBA,EACjDjhB,SAAUA,GAETuzB,EAGb,CAEAE,GAAqB/tB,UAAY,CAC7B1O,gBAAiBxiB,IAAAA,WAAqB48B,IAAiBl+B,WACvD+tC,gBAAiBzsC,IAAAA,KAAetB,WAChCwgD,uBAAwBl/C,IAAAA,KAAetB,WACvCqgD,SAAU/+C,IAAAA,KAAetB,WACzB8sB,SAAUxrB,IAAAA,MClBd,SAAeixB,EAAAA,QAAAA,KAAWkuB,IAE1B,SAASA,IAAiB,gBAAE38B,IACxB,MAAM2T,EXoGH,SAAuB3T,GAC1B,OAAO2vB,GAAS3vB,EAAiB,qBAAsBA,EAAgB2T,WAC3E,CWtGuBipB,CAAc58B,GAC3B4T,EX+GH,SAAgC5T,GACnC,OAAO2vB,GAAS3vB,EAAiB,+BAAgCA,EAAgB4T,oBACrF,CWjHgCipB,CAAuB78B,IAC5CgR,EAASqe,IAAcY,EAAAA,EAAAA,WAAS,GAEvC,MAAQ,CACJjf,EAAUvC,EAAAA,QAAAA,cAAC4tB,GAAwB,CAC/Br6C,IAAI,mBACJsuB,UAAU,oBACVgsB,UAAU,EACVE,YAAY,wBAEZ/tB,EAAAA,QAAAA,cAAA,SACIzlB,QAAU9I,GAAMA,EAAEmyC,kBAClBjvC,MAAOwwB,EACPkpB,SAAW58C,GAAM8f,EAAgB4T,oBAAsB1zB,EAAER,OAAO0D,MAChE25C,QAAU78C,GAAoB,KAAdA,EAAE88C,SAAkB3N,GAAW,GAC/C1qC,KAAK,SACL4O,KAAM,GACNI,IAAK,KAGT8a,EAAAA,QAAAA,cAAA,OAAK6B,UAAU,wCACX7B,EAAAA,QAAAA,cAAA,OAAKwuB,UAAU,QAAQC,QAAQ,eAC3BzuB,EAAAA,QAAAA,cAAA,QAAM3b,KAAK,eAAehR,EAAE,+hBAGX,KAE7B2sB,EAAAA,QAAAA,cAAC4tB,GAAwB,CACrBr6C,IAAI,cACJsuB,UAAU,oBACVgsB,SAAUtrB,GAAsC,MAA3B34B,WAAWs7B,GAChC3qB,QAASA,IAAMqmC,GAAYre,GAC3BwrB,YAAY,mBAGRxrB,GACAvC,EAAAA,QAAAA,cAAA,WACIA,EAAAA,QAAAA,cAAA,SACIzlB,QAAU9I,GAAMA,EAAEmyC,kBAClBtgB,WAAW,EACX3uB,MAAOuwB,EACPmpB,SAAW58C,GAAM8f,EAAgB2T,WAAazzB,EAAER,OAAO0D,MACvD25C,QAAU78C,GAAoB,KAAdA,EAAE88C,SAAkB3N,GAAW,GAC/C1qC,KAAK,SACL4O,IAAK,EACLI,IAAK,OAKjB8a,EAAAA,QAAAA,cAAA,OAAK6B,UAAU,wCACX7B,EAAAA,QAAAA,cAAA,OAAKwuB,UAAU,QAAQC,QAAQ,eAC3BzuB,EAAAA,QAAAA,cAAA,QAAM3b,KAAK,eAAehR,EAAE,kdAKhD,CAEA66C,GAAiBjuB,UAAY,CACzB1O,gBAAiBxiB,IAAAA,WAAqB48B,IAAiBl+B,YC1D3D,SAAeuyB,EAAAA,QAAAA,KAAW0uB,IAE1B,SAASA,IAAQ,gBAACn9B,EAAe,eAAEo9B,IAE/B,MAAMt3C,EZiEH,SAAiCka,GACpC,OAAO2vB,GAAS3vB,EAAiB,iCAAkCA,EAAgBla,qBACvF,CYnEiCu3C,CAAwBr9B,GAC/CoqB,EAAa0G,GAAc9wB,GAC3BwP,EAAeyhB,GAAgBjxB,GAC/BkrB,EAAiBgG,GAAkBlxB,GACnCmrB,EAAqBgG,GAAsBnxB,GAC3CsrB,EAAQ+F,GAASrxB,GAEvB,OACIyO,EAAAA,QAAAA,cAAA,OAAK6B,UAAU,eAEP8sB,GACA3uB,EAAAA,QAAAA,cAAC4tB,GAAwB,CACrBC,SAAUpR,EACVliC,QAASA,IAAMgX,EAAgBovB,uBAC/BoN,YAAY,gBAEZ/tB,EAAAA,QAAAA,cAAA,OAAK6B,UAAU,wCACX7B,EAAAA,QAAAA,cAAA,OAAKwuB,UAAU,QAAQC,QAAQ,eAC3BzuB,EAAAA,QAAAA,cAAA,QAAM3b,KAAK,eACLhR,EAAE,wKAMxB2sB,EAAAA,QAAAA,cAAC4tB,GAAwB,CACrBC,SAAoB,WAAVhR,EACVtiC,QAASA,IAAMgX,EAAgBwsB,mBAC/BgQ,YAAY,eAEZ/tB,EAAAA,QAAAA,cAAA,OAAK6B,UAAU,wCACX7B,EAAAA,QAAAA,cAAA,OAAKwuB,UAAU,QAAQC,QAAQ,eAC3BzuB,EAAAA,QAAAA,cAAA,QAAM3b,KAAK,eACLhR,EAAE,qcAKpB2sB,EAAAA,QAAAA,cAAC4tB,GAAwB,CACrBC,SAAUnR,EACVniC,QAASA,IAAMgX,EAAgBmvB,2BAC/BqN,YAAY,oBAEZ/tB,EAAAA,QAAAA,cAAA,OAAK6B,UAAU,qCACX7B,EAAAA,QAAAA,cAAA,OAAKwuB,UAAU,QAAQC,QAAQ,eAC3BzuB,EAAAA,QAAAA,cAAA,QAAM3b,KAAK,eAAehR,EAAE,gVAKxC2sB,EAAAA,QAAAA,cAACkuB,GAAgB,CAAC38B,gBAAiBA,IAEnCyO,EAAAA,QAAAA,cAAC4tB,GAAwB,CACrBC,SAAU9sB,EACVxmB,QAASA,IAAMgX,EAAgBkvB,qBAC/BsN,YAAY,iBAEZ/tB,EAAAA,QAAAA,cAAA,OAAK6B,UAAU,wCACX7B,EAAAA,QAAAA,cAAA,OAAKwuB,UAAU,QAAQC,QAAQ,eAC3BzuB,EAAAA,QAAAA,cAAA,QAAM3b,KAAK,eAAehR,EAAE,msBAKxC2sB,EAAAA,QAAAA,cAAC4tB,GAAwB,CACrBC,SAAUlS,EACVphC,QAASA,IAAMgX,EAAgBusB,qBAC/BiQ,YAAY,oBAEZ/tB,EAAAA,QAAAA,cAAA,OAAK6B,UAAU,kBACX7B,EAAAA,QAAAA,cAAA,OAAKwuB,UAAU,QAAQC,QAAQ,eAC3BzuB,EAAAA,QAAAA,cAAA,QAAM3b,KAAK,eAAehR,EAAE,yUAKxC2sB,EAAAA,QAAAA,cAAC4tB,GAAwB,CACrBC,SAAUx2C,EACVkD,QAASA,IAAMgX,EAAgBssB,yBAC/BkQ,YAAY,0BAEZ/tB,EAAAA,QAAAA,cAAA,OAAK6B,UAAU,wCACX7B,EAAAA,QAAAA,cAAA,OAAKwuB,UAAU,QAAQC,QAAQ,eAC3BzuB,EAAAA,QAAAA,cAAA,QAAM3b,KAAK,eAAehR,EAAE,2NAMpD,CAEAq7C,GAAQzuB,UAAY,CAChB1O,gBAAiBxiB,IAAAA,WAAqB48B,IAAiBl+B,WACvDkhD,eAAgB5/C,IAAAA,MC5FpB,SAAeixB,EAAAA,QAAAA,KAAW6uB,IAE1B,SAASA,IAAe,gBAACt9B,EAAe,sBAAEsa,EAAqB,0BAAEijB,EAAyB,eAAEH,IACxF,MAAMI,EAAiB/M,GAAkBzwB,GACnCy9B,EAAgB9M,GAAiB3wB,GACjCirB,EAAiB+F,GAAkBhxB,GAEzC,IAAI09B,EAAcxvB,GAAasvB,EAC3BA,EAAiB,IACjBE,GAAe,GAGnB,IAAIhC,EAAaxtB,GAAauvB,EAC1BA,EAAgB,IAChB/B,GAAc,GAGlB,MAAM,MAAE9vB,GbmCL,SAAyB5L,GAC5B,OAAO2vB,GAAS3vB,EAAiB,wBAAyBA,EAAgBqC,aAC9E,CarCsBs7B,CAAgB39B,GAE5B08B,EbyCH,SAA4B18B,GAC/B,OAAO2vB,GAAS3vB,EAAiB,2BAA4BA,EAAgBiqB,gBACjF,Ca3CmC2T,CAAmB59B,IAC5C,kBAAEuqB,EAAiB,cAAED,GboDxB,SAAyBtqB,GAC5B,OAAO2vB,GAAS3vB,EAAiB,wBAAyBA,EAAgBqqB,aAC9E,CatDiDwT,CAAgB79B,GAEvD89B,EAA2B,IAAIxzC,IAAIgwB,EAAsB7hC,KAAI,EAAGwO,WAAYA,KAElF,OACIwnB,EAAAA,QAAAA,cAAA,OAAK6B,UAAY,mBAAiB1E,EAAQ,GAAK,oBAAsBnsB,MAAO,CAAEi+C,cAAahC,eACvFjtB,EAAAA,QAAAA,cAAA,OAAK6B,UAAU,iBAEP2a,GACIxc,EAAAA,QAAAA,cAAC0uB,GAAO,CACJn9B,gBAAiBA,EACjBo9B,eAAgBA,IAI5B3uB,EAAAA,QAAAA,cAAC4tB,GAAwB,CACrB/rB,UAAU,yBACVgsB,SAAUrR,EACVjiC,QAASA,IAAMgX,EAAgBivB,uBAC/BuN,YAAY,2BAEZ/tB,EAAAA,QAAAA,cAAA,OAAK6B,UAAU,wCACX7B,EAAAA,QAAAA,cAAA,OAAKwuB,UAAU,QAAQC,QAAQ,eAC3BzuB,EAAAA,QAAAA,cAAA,QAAM3b,KAAK,eAAehR,EAAE,kzBAKxC2sB,EAAAA,QAAAA,cAAC4tB,GAAwB,CACrB/rB,UAAU,0BACVgsB,UAAU,EACVtzC,QAASA,IAAMgX,EAAgBgtB,iBAC/BhkB,UAAWuhB,GAEX9b,EAAAA,QAAAA,cAAA,OAAK6B,UAAU,kBACX7B,EAAAA,QAAAA,cAAA,OAAKwuB,UAAU,QAAQC,QAAQ,eAC3BzuB,EAAAA,QAAAA,cAAA,QAAM3b,KAAK,eAAehR,EAAE,oMAKxC2sB,EAAAA,QAAAA,cAAC4tB,GAAwB,CACrB/rB,UAAU,0BACVgsB,UAAU,EACVtzC,QAASA,IAAMgX,EAAgB+sB,aAC/B/jB,UAAWshB,GAEX7b,EAAAA,QAAAA,cAAA,OAAK6B,UAAU,kBACX7B,EAAAA,QAAAA,cAAA,OAAKwuB,UAAU,QAAQC,QAAQ,eAC3BzuB,EAAAA,QAAAA,cAAA,QAAM3b,KAAK,eAAehR,EAAE,qMAMpCw4B,EAAsB7hC,KAAI,EAAEwO,QAAOG,aAAYC,aAAY9P,IAEnDk3B,EAAAA,QAAAA,cAACguB,GAAoB,CACjBz6C,IAAKzK,EACLyoB,gBAAiBA,EACjB08B,uBAAwBA,EACxBzS,gBAAiB7iC,EACjB4hB,SAAU3hB,IAAcukB,GAEvB3kB,MAOZ62C,EAAyB7e,IAAI,QAAUse,GACxC9uB,EAAAA,QAAAA,cAACguB,GAAoB,CACjBz8B,gBAAiBA,EACjB08B,uBAAwBA,EACxBzS,gBAAiB1M,GAAkB5E,WACnC3P,UAAW4C,GACd,OAMAkyB,EAAyB7e,IAAI,SAAWse,GACzC9uB,EAAAA,QAAAA,cAACguB,GAAoB,CACjBz8B,gBAAiBA,EACjB08B,uBAAwBA,EACxBzS,gBAAiB1M,GAAkB3E,cACnC5P,UAAW4C,GACd,QAMAkyB,EAAyB7e,IAAI,QAAUse,GACxC9uB,EAAAA,QAAAA,cAACguB,GAAoB,CACjBz8B,gBAAiBA,EACjB08B,uBAAwBA,EACxBzS,gBAAiB1M,GAAkB1E,SACnC7P,UAAW4C,GACd,OAMAkyB,EAAyB7e,IAAI,QAAUse,GACxC9uB,EAAAA,QAAAA,cAACguB,GAAoB,CACjBz8B,gBAAiBA,EACjB08B,uBAAwBA,EACxBzS,gBAAiB1M,GAAkBzE,QACnC9P,UAAW4C,GACd,MAKL6C,EAAAA,QAAAA,cAACguB,GAAoB,CACjBz8B,gBAAiBA,EACjB08B,uBAAwBA,EACxBzS,gBAAiB1M,GAAkB96B,IACnCumB,UAAU,GACb,QAOjB,CAEAs0B,GAAe5uB,UAAY,CACvB1O,gBAAiBxiB,IAAAA,WAAqB48B,IAAiBl+B,WACvDo+B,sBAAuB3L,EAAgBrnB,sBAAsBpL,WAC7DqhD,0BAA2B//C,IAAAA,KAC3B4/C,eAAgB5/C,IAAAA,MCpKL,MAAMugD,WAAmBtvB,EAAAA,QAAAA,cAEpCzkB,WAAAA,CAAYxO,GACR4kB,MAAM5kB,GAEN3B,KAAKmkD,MAAQ,CACT3tC,aAAc,EACdC,cAAe,EACfiK,gBAAiB,CACb3E,KAAM,EACND,KAAM,GAEV0M,aAAc,CACVzM,KAAM,EACND,KAAM,IAId9b,KAAK84C,YAAc94C,KAAK84C,YAAYxxB,KAAKtnB,MACzCA,KAAKokD,aAAepkD,KAAKokD,aAAa98B,KAAKtnB,MAC3CA,KAAKqkD,YAAcrkD,KAAKqkD,YAAY/8B,KAAKtnB,MACzCA,KAAKskD,cAAgBtkD,KAAKskD,cAAch9B,KAAKtnB,MAC7CA,KAAKukD,eAAiBvkD,KAAKukD,eAAej9B,KAAKtnB,KACnD,CAEAwkD,UAAAA,CAAWrM,GACP,OAAIA,GAASA,EAAM2C,SAAW3C,EAAM2C,QAAQ,GACjC3C,EAAM2C,QAAQ,GAAGrH,QAExB0E,GAASA,EAAM4C,gBAAkB5C,EAAM4C,eAAe,GAC/C5C,EAAM4C,eAAe,GAAGtH,QAE5B0E,EAAM1E,OACjB,CAEAgR,iBAAAA,GACIzkD,KAAK0kD,UAAY,IAAIx+B,GAAkB,CACnCC,gBAAiBnmB,KAAK2B,MAAMwkB,gBAC5BC,cAAepmB,KAAKm6C,GACpB9zB,MAAOrmB,KAAK2B,MAAM0kB,MAClBC,kBAAmBtmB,KAAK2B,MAAM2kB,oBAElCtmB,KAAK2B,MAAMwkB,gBAAgB0E,mBAAqB7qB,KAAK0kD,UAErD1kD,KAAK0kD,UAAUp0C,GAAG,gBAAiBoH,IAC/B1X,KAAK2kD,SAASjtC,EAAO,IAGzB1X,KAAK2kD,SAAS,CACVjkC,gBAAiB1gB,KAAK2B,MAAMwkB,gBAAgB4E,WAC5CvC,aAAcxoB,KAAK2B,MAAMwkB,gBAAgB+kB,gBAG7ClrC,KAAK2B,MAAMwkB,gBAAgB7V,GAAG,qBAAsBoQ,IAChD1gB,KAAK2kD,SAAS,CAAEjkC,mBAAkB,IAGtC1gB,KAAK2B,MAAMwkB,gBAAgB7V,GAAG,yBAA0BkY,IACpDxoB,KAAK2kD,SAAS,CAAEn8B,aAAcA,GAAe,GAErD,CAEAo8B,kBAAAA,CAAmBC,GACXA,EAAUhU,YAAc7wC,KAAK2B,MAAMkvC,WAAa7wC,KAAK0kD,WACrD1kD,KAAK0kD,UAAUr9B,QAEvB,CAEAy9B,oBAAAA,GACQ9kD,KAAK0kD,YACL1kD,KAAK0kD,UAAUxmC,UACfle,KAAK0kD,UAAY,KAEzB,CAEA5L,WAAAA,CAAYX,GACR,IAAKn4C,KAAK+kD,UACN,OAQJ,IAAI3U,EAJA+H,GAASA,EAAM2C,SAAW3C,EAAMiD,gBAChCjD,EAAMiD,iBAIV,MAAM4J,EAAQhlD,KAAKm6C,GAAGrkC,wBAAwBsX,KAE9CptB,KAAK2kD,UAAS,EAAEjkC,kBAAiB8H,eAAchS,mBAE3C,IAAIyuC,GADWjlD,KAAKwkD,WAAWrM,GAAS6M,GAChBxuC,EAExByuC,EAAaxrC,KAAKK,IAAImrC,EAAY,GAClCA,EAAaxrC,KAAKC,IAAIurC,EAAY,GAElC,IAAIlb,EAAQkb,GAAcz8B,EAAa1M,KAAO0M,EAAazM,MAAQyM,EAAazM,KAEhF,GAAuB,WAAnB/b,KAAK+kD,UAAwB,CAC7B,MAAMj3B,EAAQpN,EAAgB5E,KAAO4E,EAAgB3E,KACrD,IAAIA,EAAOguB,EAAQjc,EAAM9tB,KAAKklD,wBAC1BppC,EAAOiuB,EAAQjc,GAAO,EAAE9tB,KAAKklD,yBAgBjC,OAdInpC,EAAOyM,EAAazM,OACpBA,EAAOyM,EAAazM,KACpBD,EAAOC,EAAO+R,GAGdhS,EAAO0M,EAAa1M,OACpBA,EAAO0M,EAAa1M,KACpBC,EAAOD,EAAOgS,GAGlBsiB,EAAkBA,KACP,CAACr0B,OAAMD,SAGX,CACH4E,gBAAiBrY,OAAO0yB,OAAO,CAAC,EAAGra,EAAiB,CAChD3E,OAAMD,SAGlB,CAAO,GAAuB,SAAnB9b,KAAK+kD,UAAsB,CAC9Bhb,EAAQrpB,EAAgB5E,OACxBiuB,EAAQrpB,EAAgB5E,MAG5B,MAAMqpC,EAAe38B,EAAa1M,OAAS4E,EAAgB5E,KAe3D,OAbAs0B,EAAkBA,IACV+U,EACO,CACHppC,KAAMguB,GAGH,CACHhuB,KAAMguB,EACNjuB,KAAM4E,EAAgB5E,MAK3B,CACH4E,gBAAiBrY,OAAO0yB,OAAO,CAAC,EAAGra,EAAiB,CAChD3E,KAAMguB,IAGlB,CAAO,GAAuB,UAAnB/pC,KAAK+kD,UAAuB,CAC/Bhb,EAAQrpB,EAAgB3E,OACxBguB,EAAQrpB,EAAgB3E,MAG5B,MAAMqpC,EAAc58B,EAAazM,OAAS2E,EAAgB3E,KAe1D,OAbAq0B,EAAkBA,IACVgV,EACO,CACHtpC,KAAMiuB,GAGH,CACHhuB,KAAM2E,EAAgB3E,KACtBD,KAAMiuB,GAKX,CACHrpB,gBAAiBrY,OAAO0yB,OAAO,CAAC,EAAGra,EAAiB,CAChD5E,KAAMiuB,IAGlB,KACD,KACMqG,IAILA,EAAgB4B,iBAAkB,EAClChyC,KAAK2B,MAAMwkB,gBAAgBiqB,gBAAkBA,EAAe,GAEpE,CAEAiV,YAAAA,GACIp/C,OAAOizC,iBAAiB,YAAal5C,KAAK84C,aAC1C7yC,OAAOizC,iBAAiB,UAAWl5C,KAAKokD,cACxCn+C,OAAOizC,iBAAiB,YAAal5C,KAAK84C,YAAa,CAAEyC,SAAS,IAClEt1C,OAAOizC,iBAAiB,WAAYl5C,KAAKokD,cACzCn+C,OAAOizC,iBAAiB,cAAel5C,KAAKokD,aAChD,CAEAA,YAAAA,GACIpkD,KAAK+kD,UAAY,KACjB/kD,KAAKslD,cACLr/C,OAAOgzC,oBAAoB,YAAaj5C,KAAK84C,aAC7C7yC,OAAOgzC,oBAAoB,UAAWj5C,KAAKokD,cAC3Cn+C,OAAOgzC,oBAAoB,YAAaj5C,KAAK84C,aAC7C7yC,OAAOgzC,oBAAoB,WAAYj5C,KAAKokD,cAC5Cn+C,OAAOgzC,oBAAoB,cAAej5C,KAAKokD,aACnD,CAEAC,WAAAA,CAAYlM,GACRn4C,KAAK+kD,UAAY,SAEjB,MAAM,gBAACrkC,EAAe,aAAE8H,EAAY,aAAEhS,GAAgBxW,KAAKmkD,MACrDa,EAAQhlD,KAAKm6C,GAAGrkC,wBAAwBsX,KAExC4e,EAAchsC,KAAKwkD,WAAWrM,GAAS6M,EACvCO,GAAa7kC,EAAgB3E,KAAOyM,EAAazM,OAAOyM,EAAa1M,KAAO0M,EAAazM,MAAQvF,GAAgB,EACjHgvC,GAAa9kC,EAAgB5E,KAAO0M,EAAazM,OAAOyM,EAAa1M,KAAO0M,EAAazM,MAAQvF,GAAgB,EAEvHxW,KAAKklD,yBAA2BlZ,EAAYuZ,IAAYC,EAAYD,GACpEvlD,KAAKqlD,cACT,CAEAf,aAAAA,CAAcnM,GACVn4C,KAAK+kD,UAAY,OACjB/kD,KAAKqlD,cACT,CAEAd,cAAAA,CAAepM,GACXn4C,KAAK+kD,UAAY,QACjB/kD,KAAKqlD,cACT,CAEAj9B,MAAAA,GACI,MAAM,aAAEI,EAAY,gBAAE9H,EAAe,aAAElK,EAAY,cAAEC,GAAkBzW,KAAKmkD,MAE5E,IAAIoB,EAAY9rC,KAAKC,IAAID,KAAKK,KAAK4G,EAAgB3E,KAAOyM,EAAazM,OAAOyM,EAAa1M,KAAO0M,EAAazM,MAAO,GAAI,GAAKvF,GAAgB,EAC3IgvC,EAAa/rC,KAAKC,IAAID,KAAKK,KAAK4G,EAAgB5E,KAAO0M,EAAazM,OAAOyM,EAAa1M,KAAO0M,EAAazM,MAAO,GAAI,GAAKvF,GAAgB,GAE5I0Z,MAAMq1B,KAAe/vB,SAAS+vB,IAAc7kC,EAAgB5E,KAAO4E,EAAgB3E,QACnFwpC,EAAY,IAGZr1B,MAAMs1B,KAAehwB,SAASgwB,IAAc9kC,EAAgB5E,KAAO4E,EAAgB3E,QACnFypC,EAAY,GAGhB,MACMlvB,EAAc7f,EADJ,GAEhB,IAAIinC,EAsBJ,OApBIh9B,EAAgBqR,OAAS/xB,KAAK2B,MAAM8jD,YACpC/H,EAAQN,GAAU,CACd1jC,IAAK8O,EAAazM,KAClBjC,IAAK0O,EAAa1M,KAClBmgC,UAAWzlC,EACXyZ,UAAW,MACX8B,MAAOrR,EAAgBqR,MACvBmqB,UAAWpqB,GACXurB,kBAAmB,GACnBC,aAAc,EACdnB,cAAe,CACXjqB,iBAAiB,EACjBE,aAAc,MACd1B,SAAU1wB,KAAK2B,MAAM+uB,UAEzB6sB,WAAW,EACXC,UAAU,KAKd5oB,EAAAA,QAAAA,cAAA,OAAK6B,UAAU,yBACX7B,EAAAA,QAAAA,cAAA,OAAK6B,UAAU,kCAAkC7wB,MAAO,CAAE8/C,YAAa,SACnE9wB,EAAAA,QAAAA,cAAA,UAAQoC,IAAMmjB,GAAOn6C,KAAKm6C,GAAKA,IAE/BvlB,EAAAA,QAAAA,cAAA,OAAKhvB,MAAO,CAAE+P,OAAQ2gB,IAClB1B,EAAAA,QAAAA,cAAA,SACIA,EAAAA,QAAAA,cAAA,QACInqB,EAAG,EACHF,EAAGkM,EACHlL,MAAOiL,EACPb,OAnCR,GAoCQ8gB,UAAU,wBAIVinB,GAASA,EAAM9+C,KAAI,EAAG09C,aAAYlvC,QAAOyD,OAAMxR,YAAY3B,KACvD,GAAIwyB,MAAMosB,GACN,OAAO,KAGX,MAAMwE,EAAU,CAAC,YAAc,aAAYjwC,IAAS,aAAYxR,KAOhE,OALsBi9C,GAAciJ,GAAajJ,GAAckJ,GAE3D1E,EAAQrhD,KAAK,yBAIbm1B,EAAAA,QAAAA,cAAA,KAAGzsB,IAAKzK,EAAG+4B,UAAWqqB,EAAQhiD,KAAK,MAC/B81B,EAAAA,QAAAA,cAAA,QAAM3sB,EAAI,IAAGq0C,QAAiB7lC,MAE9Bme,EAAAA,QAAAA,cAAA,QAAMnqB,EAAG6xC,EAAa,EAAG/xC,EAAGkM,GACvBrJ,GAEL,IAKhBwnB,EAAAA,QAAAA,cAAA,QACInqB,EAAG86C,EACHh7C,EAAGkM,EACHlL,MAAOi6C,EAAYD,EACnB5vC,OApER,GAqEQ8gB,UAAU,gBACVkiB,YAAa34C,KAAKqkD,YAClBsB,aAAc3lD,KAAKqkD,cAGvBzvB,EAAAA,QAAAA,cAAA,QACI3sB,EAAE,8FACFwuB,UAAU,uBACVhB,UAAY,aAAY8vB,GAAaC,EAAYD,GAAW,KAAK9uC,KACjEkiC,YAAa34C,KAAKqkD,YAClBsB,aAAc3lD,KAAKqkD,eAI3BzvB,EAAAA,QAAAA,cAAA,SACIA,EAAAA,QAAAA,cAAA,QACInqB,EAAG86C,EACHh7C,EAAG,EACHgB,MAAOi6C,EAAYD,EACnB5vC,OAAQ2gB,EACRG,UAAU,2BACVkiB,YAAa34C,KAAKqkD,YAClBsB,aAAc3lD,KAAKqkD,eAK3BzvB,EAAAA,QAAAA,cAAA,KAAG6B,UAAY,oBAAsC,SAAnBz2B,KAAK+kD,WAA2C,WAAnB/kD,KAAK+kD,UAA0B,6BAA+B,KACzHnwB,EAAAA,QAAAA,cAAA,QACInqB,EAAG86C,EAAY,GACfh7C,GAAIkM,EAAgB,IAAI,EACxBlL,MAAO,GACPoK,OAAQ,GACRsD,KAAK,cACLwd,UAAU,2BACVkiB,YAAa34C,KAAKskD,cAClBqB,aAAc3lD,KAAKskD,gBAEvB1vB,EAAAA,QAAAA,cAAA,QACI3sB,EAAE,6FACFwuB,UAAU,uBACVhB,UAAY,aAAY8vB,MAAc9uC,EAAgB,IAAI,KAC1DkiC,YAAa34C,KAAKskD,cAClBqB,aAAc3lD,KAAKskD,iBAK3B1vB,EAAAA,QAAAA,cAAA,KAAG6B,UAAY,oBAAsC,UAAnBz2B,KAAK+kD,WAA4C,WAAnB/kD,KAAK+kD,UAA0B,6BAA+B,KAC1HnwB,EAAAA,QAAAA,cAAA,QACInqB,EAAG+6C,EAAY,GACfj7C,GAAIkM,EAAgB,IAAI,EACxBlL,MAAO,GACPoK,OAAQ,GACRsD,KAAK,cACLwd,UAAU,2BACVkiB,YAAa34C,KAAKukD,eAClBoB,aAAc3lD,KAAKukD,iBAEvB3vB,EAAAA,QAAAA,cAAA,QACI3sB,EAAE,6FACFwuB,UAAU,uBACVhB,UAAY,aAAY+vB,MAAc/uC,EAAgB,IAAI,KAC1DkiC,YAAa34C,KAAKukD,eAClBoB,aAAc3lD,KAAKukD,mBAO3BvkD,KAAK2B,MAAMw3C,eACXvkB,EAAAA,QAAAA,cAAC3kB,GAAa,CACVkW,gBAAiBnmB,KAAK2B,MAAMwkB,gBAC5BgzB,cAAen5C,KAAK2B,MAAMw3C,cAC1BC,cAAc,EACdz9B,OAAQ6M,EACR/R,cAAeA,EACfD,aAAcA,KAMtC,EAIJ0tC,GAAWvtB,aAAe,CACtBprB,MAAO,EACPqB,YAAa,eAGjBs3C,GAAWrvB,UAAY,CACnB1O,gBAAiBxiB,IAAAA,WAAqB48B,IAAiBl+B,WACvDgkB,MAAO1iB,IAAAA,KACPktC,UAAWltC,IAAAA,KACX2iB,kBAAmB3iB,IAAAA,KACnB8hD,UAAW9hD,IAAAA,KACX+sB,SAAU/sB,IAAAA,OACVw1C,cAAerkB,EAAgB7kB,eCzZnC,SAAe2kB,EAAAA,QAAAA,KAAWgxB,IAE1B,SAASA,IAAc,OAAE34C,EAAM,EAAEvP,EAAC,MAAEkI,EAAK,YAAE+yC,EAAW,MAAElH,EAAK,gBAAEtrB,EAAe,YAAE7L,IAC5E,MAAMvc,GAAQP,EAAAA,EAAAA,SAASyP,EAAOlP,MAAOL,EAAGuP,EAAOtP,yBAG3CiI,EADU,QAAV6rC,EACQppC,OAAO0yB,OAAO,CAAC,EAAGn1B,EAAO,CAC7BigD,gBAAiB9nD,IAGbsK,OAAO0yB,OAAO,CAAC,EAAGn1B,EAAO,CAC7B7H,UAIR,MAAM+iD,EAAU,CAAC,mBACbxmC,GACAwmC,EAAQrhD,KAAK,+BAGjB,MAAM0C,EAAOy9B,GAAc3yB,EAAQvP,GAEnC,OACIk3B,EAAAA,QAAAA,cAAA,OACI6B,UAAWqqB,EAAQhiD,KAAK,KACxB8G,MAAOA,EACP+yC,YAAaA,EACb2J,YAAaA,IAAMn8B,EAAgBqsB,qBAAqB90C,GACxD6kD,WAAYA,IAAMp8B,EAAgBqsB,qBAAqB,MACvDrjC,QAASA,IAAMgX,EAAgBmsB,oBAAoB50C,IAElDyE,EAGb,CAEAyjD,GAAc/wB,UAAY,CACtB5nB,OAAQ6nB,EAAgBjqB,aAAaxI,WACrC8jB,gBAAiBxiB,IAAAA,WAAqB48B,IACtC7iC,EAAGiG,IAAAA,OAAiBtB,WACpBuD,MAAOjC,IAAAA,OACPg1C,YAAah1C,IAAAA,KACb8tC,MAAO9tC,IAAAA,OAAiBtB,WACxBiY,YAAa3W,IAAAA,MC9CF,MAAMmiD,WAA+BlxB,EAAAA,QAAAA,cAEhDzkB,WAAAA,CAAYxO,GACR4kB,MAAM5kB,GAEN3B,KAAKmkD,MAAQ,CACT4B,mBAAmB,GAGvB/lD,KAAKgmD,wBAA0BhmD,KAAKgmD,wBAAwB1+B,KAAKtnB,KACrE,CAEAgmD,uBAAAA,GACIhmD,KAAK2kD,UAAS,EAAGoB,wBACN,CACHA,mBAAoBA,KAGhC,CAEA39B,MAAAA,GACI,MAAM,SAACs6B,EAAQ,gBAAEv8B,EAAe,UAAEnZ,EAAS,MAAEG,EAAK,MAAEC,EAAK,UAAE4zB,GAAahhC,KAAK2B,OAEvE,kBAAEokD,GAAsB/lD,KAAKmkD,MAEnC,OACIvvB,EAAAA,QAAAA,cAAA,OACI6B,UAAY,6BAA2BsvB,EAAoB,2CAA6C,IACxG,kBAAiB/4C,EACjB,kBAAiBg0B,GAEjBpM,EAAAA,QAAAA,cAAA,OAAK6B,UAAU,cAActnB,QAASA,IAAMgX,EAAgBktB,YAAY,CAACrmC,eACpEG,EAAMzO,MAAM,EAAGqnD,EAAoB,EAAI,IAG5CnxB,EAAAA,QAAAA,cAAA,OAAK6B,UAAU,kCACX7B,EAAAA,QAAAA,cAAA,WACK8tB,EAED9tB,EAAAA,QAAAA,cAAA,OAAK6B,UAAU,sBAAsB4sB,QAAQ,cAAcl0C,QAASnP,KAAKgmD,yBACrEpxB,EAAAA,QAAAA,cAAA,QACI3sB,EAAE,ySAId2sB,EAAAA,QAAAA,cAAA,OAAK6B,UAAU,mCACX7B,EAAAA,QAAAA,cAAA,SACIquB,SAAW9K,GAAUhyB,EAAgBitB,SAAS,CAACpmC,YAAWI,MAAO+qC,EAAMtyC,OAAO0D,QAC9E08C,YAAY,cACZ18C,MAAO6D,GAAS,OAMxC,EAGJ04C,GAAuBjxB,UAAY,CAC/B1O,gBAAiBxiB,IAAAA,WAAqB48B,IAAiBl+B,WACvDqgD,SAAU/+C,IAAAA,KAAetB,WACzB2K,UAAWrJ,IAAAA,OAAiBtB,WAC5B8K,MAAOxJ,IAAAA,OAAiBtB,WACxB+K,MAAOzJ,IAAAA,OACPq9B,UAAWr9B,IAAAA,QCZf,SAAeixB,EAAAA,QAAAA,KAAWsxB,IAE1B,SAASA,IAAU,gBAAE//B,EAAe,MAAEsrB,EAAK,UAAEZ,EAAS,UAAE7P,EAAS,oBAAEmgB,EAAoB,IACnF,MAAMl0C,EAASypC,GAAUvwB,IAClB6uB,EAAesM,IAAoBlL,EAAAA,EAAAA,UAAS,OAC5C+P,EAAcC,IAAmBhQ,EAAAA,EAAAA,UAAS,CAC7C3rC,EAAG,EACHF,EAAG,IAGD+lC,EAAoBqG,GAAqBxwB,GAEzCkgC,GAASC,EAAAA,EAAAA,QAAO,OACfC,EAAUC,IAAepQ,EAAAA,EAAAA,UAA+G,EAAtGnpC,EAAOrO,KAAI,EAAGuD,OAAM6I,QAAQtN,KAAOyE,GAAQ6I,GAAQtN,GAAGqC,WAAWnC,SAAQkL,QAAO,CAACvK,EAAGD,IAAMC,EAAID,GAAG,IAE1I,IAAImoD,GACJpQ,EAAAA,EAAAA,YAAU,KACFgQ,EAAOK,UACPC,qBAAqBF,GAErBA,EAAwB7wC,uBAAsB,KAC1C,IAAKywC,EAAOK,QACR,OAGJ,MAAMn7C,EAAQ,IAAI86C,EAAOK,QAAQE,iBAAiB,+BAC7ChoD,KAAKu7C,GAAOA,EAAG0M,cACf/9C,QAAO,CAACvK,EAAGD,IAAMC,EAAID,GAAG,GAC7BkoD,EAAYj7C,EAAM,IAE1B,GACD,CAAC0B,EAAQo5C,EAAOK,UAEnB,MAAM9gD,EAzEV,UAAyB,gBAACugB,EAAe,SAAEogC,IACvC,MAAM5C,EAAiB/M,GAAkBzwB,GACnCy9B,EAAgB9M,GAAiB3wB,GACjCirB,EAAiB+F,GAAkBhxB,GAEzC,IAAI09B,EAAcxvB,GAAasvB,EAC3BA,EAAiB,IACjBE,GAAe,GAGnBA,GAAe,IAEXzS,IACAyS,GAAe,IAGnB,IASIlD,EATAkB,EAAaxtB,GAAauvB,EAE1BA,EAAgB,IAChB/B,GAAc,GAGlBA,EAAapoC,KAAKK,IAAI+pC,EAAahC,GACnCgC,EAAcpqC,KAAKK,IAAI+pC,EAAahC,GAIpC,MAAM,aAAErrC,GAAiBggC,GAAerwB,GAUxC,OARoB3P,EAAeqrC,EAAagC,EAAc0C,IAG1D1E,EAAa,EACbgC,EAAc,EACdlD,EAAe,IAGZ,CAAEkD,cAAahC,aAAYlB,eACtC,CAmCkBmG,CAAgB,CAAE3gC,kBAAiBogC,aAE3C9+B,EAAOgvB,GAAQtwB,GACfsjB,EjBCH,SAA6BtjB,GAChC,OAAO2vB,GAAS3vB,EAAiB,4BAA6BA,EAAgBsjB,iBAClF,CiBH6Bsd,CAAoB5gC,GAyD7C,OACIyO,EAAAA,QAAAA,cAAA,OAAK6B,UAAU,aAAa7wB,MAAOA,EAAOoxB,IAAKqvB,GAEvCxV,GACAjc,EAAAA,QAAAA,cAAA,OACI6B,UAAU,4BACV,kBAAgB,WAChB,kBAAiBuK,IAKrBvZ,EAAK7oB,KAAI,CAAC6M,EAAM/N,KACP+N,EAAKwB,OAAOrP,QAAU6pB,EAAK7pB,OAAS,EAC9B,KAIPg3B,EAAAA,QAAAA,cAACkxB,GAAsB,CACnB39C,IAAKzK,EACL0P,MAAO3B,EAAK2B,MACZJ,UAAWvB,EAAKuB,UAChBG,MAAO1B,EAAK0B,MACZgZ,gBAAiBA,EACjB6a,UAAWA,GAGPv1B,EAAKwB,OAAOrO,KAAKypB,GACTA,EAAarc,YACN,KAIP4oB,EAAAA,QAAAA,cAACgxB,GAAa,CACVz9C,IAAKkgB,EAAa/iB,MAClB2H,OAAQob,EACR3qB,EAAG2qB,EAAa/iB,MAChBqzC,YAAaA,CAACR,EAAO6O,IA5FvCC,EAAC9O,EAAO9vB,KAC1B,IAAI6+B,EAAc/O,EAAMtyC,OACxB,KAAOqhD,GAAyC,eAA1BA,EAAYzwB,WAC9BywB,EAAcA,EAAYjgD,WAE9B,MAAMkgD,EAAahP,EAAMtyC,OAAOiQ,wBAAwBsX,KACxD,IAAIg6B,EAAgBF,EAAYpxC,wBAAwBsX,KACpDi6B,EAAsBH,EAAYthD,MAAMi8C,WAE5C,MAAMnzC,EAASypC,EAAM1E,QACfyO,EAAS/J,EAAMxE,QACf2T,EAAenP,EAAM1E,QACrB8T,EAAepP,EAAMxE,QAE3B2N,EAAiBj5B,GACjB+9B,EAAgB,CACZ37C,EAAG0tC,EAAM1E,QAAU/kC,GAAUy4C,EAAaC,GAAiB,EAC3D78C,EAAG4tC,EAAMxE,QAAUuO,EAAS,IAGhC,MAAMpJ,EAAeC,IACbmO,EAAYthD,MAAMi8C,aAAewF,IACjCD,EAAgBF,EAAYpxC,wBAAwBsX,KACpDi6B,EAAsBH,EAAYthD,MAAMi8C,YAG5CuE,EAAgB,CACZ37C,EAAGsuC,EAAUtF,QAAU/kC,GAAUy4C,EAAaC,GAAiB,EAC/D78C,EAAGwuC,EAAUpF,QAAUuO,EAAS,GAClC,EAGAlJ,EAAamJ,IACfl8C,OAAOgzC,oBAAoB,YAAaH,GACxC7yC,OAAOgzC,oBAAoB,UAAWD,GAEtC,IAAInzC,EAASs8C,EAAat8C,OAC1B,KAAOA,KAAYA,EAAOu8C,SAAW,CAAC,GAAGp1C,aAAenH,EAAOu8C,SAAW,CAAC,GAAGC,WAC1Ex8C,EAASA,EAAOoB,WAGpBq6C,EAAiB,MACjBn7B,EAAgB4uB,aAAa1sB,EAAcxiB,IAAWA,EAAOu8C,SAAW,CAAC,GAAGp1C,UAAWnH,IAAWA,EAAOu8C,SAAW,CAAC,GAAGC,WAEpHF,EAAa1O,UAAY6T,GAAgBnF,EAAaxO,UAAY4T,GAClEphC,EAAgBkuB,uBAAuBhsB,EAAc85B,EAAatO,SACtE,EAGJ5tC,OAAOizC,iBAAiB,YAAaJ,GACrC7yC,OAAOizC,iBAAiB,UAAWF,GAEnC7yB,EAAgB2uB,eAAe,EAwC+CmS,CAAc9O,EAAO9vB,GAC/DopB,MAAOA,EACPtrB,gBAAiBA,EACjB7L,YAAag2B,IAAsBjoB,EAAa/iB,OAASmkC,EAAiBrE,IAAI/c,UAW1GwoB,GACAjc,EAAAA,QAAAA,cAAA,OACI6B,UAAU,4BACV,kBAAgB,YAChB,kBAAiBuK,IAKrBgU,GACApgB,EAAAA,QAAAA,cAACgxB,GAAa,CACVhgD,MAAO,CACHwnB,KAAM+4B,EAAa17C,EACnB0iB,IAAKg5B,EAAa57C,EAAI42C,EACtB9hD,SAAU,WACVguB,cAAe,OACfm6B,OAAQ,GAEZv6C,OAAQ+nC,EACRt3C,EAAGs3C,EAAc1vC,MACjBmsC,MAAOA,EACPtrB,gBAAiBA,IAKrC,CAEA+/B,GAAUrxB,UAAY,CAClB1O,gBAAiBxiB,IAAAA,WAAqB48B,IAAiBl+B,WACvDovC,MAAO9tC,IAAAA,OAAiBtB,WACxBwuC,UAAWltC,IAAAA,KAAetB,WAC1B2+B,UAAWr9B,IAAAA,OACXw9C,oBAAqBx9C,IAAAA,QCtOzB,SAAeixB,EAAAA,QAAAA,KAAW6yB,IAE1B,SAASA,IAAW,MAAEC,IAClB,OACI9yB,EAAAA,QAAAA,cAAA,OAAK6B,UAAU,iBACVixB,EAGb,CAEAD,GAAW5yB,UAAY,CACnB6yB,MAAO/jD,IAAAA,OAAiBtB,YCP5B,MAAMslD,WAAqB/yB,EAAAA,QAAAA,cAEvBzkB,WAAAA,CAAYxO,GACR4kB,MAAM5kB,GAEN3B,KAAKijD,SAAWjjD,KAAKijD,SAAS37B,KAAKtnB,KACvC,CAIAijD,QAAAA,CAAS9K,GACL1oB,YAAW,KACPzvB,KAAK2B,MAAMwkB,gBAAgBqvB,WAAWx1C,KAAK2B,MAAM0mB,aAAc8vB,EAAMtyC,OAAO+hD,QAAQ,GAE5F,CAEAx/B,MAAAA,GACI,MAAM,aAAEC,GAAiBroB,KAAK2B,MACxB5D,GAAQP,EAAAA,EAAAA,SAAS6qB,EAAatqB,MAAOsqB,EAAa/iB,MAAO+iB,EAAa1qB,yBAE5E,IAAIwE,EAAOkmB,EAAalmB,MAAQkmB,EAAard,KAM7C,OAJK7I,IACDA,EAAOkmB,EAAa/iB,OAIpBsvB,EAAAA,QAAAA,cAAA,OAAK6B,UAAU,iBACX7B,EAAAA,QAAAA,cAAA,aACIA,EAAAA,QAAAA,cAAA,SACI9pB,KAAK,WACL+8C,gBAAiBx/B,EAAamd,OAC9BxO,IAAMmjB,GAAOA,GAAMA,EAAGjB,iBAAiB,SAAUl5C,KAAKijD,YAE1DruB,EAAAA,QAAAA,cAAA,QAAM6B,UAAU,YAAY7wB,MAAO,CAAEmG,WAAYhO,EAAO+pD,YAAa/pD,KAEpEoE,GAIjB,EAQW,SAAS4lD,IAAQ,gBAAE5hC,IAC9B,MAAMlZ,EAASypC,GAAUvwB,GAEzB,OACIyO,EAAAA,QAAAA,cAAA,OAAK6B,UAAU,mBAEPxpB,EAAOrO,KAAI,CAACypB,EAAc3qB,IACtBk3B,EAAAA,QAAAA,cAAC+yB,GAAY,CACTx/C,IAAKzK,EACL2qB,aAAcA,EACdlC,gBAAiBA,MAMzC,CArBAwhC,GAAa9yB,UAAY,CACrBxM,aAAcyM,EAAgBjqB,aAAaxI,WAC3C8jB,gBAAiBxiB,IAAAA,WAAqB48B,IAAiBl+B,YAqB3D0lD,GAAQlzB,UAAY,CAChB1O,gBAAiBxiB,IAAAA,WAAqB48B,IAAiBl+B,YC1E5C,MAAM2lD,GAQjB73C,WAAAA,EAAY,WAAE83C,GAAW,EAAI,aAAEC,GAAa,EAAI,cAAEC,GAAc,GAAU,CAAC,GACvEnoD,KAAKooD,kBAAoB,IAAI33C,IAC7BzQ,KAAKqoD,YAAcJ,EACnBjoD,KAAKsoD,cAAgBJ,EACrBloD,KAAKuoD,eAAiBJ,CAC1B,CAEAz3C,GAAAA,CAAIyV,GACAnmB,KAAKooD,kBAAkB13C,IAAIyV,GAEvBnmB,KAAKqoD,aACLroD,KAAKioD,WAAW9hC,GAGhBnmB,KAAKsoD,eACLtoD,KAAKkoD,aAAa/hC,GAGlBnmB,KAAKuoD,gBACLvoD,KAAKmoD,cAAchiC,EAE3B,CAEAhhB,MAAAA,CAAOghB,GACHnmB,KAAKooD,kBAAkBx3C,OAAOuV,EAIlC,CAEAgiC,aAAAA,CAAchiC,GACVA,EAAgB7V,GAAG,sBAAuBugC,IACtC,IAAK,IAAI2X,KAAwBxoD,KAAKooD,kBAC9BjiC,IAAoBqiC,IAIpB3X,EACA2X,EAAqB1T,gBAErB0T,EAAqBzT,aAAa,KAAM,MAEhD,GAER,CAEAkT,UAAAA,CAAW9hC,GACPA,EAAgB7V,GAAG,4BAA6B8/B,IAC5C,IAAK,IAAIoY,KAAwBxoD,KAAKooD,kBAC9BjiC,IAAoBqiC,IAIxBA,EAAqBpY,gBAAkBA,EAC3C,GAER,CAEA8X,YAAAA,CAAa/hC,GACTA,EAAgB7V,GAAG,yBAAyB,CAACqgC,EAAc8X,KACvD,GAAIzoD,KAAK0oD,sBAAwBD,EAC7B,OAGJ,MAAME,EAA2D,IAAtChY,EAAa5F,uBACnC4F,EAAapO,cACU,YAAvBviC,KAAKsoD,gBAAgCniC,EAAgB2tB,sBAEtD6U,IACA3oD,KAAK0oD,oBAAsBjvC,KAAKmvC,UAGpC,IAAK,IAAIJ,KAAwBxoD,KAAKooD,kBAC9BjiC,IAAoBqiC,IAIpBG,EACAH,EAAqBvU,sBAAsBj0C,KAAK0oD,qBAIpDF,EAAqBhV,wBAAwB,CACzC5c,OAAQ+Z,EAAa/Z,OACrBC,OAAQ8Z,EAAa9Z,OACrBkd,gBAAgB,EAChBC,gBAAiBh0C,KAAK0oD,sBAE9B,GAER,E,uOC3CJ,SAAe9zB,EAAAA,QAAAA,KAAWi0B,IAEpBC,GAAsB,CACxBrX,MAAO,QACPiN,UAAU,EACVqK,gBAAgB,EAChBC,oBAAoB,EACpB/H,eAAe,EACfpH,cAAc,EACdD,wBAAwB,EACxBnZ,sBAAuB,GACvB8iB,gBAAgB,EAChB1iB,wBAAwB,EACxBC,oBAAoB,GAGxB,SAAS+nB,GAAQlnD,GACbA,EAAQ,IAAImnD,MAAwBnnD,GAEpC,MAAMwkB,GAAkB8iC,EAAAA,EAAAA,UAAQ,IAAM,IAAI1oB,GAAgB,CACtDS,UAAWr/B,EAAMhC,MACdgC,KACAA,EAAMunD,iCACT,KAEJ7S,EAAAA,EAAAA,YAAU,IAKC,KACHlwB,EAAgBjI,SAAS,GAE9B,CAACiI,KAEJkwB,EAAAA,EAAAA,YAAU,KACN10C,EAAMwnD,uBAAyBxnD,EAAMwnD,sBAAsBhjC,EAAgB,GAC5E,CAACA,EAAiBxkB,EAAMwnD,yBAE3B9S,EAAAA,EAAAA,YAAU,KACNlwB,EAAgBgvB,iBAAmBxzC,EAAMwzC,gBAAgB,GAC1D,CAAChvB,EAAiBxkB,EAAMwzC,oBAE3BkB,EAAAA,EAAAA,YAAU,KACN10C,EAAMynD,cAAgBjjC,EAAgB7V,GAAG,cAAe3O,EAAMynD,cAEvD,KACHznD,EAAMynD,cAAgBjjC,EAAgBxV,IAAI,cAAehP,EAAMynD,aAAa,IAEjF,CAACjjC,EAAiBxkB,EAAMynD,gBAE3B/S,EAAAA,EAAAA,YAAU,KACNlwB,EAAgBye,UAAUjjC,EAAMsL,OAAO,GACxC,CAACkZ,EAAiBxkB,EAAMsL,UAE3BopC,EAAAA,EAAAA,YAAU,KACNlwB,EAAgBsrB,MAAQ9vC,EAAM8vC,KAAK,GACpC,CAACtrB,EAAiBxkB,EAAM8vC,QAE3B,MAAMA,EAAQ+F,GAASrxB,GACjBy4B,EAAYj9C,EAAMi9C,WAAuB,WAAVnN,EAE/BlpB,EAAmB5mB,EAAM4mB,mBAA+B,WAAVkpB,EAAsB,OAAI5zC,IAC9Ew4C,EAAAA,EAAAA,YAAU,KACNlwB,EAAgBoC,iBAAmBA,CAAgB,GACpD,CAACpC,EAAiBoC,KAErB8tB,EAAAA,EAAAA,YAAU,KACNlwB,EAAgB2T,WAAan4B,EAAMm4B,UAAU,GAC9C,CAAC3T,EAAiBxkB,EAAMm4B,cAE3Buc,EAAAA,EAAAA,YAAU,KACNlwB,EAAgBsa,sBAAwB9+B,EAAM8+B,qBAAqB,GACpE,CAACta,EAAiBxkB,EAAM8+B,yBAE3B4V,EAAAA,EAAAA,YAAU,KACNlwB,EAAgB0c,YAAclhC,EAAMkhC,WAAW,GAChD,CAAC1c,EAAiBxkB,EAAMkhC,eAE3BwT,EAAAA,EAAAA,YAAU,IACD10C,EAAM0nD,cAIXljC,EAAgB7V,GAAG,wBAAyB3O,EAAM0nD,cAC3C,KACHljC,EAAgBxV,IAAI,wBAAyBhP,EAAM0nD,aAAa,GALzD,QAOZ,CAACljC,EAAiBxkB,EAAM0nD,gBAE3BhT,EAAAA,EAAAA,YAAU,KACNlwB,EAAgBmd,gBAAgBjc,QAAQ,GACzC,CAAC1lB,EAAMgU,SAEV,MAAMk7B,EAAYqG,GAAa/wB,IAEzB,OAACmjC,EAAM,WAAEC,GApInB,SAAsC5nD,GAAO,UAAEkvC,EAAS,MAAEY,IACtD,MAAM,WAAEtQ,EAAU,OAAExrB,EAAM,MAAEpK,GAAU5J,EAEhC4nD,EAAa,CACf,UACC,WAAU9X,KAGT6X,EAAS,CAAC,EAsBhB,OApBIzY,GACA0Y,EAAW9pD,KAAK,sBAGhB0hC,GACAooB,EAAW9pD,KAAK,sBAChB8pD,EAAW9pD,KAAK,yBACTkW,IACP4zC,EAAW9pD,KAAK,wBAEZ6pD,EAAO3zC,OADW,iBAAXA,EACSA,EAAS,GAER,QAAOA,aAI5BpK,IACA+9C,EAAO/9C,MAAQA,GAGZ,CACH+9C,SACAC,aAER,CAkGiCC,CAA6B7nD,EAAO,CAAEkvC,YAAWY,UAExE9B,EAAYkH,GAAa1wB,GACzBupB,EAAWqH,GAAY5wB,GACvBkrB,EAAiBgG,GAAkBlxB,GAEnCi7B,EAAiD,kBAAzBz/C,EAAMy/C,eAA+Bz/C,EAAMy/C,eAA4B,WAAV3P,EACrFkN,EAAqC,kBAAnBh9C,EAAMg9C,UAAyBh9C,EAAMg9C,SACvDD,EAAqC,kBAAnB/8C,EAAM+8C,UAAyB/8C,EAAM+8C,SAEvD+K,EAAmB,CACrBtjC,kBACAu4B,WACAC,WACAsC,cAAet/C,EAAMs/C,cACrBxJ,WAAY91C,EAAM81C,WAClBhG,QACAzQ,UAAWr/B,EAAMhC,GACjBwhD,oBAAqBx/C,EAAMw/C,oBAC3BC,iBACAxC,aAGJ,OACIhqB,EAAAA,QAAAA,cAAA,OAAK6B,UAAW8yB,EAAWzqD,KAAK,KAAM8G,MAAO0jD,EAAQ,kBAAiB3nD,EAAMhC,IAEpEgC,EAAM+lD,OACN9yB,EAAAA,QAAAA,cAAC6yB,GAAU,CAACC,MAAO/lD,EAAM+lD,QAG7B9yB,EAAAA,QAAAA,cAAA,OAAK6B,UAAU,mCAEP4a,GACAzc,EAAAA,QAAAA,cAACmzB,GAAO,CAAC5hC,gBAAiBA,IAG9ByO,EAAAA,QAAAA,cAAA,OAAK6B,UAAU,kCAEP90B,EAAMs/C,eACNrsB,EAAAA,QAAAA,cAACsxB,GAAS,CACN//B,gBAAiBA,EACjB0qB,UAAWA,EACXY,MAAO9vC,EAAM8vC,MACbzQ,UAAWr/B,EAAMhC,GACjBwhD,oBAAqBx/C,EAAMw/C,sBAK/Bx/C,EAAMqnD,oBACNp0B,EAAAA,QAAAA,cAAC6uB,GAAc,CACXt9B,gBAAiBA,EACjBsa,sBAAuB9+B,EAAM8+B,sBAC7BijB,0BAA2B/hD,EAAM+hD,0BACjCH,eAAgB5hD,EAAM4hD,iBAI9B3uB,EAAAA,QAAAA,cAAA,OAAK6B,UAAU,oBAEPoa,GACAjc,EAAAA,QAAAA,cAAA,OACI6B,UAAU,cACV,kBAAgB,WAChB,kBAAiB90B,EAAMhC,GACvBiG,MAAO,CACH2F,MAAO8oB,GACP1e,OAAoC,iBAArBhU,EAAM81C,WAA0B91C,EAAM81C,gBAAa55C,KAM1E6xC,EAAS9wC,KAAI,CAAC6M,EAAM/N,IACTk3B,EAAAA,QAAAA,cAACosB,GAAKtqB,GAAA,CACTvuB,IAAKzK,EACL+N,KAAMA,EACNy1C,UAAWxR,EAAS9xC,OAASF,EAAI,GAC7B+rD,MAKhB70B,EAAAA,QAAAA,cAAA,OAAK6B,UAAU,qBACX7B,EAAAA,QAAAA,cAAC+kB,GAAS,CACNxzB,gBAAiBA,EACjBE,MAAO1kB,EAAM0kB,MACboxB,WAAY91C,EAAM81C,WAClBmC,uBAAwBj4C,EAAMi4C,uBAC9BC,aAAcl4C,EAAMk4C,aACpBC,gBAAiBn4C,EAAMm4C,gBACvBC,eAAgBp4C,EAAMo4C,eACtBzzB,kBAAmB3kB,EAAM2kB,kBACzByxB,gBAAiBp2C,EAAMo2C,gBACvBC,YAAar2C,EAAMq2C,YACnBC,6BAA8Bt2C,EAAMs2C,6BACpC+B,aAAcr4C,EAAMq4C,aACpBb,cAAex3C,EAAMw3C,cACrBhnB,WAAYxwB,EAAMwwB,WAClBzB,SAAU/uB,EAAM+uB,WAGpBkE,EAAAA,QAAAA,cAAC6pB,GAAK,CACFE,SAAUA,EACVD,SAAUA,EACVv4B,gBAAiBA,EACjBy4B,UAAWA,EACXC,UAAWl9C,EAAMk9C,UACjB1sB,WAAYxwB,EAAMwwB,WAClBzB,SAAU/uB,EAAM+uB,SAChB2B,aAAc1wB,EAAM+nD,kBACpB5K,iBAAkBn9C,EAAMm9C,mBAIxBn9C,EAAMonD,gBACNn0B,EAAAA,QAAAA,cAAA,OAAK6B,UAAU,yBACX7B,EAAAA,QAAAA,cAACsvB,GAAU,CACP/9B,gBAAiBA,EACjBE,MAAO1kB,EAAM0kB,MACbC,kBAAmB3kB,EAAM2kB,kBACzBm/B,UAAW9jD,EAAMgoD,oBACjBj5B,SAAU/uB,EAAM+uB,SAChByoB,cAAex3C,EAAMw3C,kBAOjCxJ,EAAU/wC,KAAI,CAAC6M,EAAM/N,IACVk3B,EAAAA,QAAAA,cAACosB,GAAKtqB,GAAA,CACTvuB,IAAKzK,EACL+N,KAAMA,EACNy1C,UAAWxjD,GACP+rD,MAMZ5Y,GACAjc,EAAAA,QAAAA,cAAA,OACI6B,UAAU,cACV,kBAAgB,YAChB,kBAAiB90B,EAAMhC,GACvBiG,MAAO,CACH2F,MAAO8oB,GACP1e,OAAoC,iBAArBhU,EAAM81C,WAA0B91C,EAAM81C,gBAAa55C,QAStG,CAEAgrD,GAAQh0B,UAAY,CAChB5nB,OAAQ6nB,EAAgBhoB,OAAOzK,WAC/BgkB,MAAO1iB,IAAAA,KACP+8B,YAAa/8B,IAAAA,KACb2iB,kBAAmB3iB,IAAAA,KAEnB0lD,aAAc1lD,IAAAA,KACdylD,aAAczlD,IAAAA,KACdwlD,sBAAuBxlD,IAAAA,KACvBwxC,iBAAkBxxC,IAAAA,OAElBulD,8BAA+BvlD,IAAAA,OAC/Bo9B,SAAUp9B,IAAAA,WAAqBqkD,IAC/BroD,GAAIgE,IAAAA,OACJw9C,oBAAqBx9C,IAAAA,OAErB8tC,MAAO9tC,IAAAA,MAAgB,CAAC,MAAO,QAAS,WACxC+jD,MAAO/jD,IAAAA,OACPw9B,WAAYx9B,IAAAA,KACZ8zC,WAAY9zC,IAAAA,OACZgS,OAAQhS,IAAAA,OACR4H,MAAO5H,IAAAA,OAEP+6C,SAAU/6C,IAAAA,KACVolD,eAAgBplD,IAAAA,KAChBqlD,mBAAoBrlD,IAAAA,KACpBs9C,cAAet9C,IAAAA,KACfk2C,aAAcl2C,IAAAA,KACdg7C,SAAUh7C,IAAAA,KACVy9C,eAAgBz9C,IAAAA,KAChBi7C,UAAWj7C,IAAAA,KACXk7C,UAAWl7C,IAAAA,MAAgB,CAAC,SAC5Bm7C,iBAAkBn7C,IAAAA,KAClB+lD,kBAAmB/lD,IAAAA,KACnBwuB,WAAYxuB,IAAAA,MAAgB,CAAC,MAAO,QACpC+sB,SAAU/sB,IAAAA,OACVgmD,oBAAqBhmD,IAAAA,KAErBi2C,uBAAwBj2C,IAAAA,KACxB4/C,eAAgB5/C,IAAAA,KAEhBm2B,WAAYn2B,IAAAA,OACZm9B,mBAAoBn9B,IAAAA,KACpBg9B,4BAA6Bh9B,IAAAA,KAC7Bi9B,mBAAoBj9B,IAAAA,KACpBk9B,uBAAwBl9B,IAAAA,KACxB4kB,iBAAkB5kB,IAAAA,OAElBo2C,eAAgBjlB,EAAgBvmB,eAEhCkyB,sBAAuB3L,EAAgBrnB,sBACvCi2C,0BAA2B//C,IAAAA,KAC3B68B,wBAAyB78B,IAAAA,OAEzBk/B,YAAa/N,EAAgBjmB,YAC7BkpC,gBAAiBjjB,EAAgBzlB,gBACjC2oC,YAAar0C,IAAAA,KACbs0C,6BAA8Bt0C,IAAAA,KAC9Bw1C,cAAerkB,EAAgB7kB,cAC/B+pC,aAAcr2C,IAAAA,MAGX,MAAMimD,GAAmBrsD,EAAAA,YACnBssD,GAA6BnmB,GCjX3B,MAAMomB,WAAkC55C,EAEnDC,WAAAA,EAAY,GAAExQ,IACV4mB,QAEAvmB,KAAK+pD,IAAMpqD,EAEXK,KAAKgqD,aAAe,GACpBhqD,KAAKiqD,sBAAwB,IAAIzoB,IACjCxhC,KAAKkqD,sBAAwB,IAAI1oB,IACjCxhC,KAAKmjC,gBAAkB,IAAI3B,IAC3BxhC,KAAKmqD,mCAAqC,IAAI3oB,IAC9CxhC,KAAKooD,kBAAoB,IAAI33C,IAC7BzQ,KAAKoqD,YAAc,GAEnBpqD,KAAK8jC,WAAa,IAAItC,IACtBxhC,KAAK+jC,eAAiB,IAAIvC,IAE1BxhC,KAAK0iC,YAAa,EAElB1iC,KAAKsQ,GAAG,wBAAwB,KAC5B,IAAK,IAAI6V,KAAmBnmB,KAAKooD,kBAC7BjiC,EAAgB6jC,aAAehqD,KAAKgqD,YACxC,GAER,CAOAplB,SAAAA,CAAU33B,GAEN,GAAIjN,KAAKoqD,YAAYxsD,SAAWqP,EAAOrP,OAAQ,CAC3C,IAAIonC,GAAe,EACnB,IAAK,IAAItnC,EAAI,EAAGA,EAAIuP,EAAOrP,OAAQF,IAC/B,GAAIuP,EAAOvP,KAAOsC,KAAKoqD,YAAY1sD,GAAI,CACnCsnC,GAAe,EACf,KACJ,CAGJ,IAAKA,EACD,MAER,CAEAhlC,KAAKoqD,YAAcn9C,EAEnB,MAAMo9C,EAAe,IAAI55C,IACnB65C,EAAmB,IAAI75C,IAAIxD,GAEjC,IAAK,IAAIob,KAAgBpb,EAAQ,CAC7B,IAAIs9C,EAAaliC,EAAavc,OAAS,EAEnC9L,KAAKiqD,sBAAsB7kB,IAAI/c,KAC/BkiC,EAAavqD,KAAKiqD,sBAAsBzhD,IAAI6f,IAGhDgiC,EAAa35C,IAAI65C,GAEjB,IAAIlhB,EAAYrpC,KAAKkqD,sBAAsB1hD,IAAI+hD,GAC1ClhB,IACDA,EAAY,IAAI54B,IAChBzQ,KAAKkqD,sBAAsB/sC,IAAIotC,EAAYlhB,IAG/CA,EAAU34B,IAAI2X,EAClB,CAEA,MAAMmiC,EAAqB,IAAIH,GAAc7zB,OAE7Cx2B,KAAKgqD,aAAe,GACpB,IAAIS,EAAoB,EAExB,IAAK,IAAIF,KAAcC,EAAoB,CACvC,MAAMv9C,EAAS,GAEf,IAAK,IAAIob,KAAgBroB,KAAKkqD,sBAAsB1hD,IAAI+hD,GAAa,CACjE,IAAKD,EAAiBllB,IAAI/c,GAAe,CACrCroB,KAAKkqD,sBAAsB1hD,IAAI+hD,GAAY35C,OAAOyX,GAClD,QACJ,CAEA,GAAIroB,KAAKmjC,gBAAgBiC,IAAI/c,GAAe,CACxCoiC,IACAx9C,EAAOxN,KAAKO,KAAKmjC,gBAAgB36B,IAAI6f,IACrC,QACJ,CAEA,MAAMtqB,GAAQP,EAAAA,EAAAA,SAAS6qB,EAAatqB,MAAO0sD,GACrCtoD,EAAOy9B,GAAcvX,EAAcoiC,GACnC1d,EAAiB,IAChB1kB,EACH1qB,wBAAyB8sD,EACzBC,uBAAwBH,EACxBxsD,QACAoE,QAGJnC,KAAKmjC,gBAAgBhmB,IAAIkL,EAAc0kB,GACvC/sC,KAAKmqD,mCAAmChtC,IAAIstC,EAAmBpiC,GAE/DoiC,IACAx9C,EAAOxN,KAAKstC,EAChB,CAEA/sC,KAAKgqD,aAAavqD,KAAKwN,EAC3B,CAEIjN,KAAK2qD,6BACL3qD,KAAK2qD,6BAA+B3qD,KAAK2qD,6BAA+B3qD,KAAK4qD,kBAAoBH,EAEjGzqD,KAAK2qD,6BAA+BF,EAExCzqD,KAAK4qD,kBAAoBH,EAEzBzqD,KAAK8Q,KAAK,uBAAwB9Q,KAAK6qD,YAC3C,CAOAC,uBAAAA,CAAwB3kC,GAChBnmB,KAAKooD,kBAAkBhjB,IAAIjf,KAI/BnmB,KAAKooD,kBAAkB13C,IAAIyV,GAC3BA,EAAgB4kC,2BAA6B/qD,KAC7CmmB,EAAgB6jC,aAAehqD,KAAKgqD,aAEpC7jC,EAAgB7V,GAAG,wBAAwB,EAAG0wB,YAAWh0B,YAAWgoC,iBAAgB,CAAC,KACjF,GAAIhU,IAAc7a,EAAgB6a,UAC9B,OAGJ,MAAOgqB,EAAOC,EAAgBV,GAAcvpB,EAAUriC,MAAM,KAC9C,iBAAVqsD,GAA4BC,IAAmBjrD,KAAK+pD,KAIxDt6B,YAAW,KACPzvB,KAAKkrD,WAAW,CAAEl+C,YAAWgoC,gBAAeuV,cAAa,GAC3D,IAGNpkC,EAAgB7V,GAAG,sBAAuBugC,IAClCA,IAAc7wC,KAAK0iC,aAIvB1iC,KAAK0iC,WAAamO,EAClB7wC,KAAK8Q,KAAK,qBAAsB9Q,KAAK0iC,YAAW,IAGpDvc,EAAgB7V,GAAG,uBAAwBs4B,IACvC,IAAK,IAAI4f,KAAwBxoD,KAAKooD,kBAC9BjiC,IAAoBqiC,GAIxBA,EAAqBtf,uBAAuBN,EAChD,IAGJziB,EAAgB7V,GAAG,WAAW,KAC1BtQ,KAAKooD,kBAAkBx3C,OAAOuV,EAAgB,IAEtD,CASA+kC,UAAAA,EAAW,UAAEl+C,EAAS,cAAEgoC,EAAa,WAAEuV,IACnC,MAAMY,EAAiBnrD,KAAKorD,WAEtBnmB,EAAiBjlC,KAAKmqD,mCAAmC3hD,IAAIwsC,EAAcr3C,yBAC3EovC,EAAiB/sC,KAAKmjC,gBAAgB36B,IAAIy8B,GAEhDjlC,KAAKgqD,aAAajd,EAAe2d,wBAAwB5lD,OACrD9E,KAAKgqD,aAAajd,EAAe2d,wBAAwB//B,QAAQoiB,GAAiB,GAEtF/sC,KAAKgqD,aAAajd,EAAe2d,wBAA0B,IAAI1qD,KAAKgqD,aAAajd,EAAe2d,yBAG5F3d,EAAe2d,uBADA,QAAfH,EACwCvqD,KAAKqrD,oBACvB,WAAfd,EACiCvqD,KAAKsrD,uBAELvsD,SAASwrD,GAGrDxd,EAAe//B,UAAYA,SAGpB+/B,EAAethC,KAEtBzL,KAAKgqD,aAAajd,EAAe2d,wBAA0B,IAAI1qD,KAAKgqD,aAAajd,EAAe2d,wBAAyB3d,GACzH/sC,KAAKgqD,aAAe,IAAIhqD,KAAKgqD,cAE7B,IAAK,IAAIO,EAAa,EAAGA,EAAavqD,KAAKgqD,aAAapsD,OAAQ2sD,IAAc,CAC1E,MAAMgB,EAAwBvrD,KAAKgqD,aAAaO,GAAY3rD,KAAI,EAAGjB,6BAC/DqC,KAAKmqD,mCAAmC3hD,IAAI7K,KAChDqC,KAAKkqD,sBAAsB/sC,IAAIotC,EAAY,IAAI95C,IAAI86C,IAEnD,IAAK,IAAIljC,KAAgBkjC,EACrBvrD,KAAKiqD,sBAAsB9sC,IAAIkL,EAAckiC,EAErD,CAEAvqD,KAAK8Q,KAAK,uBAAwB9Q,KAAK6qD,aACvC7qD,KAAK8Q,KAAK,sBAAuB9Q,KAAKorD,WAAYD,EACtD,CAQAE,iBAAAA,GAEI,IAAIG,EAAkB,KAEtB,IAAK,IAAI9tD,EAAI,EAAGA,EAAIsC,KAAKgqD,aAAapsD,QACE,IAAhCoC,KAAKgqD,aAAatsD,GAAGE,OADiBF,IAEtC8tD,EAAkB9tD,EAM1B,GAAwB,OAApB8tD,EACA,OAAOA,EAIXxrD,KAAKgqD,aAAe,CAAC,MAAOhqD,KAAKgqD,cACjC,IAAK,IAAIO,EAAa,EAAGA,EAAavqD,KAAKgqD,aAAapsD,OAAQ2sD,IAC5D,GAAKvqD,KAAKgqD,aAAaO,GAAY3sD,OAAnC,CAIAoC,KAAKgqD,aAAaO,GAAc,IAAIvqD,KAAKgqD,aAAaO,IAEtD,IAAK,IAAIxd,KAAkB/sC,KAAKgqD,aAAaO,GACzCxd,EAAe2d,uBAAyBH,CAL5C,CASJ,OAAO,CACX,CAQAe,oBAAAA,GAEI,IAAIG,EAAqB,KAEzB,IAAK,IAAI/tD,EAAIsC,KAAKgqD,aAAapsD,OAAS,EAAGF,GAAK,GACR,IAAhCsC,KAAKgqD,aAAatsD,GAAGE,OADsBF,IAE3C+tD,EAAqB/tD,EAM7B,OAA2B,OAAvB+tD,EACOA,GAIXzrD,KAAKgqD,aAAe,IAAIhqD,KAAKgqD,aAAc,IAEpChqD,KAAKgqD,aAAapsD,OAAS,EACtC,CAEA,eAAIitD,GACA,OAAO7qD,KAAKgqD,aAAatiC,QAAQza,GAAWA,EAAOrP,QACvD,CAEA,UAAIqP,GACA,MAAO,IAAIjN,KAAKooD,mBAAmBxpD,KAAKunB,GAAoBA,EAAgBlZ,SAAQ8T,MACxF,CAEA,cAAIqqC,GACA,OAAOprD,KAAK6qD,YAAYjtD,MAC5B,CAEA,aAAIizC,GACA,OAAO7wC,KAAK0iC,UAChB,CAEAxkB,OAAAA,GACIle,KAAKqQ,iBAEL,IAAK,IAAIm0B,KAAYxkC,KAAK+jC,eAAezL,SACrCkM,EAASC,cAGbzkC,KAAK+jC,eAAe5lB,OACxB,CAEA,iCAAI+qC,GACA,MAAO,CACHjoB,gBAAiBjhC,KAAK8jC,WACtB5C,oBAAqBlhC,KAAK+jC,eAElC,CAEA2nB,gCAAAA,GACI,MAAMpmD,EAAQtF,KAAK2qD,6BAInB,OAFA3qD,KAAK2qD,+BAEErlD,CACX,E,uOCrUJ,SAAesvB,EAAAA,QAAAA,KAAW+2B,IAG1B,SAASA,GAAahqD,GAGlB,MAAMspD,GAAiBhC,EAAAA,EAAAA,UAAQ,IAAMxvC,KAAKmvC,SAAS7oD,SAAS,IAAIrB,MAAM,IAAI,IAEpEktD,GAA4B3C,EAAAA,EAAAA,UAAQ,IAAM,IAAIa,GAA0B,CAC1EnqD,GAAIsrD,KACDtpD,KACH,IAEEkpD,EvBiHH,SAAwBe,GAC3B,OAAO9V,GAAS8V,EAA2B,uBAAwBA,EAA0Bf,YACjG,CuBnHwBgB,CAAeD,GAE7B7qB,GAAWkoB,EAAAA,EAAAA,UAAQ,IAAM,IAAIjB,GAAS,CACxCC,WAAYtmD,EAAMsmD,WAClBC,aAAcvmD,EAAMumD,aACpBC,eAAe,KACf,IAEE2C,GAA0B7B,EAAAA,EAAAA,UAAQ,IAAM2C,EAA0Bd,wBAAwBxjC,KAAKskC,IAA4B,CAACA,KAElIvV,EAAAA,EAAAA,YAAU,IAKC,KACHuV,EAA0B1tC,SAAS,GAExC,CAAC0tC,KAEJvV,EAAAA,EAAAA,YAAU,KACN10C,EAAMwnD,uBAAyBxnD,EAAMwnD,sBAAsByC,EAA0B,GACtF,CAACA,EAA2BjqD,EAAMwnD,yBAErC9S,EAAAA,EAAAA,YAAU,KACNuV,EAA0BhnB,UAAUjjC,EAAMsL,OAAO,GAClD,CAAC2+C,EAA2BjqD,EAAMsL,UAErCopC,EAAAA,EAAAA,YAAU,IACD10C,EAAMmqD,qBAIXF,EAA0Bt7C,GAAG,uBAAwB3O,EAAMmqD,qBACpD,KACHF,EAA0Bj7C,IAAI,uBAAwBhP,EAAMmqD,oBAAoB,GALzE,QAOZ,CAACF,EAA2BjqD,EAAMmqD,sBAErC,MAAMjb,EAAYqG,GAAa0U,GAE/B,OACIh3B,EAAAA,QAAAA,cAAA,OAAK6B,UAAU,gBAEPoa,GAAalvC,EAAMoqD,iBACfn3B,EAAAA,QAAAA,cAAA,OAAK6B,UAAY,uBAAsB90B,EAAM8vC,QAAS,kBAAkB,gBAAewZ,SAAsB,eAMjHJ,EAAYjsD,KAAI,CAACqO,EAAQvP,IACrBk3B,EAAAA,QAAAA,cAACi0B,GAAOnyB,GAAA,CACJvuB,IAAKzK,GACDiE,EAAK,CACTo/B,SAAUA,EACVmoB,8BAA+B0C,EAA0B1C,8BACzDj8C,OAAQA,EACRtN,GAAK,gBAAesrD,KAAkBvtD,IACtCyjD,oBAAqBx/C,EAAMoqD,gBAAkB,GAAK,EAClD5C,sBAAuB2B,OAM/Bja,GACAjc,EAAAA,QAAAA,cAAA,OAAK6B,UAAY,uBAAsB90B,EAAM8vC,QAAS,kBAAkB,gBAAewZ,YAAyB,eAMhI,CAEAU,GAAah1B,aAAe,CACxB8a,MAAO,SAGXka,GAAa92B,UAAYxsB,OAAO0yB,OAAO,CAAC,EAAG8tB,GAAQh0B,UAAW,CAC1DozB,WAAYtkD,IAAAA,KACZukD,aAAcvkD,IAAAA,KACdooD,gBAAiBpoD,IAAAA,KACjBmoD,oBAAqBnoD,IAAAA,M","sources":["webpack://@windborne/grapher/./src/helpers/colors.js","webpack://@windborne/grapher/./src/grapher.scss","webpack://@windborne/grapher/./node_modules/css-loader/dist/runtime/api.js","webpack://@windborne/grapher/./node_modules/css-loader/dist/runtime/sourceMaps.js","webpack://@windborne/grapher/./node_modules/prop-types/factoryWithThrowingShims.js","webpack://@windborne/grapher/./node_modules/prop-types/index.js","webpack://@windborne/grapher/./node_modules/prop-types/lib/ReactPropTypesSecret.js","webpack://@windborne/grapher/./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js","webpack://@windborne/grapher/./node_modules/style-loader/dist/runtime/insertBySelector.js","webpack://@windborne/grapher/./node_modules/style-loader/dist/runtime/insertStyleElement.js","webpack://@windborne/grapher/./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js","webpack://@windborne/grapher/./node_modules/style-loader/dist/runtime/styleDomAPI.js","webpack://@windborne/grapher/./node_modules/style-loader/dist/runtime/styleTagTransform.js","webpack://@windborne/grapher/./src/renderer/background.frag","webpack://@windborne/grapher/./src/renderer/background.vert","webpack://@windborne/grapher/./src/renderer/circle.frag","webpack://@windborne/grapher/./src/renderer/circle.vert","webpack://@windborne/grapher/./src/renderer/line.frag","webpack://@windborne/grapher/./src/renderer/line.vert","webpack://@windborne/grapher/./src/renderer/shadow.frag","webpack://@windborne/grapher/./src/renderer/shadow.vert","webpack://@windborne/grapher/webpack/bootstrap","webpack://@windborne/grapher/webpack/runtime/compat get default export","webpack://@windborne/grapher/webpack/runtime/define property getters","webpack://@windborne/grapher/webpack/runtime/ensure chunk","webpack://@windborne/grapher/webpack/runtime/get javascript chunk filename","webpack://@windborne/grapher/webpack/runtime/hasOwnProperty shorthand","webpack://@windborne/grapher/webpack/runtime/make namespace object","webpack://@windborne/grapher/webpack/runtime/publicPath","webpack://@windborne/grapher/webpack/runtime/import chunk loading","webpack://@windborne/grapher/webpack/runtime/nonce","webpack://@windborne/grapher/external module \"react\"","webpack://@windborne/grapher/./src/state/data_types.js","webpack://@windborne/grapher/./src/helpers/custom_prop_types.js","webpack://@windborne/grapher/./src/eventable.js","webpack://@windborne/grapher/./src/state/infer_type.js","webpack://@windborne/grapher/./src/helpers/color_to_vector.js","webpack://@windborne/grapher/./src/renderer/create_gl_program.js","webpack://@windborne/grapher/./src/renderer/background_program.js","webpack://@windborne/grapher/./src/renderer/size_canvas.js","webpack://@windborne/grapher/./src/renderer/paths_from.js","webpack://@windborne/grapher/./src/renderer/draw_zero_line.js","webpack://@windborne/grapher/./src/renderer/draw_area.js","webpack://@windborne/grapher/./src/renderer/draw_bars.js","webpack://@windborne/grapher/./src/renderer/draw_line.js","webpack://@windborne/grapher/./src/state/rust_api.js","webpack://@windborne/grapher/./src/renderer/extract_vertices.js","webpack://@windborne/grapher/./src/renderer/line_program.js","webpack://@windborne/grapher/./src/renderer/shadow_program.js","webpack://@windborne/grapher/./src/renderer/graph_body_renderer.js","webpack://@windborne/grapher/./src/renderer/draw_background.js","webpack://@windborne/grapher/./src/helpers/format.js","webpack://@windborne/grapher/./src/helpers/axis_sizes.js","webpack://@windborne/grapher/./src/components/tooltip.jsx","webpack://@windborne/grapher/./src/components/context_menu.jsx","webpack://@windborne/grapher/./src/state/space_conversions/simple_series_to_data_space.js","webpack://@windborne/grapher/./src/state/calculate_data_bounds.js","webpack://@windborne/grapher/./src/state/merge_bounds.js","webpack://@windborne/grapher/./src/state/expand_bounds.js","webpack://@windborne/grapher/./src/helpers/binary_search.js","webpack://@windborne/grapher/./src/state/space_conversions/data_space_to_selected_space.js","webpack://@windborne/grapher/./src/renderer/scale_bounds.js","webpack://@windborne/grapher/./src/state/space_conversions/selected_space_to_render_space.js","webpack://@windborne/grapher/./src/helpers/flatten_simple_data.js","webpack://@windborne/grapher/./src/state/calculate_tooltip_state.js","webpack://@windborne/grapher/./src/state/bound_calculators.js","webpack://@windborne/grapher/./src/state/space_conversions/condense_data_space.js","webpack://@windborne/grapher/./src/helpers/name_for_series.js","webpack://@windborne/grapher/./src/state/space_conversions/selected_space_to_background_space.js","webpack://@windborne/grapher/./src/state/state_controller.js","webpack://@windborne/grapher/./src/state/get_default_bounds_calculator.js","webpack://@windborne/grapher/./src/helpers/generator_params_equal.js","webpack://@windborne/grapher/./src/state/calculate_annotations_state.js","webpack://@windborne/grapher/./src/state/selection_from_global_bounds.js","webpack://@windborne/grapher/./src/state/find_matching_axis.js","webpack://@windborne/grapher/./src/state/average_loop_times.js","webpack://@windborne/grapher/./src/state/bound_calculator_from_selection.js","webpack://@windborne/grapher/./src/state/hooks.js","webpack://@windborne/grapher/./src/components/annotations.jsx","webpack://@windborne/grapher/./src/components/draggable_points.jsx","webpack://@windborne/grapher/./src/components/vertical_lines.jsx","webpack://@windborne/grapher/./src/components/graph_body.jsx","webpack://@windborne/grapher/./src/grapher.scss?e17f","webpack://@windborne/grapher/./src/helpers/place_grid.js","webpack://@windborne/grapher/./src/components/x_axis.jsx","webpack://@windborne/grapher/./src/components/y_axis.jsx","webpack://@windborne/grapher/./src/components/range_selection_button_base.jsx","webpack://@windborne/grapher/./src/components/range_selection_button.jsx","webpack://@windborne/grapher/./src/components/percentile_button.jsx","webpack://@windborne/grapher/./src/components/options.jsx","webpack://@windborne/grapher/./src/components/range_selection.jsx","webpack://@windborne/grapher/./src/components/range_graph.jsx","webpack://@windborne/grapher/./src/components/series_key_item.jsx","webpack://@windborne/grapher/./src/components/series_key_axis_container.jsx","webpack://@windborne/grapher/./src/components/series_key.jsx","webpack://@windborne/grapher/./src/components/graph_title.jsx","webpack://@windborne/grapher/./src/components/sidebar.jsx","webpack://@windborne/grapher/./src/state/sync_pool.js","webpack://@windborne/grapher/./src/grapher.jsx","webpack://@windborne/grapher/./src/state/multigraph_state_controller.js","webpack://@windborne/grapher/./src/multigrapher.jsx"],"sourcesContent":["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/**\n * Applies reduced opacity to a color\n * @param {string} color \n * @param {number} opacityFactor \n * @returns {string}\n */\nexport function applyReducedOpacity(color, opacityFactor) {\n if (!color) return color;\n\n if (color.startsWith(\"rgba(\")) {\n const matches = color.match(/rgba\\((\\d+),\\s*(\\d+),\\s*(\\d+),\\s*([\\d.]+)\\)/);\n if (matches) {\n const [, r, g, b, a] = matches;\n const newAlpha = parseFloat(a) * opacityFactor;\n return `rgba(${r}, ${g}, ${b}, ${newAlpha})`;\n }\n }\n\n if (color.startsWith(\"rgb(\")) {\n const matches = color.match(/rgb\\((\\d+),\\s*(\\d+),\\s*(\\d+)\\)/);\n if (matches) {\n const [, r, g, b] = matches;\n return `rgba(${r}, ${g}, ${b}, ${opacityFactor})`;\n }\n }\n\n if (color.startsWith(\"#\")) {\n let hex = color.slice(1);\n if (hex.length === 3) {\n hex = hex\n .split(\"\")\n .map((char) => char + char)\n .join(\"\");\n }\n const r = parseInt(hex.slice(0, 2), 16);\n const g = parseInt(hex.slice(2, 4), 16);\n const b = parseInt(hex.slice(4, 6), 16);\n return `rgba(${r}, ${g}, ${b}, ${opacityFactor})`;\n }\n\n return color;\n}\n\n/**\n * Applies reduced opacity to a gradient\n * @param {Array<[number, string]>} gradient \n * @param {number} opacityFactor \n * @returns {Array<[number, string]>}\n */\nexport function applyReducedOpacityToGradient(gradient, opacityFactor) {\n if (!gradient || !Array.isArray(gradient)) {\n return gradient;\n }\n\n return gradient.map((stop) => {\n if (Array.isArray(stop) && stop.length === 2) {\n const [position, color] = stop;\n const translucentColor = applyReducedOpacity(color, opacityFactor);\n return [position, translucentColor];\n } else if (typeof stop === \"string\") {\n return applyReducedOpacity(stop, opacityFactor);\n }\n return stop;\n });\n}\n\n/**\n * Creates a default gradient from a color at half opacity\n * @param {string} color \n * @returns {Array<[number, string]>}\n */\nexport function createDefaultGradient(color) {\n if (!color) return [[0, 'transparent'], [1, 'transparent']];\n \n const halfOpacityColor = applyReducedOpacity(color, 0.5);\n return [[0, halfOpacityColor], [1, halfOpacityColor]];\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, #131313, #1e1e1e);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;margin-top:10px}.grapher-night .graph-body{width:100%;height:400px;position:relative}.grapher-night .graph-body canvas{width:100%;height:100%}.grapher-night .graph-body .grapher-tooltip,.grapher-night .graph-body .grapher-draggable-points,.grapher-night .graph-body .grapher-vertical-lines{position:absolute;top:0;left:0;right:0;z-index:20}.grapher-night .graph-body .grapher-tooltip>svg,.grapher-night .graph-body .grapher-draggable-points>svg,.grapher-night .graph-body .grapher-vertical-lines>svg{position:absolute;overflow:visible;left:0}.grapher-night .graph-body .grapher-vertical-lines{pointer-events:none;user-select:none}.grapher-night .graph-body .grapher-tooltip .tooltip-item path{fill:rgba(0,0,0,.6)}.grapher-night .graph-body .grapher-tooltip .tooltip-item text{fill:#f0f0f0;dominant-baseline:hanging;text-anchor:start}.grapher-night .graph-body .grapher-tooltip .tooltip-item.tooltip-item-fixed path{fill:#000}.grapher-night .graph-body .grapher-tooltip .line{position:absolute;height:400px;border-left:1px solid #ccc}.grapher-night .graph-body .grapher-tooltip .custom-tooltip-container{position:absolute}.grapher-night .graph-body .grapher-context-menu{position:absolute;top:0;left:0}.grapher-night .graph-body .grapher-context-menu .menu-item .menu-text{user-select:all;position:absolute;top:0;background:rgba(0,0,0,.6);border:1px solid rgba(255,255,255,.3);color:#f0f0f0;padding:2px 4px;max-width:max-content;width:200px}.grapher-night .graph-body .grapher-draggable-points circle{cursor:pointer}.grapher-night .graph-body .grapher-vertical-lines line{stroke:#ccc}.grapher-night .graph-body .grapher-vertical-lines polygon{fill:#ccc}.grapher-night .graph-body .grapher-annotations{position:absolute;top:0;pointer-events:none;user-select:none;z-index:10}.grapher-night .graph-body .grapher-annotations .grapher-annotation{position:absolute}.grapher-night .graph-body .grapher-annotations .grapher-annotation .annotation-marker{display:inline-block;background:rgba(255,255,255,.3)}.grapher-night .graph-body .grapher-annotations .grapher-annotation.grapher-annotation-range .annotation-range-marker{display:inline-block;background-color:rgba(128,128,128,.2);background-image:repeating-linear-gradient(53deg, #626266, #626266 1px, rgba(255, 255, 255, 0.1) 1px, rgba(255, 255, 255, 0.1) 4px);background-size:40px 40px;border-right:1px solid #fff;border-left:1px solid #fff}.grapher-night .graph-body .grapher-annotations .grapher-annotation .annotation-text{position:absolute;background:rgba(0,0,0,.6);border:1px solid rgba(255,255,255,.3);color:#f0f0f0;padding:2px 4px;white-space:nowrap;font-size:10px;z-index:10}.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.x-axis-dual{height:30px}.grapher-night .axis.y-axis{height:400px}.grapher-night .axis.y-axis .axis-item text{text-anchor:end}.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:rgba(192,192,192,.3);stroke-width:1px}.grapher-night .axis .axis-item path{stroke:rgba(192,192,192,.3);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:1px}.grapher-night .axis .axis-item.axis-item-big-labels text{font-size:16px}.grapher-night .range-selection-graph{width:100%;background-color:rgba(0,0,0,.3);height:calc(50px + 14px)}.grapher-night .range-selection-graph .graph-body-secondary{height:50px}.grapher-night .range-selection-graph .graph-body-secondary canvas{height:100%}.grapher-night .range-selection-graph .graph-body-secondary svg{position:absolute;left:0;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 .target-selection-outline{stroke:#aaa;cursor:ew-resize;fill:rgba(0,0,0,0)}.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{fill:#808083;cursor:ew-resize}.grapher-night .range-selection-graph .graph-body-secondary svg .selection-bar-rifles{stroke:#fff;stroke-width:1px;cursor:ew-resize}.grapher-night .range-selection-graph .graph-body-secondary svg .selection-bar-handle-hit{cursor:ew-resize}.grapher-night .range-selection-graph .graph-body-secondary svg .selection-bar-handle{stroke:#aaa;fill:#666;stroke-width:1px;cursor:ew-resize;transition:stroke-width .15s ease,fill .15s ease}.grapher-night .range-selection-graph .graph-body-secondary svg .selection-handle .selection-handle-hit{cursor:ew-resize}.grapher-night .range-selection-graph .graph-body-secondary svg .selection-handle .selection-handle-line{stroke:#aaa;stroke-width:1;transition:stroke-width .15s ease}.grapher-night .range-selection-graph .graph-body-secondary svg .selection-handle:hover .selection-handle-line{stroke-width:3}.grapher-night .range-selection-graph .graph-body-secondary svg .selection-handle.selection-handle-dragging .selection-handle-line{stroke-width:3}.grapher-night .range-selection-graph .graph-body-secondary svg .selection-handle:hover .selection-bar-handle{stroke-width:2px}.grapher-night .range-selection-graph .graph-body-secondary svg .selection-handle.selection-handle-dragging .selection-bar-handle{stroke-width:2px}.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:#9f9f9f;stroke-width:1px}.grapher-night .range-selection-graph .graph-body-secondary svg .axis-item.axis-item-highlighted path{stroke:#fff}.grapher-night .range-selection-graph .graph-body-secondary svg .axis-item.axis-item-highlighted text{fill:#fff}.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;margin-top:10px}.grapher-day .graph-body{width:100%;height:400px;position:relative}.grapher-day .graph-body canvas{width:100%;height:100%}.grapher-day .graph-body .grapher-tooltip,.grapher-day .graph-body .grapher-draggable-points,.grapher-day .graph-body .grapher-vertical-lines{position:absolute;top:0;left:0;right:0;z-index:20}.grapher-day .graph-body .grapher-tooltip>svg,.grapher-day .graph-body .grapher-draggable-points>svg,.grapher-day .graph-body .grapher-vertical-lines>svg{position:absolute;overflow:visible;left:0}.grapher-day .graph-body .grapher-vertical-lines{pointer-events:none;user-select:none}.grapher-day .graph-body .grapher-tooltip .tooltip-item path{fill:rgba(255,255,255,.6)}.grapher-day .graph-body .grapher-tooltip .tooltip-item text{fill:#0f0f0f;dominant-baseline:hanging;text-anchor:start}.grapher-day .graph-body .grapher-tooltip .tooltip-item.tooltip-item-fixed path{fill:#fff}.grapher-day .graph-body .grapher-tooltip .line{position:absolute;height:400px;border-left:1px solid #333}.grapher-day .graph-body .grapher-tooltip .custom-tooltip-container{position:absolute}.grapher-day .graph-body .grapher-context-menu{position:absolute;top:0;left:0}.grapher-day .graph-body .grapher-context-menu .menu-item .menu-text{user-select:all;position:absolute;top:0;background:rgba(255,255,255,.6);border:1px solid rgba(0,0,0,.3);color:#0f0f0f;padding:2px 4px;max-width:max-content;width:200px}.grapher-day .graph-body .grapher-draggable-points circle{cursor:pointer}.grapher-day .graph-body .grapher-vertical-lines line{stroke:#333}.grapher-day .graph-body .grapher-vertical-lines polygon{fill:#333}.grapher-day .graph-body .grapher-annotations{position:absolute;top:0;pointer-events:none;user-select:none;z-index:10}.grapher-day .graph-body .grapher-annotations .grapher-annotation{position:absolute}.grapher-day .graph-body .grapher-annotations .grapher-annotation .annotation-marker{display:inline-block;background:rgba(0,0,0,.3)}.grapher-day .graph-body .grapher-annotations .grapher-annotation.grapher-annotation-range .annotation-range-marker{display:inline-block;background-color:rgba(128,128,128,.2);background-image:repeating-linear-gradient(53deg, #626266, #626266 1px, rgba(255, 255, 255, 0.1) 1px, rgba(255, 255, 255, 0.1) 4px);background-size:40px 40px;border-right:1px solid #fff;border-left:1px solid #fff}.grapher-day .graph-body .grapher-annotations .grapher-annotation .annotation-text{position:absolute;background:rgba(255,255,255,.6);border:1px solid rgba(0,0,0,.3);color:#0f0f0f;padding:2px 4px;white-space:nowrap;font-size:10px;z-index:10}.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.x-axis-dual{height:30px}.grapher-day .axis.y-axis{height:400px}.grapher-day .axis.y-axis .axis-item text{text-anchor:end}.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: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:1px}.grapher-day .axis .axis-item.axis-item-big-labels text{font-size:16px}.grapher-day .range-selection-graph{width:100%;background-color:rgba(255,255,255,.3);height:calc(50px + 14px)}.grapher-day .range-selection-graph .graph-body-secondary{height:50px}.grapher-day .range-selection-graph .graph-body-secondary canvas{height:100%}.grapher-day .range-selection-graph .graph-body-secondary svg{position:absolute;left:0;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 .target-selection-outline{stroke:#333;cursor:ew-resize;fill:rgba(0,0,0,0)}.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{fill:#b0b0b7;cursor:ew-resize}.grapher-day .range-selection-graph .graph-body-secondary svg .selection-bar-rifles{stroke:#333;stroke-width:1px;cursor:ew-resize}.grapher-day .range-selection-graph .graph-body-secondary svg .selection-bar-handle-hit{cursor:ew-resize}.grapher-day .range-selection-graph .graph-body-secondary svg .selection-bar-handle{stroke:#333;fill:#b0b0b7;stroke-width:1px;cursor:ew-resize;transition:stroke-width .15s ease,fill .15s ease}.grapher-day .range-selection-graph .graph-body-secondary svg .selection-handle .selection-handle-hit{cursor:ew-resize}.grapher-day .range-selection-graph .graph-body-secondary svg .selection-handle .selection-handle-line{stroke:#333;stroke-width:1;transition:stroke-width .15s ease}.grapher-day .range-selection-graph .graph-body-secondary svg .selection-handle:hover .selection-handle-line{stroke-width:3}.grapher-day .range-selection-graph .graph-body-secondary svg .selection-handle.selection-handle-dragging .selection-handle-line{stroke-width:3}.grapher-day .range-selection-graph .graph-body-secondary svg .selection-handle:hover .selection-bar-handle{stroke-width:2px}.grapher-day .range-selection-graph .graph-body-secondary svg .selection-handle.selection-handle-dragging .selection-bar-handle{stroke-width:2px}.grapher-day .range-selection-graph .graph-body-secondary svg .axis-item text{fill:#555;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:#555;stroke-width:1px}.grapher-day .range-selection-graph .graph-body-secondary svg .axis-item.axis-item-highlighted path{stroke:#000}.grapher-day .range-selection-graph .graph-body-secondary svg .axis-item.axis-item-highlighted text{fill:#000}.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;margin-top:10px}.grapher-export .graph-body{width:100%;height:400px;position:relative}.grapher-export .graph-body canvas{width:100%;height:100%}.grapher-export .graph-body .grapher-tooltip,.grapher-export .graph-body .grapher-draggable-points,.grapher-export .graph-body .grapher-vertical-lines{position:absolute;top:0;left:0;right:0;z-index:20}.grapher-export .graph-body .grapher-tooltip>svg,.grapher-export .graph-body .grapher-draggable-points>svg,.grapher-export .graph-body .grapher-vertical-lines>svg{position:absolute;overflow:visible;left:0}.grapher-export .graph-body .grapher-vertical-lines{pointer-events:none;user-select:none}.grapher-export .graph-body .grapher-tooltip .tooltip-item path{fill:rgba(255,255,255,.6)}.grapher-export .graph-body .grapher-tooltip .tooltip-item text{fill:#0f0f0f;dominant-baseline:hanging;text-anchor:start}.grapher-export .graph-body .grapher-tooltip .tooltip-item.tooltip-item-fixed path{fill:#fff}.grapher-export .graph-body .grapher-tooltip .line{position:absolute;height:400px;border-left:1px solid #333}.grapher-export .graph-body .grapher-tooltip .custom-tooltip-container{position:absolute}.grapher-export .graph-body .grapher-context-menu{position:absolute;top:0;left:0}.grapher-export .graph-body .grapher-context-menu .menu-item .menu-text{user-select:all;position:absolute;top:0;background:rgba(255,255,255,.6);border:1px solid rgba(0,0,0,.3);color:#0f0f0f;padding:2px 4px;max-width:max-content;width:200px}.grapher-export .graph-body .grapher-draggable-points circle{cursor:pointer}.grapher-export .graph-body .grapher-vertical-lines line{stroke:#333}.grapher-export .graph-body .grapher-vertical-lines polygon{fill:#333}.grapher-export .graph-body .grapher-annotations{position:absolute;top:0;pointer-events:none;user-select:none;z-index:10}.grapher-export .graph-body .grapher-annotations .grapher-annotation{position:absolute}.grapher-export .graph-body .grapher-annotations .grapher-annotation .annotation-marker{display:inline-block;background:rgba(0,0,0,.3)}.grapher-export .graph-body .grapher-annotations .grapher-annotation.grapher-annotation-range .annotation-range-marker{display:inline-block;background-color:rgba(128,128,128,.2);background-image:repeating-linear-gradient(53deg, #626266, #626266 1px, rgba(255, 255, 255, 0.1) 1px, rgba(255, 255, 255, 0.1) 4px);background-size:40px 40px;border-right:1px solid #fff;border-left:1px solid #fff}.grapher-export .graph-body .grapher-annotations .grapher-annotation .annotation-text{position:absolute;background:rgba(255,255,255,.6);border:1px solid rgba(0,0,0,.3);color:#0f0f0f;padding:2px 4px;white-space:nowrap;font-size:10px;z-index:10}.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.x-axis-dual{height:30px}.grapher-export .axis.y-axis{height:400px}.grapher-export .axis.y-axis .axis-item text{text-anchor:end}.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-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:1px}.grapher-export .axis .axis-item.axis-item-big-labels text{font-size:16px}.grapher-export .range-selection-graph{width:100%;background-color:rgba(255,255,255,.3);height:calc(50px + 14px)}.grapher-export .range-selection-graph .graph-body-secondary{height:50px}.grapher-export .range-selection-graph .graph-body-secondary canvas{height:100%}.grapher-export .range-selection-graph .graph-body-secondary svg{position:absolute;left:0;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 .target-selection-outline{stroke:#333;cursor:ew-resize;fill:rgba(0,0,0,0)}.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{fill:#b0b0b7;cursor:ew-resize}.grapher-export .range-selection-graph .graph-body-secondary svg .selection-bar-rifles{stroke:#333;stroke-width:1px;cursor:ew-resize}.grapher-export .range-selection-graph .graph-body-secondary svg .selection-bar-handle-hit{cursor:ew-resize}.grapher-export .range-selection-graph .graph-body-secondary svg .selection-bar-handle{stroke:#333;fill:#b0b0b7;stroke-width:1px;cursor:ew-resize;transition:stroke-width .15s ease,fill .15s ease}.grapher-export .range-selection-graph .graph-body-secondary svg .selection-handle .selection-handle-hit{cursor:ew-resize}.grapher-export .range-selection-graph .graph-body-secondary svg .selection-handle .selection-handle-line{stroke:#333;stroke-width:1;transition:stroke-width .15s ease}.grapher-export .range-selection-graph .graph-body-secondary svg .selection-handle:hover .selection-handle-line{stroke-width:3}.grapher-export .range-selection-graph .graph-body-secondary svg .selection-handle.selection-handle-dragging .selection-handle-line{stroke-width:3}.grapher-export .range-selection-graph .graph-body-secondary svg .selection-handle:hover .selection-bar-handle{stroke-width:2px}.grapher-export .range-selection-graph .graph-body-secondary svg .selection-handle.selection-handle-dragging .selection-bar-handle{stroke-width:2px}.grapher-export .range-selection-graph .graph-body-secondary svg .axis-item text{fill:#333;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:#333;stroke-width:1px}.grapher-export .range-selection-graph .graph-body-secondary svg .axis-item.axis-item-highlighted path{stroke:#000}.grapher-export .range-selection-graph .graph-body-secondary svg .axis-item.axis-item-highlighted text{fill:#000}.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: #131313,\\n $background-color-2: #1e1e1e,\\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: rgb(192, 192, 192, 0.3),\\n $axis-line-width: 1px,\\n $axis-tick-color: rgb(192, 192, 192, 0.3),\\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-background-color: rgba(0, 0, 0, 0.3),\\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-selection-bar-height: 14px,\\n $range-graph-handle-color: #AAA,\\n $range-graph-handle-fill-color: #666,\\n $range-graph-axis-text-color: #9f9f9f,\\n $range-graph-tick-highlighted-color: #FFF,\\n $range-graph-text-highlighted-color: #FFF,\\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 $x-axis-dual-height: 30px;\\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 margin-top: 10px;\\n }\\n\\n .graph-body {\\n width: 100%;\\n height: $primary-graph-body-height;\\n position: relative;\\n\\n canvas {\\n width: 100%;\\n height: 100%;\\n }\\n\\n .grapher-tooltip, .grapher-draggable-points, .grapher-vertical-lines {\\n position: absolute;\\n top: 0;\\n left: 0;\\n right: 0;\\n z-index: 20;\\n\\n > svg {\\n position: absolute;\\n overflow: visible;\\n left: 0;\\n }\\n }\\n\\n .grapher-vertical-lines {\\n pointer-events: none;\\n user-select: none;\\n }\\n\\n .grapher-tooltip {\\n .tooltip-item {\\n path {\\n fill: $tooltip-background-color;\\n }\\n\\n text {\\n fill: $tooltip-text-color;\\n dominant-baseline: hanging;\\n text-anchor: start;\\n }\\n\\n &.tooltip-item-fixed {\\n path {\\n fill: rgba($tooltip-background-color, 1);\\n }\\n }\\n }\\n\\n .line {\\n position: absolute;\\n height: 400px;\\n border-left: 1px solid $tooltip-line-color;\\n }\\n\\n .custom-tooltip-container {\\n position: absolute;\\n }\\n }\\n\\n .grapher-context-menu {\\n position: absolute;\\n top: 0;\\n left: 0;\\n .menu-item {\\n\\n .menu-text {\\n user-select: all;\\n position: absolute;\\n top: 0;\\n background: $tooltip-background-color;\\n border: 1px solid $annotation-background-color;\\n color: $tooltip-text-color;\\n padding: 2px 4px;\\n max-width: max-content;\\n width: 200px;\\n }\\n }\\n }\\n\\n .grapher-draggable-points {\\n circle {\\n cursor: pointer;\\n }\\n }\\n\\n .grapher-vertical-lines {\\n line {\\n stroke: $vertical-line-color;\\n }\\n\\n polygon {\\n fill: $vertical-line-color;\\n }\\n }\\n\\n .grapher-annotations {\\n position: absolute;\\n top: 0;\\n pointer-events: none;\\n user-select: none;\\n z-index: 10;\\n\\n .grapher-annotation {\\n position: absolute;\\n\\n .annotation-marker {\\n display: inline-block;\\n background: $annotation-background-color;\\n }\\n\\n &.grapher-annotation-range {\\n .annotation-range-marker {\\n display: inline-block;\\n background-color: rgba(128, 128, 128, 0.2);\\n background-image: repeating-linear-gradient(53deg, #626266, #626266 1px, rgba(255, 255, 255, 0.1) 1px, rgba(255, 255, 255, 0.1) 4px);\\n background-size: 40px 40px;\\n border-right: 1px solid white;\\n border-left: 1px solid white;\\n }\\n }\\n\\n .annotation-text {\\n position: absolute;\\n background: $tooltip-background-color;\\n border: 1px solid $annotation-background-color;\\n color: $tooltip-text-color;\\n padding: 2px 4px;\\n white-space: nowrap;\\n font-size: 10px;\\n z-index: 10;\\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 \\n &.x-axis-dual {\\n height: $x-axis-dual-height;\\n }\\n display: block;\\n }\\n\\n &.y-axis {\\n height: $primary-graph-body-height;\\n\\n .axis-item text {\\n text-anchor: end;\\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-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: 1px;\\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 background-color: $range-graph-selection-background-color;\\n height: calc(#{$secondary-graph-body-height} + #{$range-graph-selection-bar-height}); \\n\\n .graph-body-secondary {\\n height: $secondary-graph-body-height;\\n\\n canvas {\\n height: 100%;\\n }\\n\\n svg {\\n position: absolute;\\n left: 0;\\n width: 100%;\\n overflow: visible;\\n\\n .target-selection {\\n fill: $range-graph-selection-range-color;\\n cursor: ew-resize;\\n }\\n\\n\\n .target-selection-outline {\\n stroke: $range-graph-selection-outline-color;\\n cursor: ew-resize;\\n fill: transparent;\\n }\\n\\n .selection-bar-track {\\n fill: $range-graph-selection-bar-track-color;\\n }\\n\\n .selection-bar {\\n fill: $range-graph-selection-bar-color;\\n cursor: ew-resize;\\n }\\n\\n .selection-bar-rifles {\\n stroke: $range-graph-selection-bar-rifles-color;\\n stroke-width: 1px;\\n cursor: ew-resize;\\n }\\n\\n .selection-bar-handle-hit {\\n cursor: ew-resize;\\n }\\n\\n .selection-bar-handle {\\n stroke: $range-graph-handle-color;\\n fill: $range-graph-handle-fill-color;\\n stroke-width: 1px;\\n cursor: ew-resize;\\n transition: stroke-width 0.15s ease, fill 0.15s ease;\\n }\\n\\n .selection-handle {\\n .selection-handle-hit {\\n cursor: ew-resize;\\n }\\n\\n .selection-handle-line {\\n stroke: $range-graph-handle-color;\\n stroke-width: 1;\\n transition: stroke-width 0.15s ease;\\n }\\n\\n &:hover .selection-handle-line {\\n stroke-width: 3;\\n }\\n\\n &.selection-handle-dragging .selection-handle-line {\\n stroke-width: 3;\\n }\\n\\n &:hover .selection-bar-handle {\\n stroke-width: 2px;\\n }\\n\\n &.selection-handle-dragging .selection-bar-handle {\\n stroke-width: 2px;\\n }\\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: $range-graph-axis-text-color;\\n stroke-width: 1px;\\n }\\n \\n &.axis-item-highlighted {\\n path {\\n stroke: $range-graph-tick-highlighted-color;\\n }\\n \\n text {\\n fill: $range-graph-text-highlighted-color;\\n }\\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-background-color: rgba(255, 255, 255, 0.3),\\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-selection-bar-height: 14px,\\n $range-graph-handle-color: #333,\\n $range-graph-handle-fill-color: #B0B0B7,\\n $range-graph-axis-text-color: #555,\\n $range-graph-tick-highlighted-color: #000,\\n $range-graph-text-highlighted-color: #000,\\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-background-color: rgba(255, 255, 255, 0.3),\\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-selection-bar-height: 14px,\\n $range-graph-handle-color: #333,\\n $range-graph-handle-fill-color: #B0B0B7,\\n $range-graph-axis-text-color: #333,\\n $range-graph-tick-highlighted-color: #000,\\n $range-graph-text-highlighted-color: #000,\\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;\\nuniform float width; // Canvas width for normalization\\nuniform float cutoffX; // Cutoff X position as ratio (0.0-1.0)\\nuniform float cutoffOpacity; // Opacity for pre-cutoff area\\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 // Apply cutoff opacity if active\\n vec4 finalColor = vec4(color);\\n if (cutoffX >= 0.0) {\\n // Convert pixel position to normalized coordinate (0.0 to 1.0)\\n float normalizedX = gl_FragCoord.x / width;\\n \\n // Apply reduced opacity to pixels left of cutoff\\n if (normalizedX < cutoffX) {\\n finalColor.a *= cutoffOpacity;\\n }\\n }\\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 = finalColor;\\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 = \"precision highp float;\\n\\nvarying vec4 trapBounds; // [x1, lineY1, x2, lineY2]\\nvarying vec4 trapBottom; // [x1, bottomY1, x2, bottomY2] \\nvarying vec2 worldPos; // World position\\n\\nuniform int gradientCount;\\nuniform sampler2D gradientTexture; // Texture containing gradient data\\nuniform vec4 fallbackColor;\\n\\nvec4 interpolateGradient(float position) {\\n if (gradientCount <= 0) {\\n return fallbackColor;\\n }\\n if (gradientCount == 1) {\\n return texture2D(gradientTexture, vec2(0.5 / float(gradientCount * 2), 0.5));\\n }\\n\\n float textureWidth = float(gradientCount * 2);\\n float firstStop = texture2D(gradientTexture, vec2(0.5 / textureWidth, 0.5)).r;\\n float lastStop = texture2D(gradientTexture, vec2((float((gradientCount - 1) * 2) + 0.5) / textureWidth, 0.5)).r;\\n \\n // Scale position to fit the gradient range\\n if (lastStop > firstStop) {\\n position = firstStop + position * (lastStop - firstStop);\\n }\\n \\n position = clamp(position, 0.0, 1.0);\\n\\n // Handle boundary cases first\\n vec4 firstColor = texture2D(gradientTexture, vec2(1.5 / textureWidth, 0.5));\\n vec4 lastColor = texture2D(gradientTexture, vec2((float((gradientCount - 1) * 2 + 1) + 0.5) / textureWidth, 0.5));\\n \\n if (position <= firstStop) return firstColor;\\n if (position >= lastStop) return lastColor;\\n \\n // Calculate normalized position within the gradient range\\n float normalizedPos = (position - firstStop) / max(lastStop - firstStop, 0.001);\\n normalizedPos = clamp(normalizedPos, 0.0, 1.0);\\n \\n // Map to segment index using only float operations\\n float segmentFloat = normalizedPos * float(gradientCount - 1);\\n float segmentIndex = floor(segmentFloat);\\n \\n // Ensure segment index is within valid bounds using float operations\\n segmentIndex = min(segmentIndex, float(gradientCount - 2));\\n segmentIndex = max(segmentIndex, 0.0);\\n \\n // Calculate texture coordinates for the two colors to interpolate\\n float texCoordA = (segmentIndex * 2.0 + 1.0 + 0.5) / textureWidth;\\n float texCoordB = ((segmentIndex + 1.0) * 2.0 + 1.0 + 0.5) / textureWidth;\\n \\n // Sample the two colors\\n vec4 colorA = texture2D(gradientTexture, vec2(texCoordA, 0.5));\\n vec4 colorB = texture2D(gradientTexture, vec2(texCoordB, 0.5));\\n \\n // Get the actual gradient stops for proper interpolation\\n float stopA = texture2D(gradientTexture, vec2((segmentIndex * 2.0 + 0.5) / textureWidth, 0.5)).r;\\n float stopB = texture2D(gradientTexture, vec2(((segmentIndex + 1.0) * 2.0 + 0.5) / textureWidth, 0.5)).r;\\n \\n // Calculate interpolation factor based on actual stop positions\\n float stopRange = stopB - stopA;\\n float t = stopRange > 0.001 ? (position - stopA) / stopRange : 0.0;\\n t = clamp(t, 0.0, 1.0);\\n \\n return mix(colorA, colorB, t);\\n}\\n\\nvoid main() {\\n float pixelX = worldPos.x;\\n float pixelY = worldPos.y;\\n \\n // Extract trapezoid corners\\n float x1 = trapBounds.x;\\n float lineY1 = trapBounds.y;\\n float x2 = trapBounds.z;\\n float lineY2 = trapBounds.w;\\n \\n float bottomX1 = trapBottom.x;\\n float bottomY1 = trapBottom.y;\\n float bottomX2 = trapBottom.z;\\n float bottomY2 = trapBottom.w;\\n \\n // Interpolate line Y at current pixel X\\n float t = (pixelX - x1) / (x2 - x1 + 0.001); // Avoid division by zero\\n t = clamp(t, 0.0, 1.0);\\n \\n float lineYAtPixel = mix(lineY1, lineY2, t);\\n float bottomYAtPixel = mix(bottomY1, bottomY2, t);\\n \\n // Calculate gradient position: 0.0 at line, 1.0 at bottom\\n float totalDistance = abs(bottomYAtPixel - lineYAtPixel);\\n float gradientPos = totalDistance > 0.001 ? \\n abs(pixelY - lineYAtPixel) / totalDistance : 0.0;\\n \\n vec4 color = interpolateGradient(gradientPos);\\n gl_FragColor = color;\\n}\\n\"","module.exports = \"precision highp float;\\n\\nattribute vec2 position;\\nattribute vec4 trapezoidBounds; // [x1, y1_line, x2, y2_line] - the line segment \\nattribute vec4 trapezoidBottom; // [x1, y1_bottom, x2, y2_bottom] - the bottom segment\\n\\nuniform float width;\\nuniform float height;\\n\\nvarying vec4 trapBounds; // Pass trapezoid line bounds to fragment\\nvarying vec4 trapBottom; // Pass trapezoid bottom bounds to fragment \\nvarying vec2 worldPos; // Pass world position\\n\\nvoid main() {\\n trapBounds = trapezoidBounds;\\n trapBottom = trapezoidBottom;\\n worldPos = position;\\n \\n gl_Position = vec4(2.0*position.x/width - 1.0, 1.0 - 2.0*position.y/height, 0.0, 1.0);\\n}\\n\"","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".bundle.esm.js\";\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.p = \"/assets/\";","__webpack_require__.b = new URL(\"./\", import.meta.url);\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t792: 0\n};\n\nvar installChunk = (data) => {\n\tvar {ids, modules, runtime} = data;\n\t// add \"modules\" to the modules object,\n\t// then flag all \"ids\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tfor(moduleId in modules) {\n\t\tif(__webpack_require__.o(modules, moduleId)) {\n\t\t\t__webpack_require__.m[moduleId] = modules[moduleId];\n\t\t}\n\t}\n\tif(runtime) runtime(__webpack_require__);\n\tfor(;i < ids.length; i++) {\n\t\tchunkId = ids[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[ids[i]] = 0;\n\t}\n\n}\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// import() 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[1]);\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 = import(\"./\" + __webpack_require__.u(chunkId)).then(installChunk, (e) => {\n\t\t\t\t\t\tif(installedChunks[chunkId] !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t});\n\t\t\t\t\tvar promise = Promise.race([promise, new Promise((resolve) => (installedChunkData = installedChunks[chunkId] = [resolve]))])\n\t\t\t\t\tpromises.push(installedChunkData[1] = promise);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n};\n\n// no external install chunk\n\n// no on chunks loaded","__webpack_require__.nc = undefined;","var x = (y) => {\n\tvar x = {}; __webpack_require__.d(x, y); return x\n} \nvar y = (x) => (() => (x))\nconst __WEBPACK_NAMESPACE_OBJECT__ = x({ [\"default\"]: () => (__WEBPACK_EXTERNAL_MODULE_react__[\"default\"]), [\"useCallback\"]: () => (__WEBPACK_EXTERNAL_MODULE_react__.useCallback), [\"useEffect\"]: () => (__WEBPACK_EXTERNAL_MODULE_react__.useEffect), [\"useMemo\"]: () => (__WEBPACK_EXTERNAL_MODULE_react__.useMemo), [\"useRef\"]: () => (__WEBPACK_EXTERNAL_MODULE_react__.useRef), [\"useState\"]: () => (__WEBPACK_EXTERNAL_MODULE_react__.useState) });","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 minPointSpacing: PropTypes.number,\n rendering: PropTypes.oneOf(['line', 'bar', 'area', 'shadow']), // defaults to line\n negativeColor: PropTypes.string, // colors lines and points below zero for all renderings\n gradient: PropTypes.array, // only applies to area and shadow\n negativeGradient: PropTypes.array, // gradient for values below zero (area and shadow)\n zeroLineWidth: PropTypes.number, // only applies to bar and area\n zeroLineColor: PropTypes.string, // only applies to bar and area\n zeroLineY: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), // only applies to bar and area\n pointRadius: PropTypes.number, // only applies to area\n tooltipWidth: PropTypes.number,\n hasAreaBottom: PropTypes.bool,\n shadowColor: PropTypes.string,\n gradient: PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.string, PropTypes.array])), // gradient colors or [position, color] pairs\n rangeKey: PropTypes.string\n});\n\nconst Series = PropTypes.arrayOf(SingleSeries);\n\nconst Axis = PropTypes.shape({\n axisIndex: PropTypes.number.isRequired,\n series: PropTypes.array.isRequired,\n side: PropTypes.oneOf(['left', 'right']).isRequired,\n scale: PropTypes.oneOf(['linear', 'log']).isRequired,\n label: PropTypes.string\n});\n\nconst Axes = PropTypes.arrayOf(Axis);\n\nconst CustomBoundsSelector = PropTypes.shape({\n label: PropTypes.string.isRequired,\n calculator: PropTypes.func.isRequired,\n datesOnly: PropTypes.bool\n});\n\nconst CustomBoundsSelectors = PropTypes.arrayOf(CustomBoundsSelector);\n\nconst TooltipOptionsRaw = {\n includeSeriesLabel: PropTypes.bool,\n includeXLabel: PropTypes.bool,\n includeYLabel: PropTypes.bool,\n includeXValue: PropTypes.bool,\n includeYValue: PropTypes.bool,\n floating: PropTypes.bool,\n alwaysFixedPosition: PropTypes.bool,\n floatPosition: PropTypes.oneOf(['top', 'bottom']),\n floatDelta: PropTypes.number,\n savingDisabled: PropTypes.bool,\n customTooltip: PropTypes.func,\n combineTooltips: PropTypes.oneOfType([PropTypes.bool, PropTypes.number])\n};\n\nconst TooltipOptions = PropTypes.shape(TooltipOptionsRaw);\n\nconst Annotation = PropTypes.shape({\n x: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.instanceOf(Date)]),\n startX: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.instanceOf(Date)]),\n endX: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.instanceOf(Date)]),\n series: PropTypes.arrayOf(PropTypes.string),\n content: PropTypes.string,\n lineOnly: PropTypes.bool\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.oneOfType([PropTypes.number, PropTypes.instanceOf(Date)]).isRequired,\n color: PropTypes.string,\n lineTop: PropTypes.number,\n width: PropTypes.number,\n markTop: PropTypes.bool,\n style: PropTypes.object,\n markerStyle: PropTypes.object,\n text: PropTypes.string,\n textTop: PropTypes.number,\n textStyle: PropTypes.object,\n minPixelX: PropTypes.number,\n maxPixelX: PropTypes.number,\n onRangeGraph: PropTypes.oneOfType([\n PropTypes.bool,\n PropTypes.object // anything that can be passed into the overall vertical line\n ]),\n onRangeGraphOnly: PropTypes.bool\n});\nconst VerticalLines = PropTypes.arrayOf(VerticalLine);\n\nconst CustomPropTypes = {\n Data,\n SingleSeries,\n Series,\n Axis,\n Axes,\n CustomBoundsSelector,\n CustomBoundsSelectors,\n TooltipOptions,\n TooltipOptionsRaw,\n Annotations,\n DraggablePoint,\n DraggablePoints,\n VerticalLine,\n VerticalLines\n};\n\n\nexport default CustomPropTypes;\n","export 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 {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","/**\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]{3}$|^#[\\dA-F]{6}$/i.test(color)) {\n throw new Error(`Color must be a hex string: ${color}`);\n }\n\n // support for short hex codes, expanding 3-digit hex to 6-digit\n if (color.length === 4) {\n color = '#' + color[1] + color[1] + color[2] + color[2] + color[3] + color[3];\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","/**\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 return null;\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 return null;\n }\n\n const program = gl.createProgram();\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n\n gl.linkProgram(program);\n \n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n console.error('Shader program linking failed:', gl.getProgramInfoLog(program));\n return null;\n }\n\n gl.validateProgram(program);\n if (!gl.getProgramParameter(program, gl.VALIDATE_STATUS)) {\n console.error('Shader program validation failed:', gl.getProgramInfoLog(program));\n return null;\n }\n\n return program;\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","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","import {DPI_INCREASE} from './size_canvas';\n\n/**\n * Returns an array of contiguous paths from data in render space\n *\n * @param {{nullMask: Uint8Array, maxYValues: Float64Array, minYValues: Float64Array, yValues: Float64Array}} dataInRenderSpace\n * @param {Object} options\n * @param {Number} options.splitAtY - split the path whenever it's suddenly less or greater than this value\n * @return {[[Number]]}\n */\nexport default function pathsFrom(dataInRenderSpace, {splitAtY}={}) {\n const paths = [];\n let currentPath = [];\n let previouslyDiscontinuous = true;\n\n const { nullMask, maxYValues, minYValues, yValues } = dataInRenderSpace;\n\n for (let i = 0; i < yValues.length; i++) {\n const x = i*DPI_INCREASE;\n const y = yValues[i];\n\n if (nullMask[i] & 0b001) { // y null\n if (!previouslyDiscontinuous) {\n paths.push(currentPath);\n currentPath = [];\n }\n\n previouslyDiscontinuous = true;\n continue;\n }\n\n currentPath.push([x, y]);\n\n const minY = minYValues[i];\n const maxY = maxYValues[i];\n\n if (minY !== maxY) {\n if (!(nullMask[i] & 0b010)) {\n currentPath.push([x, minY]);\n }\n\n if (!(nullMask[i] & 0b100)) {\n currentPath.push([x, maxY]);\n }\n currentPath.push([x, y]);\n }\n\n previouslyDiscontinuous = false;\n\n if (typeof splitAtY === 'number' && i > 0) {\n const prevY = yValues[i-1];\n const signFlipped = !(nullMask[i-1] & 0b001) && (prevY < splitAtY && y >= splitAtY) || (prevY > splitAtY && y <= splitAtY) || (prevY === splitAtY && y !== splitAtY);\n\n if (signFlipped) {\n if (!previouslyDiscontinuous) {\n paths.push(currentPath);\n currentPath = [\n [x, y]\n ];\n }\n\n previouslyDiscontinuous = true;\n }\n }\n }\n\n if (!previouslyDiscontinuous) {\n paths.push(currentPath);\n }\n\n return paths;\n}\n","/**\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 if (!context) {\n console.error('Canvas context is null in drawZeroLine');\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 pathsFrom from \"./paths_from\";\nimport { drawZeroLine } from \"./draw_zero_line\";\nimport { DPI_INCREASE } from \"./size_canvas\";\nimport { applyReducedOpacity, applyReducedOpacityToGradient } from \"../helpers/colors\";\n\n/**\n * Draws the data on the canvas\n * Assumes the data is in individual point render space, ie x and y in pixels\n *\n * @param {Array<[number, number]>} individualPoints - data to draw\n * @param {Object} dataInRenderSpace\n * @param {Object} options - set of options\n * @param {Object} options.context - the context to draw on\n * @param {String} options.color - color of the bar to draw\n * @param {{renderWidth: Number, renderHeight: Number}} options.sizing - size of the canvas, in pixels\n * @param {Number} options.zero - y coordinate that represents \"zero\"\n * @param {Boolean} options.hasNegatives - if any values are negative (in which case should render from zero)\n * @param {Array<String>} [options.gradient] - an array of stops, from top to bottom of canvas, to draw with\n * @param {String} [options.zeroColor] - color of the zero line\n * @param {Number} [options.zeroWidth] - width of the zero line\n * @param {Boolean} [options.showIndividualPoints] - draw circles at each point\n * @param {String} [options.negativeColor] - color of the area below zero\n * @param {Number} [options.width] - line width\n * @param {Object} [options.inRenderSpaceAreaBottom] - if provided, will use this as the area bottom instead of zero/sizing.renderHeight\n * @private\n */\nexport default function drawArea(\n individualPoints,\n dataInRenderSpace,\n {\n color,\n context,\n sizing,\n zero,\n hasNegatives,\n gradient,\n negativeGradient,\n zeroColor,\n zeroWidth,\n showIndividualPoints,\n negativeColor,\n pointRadius,\n minPointSpacing,\n width,\n highlighted,\n shadowColor = \"black\",\n shadowBlur = 5,\n inRenderSpaceAreaBottom,\n cutoffIndex,\n cutoffOpacity,\n originalData,\n renderCutoffGradient,\n selectionBounds,\n isPreview,\n }\n) {\n if (!context) {\n console.error(\"Canvas context is null in drawArea\");\n return;\n }\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(\n 0,\n 0,\n 0,\n sizing.renderHeight\n );\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 shouldSplitAreaPaths = hasNegatives && negativeGradient;\n const areaPaths = pathsFrom(dataInRenderSpace, shouldSplitAreaPaths ? { splitAtY: zero } : undefined);\n const areaBottomPaths =\n inRenderSpaceAreaBottom && pathsFrom(inRenderSpaceAreaBottom, shouldSplitAreaPaths ? { splitAtY: zero } : undefined);\n\n const linePaths = pathsFrom(dataInRenderSpace, {\n splitAtY: zero,\n });\n\n if (renderCutoffGradient && cutoffIndex !== undefined && originalData) {\n drawAreaWithCutoff(\n individualPoints,\n areaPaths,\n areaBottomPaths,\n linePaths,\n {\n color,\n context,\n sizing,\n zero,\n hasNegatives,\n gradient,\n zeroColor,\n zeroWidth,\n showIndividualPoints,\n negativeColor,\n pointRadius,\n width,\n highlighted,\n shadowColor,\n shadowBlur,\n inRenderSpaceAreaBottom,\n cutoffIndex,\n cutoffOpacity,\n originalData,\n selectionBounds,\n isPreview,\n }\n );\n return;\n }\n\n for (let pathI = 0; pathI < areaPaths.length; pathI++) {\n const path = areaPaths[pathI];\n const areaBottomPath = areaBottomPaths && areaBottomPaths[pathI];\n \n // Determine if this path segment is positive or negative for gradient application\n let isPositive = true;\n if (hasNegatives && negativeGradient && path.length > 0) {\n // Check the average Y position of the path to determine if it's above or below zero\n let sumY = 0;\n for (let i = 0; i < path.length; i++) {\n sumY += path[i][1];\n }\n const avgY = sumY / path.length;\n isPositive = avgY <= zero; // In screen coordinates, smaller Y is higher up (positive)\n }\n \n // Set the fill style based on whether this is a positive or negative segment\n if (hasNegatives && negativeGradient) {\n if (isPositive) {\n // Use the original gradient or color for positive areas\n if (gradient && gradient.length >= 2) {\n const globalGradient = context.createLinearGradient(0, 0, 0, sizing.renderHeight);\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 context.fillStyle = globalGradient;\n } else {\n context.fillStyle = color;\n }\n } else {\n // Use negativeGradient for negative areas\n if (negativeGradient.length >= 2) {\n const negGradient = context.createLinearGradient(0, 0, 0, sizing.renderHeight);\n for (let i = 0; i < negativeGradient.length; i++) {\n const value = negativeGradient[i];\n if (Array.isArray(value)) {\n negGradient.addColorStop(value[0], value[1]);\n } else {\n negGradient.addColorStop(i / (negativeGradient.length - 1), value);\n }\n }\n context.fillStyle = negGradient;\n } else {\n context.fillStyle = negativeColor || color;\n }\n }\n }\n \n context.beginPath();\n\n const [firstX, _startY] = path[0];\n const [lastX, _lastY] = path[path.length - 1];\n\n if (!areaBottomPaths) {\n context.moveTo(firstX, areaBottom);\n }\n\n for (let i = 0; i < path.length; i++) {\n const [x, y] = path[i];\n context.lineTo(x, y);\n }\n\n if (areaBottomPath && areaBottomPath.length) {\n for (let i = areaBottomPath.length - 1; i >= 0; i--) {\n const [x, y] = areaBottomPath[i];\n context.lineTo(x, y);\n }\n\n context.lineTo(...path[0]);\n } else {\n context.lineTo(lastX, areaBottom);\n }\n\n context.fill();\n }\n\n if (highlighted) {\n width += 2;\n }\n\n width *= DPI_INCREASE;\n context.strokeStyle = color;\n context.lineWidth = width;\n\n for (let path of linePaths) {\n if (!path.length) {\n continue;\n }\n\n if (hasNegatives && negativeColor) {\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 } else {\n context.strokeStyle = color;\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 && !renderCutoffGradient) {\n // Apply point spacing for individual point circles only\n function applyPointSpacing(points, minSpacing) {\n if (!minSpacing || points.length <= 1) {\n return points;\n }\n \n const spacedPoints = [];\n let lastX = -Infinity;\n \n for (const point of points) {\n const [x] = point;\n if (x - lastX >= minSpacing) {\n spacedPoints.push(point);\n lastX = x;\n }\n }\n \n return spacedPoints;\n }\n\n const pointsToRender = applyPointSpacing(individualPoints, minPointSpacing);\n for (let [x, y] of pointsToRender) {\n // Determine the color for this point\n let pointColor = color;\n if (negativeColor && hasNegatives) {\n if (y === zero && zeroColor) {\n pointColor = zeroColor;\n } else if (y < zero) {\n pointColor = color;\n } else {\n pointColor = negativeColor;\n }\n }\n \n context.fillStyle = pointColor;\n context.beginPath();\n context.arc(x, y, pointRadius || 8, 0, 2 * Math.PI, false);\n context.fill();\n }\n }\n}\n\n/**\n * Draws the data on the canvas with cutoff\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 area to draw\n * @param {{renderWidth: Number, renderHeight: Number}} options.sizing - size of the canvas, in pixels\n * @param {Number} options.zero - y coordinate that represents \"zero\"\n * @param {Boolean} options.hasNegatives - if any values are negative (in which case should render from zero)\n * @param {Array<String>} [options.gradient] - an array of stops, from top to bottom of canvas, to draw with\n * @param {String} [options.zeroColor] - color of the zero line\n * @param {Number} [options.zeroWidth] - width of the zero line\n * @param {Boolean} [options.showIndividualPoints] - draw circles at each point\n * @param {String} [options.negativeColor] - color of the area below zero\n * @param {Number} [options.width] - line width\n * @param {Object} [options.inRenderSpaceAreaBottom] - if provided, will use this as the area bottom instead of zero/sizing.renderHeight\n * @private\n */\nfunction drawAreaWithCutoff(\n individualPoints,\n areaPaths,\n areaBottomPaths,\n linePaths,\n {\n color,\n context,\n sizing,\n zero,\n hasNegatives,\n gradient,\n zeroColor,\n zeroWidth,\n showIndividualPoints,\n negativeColor,\n pointRadius,\n width,\n highlighted,\n shadowColor,\n shadowBlur,\n inRenderSpaceAreaBottom,\n cutoffIndex,\n cutoffOpacity,\n originalData,\n selectionBounds,\n isPreview,\n }\n) {\n let cutoffTime;\n if (typeof originalData[0] === \"object\" && originalData[0].length === 2) {\n const baseIndex = Math.floor(cutoffIndex);\n const fraction = cutoffIndex - baseIndex;\n\n if (fraction === 0 || baseIndex >= originalData.length - 1) {\n const cutoffDate =\n originalData[Math.min(baseIndex, originalData.length - 1)][0];\n cutoffTime =\n cutoffDate instanceof Date ? cutoffDate.getTime() : cutoffDate;\n } else {\n const currentDate = originalData[baseIndex][0];\n const nextDate = originalData[baseIndex + 1][0];\n const currentTime =\n currentDate instanceof Date ? currentDate.getTime() : currentDate;\n const nextTime = nextDate instanceof Date ? nextDate.getTime() : nextDate;\n cutoffTime = currentTime + fraction * (nextTime - currentTime);\n }\n } else {\n cutoffTime = cutoffIndex;\n }\n\n let firstTime, lastTime;\n if (isPreview && selectionBounds) {\n firstTime = selectionBounds.minX instanceof Date ? selectionBounds.minX.getTime() : selectionBounds.minX;\n lastTime = selectionBounds.maxX instanceof Date ? selectionBounds.maxX.getTime() : selectionBounds.maxX;\n } else {\n firstTime = originalData[0][0] instanceof Date ? originalData[0][0].getTime() : originalData[0][0];\n lastTime = originalData[originalData.length - 1][0] instanceof Date ? \n originalData[originalData.length - 1][0].getTime() : originalData[originalData.length - 1][0];\n }\n\n const timeRatio = (cutoffTime - firstTime) / (lastTime - firstTime);\n\n if (timeRatio < 0) {\n for (let pathI = 0; pathI < areaPaths.length; pathI++) {\n const path = areaPaths[pathI];\n const areaBottomPath = areaBottomPaths && areaBottomPaths[pathI];\n\n renderEntireArea(path, areaBottomPath, {\n color,\n context,\n sizing,\n zero,\n hasNegatives,\n gradient,\n zeroColor,\n zeroWidth,\n highlighted,\n shadowColor,\n shadowBlur,\n inRenderSpaceAreaBottom,\n });\n }\n } else if (timeRatio > 1) {\n const reducedOpacityGradient = gradient\n ? applyReducedOpacityToGradient(gradient, cutoffOpacity)\n : null;\n for (let pathI = 0; pathI < areaPaths.length; pathI++) {\n const path = areaPaths[pathI];\n const areaBottomPath = areaBottomPaths && areaBottomPaths[pathI];\n\n renderEntireArea(path, areaBottomPath, {\n color: applyReducedOpacity(color, cutoffOpacity),\n context,\n sizing,\n zero,\n hasNegatives,\n gradient: reducedOpacityGradient,\n zeroColor,\n zeroWidth,\n highlighted,\n shadowColor,\n shadowBlur,\n inRenderSpaceAreaBottom,\n });\n }\n } else {\n if (isPreview) {\n for (let pathI = 0; pathI < areaPaths.length; pathI++) {\n const path = areaPaths[pathI];\n const areaBottomPath = areaBottomPaths && areaBottomPaths[pathI];\n\n if (!path.length) {\n continue;\n }\n\n const renderCutoffIndex = timeRatio * path.length;\n const splitIndex = Math.floor(renderCutoffIndex);\n const fraction = renderCutoffIndex - splitIndex;\n\n let ghostPoint = null;\n if (splitIndex < path.length - 1 && fraction > 0) {\n const [x1, y1] = path[splitIndex];\n const [x2, y2] = path[splitIndex + 1];\n ghostPoint = [x1 + fraction * (x2 - x1), y1 + fraction * (y2 - y1)];\n }\n\n const shouldRenderPre =\n splitIndex > 0 || (splitIndex === 0 && fraction > 0);\n\n if (shouldRenderPre) {\n const preCutoffPath = path.slice(0, splitIndex + 1);\n if (ghostPoint && splitIndex < path.length - 1) {\n preCutoffPath.push(ghostPoint);\n }\n\n const preCutoffAreaBottomPath = areaBottomPath\n ? areaBottomPath.slice(0, splitIndex + 1)\n : null;\n if (\n ghostPoint &&\n preCutoffAreaBottomPath &&\n splitIndex < areaBottomPath.length - 1\n ) {\n const bottomGhostPoint = [ghostPoint[0], zero];\n preCutoffAreaBottomPath.push(bottomGhostPoint);\n }\n\n const reducedOpacityGradient = gradient\n ? applyReducedOpacityToGradient(gradient, cutoffOpacity)\n : null;\n renderEntireArea(preCutoffPath, preCutoffAreaBottomPath, {\n color: applyReducedOpacity(color, cutoffOpacity),\n context,\n sizing,\n zero,\n hasNegatives,\n gradient: reducedOpacityGradient,\n zeroColor,\n zeroWidth,\n highlighted,\n shadowColor,\n shadowBlur,\n inRenderSpaceAreaBottom,\n });\n }\n\n const shouldRenderPost =\n splitIndex < path.length - 1 ||\n (splitIndex === path.length - 1 && fraction === 0);\n\n if (shouldRenderPost) {\n const postCutoffPath = [];\n if (ghostPoint && splitIndex < path.length - 1) {\n postCutoffPath.push(ghostPoint);\n }\n postCutoffPath.push(...path.slice(splitIndex + 1));\n\n const postCutoffAreaBottomPath = [];\n if (\n ghostPoint &&\n areaBottomPath &&\n splitIndex < areaBottomPath.length - 1\n ) {\n const bottomGhostPoint = [ghostPoint[0], zero];\n postCutoffAreaBottomPath.push(bottomGhostPoint);\n }\n if (areaBottomPath) {\n postCutoffAreaBottomPath.push(\n ...areaBottomPath.slice(splitIndex + 1)\n );\n }\n\n renderEntireArea(\n postCutoffPath,\n postCutoffAreaBottomPath.length ? postCutoffAreaBottomPath : null,\n {\n color,\n context,\n sizing,\n zero,\n hasNegatives,\n gradient,\n zeroColor,\n zeroWidth,\n highlighted,\n shadowColor,\n shadowBlur,\n inRenderSpaceAreaBottom,\n }\n );\n }\n }\n\n if (linePaths && linePaths.length > 0) {\n drawLinesWithCutoff(linePaths, timeRatio, {\n color,\n context,\n hasNegatives,\n negativeColor,\n zero,\n width,\n highlighted,\n cutoffOpacity,\n });\n }\n\n if (\n showIndividualPoints &&\n individualPoints &&\n individualPoints.length > 0\n ) {\n drawPointsWithCutoffByRatio(individualPoints, timeRatio, {\n color,\n context,\n negativeColor,\n hasNegatives,\n zero,\n zeroColor,\n pointRadius,\n cutoffOpacity,\n });\n }\n } else {\n if (!selectionBounds) {\n for (let pathI = 0; pathI < areaPaths.length; pathI++) {\n const path = areaPaths[pathI];\n const areaBottomPath = areaBottomPaths && areaBottomPaths[pathI];\n\n renderEntireArea(path, areaBottomPath, {\n color,\n context,\n sizing,\n zero,\n hasNegatives,\n gradient,\n zeroColor,\n zeroWidth,\n highlighted,\n shadowColor,\n shadowBlur,\n inRenderSpaceAreaBottom,\n });\n }\n } else {\n const visibleMinTime =\n selectionBounds.minX instanceof Date\n ? selectionBounds.minX.getTime()\n : selectionBounds.minX;\n const visibleMaxTime =\n selectionBounds.maxX instanceof Date\n ? selectionBounds.maxX.getTime()\n : selectionBounds.maxX;\n\n if (cutoffTime < visibleMinTime) {\n // cutoff before visible range - render entire area normally\n for (let pathI = 0; pathI < areaPaths.length; pathI++) {\n const path = areaPaths[pathI];\n const areaBottomPath = areaBottomPaths && areaBottomPaths[pathI];\n\n renderEntireArea(path, areaBottomPath, {\n color,\n context,\n sizing,\n zero,\n hasNegatives,\n gradient,\n zeroColor,\n zeroWidth,\n highlighted,\n shadowColor,\n shadowBlur,\n inRenderSpaceAreaBottom,\n });\n }\n } else if (cutoffTime > visibleMaxTime) {\n // cutoff after visible range - render entire area with reduced opacity\n const reducedOpacityGradient = gradient\n ? applyReducedOpacityToGradient(gradient, cutoffOpacity)\n : null;\n for (let pathI = 0; pathI < areaPaths.length; pathI++) {\n const path = areaPaths[pathI];\n const areaBottomPath = areaBottomPaths && areaBottomPaths[pathI];\n\n renderEntireArea(path, areaBottomPath, {\n color: applyReducedOpacity(color, cutoffOpacity),\n context,\n sizing,\n zero,\n hasNegatives,\n gradient: reducedOpacityGradient,\n zeroColor,\n zeroWidth,\n highlighted,\n shadowColor,\n shadowBlur,\n inRenderSpaceAreaBottom,\n });\n }\n } else {\n // cutoff within visible range - calculate position relative to visible bounds\n const visibleTimeRatio =\n (cutoffTime - visibleMinTime) / (visibleMaxTime - visibleMinTime);\n\n for (let pathI = 0; pathI < areaPaths.length; pathI++) {\n const path = areaPaths[pathI];\n const areaBottomPath = areaBottomPaths && areaBottomPaths[pathI];\n\n if (!path.length) {\n continue;\n }\n\n const renderCutoffIndex = visibleTimeRatio * path.length;\n const splitIndex = Math.floor(renderCutoffIndex);\n const fraction = renderCutoffIndex - splitIndex;\n\n // create ghost point for continuity if needed\n let ghostPoint = null;\n if (splitIndex < path.length - 1 && fraction > 0) {\n const [x1, y1] = path[splitIndex];\n const [x2, y2] = path[splitIndex + 1];\n ghostPoint = [\n x1 + fraction * (x2 - x1),\n y1 + fraction * (y2 - y1),\n ];\n }\n\n // render pre-cutoff area with reduced opacity\n const shouldRenderPre =\n splitIndex > 0 || (splitIndex === 0 && fraction > 0);\n\n if (shouldRenderPre) {\n renderAreaSegment(\n path,\n areaBottomPath,\n splitIndex,\n ghostPoint,\n true,\n {\n color: applyReducedOpacity(color, cutoffOpacity),\n context,\n sizing,\n zero,\n hasNegatives,\n gradient,\n areaBottomPaths,\n }\n );\n }\n\n // render post-cutoff area with normal opacity\n const shouldRenderPost = splitIndex < path.length - 1;\n\n if (shouldRenderPost) {\n renderAreaSegment(\n path,\n areaBottomPath,\n splitIndex,\n ghostPoint,\n false,\n {\n color,\n context,\n sizing,\n zero,\n hasNegatives,\n gradient,\n areaBottomPaths,\n }\n );\n }\n }\n }\n }\n }\n\n // draw outline lines with cutoff\n if (timeRatio >= 0 && timeRatio <= 1 && !isPreview) {\n if (selectionBounds) {\n const visibleMinTime =\n selectionBounds.minX instanceof Date\n ? selectionBounds.minX.getTime()\n : selectionBounds.minX;\n const visibleMaxTime =\n selectionBounds.maxX instanceof Date\n ? selectionBounds.maxX.getTime()\n : selectionBounds.maxX;\n\n // test case time\n if (cutoffTime < visibleMinTime) {\n // cutoff before visible range - draw lines normally\n drawLinesNormally(linePaths, {\n color,\n context,\n hasNegatives,\n negativeColor,\n width,\n highlighted,\n });\n } else if (cutoffTime > visibleMaxTime) {\n // cutoff after visible range - draw lines with reduced opacity (to match area)\n const reducedColor = applyReducedOpacity(color, cutoffOpacity);\n const reducedNegativeColor = negativeColor\n ? applyReducedOpacity(negativeColor, cutoffOpacity)\n : negativeColor;\n drawLinesNormally(linePaths, {\n color: reducedColor,\n context,\n hasNegatives,\n negativeColor: reducedNegativeColor,\n width,\n highlighted,\n });\n } else {\n // cutoff within visible range - split lines at cutoff\n const visibleTimeRatio =\n (cutoffTime - visibleMinTime) / (visibleMaxTime - visibleMinTime);\n drawLinesWithCutoff(linePaths, visibleTimeRatio, {\n color,\n context,\n hasNegatives,\n negativeColor,\n zero,\n width,\n highlighted,\n cutoffOpacity,\n });\n }\n } else {\n // no bounds available - draw lines normally\n drawLinesNormally(linePaths, {\n color,\n context,\n hasNegatives,\n negativeColor,\n width,\n highlighted,\n });\n }\n } else if (!isPreview) {\n // draw lines normally without cutoff\n drawLinesNormally(linePaths, {\n color,\n context,\n hasNegatives,\n negativeColor,\n width,\n highlighted,\n });\n }\n\n // draw other elements (zero line, points) normally\n if (zeroWidth) {\n const areaBottom = hasNegatives ? zero : sizing.renderHeight;\n drawZeroLine(areaBottom, {\n context,\n sizing,\n color,\n zero,\n zeroColor,\n zeroWidth,\n });\n }\n\n if (showIndividualPoints && !isPreview) {\n if (timeRatio >= 0 && timeRatio <= 1) {\n if (selectionBounds) {\n const visibleMinTime =\n selectionBounds.minX instanceof Date\n ? selectionBounds.minX.getTime()\n : selectionBounds.minX;\n const visibleMaxTime =\n selectionBounds.maxX instanceof Date\n ? selectionBounds.maxX.getTime()\n : selectionBounds.maxX;\n\n //test case time\n if (cutoffTime < visibleMinTime) {\n // cutoff before visible range - draw points normally\n drawPointsNormally(individualPoints, {\n color,\n context,\n negativeColor,\n hasNegatives,\n zero,\n zeroColor,\n pointRadius,\n });\n } else if (cutoffTime > visibleMaxTime) {\n // cutoff after visible range - draw points with reduced opacity\n const reducedColor = applyReducedOpacity(color, cutoffOpacity);\n const reducedNegativeColor = negativeColor\n ? applyReducedOpacity(negativeColor, cutoffOpacity)\n : negativeColor;\n const reducedZeroColor = zeroColor\n ? applyReducedOpacity(zeroColor, cutoffOpacity)\n : zeroColor;\n drawPointsNormally(individualPoints, {\n color: reducedColor,\n context,\n negativeColor: reducedNegativeColor,\n hasNegatives,\n zero,\n zeroColor: reducedZeroColor,\n pointRadius,\n });\n } else {\n // cutoff within visible range - split points at cutoff\n const visibleTimeRatio =\n (cutoffTime - visibleMinTime) / (visibleMaxTime - visibleMinTime);\n drawPointsWithCutoffByRatio(individualPoints, visibleTimeRatio, {\n color,\n context,\n negativeColor,\n hasNegatives,\n zero,\n zeroColor,\n pointRadius,\n cutoffOpacity,\n });\n }\n } else {\n // no bounds available - draw points normally\n drawPointsNormally(individualPoints, {\n color,\n context,\n negativeColor,\n hasNegatives,\n zero,\n zeroColor,\n pointRadius,\n });\n }\n } else {\n // cutoff outside data range - draw points normally\n drawPointsNormally(individualPoints, {\n color,\n context,\n negativeColor,\n hasNegatives,\n zero,\n zeroColor,\n pointRadius,\n });\n }\n } \n }\n}\n\nfunction renderEntireArea(\n path,\n areaBottomPath,\n {\n color,\n context,\n sizing,\n zero,\n hasNegatives,\n gradient,\n }\n) {\n context.fillStyle = color;\n\n if (gradient && gradient.length >= 2) {\n const globalGradient = context.createLinearGradient(\n 0,\n 0,\n 0,\n 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 context.fillStyle = globalGradient;\n } else {\n }\n\n const areaBottom = hasNegatives ? zero : sizing.renderHeight;\n\n context.beginPath();\n\n const [firstX, _startY] = path[0];\n const [lastX, _lastY] = path[path.length - 1];\n\n if (!areaBottomPath) {\n context.moveTo(firstX, areaBottom);\n }\n\n for (let i = 0; i < path.length; i++) {\n const [x, y] = path[i];\n context.lineTo(x, y);\n }\n\n if (areaBottomPath && areaBottomPath.length) {\n for (let i = areaBottomPath.length - 1; i >= 0; i--) {\n const [x, y] = areaBottomPath[i];\n context.lineTo(x, y);\n }\n context.lineTo(...path[0]);\n } else {\n context.lineTo(lastX, areaBottom);\n }\n\n context.fill();\n}\n\nfunction renderAreaSegment(\n path,\n areaBottomPath,\n splitIndex,\n ghostPoint,\n isPreCutoff,\n { color, context, sizing, zero, hasNegatives, gradient, areaBottomPaths }\n) {\n context.fillStyle = color;\n\n if (gradient && gradient.length >= 2) {\n const globalGradient = context.createLinearGradient(\n 0,\n 0,\n 0,\n sizing.renderHeight\n );\n for (let i = 0; i < gradient.length; i++) {\n const value = gradient[i];\n if (Array.isArray(value)) {\n const gradientColor = isPreCutoff\n ? applyReducedOpacity(value[1], 0.35)\n : value[1];\n globalGradient.addColorStop(value[0], gradientColor);\n } else {\n const gradientColor = isPreCutoff\n ? applyReducedOpacity(value, 0.35)\n : value;\n globalGradient.addColorStop(i / (gradient.length - 1), gradientColor);\n }\n }\n context.fillStyle = globalGradient;\n } else {\n }\n\n const areaBottom = hasNegatives ? zero : sizing.renderHeight;\n\n context.beginPath();\n\n if (isPreCutoff) {\n const endIndex = ghostPoint ? splitIndex + 1 : splitIndex;\n const [firstX] = path[0];\n\n if (!areaBottomPaths) {\n context.moveTo(firstX, areaBottom);\n }\n\n for (let i = 0; i <= endIndex && i < path.length; i++) {\n const [x, y] = i === endIndex && ghostPoint ? ghostPoint : path[i];\n context.lineTo(x, y);\n }\n\n if (areaBottomPath && areaBottomPath.length) {\n for (let i = Math.min(endIndex, areaBottomPath.length - 1); i >= 0; i--) {\n const [x, y] = areaBottomPath[i];\n context.lineTo(x, y);\n }\n context.lineTo(...path[0]);\n } else {\n const lastPoint = ghostPoint || path[endIndex] || path[path.length - 1];\n context.lineTo(lastPoint[0], areaBottom);\n }\n } else {\n const startIndex = ghostPoint ? splitIndex : splitIndex + 1;\n const startPoint = ghostPoint || path[startIndex];\n\n if (startPoint) {\n context.moveTo(startPoint[0], areaBottom);\n\n if (ghostPoint) {\n context.lineTo(...ghostPoint);\n }\n for (let i = startIndex; i < path.length; i++) {\n context.lineTo(...path[i]);\n }\n\n if (areaBottomPath && areaBottomPath.length) {\n for (\n let i = areaBottomPath.length - 1;\n i >= Math.max(startIndex, 0);\n i--\n ) {\n const [x, y] = areaBottomPath[i];\n context.lineTo(x, y);\n }\n if (ghostPoint) {\n context.lineTo(ghostPoint[0], areaBottom);\n }\n } else {\n const [lastX] = path[path.length - 1];\n context.lineTo(lastX, areaBottom);\n }\n }\n }\n\n context.fill();\n}\n\nfunction drawPointsNormally(\n individualPoints,\n { color, context, negativeColor, hasNegatives, zero, zeroColor, pointRadius }\n) {\n if (!individualPoints || !Array.isArray(individualPoints)) {\n return;\n }\n\n for (let i = 0; i < individualPoints.length; i++) {\n const [x, y] = individualPoints[i];\n\n let pointColor = color;\n if (negativeColor && hasNegatives) {\n if (y === zero && zeroColor) {\n pointColor = zeroColor;\n } else if (y < zero) {\n pointColor = color;\n } else {\n pointColor = negativeColor;\n }\n }\n\n context.fillStyle = pointColor;\n context.beginPath();\n context.arc(x, y, pointRadius || 8, 0, 2 * Math.PI, false);\n context.fill();\n }\n}\n\nfunction drawLinesNormally(\n linePaths,\n { color, context, hasNegatives, negativeColor, width, highlighted }\n) {\n if (!linePaths || !Array.isArray(linePaths)) {\n return;\n }\n\n if (highlighted) {\n width += 2;\n }\n width *= DPI_INCREASE;\n\n for (let path of linePaths) {\n if (!path.length) continue;\n\n context.strokeStyle = hasNegatives && negativeColor ? negativeColor : color;\n context.lineWidth = width;\n context.beginPath();\n for (let i = 0; i < path.length; i++) {\n const [x, y] = path[i];\n if (i === 0) {\n context.moveTo(x, y);\n } else {\n context.lineTo(x, y);\n }\n }\n context.stroke();\n }\n}\n\nfunction drawLinesWithCutoff(\n linePaths,\n timeRatio,\n {\n color,\n context,\n hasNegatives,\n negativeColor,\n zero,\n width,\n highlighted,\n cutoffOpacity,\n }\n) {\n if (!linePaths || !Array.isArray(linePaths)) {\n return;\n }\n\n if (highlighted) {\n width += 2;\n }\n width *= DPI_INCREASE;\n\n const cutoffPixelX = timeRatio * context.canvas.width;\n const preCutoffPaths = [];\n const postCutoffPaths = [];\n\n for (let path of linePaths) {\n if (!path.length) continue;\n\n const prePath = [];\n const postPath = [];\n let ghostPoint = null;\n let splitIndex = -1;\n\n for (let i = 0; i < path.length; i++) {\n const [x, y] = path[i];\n \n if (x < cutoffPixelX) {\n prePath.push([x, y]);\n splitIndex = i;\n } else {\n postPath.push([x, y]);\n }\n }\n\n if (prePath.length > 0 && postPath.length > 0) {\n const lastPrePoint = prePath[prePath.length - 1];\n const firstPostPoint = postPath[0];\n const [x1, y1] = lastPrePoint;\n const [x2, y2] = firstPostPoint;\n \n if (x2 !== x1) {\n const fraction = (cutoffPixelX - x1) / (x2 - x1);\n ghostPoint = [cutoffPixelX, y1 + fraction * (y2 - y1)];\n prePath.push(ghostPoint);\n postPath.unshift(ghostPoint);\n }\n }\n\n if (prePath.length > 0) {\n preCutoffPaths.push(prePath);\n }\n if (postPath.length > 0) {\n postCutoffPaths.push(postPath);\n }\n }\n\n if (preCutoffPaths.length > 0) {\n const reducedColor = applyReducedOpacity(color, cutoffOpacity);\n context.strokeStyle = reducedColor;\n context.lineWidth = width;\n\n for (let path of preCutoffPaths) {\n if (path.length > 1) {\n context.beginPath();\n for (let i = 0; i < path.length; i++) {\n const [x, y] = path[i];\n if (i === 0) {\n context.moveTo(x, y);\n } else {\n context.lineTo(x, y);\n }\n }\n context.stroke();\n }\n }\n }\n\n if (postCutoffPaths.length > 0) {\n context.strokeStyle = hasNegatives && negativeColor ? negativeColor : color;\n context.lineWidth = width;\n\n for (let path of postCutoffPaths) {\n if (path.length > 1) {\n context.beginPath();\n for (let i = 0; i < path.length; i++) {\n const [x, y] = path[i];\n if (i === 0) {\n context.moveTo(x, y);\n } else {\n context.lineTo(x, y);\n }\n }\n context.stroke();\n }\n }\n }\n}\n\nfunction drawPointsWithCutoffByRatio(\n individualPoints,\n timeRatio,\n {\n color,\n context,\n negativeColor,\n hasNegatives,\n zero,\n zeroColor,\n pointRadius,\n cutoffOpacity,\n }\n) {\n if (!individualPoints || !Array.isArray(individualPoints)) {\n return;\n }\n\n const canvasWidth = context.canvas.width;\n const cutoffPixelX = timeRatio * canvasWidth;\n\n for (let i = 0; i < individualPoints.length; i++) {\n const [x, y] = individualPoints[i];\n\n const isBeforeCutoff = x < cutoffPixelX;\n\n let pointColor = color;\n if (isBeforeCutoff) {\n pointColor = applyReducedOpacity(color, cutoffOpacity);\n }\n\n if (negativeColor && hasNegatives) {\n if (y === zero && zeroColor) {\n pointColor = zeroColor;\n } else if (y < zero) {\n pointColor = isBeforeCutoff\n ? applyReducedOpacity(color, cutoffOpacity)\n : color;\n } else {\n pointColor = isBeforeCutoff\n ? applyReducedOpacity(negativeColor, cutoffOpacity)\n : negativeColor;\n }\n }\n\n context.fillStyle = pointColor;\n context.beginPath();\n context.arc(x, y, pointRadius || 8, 0, 2 * Math.PI, false);\n context.fill();\n }\n}\n","import {drawZeroLine} from './draw_zero_line';\nimport { applyReducedOpacity } from \"../helpers/colors\";\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, cutoffIndex, cutoffOpacity, originalData, renderCutoffGradient, selectionBounds\n}) {\n if (!context) {\n console.error('Canvas context is null in drawBars');\n return;\n }\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 if (renderCutoffGradient && cutoffIndex !== undefined && originalData) {\n drawBarsWithCutoff(individualPoints, {\n color, context, sizing, indexInAxis, axisSeriesCount, zero, hasNegatives, negativeColor, zeroColor, zeroWidth, closestSpacing, bounds, cutoffIndex, cutoffOpacity, originalData, selectionBounds, barWidth, totalBarWidth, barBottom\n });\n return;\n }\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\nexport function getBarWidths({closestSpacing, bounds, sizing, axisSeriesCount}) {\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\n/**\n * Draws the data on the canvas with cutoff\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 * @param {Number} options.cutoffIndex - index of the cutoff\n * @param {Number} options.cutoffOpacity - opacity of the cutoff\n * @param {Array<[number, number]>} options.originalData - original data\n * @param {Boolean} options.selectionBounds - if selection bounds are available\n * @param {Number} options.barWidth - width of the bar\n * @param {Number} options.totalBarWidth - total width of the bar\n * @param {Number} options.barBottom - y coordinate that represents the bottom of the bar\n * @private\n */\nfunction drawBarsWithCutoff(individualPoints, {\n color, context, sizing, indexInAxis, axisSeriesCount, zero, hasNegatives, negativeColor, zeroColor, zeroWidth, closestSpacing, bounds, cutoffIndex, cutoffOpacity, originalData, selectionBounds, barWidth, totalBarWidth, barBottom\n}) {\n let cutoffTime;\n if (typeof originalData[0] === 'object' && originalData[0].length === 2) {\n const baseIndex = Math.floor(cutoffIndex);\n const fraction = cutoffIndex - baseIndex;\n \n if (fraction === 0 || baseIndex >= originalData.length - 1) {\n const cutoffDate = originalData[Math.min(baseIndex, originalData.length - 1)][0];\n cutoffTime = cutoffDate instanceof Date ? cutoffDate.getTime() : cutoffDate;\n } else {\n const currentDate = originalData[baseIndex][0];\n const nextDate = originalData[baseIndex + 1][0];\n const currentTime = currentDate instanceof Date ? currentDate.getTime() : currentDate;\n const nextTime = nextDate instanceof Date ? nextDate.getTime() : nextDate;\n cutoffTime = currentTime + fraction * (nextTime - currentTime);\n }\n } else {\n cutoffTime = cutoffIndex; \n }\n\n for (let i = 0; i < individualPoints.length; i++) {\n const [x, y] = individualPoints[i];\n \n let barColor = color;\n let isBeforeCutoff = false;\n\n if (i < originalData.length) {\n const dataPoint = originalData[i];\n const pointTime = dataPoint[0] instanceof Date ? dataPoint[0].getTime() : dataPoint[0];\n isBeforeCutoff = pointTime < cutoffTime;\n \n if (isBeforeCutoff) {\n barColor = applyReducedOpacity(color, cutoffOpacity);\n }\n }\n\n if (hasNegatives) {\n if (y <= zero) {\n context.fillStyle = barColor;\n } else {\n const negColor = isBeforeCutoff ? applyReducedOpacity(negativeColor, cutoffOpacity) : negativeColor;\n context.fillStyle = negColor;\n }\n } else {\n context.fillStyle = barColor;\n }\n\n context.fillRect(x - totalBarWidth / 2 + barWidth*indexInAxis, y, barWidth, barBottom-y);\n }\n\n if (zeroWidth) {\n drawZeroLine(barBottom, {\n context, sizing, color, zero, zeroColor, zeroWidth\n });\n }\n}\n","import {DPI_INCREASE} from './size_canvas';\nimport pathsFrom from './paths_from';\nimport { applyReducedOpacity } from \"../helpers/colors\";\n\nfunction applyPointSpacing(points, minSpacing) {\n if (!minSpacing || points.length <= 1) {\n return points;\n }\n \n const spacedPoints = [];\n let lastX = -Infinity;\n \n for (const point of points) {\n const [x] = point;\n if (x - lastX >= minSpacing) {\n spacedPoints.push(point);\n lastX = x;\n }\n }\n \n return spacedPoints;\n}\n\nexport default function drawLine(dataInRenderSpace, {\n color, width=1, context, shadowColor='black', shadowBlur=5, dashed=false, dashPattern=null, highlighted=false, showIndividualPoints=false, pointRadius, minPointSpacing, getIndividualPoints, getRanges, cutoffIndex, cutoffOpacity, originalData, renderCutoffGradient, currentBounds, selectionBounds, rendering, isPreview, negativeColor, hasNegatives, zero, zeroColor\n}) {\n if (!context) {\n console.error(\"Canvas context is null in drawLine\");\n return;\n }\n \n if (!context.setLineDash) {\n console.error('drawLine called with WebGL context instead of 2D context');\n return;\n }\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 // Split paths at zero line if negativeColor is specified\n const paths = pathsFrom(dataInRenderSpace, hasNegatives && negativeColor ? { splitAtY: zero } : undefined);\n\n for (let path of paths) {\n if (renderCutoffGradient && cutoffIndex !== undefined && originalData) {\n let cutoffTime;\n if (typeof originalData[0] === 'object' && originalData[0].length === 2) {\n const baseIndex = Math.floor(cutoffIndex);\n const fraction = cutoffIndex - baseIndex;\n \n if (fraction === 0 || baseIndex >= originalData.length - 1) {\n const cutoffDate = originalData[Math.min(baseIndex, originalData.length - 1)][0];\n cutoffTime = cutoffDate instanceof Date ? cutoffDate.getTime() : cutoffDate;\n } else {\n const currentDate = originalData[baseIndex][0];\n const nextDate = originalData[baseIndex + 1][0];\n const currentTime = currentDate instanceof Date ? currentDate.getTime() : currentDate;\n const nextTime = nextDate instanceof Date ? nextDate.getTime() : nextDate;\n cutoffTime = currentTime + fraction * (nextTime - currentTime);\n }\n } else {\n cutoffTime = cutoffIndex; \n }\n \n if (isPreview) {\n const firstTime = originalData[0][0] instanceof Date ? originalData[0][0].getTime() : originalData[0][0];\n const lastTime = originalData[originalData.length - 1][0] instanceof Date ? \n originalData[originalData.length - 1][0].getTime() : originalData[originalData.length - 1][0];\n const timeRatio = (cutoffTime - firstTime) / (lastTime - firstTime);\n \n if (timeRatio < 0) {\n context.lineWidth = width;\n context.beginPath();\n for (let i = 0; i < path.length; i++) {\n const [x, y] = path[i];\n if (i === 0) {\n context.moveTo(x, y);\n } else {\n context.lineTo(x, y);\n }\n }\n context.stroke();\n } else if (timeRatio > 1) {\n const reducedColor = applyReducedOpacity(color, cutoffOpacity);\n context.strokeStyle = reducedColor;\n context.lineWidth = width;\n context.beginPath();\n for (let i = 0; i < path.length; i++) {\n const [x, y] = path[i];\n if (i === 0) {\n context.moveTo(x, y);\n } else {\n context.lineTo(x, y);\n }\n }\n context.stroke();\n } else {\n const renderCutoffIndex = timeRatio * (path.length - 1);\n const splitIndex = Math.floor(renderCutoffIndex);\n const fraction = renderCutoffIndex - splitIndex;\n \n let ghostPoint = null;\n if (splitIndex < path.length - 1 && fraction > 0) {\n const [x1, y1] = path[splitIndex];\n const [x2, y2] = path[splitIndex + 1];\n ghostPoint = [\n x1 + fraction * (x2 - x1),\n y1 + fraction * (y2 - y1)\n ];\n }\n \n if (splitIndex > 0 || (splitIndex === 0 && fraction > 0)) {\n const reducedColor = applyReducedOpacity(color, cutoffOpacity);\n context.strokeStyle = reducedColor;\n context.lineWidth = width;\n context.beginPath();\n \n for (let i = 0; i <= splitIndex; i++) {\n const [x, y] = path[i];\n if (i === 0) {\n context.moveTo(x, y);\n } else {\n context.lineTo(x, y);\n }\n }\n \n if (ghostPoint) {\n context.lineTo(ghostPoint[0], ghostPoint[1]);\n }\n \n context.stroke();\n }\n \n if (splitIndex < path.length - 1) {\n context.strokeStyle = color;\n context.lineWidth = width;\n context.beginPath();\n \n if (ghostPoint) {\n context.moveTo(ghostPoint[0], ghostPoint[1]);\n } else {\n context.moveTo(path[splitIndex + 1][0], path[splitIndex + 1][1]);\n }\n \n for (let i = splitIndex + 1; i < path.length; i++) {\n const [x, y] = path[i];\n context.lineTo(x, y);\n }\n \n context.stroke();\n }\n }\n } else {\n if (!selectionBounds) {\n context.lineWidth = width;\n context.beginPath();\n for (let i = 0; i < path.length; i++) {\n const [x, y] = path[i];\n if (i === 0) {\n context.moveTo(x, y);\n } else {\n context.lineTo(x, y);\n }\n }\n context.stroke();\n continue;\n }\n \n const visibleMinTime = selectionBounds.minX instanceof Date ? selectionBounds.minX.getTime() : selectionBounds.minX;\n const visibleMaxTime = selectionBounds.maxX instanceof Date ? selectionBounds.maxX.getTime() : selectionBounds.maxX;\n \n if (cutoffTime < visibleMinTime) {\n context.lineWidth = width;\n context.beginPath();\n for (let i = 0; i < path.length; i++) {\n const [x, y] = path[i];\n if (i === 0) {\n context.moveTo(x, y);\n } else {\n context.lineTo(x, y);\n }\n }\n context.stroke();\n } else if (cutoffTime > visibleMaxTime) {\n const reducedColor = applyReducedOpacity(color, cutoffOpacity);\n context.strokeStyle = reducedColor;\n context.lineWidth = width;\n context.beginPath();\n for (let i = 0; i < path.length; i++) {\n const [x, y] = path[i];\n if (i === 0) {\n context.moveTo(x, y);\n } else {\n context.lineTo(x, y);\n }\n }\n context.stroke();\n context.strokeStyle = color;\n } else {\n const timeRatio = (cutoffTime - visibleMinTime) / (visibleMaxTime - visibleMinTime);\n const renderCutoffIndex = timeRatio * path.length;\n \n const preCutoffPath = [];\n const postCutoffPath = [];\n let ghostPoint = null;\n \n if (renderCutoffIndex > 0 && renderCutoffIndex < path.length - 1) {\n const beforeIndex = Math.floor(renderCutoffIndex);\n const afterIndex = Math.ceil(renderCutoffIndex);\n \n if (beforeIndex !== afterIndex) {\n const fraction = renderCutoffIndex - beforeIndex;\n const beforePoint = path[beforeIndex];\n const afterPoint = path[afterIndex];\n \n ghostPoint = [\n beforePoint[0] + fraction * (afterPoint[0] - beforePoint[0]),\n beforePoint[1] + fraction * (afterPoint[1] - beforePoint[1])\n ];\n \n } else {\n ghostPoint = path[renderCutoffIndex];\n }\n }\n \n for (let i = 0; i < path.length; i++) {\n if (i < renderCutoffIndex) {\n preCutoffPath.push(path[i]);\n } else {\n postCutoffPath.push(path[i]);\n }\n }\n \n if (ghostPoint) {\n if (preCutoffPath.length > 0) {\n preCutoffPath.push(ghostPoint);\n }\n if (postCutoffPath.length > 0) {\n postCutoffPath.unshift(ghostPoint);\n }\n }\n \n if (preCutoffPath.length > 1) {\n const reducedColor = applyReducedOpacity(color, cutoffOpacity);\n context.strokeStyle = reducedColor;\n context.lineWidth = width;\n context.beginPath();\n for (let i = 0; i < preCutoffPath.length; i++) {\n const [x, y] = preCutoffPath[i];\n if (i === 0) {\n context.moveTo(x, y);\n } else {\n context.lineTo(x, y);\n }\n }\n context.stroke();\n }\n \n if (postCutoffPath.length > 1) {\n context.strokeStyle = color;\n context.lineWidth = width;\n context.beginPath();\n for (let i = 0; i < postCutoffPath.length; i++) {\n const [x, y] = postCutoffPath[i];\n if (i === 0) {\n context.moveTo(x, y);\n } else {\n context.lineTo(x, y);\n }\n }\n context.stroke();\n }\n }\n }\n } else {\n if (hasNegatives && negativeColor) {\n let positive = true;\n if (path.length >= 2) {\n positive = path[1][1] <= zero;\n } else if (path.length > 0) {\n positive = path[0][1] <= zero;\n }\n context.strokeStyle = positive ? color : negativeColor;\n } else {\n context.strokeStyle = color;\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\n if (getRanges) {\n const ranges = getRanges();\n\n context.lineWidth = width;\n context.strokeStyle = color;\n context.setLineDash([]);\n const horizontalBarWidth = 8 * DPI_INCREASE;\n\n for (let range of ranges) {\n if (!range) {\n continue;\n }\n\n const { pixelX, pixelMinY, pixelMaxY } = range;\n\n if (pixelMinY !== null) {\n context.beginPath();\n context.moveTo(pixelX - (horizontalBarWidth / 2), pixelMinY);\n context.lineTo(pixelX + (horizontalBarWidth / 2), pixelMinY);\n context.stroke();\n }\n\n if (pixelMaxY !== null) {\n context.beginPath();\n context.moveTo(pixelX - (horizontalBarWidth / 2), pixelMaxY);\n context.lineTo(pixelX + (horizontalBarWidth / 2), pixelMaxY);\n context.stroke();\n }\n\n if (pixelMinY === null || pixelMaxY === null) {\n continue;\n }\n\n context.beginPath();\n context.moveTo(pixelX, pixelMinY);\n context.lineTo(pixelX, pixelMaxY);\n context.stroke();\n }\n }\n\n if (showIndividualPoints) {\n const individualPoints = getIndividualPoints();\n\n if (renderCutoffGradient && cutoffIndex !== undefined && originalData && selectionBounds) {\n const visibleBounds = selectionBounds;\n let firstTime, lastTime;\n \n if (visibleBounds && visibleBounds.minX !== undefined && visibleBounds.maxX !== undefined) {\n firstTime = visibleBounds.minX instanceof Date ? visibleBounds.minX.getTime() : visibleBounds.minX;\n lastTime = visibleBounds.maxX instanceof Date ? visibleBounds.maxX.getTime() : visibleBounds.maxX;\n } else {\n const firstItem = originalData[0];\n const lastItem = originalData[originalData.length - 1];\n const firstX = firstItem[0];\n const lastX = lastItem[0];\n \n firstTime = firstX instanceof Date ? firstX.getTime() : firstX;\n lastTime = lastX instanceof Date ? lastX.getTime() : lastX;\n }\n \n let cutoffTime;\n if (typeof cutoffIndex === 'string' && cutoffIndex === 'now') {\n cutoffTime = Date.now();\n } else if (typeof originalData[0] === 'object' && originalData[0].length === 2) {\n const baseIndex = Math.floor(cutoffIndex);\n const fraction = cutoffIndex - baseIndex;\n \n if (fraction === 0 || baseIndex >= originalData.length - 1) {\n const cutoffDate = originalData[Math.min(baseIndex, originalData.length - 1)][0];\n cutoffTime = cutoffDate instanceof Date ? cutoffDate.getTime() : cutoffDate;\n } else {\n const currentDate = originalData[baseIndex][0];\n const nextDate = originalData[baseIndex + 1][0];\n const currentTime = currentDate instanceof Date ? currentDate.getTime() : currentDate;\n const nextTime = nextDate instanceof Date ? nextDate.getTime() : nextDate;\n cutoffTime = currentTime + fraction * (nextTime - currentTime);\n }\n } else {\n cutoffTime = cutoffIndex; \n }\n \n if (cutoffTime !== null) {\n const timeDiff = cutoffTime - firstTime;\n const totalTime = lastTime - firstTime;\n const timeRatio = timeDiff / totalTime;\n \n if (timeRatio > 1) {\n const spacedPoints = applyPointSpacing(individualPoints, minPointSpacing);\n for (let i = 0; i < spacedPoints.length; i++) {\n const [x, y] = spacedPoints[i];\n \n let pointColor = color;\n if (negativeColor && hasNegatives) {\n if (y === zero && zeroColor) {\n pointColor = zeroColor;\n } else if (y < zero) {\n pointColor = color;\n } else {\n pointColor = negativeColor;\n }\n }\n \n const { applyReducedOpacity } = require(\"../helpers/colors\");\n const reducedOpacityColor = applyReducedOpacity(pointColor, cutoffOpacity);\n context.fillStyle = reducedOpacityColor;\n context.beginPath();\n context.arc(x, y, pointRadius || 8, 0, 2 * Math.PI, false);\n context.fill();\n }\n return;\n }\n }\n \n if (isPreview) {\n const visibleMinTime = selectionBounds.minX instanceof Date ? selectionBounds.minX.getTime() : selectionBounds.minX;\n const visibleMaxTime = selectionBounds.maxX instanceof Date ? selectionBounds.maxX.getTime() : selectionBounds.maxX;\n \n const spacedPoints = applyPointSpacing(individualPoints, minPointSpacing);\n for (let i = 0; i < spacedPoints.length; i++) {\n const [x, y] = spacedPoints[i];\n \n let isBeforeCutoff = false;\n if (cutoffTime < visibleMinTime) {\n isBeforeCutoff = false;\n } else if (cutoffTime > visibleMaxTime) {\n isBeforeCutoff = (rendering !== 'shadow');\n } else {\n const visibleCutoffRatio = (cutoffTime - visibleMinTime) / (visibleMaxTime - visibleMinTime);\n const cutoffPixelX = visibleCutoffRatio * context.canvas.width;\n isBeforeCutoff = x < cutoffPixelX;\n }\n \n let pointColor = color;\n if (negativeColor && hasNegatives) {\n if (y === zero && zeroColor) {\n pointColor = zeroColor;\n } else if (y < zero) {\n pointColor = color;\n } else {\n pointColor = negativeColor;\n }\n }\n \n if (isBeforeCutoff) {\n const reducedOpacityColor = applyReducedOpacity(pointColor, cutoffOpacity);\n context.fillStyle = reducedOpacityColor;\n } else {\n context.fillStyle = pointColor;\n }\n \n context.beginPath();\n context.arc(x, y, pointRadius || 8, 0, 2 * Math.PI, false);\n context.fill();\n }\n } else if (!selectionBounds) {\n const spacedPoints = applyPointSpacing(individualPoints, minPointSpacing);\n for (let i = 0; i < spacedPoints.length; i++) {\n const [x, y] = spacedPoints[i];\n \n let pointColor = color;\n if (negativeColor && hasNegatives) {\n if (y === zero && zeroColor) {\n pointColor = zeroColor;\n } else if (y < zero) {\n pointColor = color;\n } else {\n pointColor = negativeColor;\n }\n }\n \n context.fillStyle = pointColor;\n context.beginPath();\n context.arc(x, y, pointRadius || 8, 0, 2 * Math.PI, false);\n context.fill();\n }\n } else {\n const visibleMinTime = selectionBounds.minX instanceof Date ? selectionBounds.minX.getTime() : selectionBounds.minX;\n const visibleMaxTime = selectionBounds.maxX instanceof Date ? selectionBounds.maxX.getTime() : selectionBounds.maxX;\n \n const spacedPoints = applyPointSpacing(individualPoints, minPointSpacing);\n for (let i = 0; i < spacedPoints.length; i++) {\n const [x, y] = spacedPoints[i];\n \n let isBeforeCutoff = false;\n if (cutoffTime < visibleMinTime) {\n isBeforeCutoff = false;\n } else if (cutoffTime > visibleMaxTime) {\n isBeforeCutoff = (rendering !== 'shadow');\n } else {\n const visibleCutoffRatio = (cutoffTime - visibleMinTime) / (visibleMaxTime - visibleMinTime);\n const cutoffPixelX = visibleCutoffRatio * context.canvas.width;\n isBeforeCutoff = x < cutoffPixelX;\n }\n \n let pointColor = color;\n if (negativeColor && hasNegatives) {\n if (y === zero && zeroColor) {\n pointColor = zeroColor;\n } else if (y < zero) {\n pointColor = color;\n } else {\n pointColor = negativeColor;\n }\n }\n \n if (isBeforeCutoff) {\n const reducedOpacityColor = applyReducedOpacity(pointColor, cutoffOpacity);\n context.fillStyle = reducedOpacityColor;\n } else {\n context.fillStyle = pointColor;\n }\n \n context.beginPath();\n context.arc(x, y, pointRadius || 8, 0, 2 * Math.PI, false);\n context.fill();\n }\n }\n } else {\n const spacedPoints = applyPointSpacing(individualPoints, minPointSpacing);\n for (let i = 0; i < spacedPoints.length; i++) {\n const [x, y] = spacedPoints[i];\n \n // Determine point color based on position relative to zero\n let pointColor = color;\n if (negativeColor && hasNegatives) {\n if (y === zero && zeroColor) {\n pointColor = zeroColor;\n } else if (y < zero) {\n pointColor = color;\n } else {\n pointColor = negativeColor;\n }\n }\n \n context.fillStyle = pointColor;\n context.beginPath();\n context.arc(x, y, pointRadius || 8, 0, 2 * Math.PI, false);\n context.fill();\n }\n }\n }\n}\n","let rustApiModule;\nexport const RustAPIPromise = import('../rust/pkg/index.js').then((module) => {\n return module.default().then(() => {\n rustApiModule = module;\n });\n});\n\nexport default function RustAPI() {\n return rustApiModule;\n}\n","import pathsFrom from './paths_from';\nimport {DPI_INCREASE} from './size_canvas';\nimport RustAPI from '../state/rust_api';\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 && 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","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';\nimport { applyReducedOpacity } from \"../helpers/colors\";\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.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 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 if (parameters.renderCutoffGradient && parameters.cutoffIndex !== undefined && parameters.originalData) {\n this.drawLineWithCutoff(dataInRenderSpace, parameters);\n return;\n }\n\n const {positions, prevPositions, vertices, indices} = extractVertices(dataInRenderSpace, { dashed, dashPattern });\n\n if (!this._program) {\n console.error('WebGL line program is null - shader compilation failed!');\n return;\n }\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 const colorVector = colorToVector(parameters.color);\n gl.uniform4f(gl.getUniformLocation(this._program, 'color'), ...colorVector);\n gl.uniform4f(gl.getUniformLocation(this._program, 'shadowColor'), ...colorToVector(shadowColor));\n \n const cutoffX = parameters.cutoffX !== undefined ? parameters.cutoffX : -1.0; // Use parameter or disable\n const cutoffOpacity = parameters.cutoffOpacity !== undefined ? parameters.cutoffOpacity : 0.35;\n \n gl.uniform1f(gl.getUniformLocation(this._program, 'cutoffX'), cutoffX);\n gl.uniform1f(gl.getUniformLocation(this._program, 'cutoffOpacity'), cutoffOpacity);\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 const pointSize = parameters.pointRadius ? parameters.pointRadius * 2 * DPI_INCREASE : 2*(thickness+6);\n gl.uniform1f(gl.getUniformLocation(this._circleProgram, 'pointSize'), pointSize);\n\n let individualPoints = parameters.getIndividualPoints();\n \n if (parameters.minPointSpacing && individualPoints.length > 1) {\n const spacedPoints = [];\n let lastX = -Infinity;\n \n for (const point of individualPoints) {\n const [x] = point;\n if (x - lastX >= parameters.minPointSpacing) {\n spacedPoints.push(point);\n lastX = x;\n }\n }\n \n individualPoints = spacedPoints;\n }\n\n if (parameters.cutoffIndex !== undefined && parameters.cutoffIndex > 0 && parameters.originalData) {\n const { originalData } = parameters;\n let cutoffTime;\n \n if (typeof originalData[0] === 'object' && originalData[0].length === 2) {\n const baseIndex = Math.floor(parameters.cutoffIndex);\n const fraction = parameters.cutoffIndex - baseIndex;\n \n if (fraction === 0 || baseIndex >= originalData.length - 1) {\n const cutoffDate = originalData[Math.min(baseIndex, originalData.length - 1)][0];\n cutoffTime = cutoffDate instanceof Date ? cutoffDate.getTime() : cutoffDate;\n } else {\n const currentDate = originalData[baseIndex][0];\n const nextDate = originalData[baseIndex + 1][0];\n const currentTime = currentDate instanceof Date ? currentDate.getTime() : currentDate;\n const nextTime = nextDate instanceof Date ? nextDate.getTime() : nextDate;\n cutoffTime = currentTime + fraction * (nextTime - currentTime);\n }\n }\n \n const preCutoffPoints = [];\n const postCutoffPoints = [];\n\n if (parameters.isPreview) {\n const visibleMinTime = parameters.selectionBounds.minX instanceof Date ? parameters.selectionBounds.minX.getTime() : parameters.selectionBounds.minX;\n const visibleMaxTime = parameters.selectionBounds.maxX instanceof Date ? parameters.selectionBounds.maxX.getTime() : parameters.selectionBounds.maxX;\n const timeRatio = (cutoffTime - visibleMinTime) / (visibleMaxTime - visibleMinTime);\n const cutoffPixelX = timeRatio * width;\n \n for (let i = 0; i < individualPoints.length; i++) {\n const [pixelX, pixelY] = individualPoints[i];\n if (pixelX < cutoffPixelX) {\n preCutoffPoints.push(individualPoints[i]);\n } else {\n postCutoffPoints.push(individualPoints[i]);\n }\n }\n } else if (!parameters.selectionBounds) {\n postCutoffPoints.push(...individualPoints);\n } else {\n const visibleMinTime = parameters.selectionBounds.minX instanceof Date ? \n parameters.selectionBounds.minX.getTime() : parameters.selectionBounds.minX;\n const visibleMaxTime = parameters.selectionBounds.maxX instanceof Date ? \n parameters.selectionBounds.maxX.getTime() : parameters.selectionBounds.maxX;\n \n if (cutoffTime < visibleMinTime) {\n postCutoffPoints.push(...individualPoints);\n } else if (cutoffTime > visibleMaxTime) {\n if (parameters.rendering === 'shadow') {\n postCutoffPoints.push(...individualPoints);\n } else {\n preCutoffPoints.push(...individualPoints);\n }\n } else {\n const visibleCutoffRatio = (cutoffTime - visibleMinTime) / (visibleMaxTime - visibleMinTime);\n const renderWidth = this._gl.canvas.width;\n const cutoffPixelX = visibleCutoffRatio * renderWidth;\n \n individualPoints.forEach((point, index) => {\n const [pixelX, pixelY] = point;\n \n if (pixelX < cutoffPixelX) {\n preCutoffPoints.push(point);\n } else {\n postCutoffPoints.push(point);\n }\n });\n }\n }\n \n if (preCutoffPoints.length > 0) {\n const reducedOpacityColor = applyReducedOpacity(parameters.color, parameters.cutoffOpacity || 0.35);\n gl.uniform4f(gl.getUniformLocation(this._circleProgram, 'color'), ...colorToVector(reducedOpacityColor));\n \n gl.enableVertexAttribArray(0);\n gl.bindBuffer(gl.ARRAY_BUFFER, this._individualPointBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(preCutoffPoints.flat()), gl.STATIC_DRAW);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);\n gl.drawArrays(gl.POINTS, 0, preCutoffPoints.length);\n }\n \n if (postCutoffPoints.length > 0) {\n gl.uniform4f(gl.getUniformLocation(this._circleProgram, 'color'), ...colorToVector(parameters.color));\n \n gl.enableVertexAttribArray(0);\n gl.bindBuffer(gl.ARRAY_BUFFER, this._individualPointBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(postCutoffPoints.flat()), gl.STATIC_DRAW);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);\n gl.drawArrays(gl.POINTS, 0, postCutoffPoints.length);\n }\n } else {\n gl.uniform4f(gl.getUniformLocation(this._circleProgram, 'color'), ...colorToVector(parameters.color));\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 drawLineWithCutoff(dataInRenderSpace, parameters) {\n const { cutoffIndex, cutoffOpacity, originalData, selectionBounds } = parameters;\n \n let cutoffTime;\n if (typeof originalData[0] === 'object' && originalData[0].length === 2) {\n const baseIndex = Math.floor(cutoffIndex);\n const fraction = cutoffIndex - baseIndex;\n \n if (fraction === 0 || baseIndex >= originalData.length - 1) {\n const cutoffDate = originalData[Math.min(baseIndex, originalData.length - 1)][0];\n cutoffTime = cutoffDate instanceof Date ? cutoffDate.getTime() : cutoffDate;\n } else {\n const currentDate = originalData[baseIndex][0];\n const nextDate = originalData[baseIndex + 1][0];\n const currentTime = currentDate instanceof Date ? currentDate.getTime() : currentDate;\n const nextTime = nextDate instanceof Date ? nextDate.getTime() : nextDate;\n cutoffTime = currentTime + fraction * (nextTime - currentTime);\n }\n } else {\n cutoffTime = cutoffIndex; \n }\n\n if (parameters.isPreview) {\n const gl = this._gl;\n const visibleMinTime = selectionBounds.minX instanceof Date ? selectionBounds.minX.getTime() : selectionBounds.minX;\n const visibleMaxTime = selectionBounds.maxX instanceof Date ? selectionBounds.maxX.getTime() : selectionBounds.maxX;\n const timeRatio = (cutoffTime - visibleMinTime) / (visibleMaxTime - visibleMinTime);\n \n if (timeRatio < 0) {\n this.draw(dataInRenderSpace, { ...parameters, renderCutoffGradient: false });\n } else if (timeRatio > 1) {\n const reducedOpacityColor = applyReducedOpacity(parameters.color, cutoffOpacity);\n this.draw(dataInRenderSpace, { \n ...parameters, \n color: reducedOpacityColor,\n renderCutoffGradient: false \n });\n } else {\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n \n this.draw(dataInRenderSpace, {\n ...parameters,\n renderCutoffGradient: false,\n cutoffX: timeRatio,\n cutoffOpacity: cutoffOpacity || 0.35\n });\n }\n } else {\n if (!selectionBounds) {\n this.draw(dataInRenderSpace, { ...parameters, renderCutoffGradient: false });\n return;\n }\n \n const visibleMinTime = selectionBounds.minX instanceof Date ? selectionBounds.minX.getTime() : selectionBounds.minX;\n const visibleMaxTime = selectionBounds.maxX instanceof Date ? selectionBounds.maxX.getTime() : selectionBounds.maxX;\n\n if (cutoffTime < visibleMinTime) {\n this.draw(dataInRenderSpace, { ...parameters, renderCutoffGradient: false });\n } else if (cutoffTime > visibleMaxTime) {\n const reducedOpacityColor = applyReducedOpacity(parameters.color, cutoffOpacity);\n this.draw(dataInRenderSpace, { \n ...parameters, \n color: reducedOpacityColor,\n renderCutoffGradient: false \n });\n } else {\n const visibleCutoffRatio = (cutoffTime - visibleMinTime) / (visibleMaxTime - visibleMinTime);\n \n const gl = this._gl;\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n \n this.draw(dataInRenderSpace, {\n ...parameters,\n renderCutoffGradient: false,\n cutoffX: visibleCutoffRatio,\n cutoffOpacity: cutoffOpacity || 0.35\n });\n }\n }\n }\n}\n","import shadowFrag from \"./shadow.frag\";\nimport shadowVert from \"./shadow.vert\";\nimport colorToVector from \"../helpers/color_to_vector\";\nimport createGLProgram from \"./create_gl_program\";\nimport { applyReducedOpacity, applyReducedOpacityToGradient } from \"../helpers/colors\";\n\nexport default class ShadowProgram {\n constructor(gl) {\n this._gl = gl;\n\n this._program = createGLProgram(gl, shadowVert, shadowFrag);\n\n if (!this._program) {\n console.error(\"Failed to create shadow shader program\");\n this._program = null;\n return;\n }\n\n gl.validateProgram(this._program);\n if (!gl.getProgramParameter(this._program, gl.VALIDATE_STATUS)) {\n console.error(\n \"Shadow program validation failed:\",\n gl.getProgramInfoLog(this._program)\n );\n }\n\n const positionLoc = gl.getAttribLocation(this._program, \"position\");\n const trapezoidBoundsLoc = gl.getAttribLocation(\n this._program,\n \"trapezoidBounds\"\n );\n const trapezoidBottomLoc = gl.getAttribLocation(\n this._program,\n \"trapezoidBottom\"\n );\n\n if (\n positionLoc === -1 ||\n trapezoidBoundsLoc === -1 ||\n trapezoidBottomLoc === -1\n ) {\n console.error(\"Missing required shader attributes\");\n }\n\n this._positionBuffer = gl.createBuffer();\n this._trapezoidBoundsBuffer = gl.createBuffer();\n this._trapezoidBottomBuffer = gl.createBuffer();\n this._indexBuffer = gl.createBuffer();\n\n this._gradientTexture = gl.createTexture();\n\n if (!gl.getExtension(\"OES_element_index_uint\")) {\n console.error(\"Your browser does not support OES_element_index_uint\");\n }\n }\n\n dispose() {\n const gl = this._gl;\n if (this._gradientTexture) {\n gl.deleteTexture(this._gradientTexture);\n this._gradientTexture = null;\n }\n }\n\n /**\n * Convert trapezoids into WebGL geometry\n * @param {Array} trapezoids - Array of trapezoid definitions\n * @returns {Object} - Geometry data for WebGL\n */\n generateTrapezoidGeometry(trapezoids) {\n const positions = [];\n const trapezoidBounds = [];\n const trapezoidBottom = [];\n const indices = [];\n\n let vertexIndex = 0;\n\n for (const trap of trapezoids) {\n const { x1, y1, x2, y2, bottomY1, bottomY2 } = trap;\n\n const vertices = [\n [x1, y1],\n [x2, y2],\n [x2, bottomY2],\n [x1, bottomY1],\n ];\n\n const bounds = [x1, y1, x2, y2];\n const bottom = [x1, bottomY1, x2, bottomY2];\n\n for (let i = 0; i < 4; i++) {\n const [x, y] = vertices[i];\n\n positions.push(x, y);\n trapezoidBounds.push(...bounds);\n trapezoidBottom.push(...bottom);\n }\n\n indices.push(\n vertexIndex,\n vertexIndex + 1,\n vertexIndex + 2,\n vertexIndex,\n vertexIndex + 2,\n vertexIndex + 3\n );\n\n vertexIndex += 4;\n }\n\n return {\n positions: new Float32Array(positions),\n trapezoidBounds: new Float32Array(trapezoidBounds),\n trapezoidBottom: new Float32Array(trapezoidBottom),\n indices: new Uint32Array(indices),\n };\n }\n\n /**\n * Parse gradient definition to shader uniforms (supports up to 16 stops)\n * @param {Array} gradient - Gradient definition\n * @param {String} fallbackColor - Fallback color\n * @returns {Object} - Shader uniform data\n */\n parseGradient(gradient, fallbackColor) {\n if (!gradient || !Array.isArray(gradient) || gradient.length < 2) {\n const fallbackColorVec = colorToVector(fallbackColor);\n return {\n textureData: new Uint8Array([\n 0,\n 0,\n 0,\n 255,\n Math.floor(fallbackColorVec[0] * 255),\n Math.floor(fallbackColorVec[1] * 255),\n Math.floor(fallbackColorVec[2] * 255),\n Math.floor(fallbackColorVec[3] * 255),\n ]),\n textureWidth: 2,\n gradientCount: 1,\n fallbackColor: fallbackColorVec,\n };\n }\n\n const colors = [];\n const stops = [];\n\n for (let i = 0; i < gradient.length; i++) {\n const item = gradient[i];\n\n if (Array.isArray(item)) {\n stops.push(item[0]);\n colors.push(colorToVector(item[1]));\n } else {\n stops.push(i / (gradient.length - 1));\n colors.push(colorToVector(item));\n }\n }\n\n const textureWidth = colors.length * 2;\n const textureData = new Uint8Array(textureWidth * 4);\n\n for (let i = 0; i < colors.length; i++) {\n const stopIndex = i * 8;\n const colorIndex = stopIndex + 4;\n\n textureData[stopIndex] = Math.floor(stops[i] * 255);\n textureData[stopIndex + 1] = 0;\n textureData[stopIndex + 2] = 0;\n textureData[stopIndex + 3] = 255;\n\n textureData[colorIndex] = Math.floor(colors[i][0] * 255);\n textureData[colorIndex + 1] = Math.floor(colors[i][1] * 255);\n textureData[colorIndex + 2] = Math.floor(colors[i][2] * 255);\n textureData[colorIndex + 3] = Math.floor(colors[i][3] * 255);\n }\n\n return {\n textureData,\n textureWidth,\n gradientCount: colors.length,\n fallbackColor: colorToVector(fallbackColor),\n };\n }\n\n /**\n * Draw shadow/trapezoid geometry\n * @param {Array} individualPoints - Points defining the line\n * @param {Object} params - Rendering parameters\n */\n draw(individualPoints, params) {\n\n if (!individualPoints || individualPoints.length < 2) {\n return;\n }\n\n const gl = this._gl;\n const width = gl.drawingBufferWidth;\n const height = gl.drawingBufferHeight;\n\n gl.useProgram(this._program);\n\n if (\n params.renderCutoffGradient &&\n params.cutoffIndex !== undefined &&\n params.originalData\n ) {\n this.drawShadowWithCutoff(individualPoints, params);\n return;\n }\n\n const trapezoids = [];\n const positiveTrapezoids = [];\n const negativeTrapezoids = [];\n const { zero, inRenderSpaceAreaBottom, negativeGradient, hasNegatives } = params;\n\n\n for (let i = 0; i < individualPoints.length - 1; i++) {\n const [x1, y1] = individualPoints[i];\n const [x2, y2] = individualPoints[i + 1];\n\n let bottomY1 = zero;\n let bottomY2 = zero;\n\n const y1RelativeToZero = y1 - zero;\n const y2RelativeToZero = y2 - zero;\n const crossesZero = y1RelativeToZero * y2RelativeToZero < 0;\n\n if (crossesZero) {\n const t =\n Math.abs(y1RelativeToZero) /\n (Math.abs(y1RelativeToZero) + Math.abs(y2RelativeToZero));\n const xCross = x1 + (x2 - x1) * t;\n const yCross = zero;\n\n if (Math.abs(y1 - yCross) > 0.1) {\n const trap = {\n x1,\n y1,\n x2: xCross,\n y2: yCross,\n bottomY1,\n bottomY2: zero,\n };\n trapezoids.push(trap);\n \n // Determine if positive or negative (in screen coords, smaller Y is higher/positive)\n if (hasNegatives && negativeGradient) {\n if (y1 <= zero) {\n positiveTrapezoids.push(trap);\n } else {\n negativeTrapezoids.push(trap);\n }\n }\n }\n\n if (Math.abs(y2 - yCross) > 0.1) {\n const trap = {\n x1: xCross,\n y1: yCross,\n x2,\n y2,\n bottomY1: zero,\n bottomY2,\n };\n trapezoids.push(trap);\n \n // Determine if positive or negative\n if (hasNegatives && negativeGradient) {\n if (y2 <= zero) {\n positiveTrapezoids.push(trap);\n } else {\n negativeTrapezoids.push(trap);\n }\n }\n }\n } else {\n // Skip trapezoids completely outside canvas\n if (x1 > width || x2 < 0) {\n continue;\n }\n \n // Clip trapezoid to canvas bounds if it extends beyond\n let finalX2 = x2;\n let finalY2 = y2;\n let finalBottomY2 = bottomY2;\n \n if (x2 > width) {\n const ratio = (width - x1) / (x2 - x1);\n finalX2 = width;\n finalY2 = y1 + (y2 - y1) * ratio;\n finalBottomY2 = bottomY1 + (bottomY2 - bottomY1) * ratio;\n }\n \n const trapezoid = { x1, y1, x2: finalX2, y2: finalY2, bottomY1, bottomY2: finalBottomY2 };\n trapezoids.push(trapezoid);\n \n // Determine if positive or negative\n if (hasNegatives && negativeGradient) {\n // Check average Y position\n const avgY = (y1 + finalY2) / 2;\n if (avgY <= zero) {\n positiveTrapezoids.push(trapezoid);\n } else {\n negativeTrapezoids.push(trapezoid);\n }\n }\n }\n }\n\n if (trapezoids.length === 0) {\n return;\n }\n\n const positionLoc = gl.getAttribLocation(this._program, \"position\");\n const trapezoidBoundsLoc = gl.getAttribLocation(\n this._program,\n \"trapezoidBounds\"\n );\n const trapezoidBottomLoc = gl.getAttribLocation(\n this._program,\n \"trapezoidBottom\"\n );\n\n gl.uniform1f(gl.getUniformLocation(this._program, \"width\"), width);\n gl.uniform1f(gl.getUniformLocation(this._program, \"height\"), height);\n\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n // Helper function to render a set of trapezoids with a given gradient\n const renderTrapezoidSet = (trapSet, gradient, color) => {\n if (trapSet.length === 0) return;\n\n const geometry = this.generateTrapezoidGeometry(trapSet);\n\n gl.enableVertexAttribArray(positionLoc);\n gl.bindBuffer(gl.ARRAY_BUFFER, this._positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, geometry.positions, gl.STATIC_DRAW);\n gl.vertexAttribPointer(positionLoc, 2, gl.FLOAT, false, 0, 0);\n\n gl.enableVertexAttribArray(trapezoidBoundsLoc);\n gl.bindBuffer(gl.ARRAY_BUFFER, this._trapezoidBoundsBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, geometry.trapezoidBounds, gl.STATIC_DRAW);\n gl.vertexAttribPointer(trapezoidBoundsLoc, 4, gl.FLOAT, false, 0, 0);\n\n gl.enableVertexAttribArray(trapezoidBottomLoc);\n gl.bindBuffer(gl.ARRAY_BUFFER, this._trapezoidBottomBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, geometry.trapezoidBottom, gl.STATIC_DRAW);\n gl.vertexAttribPointer(trapezoidBottomLoc, 4, gl.FLOAT, false, 0, 0);\n\n const gradientData = this.parseGradient(gradient, color);\n\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, this._gradientTexture);\n\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n gl.RGBA,\n gradientData.textureWidth,\n 1,\n 0,\n gl.RGBA,\n gl.UNSIGNED_BYTE,\n gradientData.textureData\n );\n\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n\n gl.uniform1i(gl.getUniformLocation(this._program, \"gradientTexture\"), 0);\n gl.uniform1i(\n gl.getUniformLocation(this._program, \"gradientCount\"),\n gradientData.gradientCount\n );\n gl.uniform4fv(\n gl.getUniformLocation(this._program, \"fallbackColor\"),\n gradientData.fallbackColor\n );\n\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, geometry.indices, gl.STATIC_DRAW);\n\n gl.drawElements(gl.TRIANGLES, geometry.indices.length, gl.UNSIGNED_INT, 0);\n };\n\n // If we have negativeGradient and separate trapezoid sets, render them separately\n if (hasNegatives && negativeGradient && (positiveTrapezoids.length > 0 || negativeTrapezoids.length > 0)) {\n // Render positive trapezoids with the normal gradient\n renderTrapezoidSet(positiveTrapezoids, params.gradient, params.color);\n \n // Render negative trapezoids with negativeGradient\n renderTrapezoidSet(negativeTrapezoids, negativeGradient, params.color);\n } else {\n // Fallback to rendering all trapezoids with the same gradient (original behavior)\n renderTrapezoidSet(trapezoids, params.gradient, params.color);\n }\n \n const error = gl.getError();\n if (error !== gl.NO_ERROR) {\n console.error('WebGL error in shadow rendering:', error);\n } else {\n //he he he haw\n }\n }\n\n /**\n * Draw shadow chart with cutoff gradient\n * @param {Array} individualPoints - Points defining the line\n * @param {Object} params - Rendering parameters with cutoff info\n */\n drawShadowWithCutoff(individualPoints, params) {\n\n const { cutoffIndex, cutoffOpacity, originalData, selectionBounds, zero } =\n params;\n\n this._lastIndividualPoints = null;\n this._lastParams = null;\n\n // All cutoff data is now in tuple format [x, y] from graph_body_renderer\n let cutoffTime;\n \n if (Array.isArray(originalData[0]) && originalData[0].length === 2) {\n const baseIndex = Math.floor(cutoffIndex);\n const fraction = cutoffIndex - baseIndex;\n\n if (fraction === 0 || baseIndex >= originalData.length - 1) {\n const cutoffItem = originalData[Math.min(baseIndex, originalData.length - 1)];\n const cutoffDate = cutoffItem[0];\n cutoffTime = cutoffDate instanceof Date ? cutoffDate.getTime() : cutoffDate;\n } else {\n const currentItem = originalData[baseIndex];\n const nextItem = originalData[baseIndex + 1];\n const currentDate = currentItem[0];\n const nextDate = nextItem[0];\n const currentTime = currentDate instanceof Date ? currentDate.getTime() : currentDate;\n const nextTime = nextDate instanceof Date ? nextDate.getTime() : nextDate;\n cutoffTime = currentTime + fraction * (nextTime - currentTime);\n }\n } else {\n cutoffTime = cutoffIndex;\n }\n\n const visibleBounds = params.selectionBounds;\n let firstTime, lastTime;\n \n if (visibleBounds && visibleBounds.minX !== undefined && visibleBounds.maxX !== undefined) {\n firstTime = visibleBounds.minX instanceof Date ? visibleBounds.minX.getTime() : visibleBounds.minX;\n lastTime = visibleBounds.maxX instanceof Date ? visibleBounds.maxX.getTime() : visibleBounds.maxX;\n } else {\n const firstItem = originalData[0];\n const lastItem = originalData[originalData.length - 1];\n const firstX = firstItem[0];\n const lastX = lastItem[0];\n \n firstTime = firstX instanceof Date ? firstX.getTime() : firstX;\n lastTime = lastX instanceof Date ? lastX.getTime() : lastX;\n }\n \n const timeDiff = cutoffTime - firstTime;\n const totalTime = lastTime - firstTime;\n const timeRatio = timeDiff / totalTime;\n\n if (timeRatio < 0) {\n this.draw(individualPoints, { ...params, renderCutoffGradient: false });\n } else if (timeRatio > 1) {\n const reducedOpacityColor = applyReducedOpacity(\n params.color,\n cutoffOpacity\n );\n const translucentGradient = applyReducedOpacityToGradient(\n params.gradient,\n cutoffOpacity\n );\n this.draw(individualPoints, {\n ...params,\n color: reducedOpacityColor,\n gradient: translucentGradient,\n renderCutoffGradient: false,\n });\n } else {\n this.drawSplitShadowTrapezoids(\n individualPoints,\n { ...params, selectionBounds: params.selectionBounds },\n timeRatio,\n cutoffTime\n );\n }\n }\n\n /**\n * Draw split shadow trapezoids with cutoff\n * @param {Array} individualPoints - Points defining the line\n * @param {Object} params - Rendering parameters\n * @param {number} timeRatio - Position of cutoff in visible range (0-1)\n * @param {number} cutoffTime - Cutoff timestamp\n */\n drawSplitShadowTrapezoids(individualPoints, params, timeRatio, cutoffTime) {\n const { zero, cutoffOpacity, selectionBounds } = params;\n const gl = this._gl;\n\n const renderWidth = gl.canvas.width;\n const cutoffPixelX = timeRatio * renderWidth;\n\n const preCutoffPoints = [];\n const postCutoffPoints = [];\n \n for (let i = 0; i < individualPoints.length; i++) {\n const [pixelX, pixelY] = individualPoints[i];\n \n if (pixelX < cutoffPixelX) {\n preCutoffPoints.push(individualPoints[i]);\n } else {\n postCutoffPoints.push(individualPoints[i]);\n }\n }\n \n let ghostPoint = null;\n if (preCutoffPoints.length > 0 && postCutoffPoints.length > 0) {\n const lastPrePoint = preCutoffPoints[preCutoffPoints.length - 1];\n const firstPostPoint = postCutoffPoints[0];\n \n const [x1, y1] = lastPrePoint;\n const [x2, y2] = firstPostPoint;\n \n if (x2 !== x1) {\n const interpolationRatio = (cutoffPixelX - x1) / (x2 - x1);\n const ghostY = y1 + interpolationRatio * (y2 - y1);\n ghostPoint = [cutoffPixelX, ghostY];\n \n preCutoffPoints.push(ghostPoint);\n postCutoffPoints.unshift(ghostPoint);\n }\n }\n\n if (preCutoffPoints.length >= 2) {\n const reducedOpacityColor = applyReducedOpacity(\n params.color,\n cutoffOpacity\n );\n const gl = this._gl;\n\n gl.disable(gl.DEPTH_TEST);\n\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n const translucentGradient = applyReducedOpacityToGradient(\n params.gradient,\n cutoffOpacity\n );\n\n this.draw(preCutoffPoints, {\n ...params,\n color: reducedOpacityColor,\n gradient: translucentGradient,\n renderCutoffGradient: false,\n });\n } else {\n }\n\n if (postCutoffPoints.length >= 2) {\n this.draw(postCutoffPoints, {\n ...params,\n renderCutoffGradient: false,\n });\n } else {\n }\n }\n}\n","import Eventable from '../eventable';\nimport getColor, { createDefaultGradient } from '../helpers/colors';\nimport inferType from '../state/infer_type';\nimport BackgroundProgram from './background_program.js';\nimport drawArea from './draw_area';\nimport drawBackground from './draw_background.js';\nimport drawBars from './draw_bars';\nimport drawLine from './draw_line';\nimport LineProgram from './line_program';\nimport ShadowProgram from './shadow_program';\nimport sizeCanvas, { DPI_INCREASE } from './size_canvas';\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 \n if (!this._canvas) {\n console.error('Canvas element is null in GraphBodyRenderer constructor');\n this._initialized = false;\n return;\n }\n \n if (webgl) {\n this._context = this._canvas.getContext('webgl');\n if (this._context) {\n this._lineProgram = new LineProgram(this._context);\n this._shadowProgram = new ShadowProgram(this._context);\n } else {\n console.error('❌ WebGL context creation failed');\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 if (!this._context) {\n console.error('Failed to get canvas context in GraphBodyRenderer');\n this._initialized = false;\n return;\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._shadowProgram && this._shadowProgram.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 if (this._zeroLineCanvas && this._zeroLineCanvas.parentNode) {\n this._zeroLineCanvas.parentNode.removeChild(this._zeroLineCanvas);\n this._zeroLineCanvas = null;\n this._zeroLineContext = null;\n }\n }\n\n clear() {\n if (this._webgl) {\n this._lineProgram.clear();\n // Also clear the overlay canvas if it exists (for multi shadow charts)\n if (this._overlayContext) {\n this._overlayContext.clearRect(0, 0, this._overlayCanvas.width, this._overlayCanvas.height);\n }\n // Reset the initialization flag so canvas can be resized if needed\n this._overlayCanvasInitialized = false;\n } else {\n this._context.clearRect(0, 0, this._context.canvas.width, this._context.canvas.height);\n }\n }\n\n render(singleSeries, inRenderSpace, { highlighted, showIndividualPoints, shadowColor, shadowBlur, width, defaultLineWidth, bounds, globalBounds, inRenderSpaceAreaBottom }) {\n if (!this._initialized || !this._context || !this._canvas) {\n console.warn('GraphBodyRenderer: Cannot render - not initialized, missing context, or missing canvas');\n return;\n }\n \n let cutoffIndex = -1;\n let cutoffTime = null; \n let cutoffData = singleSeries.data; \n\n const isObjectFormat = singleSeries.data && singleSeries.data.length > 0 && \n typeof singleSeries.data[0] === 'object' && \n !Array.isArray(singleSeries.data[0]);\n \n if (isObjectFormat && singleSeries.cutoffTime) {\n cutoffData = singleSeries.data.map(point => {\n const xValue = point[singleSeries.xKey || 'x'];\n const yValue = point[singleSeries.yKey || 'y'];\n \n const convertedX = typeof xValue === 'string' ? new Date(xValue) : xValue;\n \n return [convertedX, yValue];\n });\n }\n \n if (singleSeries.cutoffTime && singleSeries.data && singleSeries.data.length > 0) {\n let cutoffDate;\n if (singleSeries.cutoffTime === 'now') {\n cutoffDate = new Date();\n } else if (typeof singleSeries.cutoffTime === 'number') {\n cutoffDate = new Date(singleSeries.cutoffTime);\n } else {\n cutoffDate = singleSeries.cutoffTime;\n }\n \n cutoffTime = cutoffDate instanceof Date ? cutoffDate.getTime() : cutoffDate;\n \n for (let i = 0; i < cutoffData.length - 1; i++) {\n const currentPoint = cutoffData[i];\n const nextPoint = cutoffData[i + 1];\n \n const currentTime = currentPoint[0] instanceof Date ? currentPoint[0].getTime() : currentPoint[0];\n const nextTime = nextPoint[0] instanceof Date ? nextPoint[0].getTime() : nextPoint[0];\n \n if (currentTime <= cutoffTime && cutoffTime <= nextTime) {\n const timeRatio = (cutoffTime - currentTime) / (nextTime - currentTime);\n cutoffIndex = i + timeRatio;\n break;\n } else if (currentTime > cutoffTime) {\n cutoffIndex = i;\n break;\n }\n }\n \n if (cutoffIndex === -1) {\n cutoffIndex = cutoffData.length - 1;\n }\n }\n \n const getIndividualPoints = (useDataSpace, includeBeyondBounds = false) => {\n if (!useDataSpace && inRenderSpace && inRenderSpace.yValues && !showIndividualPoints) {\n if (!bounds) {\n bounds = singleSeries.axis.currentBounds;\n }\n \n const individualPoints = [];\n const { yValues, nullMask } = inRenderSpace;\n const threshold = yValues.length / 2;\n let pastThreshold = 0;\n const samples = [];\n \n for (let pixelX = 0; pixelX < yValues.length; pixelX++) {\n if (nullMask[pixelX] === 0) {\n const xCoord = pixelX * DPI_INCREASE;\n individualPoints.push([xCoord, yValues[pixelX]]);\n \n if (pixelX > threshold) {\n pastThreshold++;\n if (samples.length < 3) samples.push({pixelX, xCoord, nullMask: nullMask[pixelX]});\n }\n }\n }\n \n if (individualPoints.length < 50) {\n return getIndividualPoints(true, includeBeyondBounds);\n }\n\n return individualPoints;\n }\n\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 let boundsMinX = bounds.minX instanceof Date ? bounds.minX.getTime() : bounds.minX;\n let boundsMaxX = bounds.maxX instanceof Date ? bounds.maxX.getTime() : bounds.maxX;\n \n let foundBeyondBounds = false;\n let lastPointBeforeBounds = null;\n \n for (let i = 0; i < data.length; i++) {\n let x, y;\n \n if (Array.isArray(data[i])) {\n [x, y] = data[i];\n } else if (typeof data[i] === 'object' && data[i] !== null) {\n x = data[i][singleSeries.xKey];\n y = data[i][singleSeries.yKey];\n } else {\n continue;\n }\n \n if (y === null || y === undefined) {\n continue;\n }\n\n let xValue = x instanceof Date ? x.getTime() : x;\n \n if (xValue < boundsMinX) {\n if (includeBeyondBounds) {\n lastPointBeforeBounds = [xValue, y];\n }\n continue;\n }\n \n if (xValue > boundsMaxX) {\n if (includeBeyondBounds && !foundBeyondBounds) {\n foundBeyondBounds = true;\n } else {\n break;\n }\n }\n\n const renderWidth = this._sizing.renderWidth / DPI_INCREASE;\n const xCoord = (xValue - boundsMinX) / (boundsMaxX - boundsMinX) * (renderWidth - 1) * DPI_INCREASE;\n const yCoord = (1.0 - (y - bounds.minY) / (bounds.maxY - bounds.minY)) * this._sizing.renderHeight;\n \n individualPoints.push([xCoord, yCoord]);\n }\n\n if (lastPointBeforeBounds && includeBeyondBounds) {\n const [beforeXValue, beforeY] = lastPointBeforeBounds;\n const renderWidth = this._sizing.renderWidth / DPI_INCREASE;\n const beforeXCoord = (beforeXValue - boundsMinX) / (boundsMaxX - boundsMinX) * (renderWidth - 1) * DPI_INCREASE;\n const beforeYCoord = (1.0 - (beforeY - bounds.minY) / (bounds.maxY - bounds.minY)) * this._sizing.renderHeight;\n individualPoints.unshift([beforeXCoord, beforeYCoord]);\n }\n\n return individualPoints;\n };\n\n const getRanges = () => {\n if (!bounds) {\n bounds = singleSeries.axis.currentBounds;\n }\n\n if (!singleSeries.rangeKey) {\n return [];\n }\n\n const inferredType = inferType(singleSeries, { useSimpleData: true });\n if (inferredType !== 'objects') {\n return [];\n }\n\n return (singleSeries.simpleData || singleSeries.data).map((object) => {\n const range = object[singleSeries.rangeKey];\n\n if (!range) {\n return null;\n }\n\n const min = range.min;\n const max = range.max;\n const x = object[singleSeries.xKey];\n\n return {\n x,\n range,\n\n pixelX: (x - bounds.minX) / (bounds.maxX - bounds.minX) * this._sizing.renderWidth,\n pixelMinY: typeof min === 'number' ? (1.0 - (min - bounds.minY) / (bounds.maxY - bounds.minY)) * this._sizing.renderHeight : null,\n pixelMaxY: typeof max === 'number' ? (1.0 - (max - bounds.minY) / (bounds.maxY - bounds.minY)) * this._sizing.renderHeight : null\n };\n });\n };\n\n const cpuRendering = singleSeries.rendering === 'bar' || singleSeries.rendering === 'area';\n let commonCPUParams;\n\n if (cpuRendering) {\n if (this._webgl) {\n console.warn(`CPU rendering (${singleSeries.rendering}) is not supported with webgl={true}. Use webgl={false} or switch to 'line' rendering.`);\n return;\n }\n \n if (!this._context2d) {\n this._context2d = this._canvas.getContext('2d', { willReadFrequently: false });\n }\n \n if (!this._context2d) {\n console.error('Failed to get 2D context for CPU rendering');\n return;\n }\n\n if (this._webgl) {\n this._context.flush();\n }\n\n if (!bounds) {\n bounds = singleSeries.axis?.currentBounds;\n }\n\n if (!bounds) {\n console.error('No bounds available for rendering');\n return;\n }\n\n const zero = singleSeries.zeroLineY === 'bottom' ?\n this._sizing.renderHeight :\n (1.0 - ((singleSeries.zeroLineY || 0) - bounds.minY) / (bounds.maxY - bounds.minY)) * this._sizing.renderHeight;\n\n commonCPUParams = {\n context: this._context2d,\n color: getColor(singleSeries.color, singleSeries.index, singleSeries.multigrapherSeriesIndex),\n sizing: this._sizing,\n zero,\n hasNegatives: !!singleSeries.inDataSpace.find((tuple) => tuple[1] < 0),\n negativeColor: singleSeries.negativeColor,\n zeroWidth: singleSeries.zeroLineWidth,\n zeroColor: singleSeries.zeroLineColor\n };\n\n if (!commonCPUParams.hasNegatives && singleSeries.expandYWith) {\n commonCPUParams.hasNegatives = singleSeries.expandYWith.some((y) => y < 0);\n }\n }\n\n if (singleSeries.rendering === 'bar') {\n let barParams = {\n ...commonCPUParams,\n indexInAxis: singleSeries.axis.series.indexOf(singleSeries),\n axisSeriesCount: singleSeries.axis.series.length,\n closestSpacing: globalBounds.closestSpacing,\n bounds\n };\n\n if (singleSeries.cutoffTime) {\n barParams.cutoffIndex = cutoffIndex;\n barParams.cutoffOpacity = singleSeries.cutoffOpacity !== undefined ? singleSeries.cutoffOpacity : 0.35;\n barParams.originalData = cutoffData;\n barParams.renderCutoffGradient = cutoffIndex >= 0; \n \n const selection = this === this._stateController.rangeGraphRenderer \n ? this._stateController._bounds \n : (this._stateController._selection || this._stateController._bounds);\n barParams.selectionBounds = selection;\n }\n\n drawBars(getIndividualPoints(true), barParams);\n return;\n }\n\n if (singleSeries.rendering === 'area') {\n let areaParams = {\n ...commonCPUParams,\n showIndividualPoints: typeof singleSeries.showIndividualPoints === 'boolean' ? singleSeries.showIndividualPoints : showIndividualPoints,\n gradient: singleSeries.gradient,\n negativeGradient: singleSeries.negativeGradient,\n pointRadius: singleSeries.pointRadius,\n minPointSpacing: singleSeries.minPointSpacing,\n highlighted,\n width: width || singleSeries.width || defaultLineWidth,\n shadowColor,\n shadowBlur,\n inRenderSpaceAreaBottom\n };\n\n if (singleSeries.cutoffTime) {\n areaParams.cutoffIndex = cutoffIndex;\n areaParams.cutoffOpacity = singleSeries.cutoffOpacity !== undefined ? singleSeries.cutoffOpacity : 0.35;\n areaParams.originalData = cutoffData;\n areaParams.renderCutoffGradient = cutoffIndex >= 0; \n areaParams.isPreview = this === this._stateController.rangeGraphRenderer; \n \n const selection = this === this._stateController.rangeGraphRenderer \n ? this._stateController._bounds \n : (this._stateController._selection || this._stateController._bounds);\n areaParams.selectionBounds = selection;\n }\n\n drawArea(getIndividualPoints(true), inRenderSpace, areaParams);\n }\n\n if (singleSeries.rendering === 'shadow') {\n if (!this._webgl || !this._shadowProgram) {\n console.warn('Shadow rendering requires WebGL. Enable webgl={true} on your Grapher component.', {\n webgl: !!this._webgl,\n shadowProgram: !!this._shadowProgram,\n program: !!this._shadowProgram?._program\n });\n return;\n }\n \n if (!this._shadowProgram._program) {\n console.error('ShadowProgram has no valid WebGL program');\n return;\n }\n \n if (!inRenderSpace) {\n console.error('inRenderSpace is null for shadow rendering');\n return;\n }\n \n if (!bounds) {\n bounds = singleSeries.axis?.currentBounds;\n }\n \n if (!bounds) {\n console.error('No bounds available for shadow rendering');\n return;\n }\n \n let zero;\n if (singleSeries.zeroLineY === 'bottom') {\n zero = this._sizing.renderHeight;\n } else if (singleSeries.zeroLineY !== undefined) {\n zero = (1.0 - ((singleSeries.zeroLineY) - bounds.minY) / (bounds.maxY - bounds.minY)) * this._sizing.renderHeight;\n } else {\n if (bounds.minY <= 0 && bounds.maxY >= 0) {\n zero = (1.0 - (0 - bounds.minY) / (bounds.maxY - bounds.minY)) * this._sizing.renderHeight;\n } else {\n zero = this._sizing.renderHeight;\n }\n }\n \n const boundsChanged = !this._lastBounds || \n bounds.minY !== this._lastBounds.minY || \n bounds.maxY !== this._lastBounds.maxY || \n this._sizing.renderHeight !== this._lastRenderHeight;\n \n this._lastBounds = {...bounds};\n this._lastRenderHeight = this._sizing.renderHeight;\n \n if (boundsChanged && this._lastShadowCache) {\n this._lastShadowCache = null;\n }\n \n if (zero > this._sizing.renderHeight * 1.5) {\n zero = this._sizing.renderHeight;\n } else if (zero < -this._sizing.renderHeight * 0.5) {\n zero = 0;\n }\n \n const shadowColor = getColor(singleSeries.color, singleSeries.index, singleSeries.multigrapherSeriesIndex);\n const hasNegatives = !!singleSeries.inDataSpace.find((tuple) => tuple[1] < 0);\n let shadowParams = {\n color: shadowColor,\n gradient: singleSeries.gradient || createDefaultGradient(shadowColor),\n negativeGradient: singleSeries.negativeGradient,\n hasNegatives,\n zero,\n sizing: this._sizing,\n inRenderSpaceAreaBottom\n };\n\n if (singleSeries.cutoffTime) {\n shadowParams.cutoffIndex = cutoffIndex;\n shadowParams.cutoffOpacity = singleSeries.cutoffOpacity !== undefined ? singleSeries.cutoffOpacity : 0.35;\n shadowParams.originalData = cutoffData;\n shadowParams.renderCutoffGradient = cutoffIndex >= 0; \n shadowParams.isPreview = this === this._stateController.rangeGraphRenderer; \n\n const selection = this === this._stateController.rangeGraphRenderer \n ? this._stateController._bounds \n : (this._stateController._selection || this._stateController._bounds);\n shadowParams.selectionBounds = selection || bounds;\n }\n\n this._shadowProgram.draw(getIndividualPoints(false, true), shadowParams);\n \n if (this._webgl) {\n const gl = this._context;\n gl.disable(gl.BLEND);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n }\n \n if (singleSeries.zeroLineWidth && singleSeries.zeroLineWidth > 0) {\n if (this._context2d) {\n this._context2d.save();\n this._context2d.strokeStyle = singleSeries.zeroLineColor || getColor(singleSeries.color, singleSeries.index, singleSeries.multigrapherSeriesIndex);\n this._context2d.lineWidth = singleSeries.zeroLineWidth;\n this._context2d.globalCompositeOperation = 'source-over';\n \n this._context2d.beginPath();\n this._context2d.moveTo(0, zero);\n this._context2d.lineTo(this._sizing.renderWidth, zero);\n this._context2d.stroke();\n this._context2d.restore();\n } else {\n if (!this._zeroLineCanvas) {\n this._zeroLineCanvas = document.createElement('canvas');\n this._zeroLineCanvas.style.position = 'absolute';\n this._zeroLineCanvas.style.top = '0';\n this._zeroLineCanvas.style.left = '0';\n this._zeroLineCanvas.style.pointerEvents = 'none';\n this._zeroLineContext = this._zeroLineCanvas.getContext('2d');\n this._canvas.parentNode.insertBefore(this._zeroLineCanvas, this._canvas.nextSibling);\n }\n \n this._zeroLineCanvas.width = this._canvas.width;\n this._zeroLineCanvas.height = this._canvas.height;\n this._zeroLineCanvas.style.width = this._canvas.style.width;\n this._zeroLineCanvas.style.height = this._canvas.style.height;\n \n this._zeroLineContext.clearRect(0, 0, this._zeroLineCanvas.width, this._zeroLineCanvas.height);\n this._zeroLineContext.strokeStyle = singleSeries.zeroLineColor || getColor(singleSeries.color, singleSeries.index, singleSeries.multigrapherSeriesIndex);\n this._zeroLineContext.lineWidth = singleSeries.zeroLineWidth;\n \n this._zeroLineContext.beginPath();\n this._zeroLineContext.moveTo(0, zero);\n this._zeroLineContext.lineTo(this._sizing.renderWidth, zero);\n this._zeroLineContext.stroke();\n }\n }\n }\n\n const isRangeGraph = this === this._stateController.rangeGraphRenderer;\n const shouldShowIndividualPoints = isRangeGraph \n ? false \n : (typeof singleSeries.showIndividualPoints === 'boolean' ? singleSeries.showIndividualPoints : showIndividualPoints);\n\n if (!bounds) {\n bounds = singleSeries.axis?.currentBounds || globalBounds;\n }\n\n let zero;\n if (singleSeries.zeroLineY === 'bottom') {\n zero = this._sizing.renderHeight;\n } else if (singleSeries.zeroLineY !== undefined && bounds) {\n zero = (1.0 - ((singleSeries.zeroLineY) - bounds.minY) / (bounds.maxY - bounds.minY)) * this._sizing.renderHeight;\n } else if (bounds) {\n if (bounds.minY <= 0 && bounds.maxY >= 0) {\n zero = (1.0 - (0 - bounds.minY) / (bounds.maxY - bounds.minY)) * this._sizing.renderHeight;\n } else {\n zero = this._sizing.renderHeight;\n }\n } else {\n zero = this._sizing.renderHeight;\n }\n const hasNegatives = !!singleSeries.inDataSpace.find((tuple) => tuple[1] < 0);\n\n // For WebGL shadow rendering, we need a separate 2D canvas overlay for lines/points\n // since WebGL and 2D contexts can't coexist on the same canvas\n let drawContext = this._context;\n \n if (this._webgl && singleSeries.rendering === 'shadow') {\n // Always create overlay for shadow charts since they need 2D context for drawLine\n if (!this._overlayCanvas) {\n this._overlayCanvas = document.createElement('canvas');\n this._overlayCanvas.style.position = 'absolute';\n this._overlayCanvas.style.top = '0';\n this._overlayCanvas.style.left = '0';\n this._overlayCanvas.style.pointerEvents = 'none';\n this._overlayContext = this._overlayCanvas.getContext('2d');\n this._canvas.parentNode.insertBefore(this._overlayCanvas, this._canvas.nextSibling);\n }\n \n // Size the overlay canvas to match the main canvas (only once when creating)\n if (!this._overlayCanvasInitialized) {\n this._overlayCanvas.width = this._canvas.width;\n this._overlayCanvas.height = this._canvas.height;\n this._overlayCanvas.style.width = this._canvas.style.width;\n this._overlayCanvas.style.height = this._canvas.style.height;\n this._overlayCanvasInitialized = true;\n }\n drawContext = this._overlayContext;\n } else if (this._context2d) {\n // For non-WebGL or non-shadow charts with 2D context\n drawContext = this._context2d;\n } else if (this._webgl) {\n // Fallback for WebGL: create a temporary context for drawing lines\n console.warn('Creating fallback 2D context for WebGL shadow chart');\n if (!this._fallbackContext) {\n const fallbackCanvas = document.createElement('canvas');\n fallbackCanvas.width = this._canvas.width;\n fallbackCanvas.height = this._canvas.height;\n this._fallbackContext = fallbackCanvas.getContext('2d');\n }\n drawContext = this._fallbackContext;\n }\n\n const drawParams = {\n color: getColor(singleSeries.color, singleSeries.index, singleSeries.multigrapherSeriesIndex),\n context: drawContext,\n width: width || singleSeries.width || defaultLineWidth,\n shadowColor,\n shadowBlur,\n dashed: singleSeries.dashed,\n dashPattern: singleSeries.dashPattern,\n highlighted,\n showIndividualPoints: shouldShowIndividualPoints,\n pointRadius: singleSeries.pointRadius,\n minPointSpacing: singleSeries.minPointSpacing,\n getIndividualPoints,\n getRanges: singleSeries.rangeKey ? getRanges : null,\n rendering: singleSeries.rendering, // Pass rendering type for all charts\n negativeColor: singleSeries.negativeColor,\n hasNegatives,\n zero,\n zeroColor: singleSeries.zeroLineColor\n };\n \n if (this._webgl && singleSeries.rendering === 'shadow' && singleSeries.cutoffTime && (width > 0 || shouldShowIndividualPoints)) {\n drawParams.cutoffIndex = cutoffIndex;\n drawParams.cutoffOpacity = singleSeries.cutoffOpacity !== undefined ? singleSeries.cutoffOpacity : 0.35;\n drawParams.originalData = cutoffData;\n drawParams.renderCutoffGradient = cutoffIndex >= 0;\n \n const selection = this === this._stateController.rangeGraphRenderer \n ? this._stateController._bounds \n : (this._stateController._selection || this._stateController._bounds);\n drawParams.selectionBounds = selection || bounds;\n drawParams.currentBounds = bounds;\n }\n \n\n if (!inRenderSpace) {\n console.error('inRenderSpace is null for line rendering');\n return;\n }\n \n if (singleSeries.cutoffTime) {\n drawParams.cutoffIndex = cutoffIndex;\n drawParams.cutoffOpacity = singleSeries.cutoffOpacity !== undefined ? singleSeries.cutoffOpacity : 0.35;\n drawParams.originalData = cutoffData;\n drawParams.renderCutoffGradient = cutoffIndex >= 0;\n drawParams.currentBounds = bounds;\n drawParams.isPreview = this === this._stateController.rangeGraphRenderer;\n \n const selection = this === this._stateController.rangeGraphRenderer \n ? this._stateController._bounds \n : (this._stateController._selection || this._stateController._bounds);\n drawParams.selectionBounds = selection || bounds; \n }\n \n // For shadow rendering, always use 2D canvas for lines/points even with WebGL\n // This is because shadow uses WebGL for the fill but needs 2D canvas for lines/points\n // to support negativeColor and other features\n if (this._webgl && singleSeries.rendering !== 'shadow') {\n this._lineProgram.draw(inRenderSpace, drawParams);\n } else {\n drawLine(inRenderSpace, drawParams);\n }\n \n }\n\n renderBackground(inBackgroundSpace) {\n if (!inBackgroundSpace) {\n return;\n }\n\n if (this._webgl) {\n if (!this._backgroundProgram) {\n this._backgroundProgram = new BackgroundProgram(this._context);\n }\n \n this._backgroundProgram.draw(inBackgroundSpace);\n } else {\n drawBackground(inBackgroundSpace, {\n context: this._context\n });\n }\n }\n\n /**\n * Initializes canvas\n * Currently, just sets sizing\n */\n async _initializeCanvas() {\n this._sizing = await sizeCanvas(this._canvas, this._context);\n\n this.emit('size_changed', this._sizing);\n this._stateController.markSizeChanged();\n\n if (window.ResizeObserver) {\n let first = true;\n let disabled = false;\n\n this._resizeObserver = new window.ResizeObserver( () => {\n if (first) { // always fires once at the beginning\n first = false;\n return;\n }\n\n if (disabled) {\n return;\n }\n\n disabled = true;\n this.resize().then(() => {\n disabled = false;\n });\n });\n\n this._resizeObserver.observe(this._canvas.parentNode);\n }\n\n if (this._checkIntersection && window.IntersectionObserver) {\n this._intersectionObserver = new window.IntersectionObserver((entries) => {\n clearTimeout(this._intersectionTimeout);\n\n if (!entries[0].isIntersecting) {\n return;\n }\n\n this._intersectionTimeout = setTimeout(() => {\n this.resize();\n }, 50);\n }, {\n threshold: 0.1\n });\n\n this._intersectionObserver.observe(this._canvas.parentNode);\n }\n }\n\n async resize() {\n const sizingPromise = sizeCanvas(this._canvas, this._context, { reset: true });\n this._initialized = sizingPromise;\n\n this._sizing = await this._initialized;\n if (this._initialized !== sizingPromise) {\n return;\n }\n\n this.emit('size_changed', this._sizing);\n this._stateController.markSizeChanged(this);\n }\n\n resizeDebounced() {\n if (this._resizeTimeout) {\n clearTimeout(this._resizeTimeout);\n }\n\n this._resizeTimeout = setTimeout(() => {\n this.resize();\n this._resizeTimeout = null;\n }, 50);\n }\n\n recalculatePosition() {\n if (!this._sizing) {\n return;\n }\n\n this._sizing.boundingRect = this._canvas.getBoundingClientRect();\n }\n\n /**\n * Returns the bounding rect of the element\n *\n * @return {DOMRect}\n */\n get boundingRect() {\n return this._sizing?.boundingRect;\n }\n\n get sizing() {\n return this._sizing;\n }\n\n}\n","/**\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 if (!context) {\n console.error('Canvas context is null in drawBackground');\n return;\n }\n \n const width = context.canvas.width;\n const height = context.canvas.height;\n\n for (let { minXt, maxXt, color } of data) {\n context.fillStyle = color;\n context.fillRect(minXt*width, 0, (maxXt - minXt)*width, height);\n }\n}\n","export function calculatePrecision(value) {\n return Math.max(-Math.log10(Math.abs(value)) + 2, 0);\n}\n\nexport function calculateTimePrecision(minDate, maxDate) {\n minDate = new Date(minDate);\n maxDate = new Date(maxDate);\n\n const range = maxDate.valueOf() - minDate.valueOf();\n if (range < 3*1000) {\n return 'ms';\n } else if (range < 10*60*1000) {\n return 's';\n } else {\n return 'm';\n }\n}\n\nexport function roundToPrecision(value, precision=null) {\n if (precision === null) {\n precision = calculatePrecision(value);\n }\n\n if (isNaN(precision) || precision > 100) {\n return value.toString();\n }\n\n const rounded = value.toFixed(Math.ceil(precision));\n let stripped = rounded;\n if (rounded.includes('.')) {\n stripped = stripped.replace(/\\.?0+$/g, '');\n }\n\n if (stripped === '') {\n return '0';\n }\n\n return stripped;\n}\n\nconst DATE_TIME_FORMATTERS = {};\n\n/**\n * Given a timezone string, gets the offset relative to utc in milliseconds\n * For example, America/New_York in winter is GMT-05:00, so it evaluates to -5*60*60*1000\n *\n * @param {String} timeZone - the time zone string\n * @param {Date} sampleDate - a date to use in the conversions, since it can be time-of-year dependent with Daylight Savings Time\n * @return {number|null}\n */\nfunction timezoneToOffsetMS(timeZone, sampleDate) {\n try { // formats are finicky, so give up rather than abort rendering\n let datetimeFormatter = DATE_TIME_FORMATTERS[timeZone];\n if (!datetimeFormatter) {\n let properTimeZone = timeZone;\n if (!timeZone || timeZone === 'local') {\n properTimeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n }\n\n datetimeFormatter = new Intl.DateTimeFormat('en-US', {\n timeZone: properTimeZone,\n timeZoneName: 'longOffset'\n });\n DATE_TIME_FORMATTERS[timeZone] = datetimeFormatter;\n }\n\n const parts = datetimeFormatter.formatToParts(sampleDate);\n const offsetPart = parts.find(part => part.type === 'timeZoneName');\n\n if (!offsetPart) {\n return null;\n }\n\n if (offsetPart.value === 'GMT') {\n return 0;\n }\n\n if (!/^GMT[+-]\\d{2}:\\d{2}$/.test(offsetPart.value)) {\n return null;\n }\n\n const [hours, minutes] = offsetPart.value.slice(3).split(':');\n\n return parseInt(hours)*60*60*1000 + parseInt(minutes)*60*1000;\n } catch (e) {\n console.error(new Error(`Could not parse timezone offset for ${sampleDate} in ${timeZone}`)); // eslint-disable-line no-console\n console.error(e); // eslint-disable-line no-console\n return null;\n }\n}\n\n/**\n * Gets the Date object that represents the start of day in a given timezone\n * Note that this is still a native date object, so it will be in the local timezone\n * Its timestamp, however, will correspond to the start of the day in the given timezone\n *\n * @param date\n * @param timezone\n * @return {Date}\n */\nexport function startOfDayInTimezone(date, timezone) {\n if (!timezone) {\n const startOfDay = new Date(date);\n startOfDay.setHours(0, 0, 0, 0);\n return startOfDay;\n }\n\n const offset = timezoneToOffsetMS(timezone, date); // ms between timezone and utc\n let startOfDay = new Date(date);\n startOfDay.setUTCHours(0, 0, 0, 0);\n\n const difference = startOfDay.valueOf() - date.valueOf();\n\n // if we would have gone forward a day when offset is taken into account, we need to go back a day again\n if (difference > offset) {\n startOfDay = new Date(startOfDay.valueOf() - 24*60*60*1000);\n }\n\n return new Date(startOfDay.valueOf() - offset);\n}\n\nfunction formatTime(time, {precision, justTime, justDate, justMonthAndDay, unitOverride, clockStyle='24h', timeZone}) {\n const utc = timeZone && timeZone.toLowerCase() === 'utc';\n if (timeZone && !utc && timeZone !== 'local' && window.Intl && window.Intl.DateTimeFormat) {\n const offset = timezoneToOffsetMS(timeZone, time);\n const localOffset = timezoneToOffsetMS('local', time);\n\n if (typeof offset === 'number' && typeof localOffset === 'number') {\n time = new Date(time.valueOf() + offset - localOffset);\n }\n }\n\n const year = utc ? time.getUTCFullYear() : time.getFullYear();\n const month = (utc ? time.getUTCMonth() : time.getMonth()) + 1;\n const day = utc ? time.getUTCDate() : time.getDate();\n\n if (unitOverride === 'year') {\n return year.toString();\n }\n\n if (justDate) {\n return utc ? `${month}/${day}/${year}` : time.toLocaleDateString();\n }\n\n if (justMonthAndDay) {\n // eg Jan 19\n const monthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n return `${monthNames[month - 1]} ${day}`;\n }\n\n const hours = utc ? time.getUTCHours() : time.getHours();\n const minutes = utc ? time.getUTCMinutes() : time.getMinutes();\n const seconds = utc ? time.getUTCSeconds() : time.getSeconds();\n const milliseconds = utc ? time.getUTCMilliseconds() : time.getMilliseconds();\n\n let timeString;\n\n if (clockStyle === '12h') {\n timeString = `${((hours + 11) % 12 + 1).toString()}:${minutes.toString().padStart(2, '0')}`;\n } else {\n timeString = `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}`;\n }\n\n if (precision === 's' || precision === 'ms') {\n timeString += `:${seconds.toString().padStart(2, '0')}`;\n }\n\n if (precision === 'ms') {\n timeString += `.${milliseconds.toString().padStart(3, '0')}`;\n }\n\n if (clockStyle === '12h') {\n timeString += hours >= 12 ? 'pm' : 'am';\n }\n\n if (justTime) {\n return timeString;\n }\n\n if (utc) {\n timeString += ' UTC';\n }\n\n return (utc ? `${month}/${day}/${year}` : time.toLocaleDateString()) + ' ' + timeString;\n}\n\nexport function formatX(x, {dates=false, precision=null, justTime=false, justDate=false, justMonthAndDay=false, clockStyle='24h', unitOverride, timeZone, integersOnly=false, inverseEnumMap}={}) {\n if (dates && !(x instanceof Date)) {\n x = new Date(x);\n\n if (isNaN(x)) {\n return 'Invalid Date';\n }\n }\n\n if (x instanceof Date) {\n return formatTime(x, {precision, justTime, justDate, justMonthAndDay, unitOverride, clockStyle, timeZone});\n }\n\n if (isNaN(x)) {\n return 'NaN';\n }\n\n if (inverseEnumMap) {\n if (Math.abs(x - Math.round(x)) > 1e-10) {\n return '';\n }\n\n return inverseEnumMap[Math.round(x)];\n }\n\n if (integersOnly && Math.abs(x - Math.round(x)) > 1e-10) {\n return '';\n }\n\n return roundToPrecision(x, precision);\n}\n\nexport function formatY(y, {precision=null, log=false}={}) {\n if (y === null) {\n return 'null';\n }\n\n if (isNaN(y)) {\n return 'NaN';\n }\n\n if (log) {\n return `10^${roundToPrecision(Math.log10(y), precision)}`;\n }\n\n return roundToPrecision(y, precision);\n}\n","export const Y_AXIS_WIDTH = 32;\nexport const BIG_Y_AXIS_LABEL_OFFSET = 20;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport {formatX, formatY} from '../helpers/format';\nimport {Y_AXIS_WIDTH} from '../helpers/axis_sizes';\nimport CustomPropTypes from '../helpers/custom_prop_types';\n\nfunction getYLabelContent({ yLabel, y, fullYPrecision}) {\n if (fullYPrecision && !yLabel) {\n if (y === undefined) {\n return 'undefined';\n }\n\n if (y === null) {\n return 'null';\n }\n\n return y.toString();\n }\n\n if (typeof yLabel === 'number') {\n if (fullYPrecision) {\n return yLabel.toString();\n } else {\n return formatY(yLabel);\n }\n }\n\n if (typeof yLabel === 'object') {\n return formatY(y);\n }\n\n return yLabel || formatY(y);\n}\n\nfunction TooltipLabel({ axisLabel, x, y, xLabel, yLabel, textLeft, textTop, includeSeriesLabel, includeXValue, includeYValue, includeXLabel, includeYLabel, fullYPrecision, formatXOptions }) {\n let i = 0;\n\n return (\n <g>\n {\n includeSeriesLabel &&\n <text x={textLeft} y={textTop + (i++)*12}>\n {axisLabel}\n </text>\n }\n\n {\n includeXValue &&\n <text x={textLeft} y={textTop + (i++) * 12}>\n {includeXLabel && 'x: '}{xLabel || formatX(x, formatXOptions)}\n </text>\n }\n\n {\n includeYValue &&\n <text x={textLeft} y={textTop + (i++) * 12}>\n {includeYLabel && 'y: '}{getYLabelContent({ yLabel, y, fullYPrecision})}\n </text>\n }\n </g>\n );\n}\n\nTooltipLabel.propTypes = {\n axisLabel: PropTypes.string,\n x: PropTypes.oneOfType([PropTypes.number, PropTypes.instanceOf(Date)]),\n y: PropTypes.number,\n xLabel: PropTypes.string,\n yLabel: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n textLeft: PropTypes.number.isRequired,\n textTop: PropTypes.number.isRequired,\n fullYPrecision: PropTypes.bool,\n formatXOptions: PropTypes.object,\n ...CustomPropTypes.TooltipOptionsRaw\n};\n\nexport default class Tooltip extends React.PureComponent {\n\n render() {\n const textPadding = 3;\n let height = 12*3 + 2*textPadding;\n\n if (!this.props.includeSeriesLabel) {\n height -= 12;\n }\n\n if (!this.props.includeXValue) {\n height -= 12;\n }\n\n if (!this.props.includeYValue) {\n height -= 12;\n }\n\n const caretSize = 7;\n const halfHeight = height/2;\n const caretPadding = 4;\n\n const textTop = -halfHeight + textPadding;\n\n const formatXOptions = {\n clockStyle: this.props.clockStyle,\n timeZone: this.props.timeZone\n };\n\n const passThroughProps = {\n includeSeriesLabel: this.props.includeSeriesLabel,\n includeXLabel: this.props.includeXLabel,\n includeYLabel: this.props.includeYLabel,\n includeXValue: this.props.includeXValue,\n includeYValue: this.props.includeYValue,\n formatXOptions\n };\n\n const preparedTooltips = this.props.tooltips.map((tooltip) => {\n const { x, y, pixelY, pixelX, series, index, xLabel, yLabel, fullYPrecision } = tooltip;\n\n if (typeof pixelX !== 'number') {\n return null;\n }\n\n const axisLabel = (series.name || series.yKey || index).toString();\n let width = Math.max(axisLabel.length, (xLabel || formatX(x, formatXOptions)).length + 4, getYLabelContent({ yLabel, y, fullYPrecision}).length + 4) * 7.5;\n if (series.tooltipWidth) {\n width = series.tooltipWidth;\n }\n\n let fixedPosition = this.props.elementWidth < (width + 2*caretSize + 2*caretPadding);\n\n let multiplier = 1;\n if (pixelX >= this.props.elementWidth - (width + 2*caretSize + caretPadding)) {\n multiplier = -1;\n }\n\n if (pixelX < width + 2*caretSize + caretPadding && multiplier === -1) {\n fixedPosition = true;\n }\n\n if (y === null) {\n fixedPosition = true;\n }\n\n if (this.props.alwaysFixedPosition) {\n fixedPosition = true;\n }\n\n let textLeft = caretSize + caretPadding;\n if (multiplier < 0) {\n textLeft = -width - textLeft;\n } else {\n textLeft += 6;\n }\n\n if (!isFinite(pixelX)) {\n return null;\n }\n\n const transform = `translate(${pixelX},${pixelY})`;\n\n const commonLabelProps = {\n fullYPrecision: fullYPrecision || this.props.maxPrecision,\n x,\n y,\n axisLabel,\n xLabel,\n yLabel,\n ...passThroughProps\n };\n\n let yTranslation = 0;\n let baseLeft;\n\n if (fixedPosition) {\n textLeft = 6;\n\n baseLeft = this.props.elementWidth / 2 - width / 2;\n\n if (width > this.props.elementWidth && !this.props.floating) {\n baseLeft -= Y_AXIS_WIDTH * this.props.axisCount / 2;\n }\n\n yTranslation = 18;\n\n if (this.props.floating) {\n if (this.props.floatPosition === 'bottom') {\n yTranslation = this.props.elementHeight + halfHeight + 4;\n } else {\n yTranslation = -height;\n }\n\n if (this.props.floatDelta) {\n yTranslation += this.props.floatDelta;\n }\n }\n }\n\n return {\n ...tooltip,\n label: axisLabel,\n indexInAxis: series?.axis?.series?.indexOf(series),\n axisLabel,\n width,\n fixedPosition,\n multiplier,\n textLeft,\n transform,\n commonLabelProps,\n textTop,\n height,\n caretSize,\n halfHeight,\n caretPadding,\n yTranslation,\n baseLeft\n };\n }).filter(Boolean);\n\n const CustomTooltipComponent = this.props.customTooltip;\n\n let groupedTooltips;\n if (this.props.combineTooltips) {\n let combinationThreshold = 50; // in px how close tooltips should be to combine\n if (typeof this.props.combineTooltips === 'number') {\n combinationThreshold = this.props.combineTooltips;\n }\n\n groupedTooltips = [];\n\n for (let tooltip of preparedTooltips) {\n let added = false;\n for (let group of groupedTooltips) {\n if (Math.abs(group.pixelX - tooltip.pixelX) <= combinationThreshold) {\n group.tooltips.push(tooltip);\n if (tooltip.pixelX > group.pixelX) {\n group.pixelX = tooltip.pixelX;\n group.multiplier = tooltip.multiplier;\n }\n\n if (tooltip.pixelY < group.pixelY) {\n group.pixelY = tooltip.pixelY;\n }\n\n added = true;\n break;\n }\n }\n\n if (!added) {\n groupedTooltips.push({\n pixelX: tooltip.pixelX,\n pixelY: tooltip.pixelY,\n multiplier: tooltip.multiplier,\n tooltips: [tooltip]\n });\n }\n }\n\n for (let group of groupedTooltips) {\n let totalHeight = 0;\n let maxWidth = 0;\n\n // sort by indexInAxis\n group.tooltips.sort((a, b) => a.indexInAxis - b.indexInAxis);\n\n for (let i = 0; i < group.tooltips.length; i++) {\n group.tooltips[i].textTop = totalHeight;\n totalHeight += group.tooltips[i].height;\n maxWidth = Math.max(maxWidth, group.tooltips[i].width);\n }\n\n for (let i = 0; i < group.tooltips.length; i++) {\n group.tooltips[i].textTop -= totalHeight/2;\n group.tooltips[i].textTop += textPadding;\n }\n\n group.height = totalHeight;\n group.halfHeight = totalHeight / 2;\n group.caretSize = caretSize;\n group.width = maxWidth;\n }\n }\n\n return (\n <div className=\"grapher-tooltip\">\n <svg>\n {\n preparedTooltips.map((tooltip, i) => {\n const { color, fixedPosition, width, transform, baseLeft, commonLabelProps, yTranslation, multiplier, textLeft, textTop } = tooltip;\n\n if (this.props.customTooltip || groupedTooltips) {\n return (\n <g key={i} transform={transform} className=\"tooltip-item\">\n <circle r={4} fill={color}/>\n </g>\n );\n }\n\n // display in a fixed position if not wide enough\n if (fixedPosition) {\n return (\n <g key={i} className=\"tooltip-item tooltip-item-fixed\">\n <circle r={4} fill={color} transform={transform} />\n\n <g transform={`translate(${baseLeft}, ${yTranslation})`}>\n <path stroke={color} d={`M0,0 V-${halfHeight} h${width} V${halfHeight} h${-width} V0`} />\n\n <TooltipLabel\n textLeft={textLeft} textTop={textTop}\n {...commonLabelProps}\n />\n </g>\n </g>\n );\n }\n\n return (\n <g key={i} transform={transform} className=\"tooltip-item\">\n <circle r={4} fill={color} />\n\n <path stroke={color} d={`M${multiplier*caretPadding},0 L${multiplier*caretSize*2},-${caretSize} V-${halfHeight} h${multiplier*width} V${halfHeight} h${multiplier*-width} V${caretSize} L${multiplier*caretPadding},0`} />\n\n <TooltipLabel\n textLeft={textLeft} textTop={textTop}\n {...commonLabelProps}\n />\n </g>\n );\n })\n }\n\n {\n !this.props.customTooltip && groupedTooltips &&\n groupedTooltips.map(({ tooltips, pixelX, pixelY, halfHeight, multiplier, color, width }, i) =>\n <g key={i} transform={`translate(${pixelX},${pixelY})`} className=\"tooltip-item\">\n <path stroke={color} d={`M${multiplier*caretPadding},0 L${multiplier*caretSize*2},-${caretSize} V-${halfHeight} h${multiplier*width} V${halfHeight} h${multiplier*-width} V${caretSize} L${multiplier*caretPadding},0`} />\n\n {\n tooltips.map((tooltip, j) =>\n <TooltipLabel\n key={j}\n textTop={tooltip.textTop}\n textLeft={tooltip.textLeft}\n {...tooltip.commonLabelProps}\n />\n )\n }\n </g>\n )\n }\n </svg>\n\n {\n this.props.customTooltip &&\n (groupedTooltips || preparedTooltips).map((tooltip, i) =>\n <div\n key={i}\n className=\"custom-tooltip-container\"\n style={{top: tooltip.pixelY, left: tooltip.pixelX}}\n >\n <CustomTooltipComponent {...tooltip} />\n </div>\n )\n }\n </div>\n );\n }\n\n}\n\nTooltip.defaultProps = {\n includeSeriesLabel: true,\n includeXLabel: true,\n includeYLabel: true,\n includeXValue: true,\n includeYValue: true\n};\n\nTooltip.propTypes = {\n mouseX: PropTypes.number.isRequired,\n mouseY: PropTypes.number.isRequired,\n elementHeight: PropTypes.number.isRequired,\n elementWidth: PropTypes.number.isRequired,\n tooltips: PropTypes.arrayOf(PropTypes.shape({\n x: PropTypes.oneOfType([PropTypes.number, PropTypes.instanceOf(Date)]),\n y: PropTypes.number,\n pixelY: PropTypes.number,\n color: PropTypes.string,\n xLabel: PropTypes.string,\n yLabel: PropTypes.any,\n fullYPrecision: PropTypes.bool\n })),\n axisCount: PropTypes.number.isRequired,\n maxPrecision: PropTypes.bool.isRequired,\n clockStyle: PropTypes.oneOf(['12h', '24h']),\n timeZone: PropTypes.string,\n ...CustomPropTypes.TooltipOptionsRaw\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nexport default class ContextMenu extends React.PureComponent {\n constructor(props) {\n super(props);\n this.setTextRef = this.setTextRef.bind(this);\n }\n \n setTextRef(ref) {\n this.textRef = ref;\n\n if (this.props.contextMenu.showing && this.textRef) {\n const range = document.createRange();\n const selection = window.getSelection();\n\n selection.removeAllRanges();\n\n range.selectNodeContents(this.textRef);\n selection.addRange(range);\n this.textRef.focus();\n }\n }\n \n formatDateTime(dateTimeStr) {\n const [datePart, timePart] = dateTimeStr.split(', ');\n\n const [month, day, year] = datePart.split('/');\n const formattedDate = `${month.padStart(2, '0')}/${day.padStart(2, '0')}/${year}`;\n\n const [time, period] = timePart.split(' ');\n const [hours, minutes] = time.split(':');\n const formattedHours = hours.padStart(2, '0');\n const formattedTime = `${formattedHours}:${minutes} ${period}`;\n\n return `${formattedDate} ${formattedTime}`;\n }\n \n render() {\n const { x, y, showing, value } = this.props.contextMenu;\n\n const style = { left: x, top: y, width: '150px'};\n \n if (!showing || !value || value.toLocaleString() === 'Invalid Date' || isNaN(x) || isNaN(y)) {\n return null;\n }\n\n const displayValue = value instanceof Date ? this.formatDateTime(value.toLocaleString()) : value;\n return (\n <div className=\"grapher-context-menu\" style={style}>\n <div className=\"menu-item\">\n <div className=\"menu-text\" autoFocus={true} ref={this.setTextRef}>\n {displayValue}\n </div>\n </div>\n </div>\n );\n }\n\n}\n\nContextMenu.propTypes = {\n contextMenu: PropTypes.shape({\n x: PropTypes.number,\n y: PropTypes.number,\n showing: PropTypes.bool,\n value: PropTypes.oneOfType([\n PropTypes.instanceOf(Date),\n PropTypes.number,\n PropTypes.object\n ])\n }).isRequired\n};\n","import inferType from '../infer_type';\nimport { SIMPLE_DATA_TYPES } from '../data_types';\n\n/**\n * Given a series of a simple type (ie, not a function or an observable), converts it into data space\n *\n * @param {*} singleSeries\n * @param {Object} options\n * @return {*}\n */\nexport default function simpleSeriesToDataSpace(singleSeries, options={}) {\n const type = inferType(singleSeries, { useSimpleData: true, data: options.data });\n if (!SIMPLE_DATA_TYPES.includes(type)) {\n throw new Error(`Cannot normalize ${type} (expected a simple type)`);\n }\n\n const inDataSpace = {\n tuples: tuplesToDataSpace,\n values: valuesToDataSpace,\n objects: objectsToDataSpace\n }[type](options.data || singleSeries.simpleData || singleSeries.data, singleSeries, options);\n\n if (singleSeries.square) {\n const square = [];\n let prevY = options.prevY;\n for (let tuple of inDataSpace) {\n if (prevY !== undefined) {\n square.push([tuple[0], prevY]);\n }\n square.push(tuple);\n prevY = tuple[1];\n }\n\n return square;\n }\n\n if (singleSeries.shiftXBy) {\n for (let tuple of inDataSpace) {\n if (typeof tuple[0] === 'string') {\n const originalXValue = tuple[0];\n tuple[0] = new Date(new Date(tuple[0]).valueOf() + singleSeries.shiftXBy);\n if (isNaN(tuple[0])) {\n tuple[0] = options.stateController.enumToNumber(originalXValue, singleSeries);\n }\n } else if (tuple[0] instanceof Date) {\n tuple[0] = new Date(tuple[0].valueOf() + singleSeries.shiftXBy);\n } else if (typeof tuple[0] === 'number') {\n tuple[0] += singleSeries.shiftXBy;\n }\n }\n }\n\n if (singleSeries.xUnixDates) {\n for (let tuple of inDataSpace) {\n if (typeof tuple[0] === 'number') {\n tuple[0] = new Date(tuple[0]*1000);\n }\n }\n }\n\n return inDataSpace;\n}\n\n/**\n * Converts a values array to data space\n *\n * @param {Array<Number|String>} data\n * @param {Object} singleSeries\n * @param {Object} options\n * @param {Number} [options.valueXStart]\n * @param {StateController} options.stateController\n * @return {Array<Array<Number|Date|null>>}\n */\nfunction valuesToDataSpace(data, singleSeries, options) {\n const inDataSpace = [];\n\n for (let i = 0; i < data.length; i++) {\n let yValue = data[i];\n\n if (typeof yValue === 'string') {\n yValue = options.stateController.enumToNumber(yValue, singleSeries);\n }\n\n if (typeof yValue === 'boolean') {\n yValue = +yValue;\n }\n\n inDataSpace.push([i + (options.valueXStart || 0), yValue]);\n }\n\n return inDataSpace;\n}\n\n/**\n * Converts a tuples array to data space\n *\n * @param {Array<Array<Number|Date|null>>} data\n * @param {Object} singleSeries\n * @param {Object} options\n * @param {StateController} options.stateController\n * @return {Array<Array<Number|Date|null>>}\n */\nfunction tuplesToDataSpace(data, singleSeries, options) {\n return [...data.map(([ xValue, yValue]) => {\n if (yValue === undefined) {\n yValue = null;\n }\n\n if (typeof xValue === 'string') {\n const originalXValue = xValue;\n xValue = new Date(xValue);\n\n if (isNaN(xValue)) {\n xValue = options.stateController.enumToNumber(originalXValue, singleSeries, true);\n }\n }\n\n if (typeof yValue === 'string') {\n yValue = options.stateController.enumToNumber(yValue, singleSeries);\n }\n\n if (typeof yValue === 'boolean') {\n yValue = +yValue;\n }\n\n return [xValue, yValue];\n })];\n}\n\nfunction readBinaryFormatValue(view, offset, index) {\n const localOffset = view.getUint32(offset + 2 + Uint32Array.BYTES_PER_ELEMENT*index, true);\n\n if (localOffset === 0) {\n return null;\n }\n\n const type = view.getUint8(localOffset);\n\n if (type === 0) {\n return view.getFloat64(offset + localOffset + 1, true);\n } else if (type === 1 || type === 6) {\n return null;\n } else if (type === 3) {\n return new Date(view.getFloat64(offset + localOffset + 1, true));\n } else {\n throw new Error(`Binary format type ${type} not supported`);\n }\n}\n\n/**\n * Converts an objects array to data space\n *\n * @param {Array<Object>} data\n * @param {Object} series\n * @param {Object} options\n * @param {StateController} options.stateController\n * @return {Array<Array<Number|Date|null>>}\n */\nfunction objectsToDataSpace(data, series, options) {\n if (!series.xKey || typeof series.xKey !== 'string') {\n throw new Error('xKey must be provided in the series');\n }\n\n if (!series.yKey || typeof series.yKey !== 'string') {\n throw new Error('yKey must be provided in the series');\n }\n\n const inDataSpace = [];\n\n for (let point of data) {\n if (point.buffer instanceof ArrayBuffer) {\n const view = new DataView(point.buffer);\n const xIndex = point.channels[series.xKey];\n const yIndex = point.channels[series.yKey];\n\n for (let offset of point.offsets) {\n inDataSpace.push([readBinaryFormatValue(view, offset, xIndex), readBinaryFormatValue(view, offset, yIndex)]);\n }\n } else if (Array.isArray(point[series.yKey])) {\n if (point[series.yKey].length && !Array.isArray(point[series.yKey][0]) && typeof point[series.yKey][0] === 'object') {\n for (let subpoint of point[series.yKey]) {\n let yValue = subpoint[series.yKey];\n if (yValue === undefined) {\n yValue = null;\n }\n\n if (typeof yValue === 'string') {\n yValue = options.stateController.enumToNumber(yValue, series);\n }\n\n if (typeof yValue === 'boolean') {\n yValue = +yValue;\n }\n\n let xValue = subpoint[series.xKey];\n if (typeof xValue === 'string') {\n xValue = new Date(xValue);\n }\n\n inDataSpace.push([xValue, yValue]);\n }\n } else {\n inDataSpace.push(...point[series.yKey]);\n }\n } else {\n let yValue = point[series.yKey];\n if (yValue === undefined) {\n yValue = null;\n }\n\n let xValue = point[series.xKey];\n if (typeof xValue === 'string') {\n xValue = new Date(xValue);\n }\n\n if (typeof yValue === 'string') {\n yValue = options.stateController.enumToNumber(yValue, series);\n }\n\n if (typeof yValue === 'boolean') {\n yValue = +yValue;\n }\n\n inDataSpace.push([xValue, yValue]);\n }\n }\n\n return inDataSpace;\n}\n","function finalizeBounds(bounds, { dates }) {\n const initial = (bounds.minX === null && bounds.maxX === null) || bounds.minY === null || bounds.maxY === null;\n\n for (let key of Object.keys(bounds)) {\n if (typeof bounds[key] !== 'number') {\n bounds[key] = 0;\n }\n }\n\n bounds.initial = initial;\n bounds.dates = dates;\n\n return bounds;\n}\n\nfunction percentileBounds(inDataSpace, bounds, {percentile=100, percentileAsymmetry=0}={}) {\n let dates = false;\n\n bounds.minX = inDataSpace[0][0];\n if (bounds.minX instanceof Date) {\n bounds.minX = bounds.minX.valueOf();\n dates = true;\n }\n\n bounds.maxX = inDataSpace[inDataSpace.length - 1][0];\n if (bounds.maxX instanceof Date) {\n bounds.maxX = bounds.maxX.valueOf();\n dates = true;\n }\n\n const sortedByY = inDataSpace\n .filter(([_x, y]) => typeof y === 'number')\n .sort(([_x1, y1], [_x2, y2]) => y1 - y2);\n\n if (!sortedByY.length) {\n return finalizeBounds(bounds, {dates});\n }\n\n const asymmetry = Math.min(Math.abs(percentileAsymmetry), (100-percentile)/2) * (percentileAsymmetry < 0 ? -1 : 1);\n const inBottomPercentile = (100-percentile)/2 + asymmetry;\n const inTopPercentile = (100-percentile)/2 - asymmetry;\n\n const startIndex = Math.floor((sortedByY.length-1)*inBottomPercentile/100);\n const endIndex = Math.floor((sortedByY.length-1)*(100-inTopPercentile)/100);\n\n bounds.minY = sortedByY[startIndex][1];\n bounds.maxY = sortedByY[endIndex][1];\n\n return finalizeBounds(bounds, {dates});\n}\n\nexport default function calculateDataBounds(inDataSpace, {percentile=100, percentileAsymmetry=0}={}) {\n let bounds = {\n minX: null,\n maxX: null,\n minY: null,\n maxY: null,\n closestSpacing: null\n };\n\n if (percentile !== 100 && inDataSpace.length) {\n return percentileBounds(inDataSpace, bounds, {percentile, percentileAsymmetry});\n }\n\n let dates = false;\n let prevX = null;\n\n for (let [x, y] of inDataSpace) {\n if (x instanceof Date) {\n x = x.valueOf();\n dates = true;\n }\n\n if (typeof bounds.minX !== 'number' || x < bounds.minX) {\n bounds.minX = x;\n }\n\n if (typeof bounds.maxX !== 'number' || x > bounds.maxX) {\n bounds.maxX = x;\n }\n\n if (typeof prevX === 'number' && typeof x === 'number') {\n const spacing = x - prevX;\n if (typeof bounds.closestSpacing !== 'number' || spacing < bounds.closestSpacing) {\n bounds.closestSpacing = spacing;\n }\n }\n prevX = x;\n\n if (typeof y !== 'number') {\n continue;\n }\n\n if (typeof bounds.minY !== 'number' || y < bounds.minY) {\n bounds.minY = y;\n }\n\n if (typeof bounds.maxY !== 'number' || y > bounds.maxY) {\n bounds.maxY = y;\n }\n }\n\n return finalizeBounds(bounds, {dates});\n}\n","export default function mergeBounds(boundsList) {\n const mergedBounds = {\n minX: null,\n maxX: null,\n minY: null,\n maxY: null,\n closestSpacing: null,\n dates: false,\n initial: true\n };\n\n for (let { minX, maxX, minY, maxY, dates, initial, closestSpacing } of boundsList) {\n if (dates) {\n mergedBounds.dates = true;\n }\n\n if (initial) {\n continue;\n }\n mergedBounds.initial = false;\n\n if (mergedBounds.minX === null || minX < mergedBounds.minX) {\n mergedBounds.minX = minX;\n }\n\n if (mergedBounds.maxX === null || maxX > mergedBounds.maxX) {\n mergedBounds.maxX = maxX;\n }\n\n if (mergedBounds.closestSpacing === null || closestSpacing < mergedBounds.closestSpacing) {\n mergedBounds.closestSpacing = closestSpacing;\n }\n\n if (mergedBounds.minY === null || minY < mergedBounds.minY) {\n mergedBounds.minY = minY;\n }\n\n if (mergedBounds.maxY === null || maxY > mergedBounds.maxY) {\n mergedBounds.maxY = maxY;\n }\n }\n\n if (mergedBounds.minX === null) {\n mergedBounds.minX = 0;\n }\n\n if (mergedBounds.maxX === null) {\n mergedBounds.maxX = 0;\n }\n\n if (mergedBounds.closestSpacing === null) {\n mergedBounds.closestSpacing = 1;\n }\n\n if (mergedBounds.minY === null) {\n mergedBounds.minY = 0;\n }\n\n if (mergedBounds.maxY === null) {\n mergedBounds.maxY = 0;\n }\n\n return mergedBounds;\n}\n","/**\n * Expands bounds to give a little y padding\n *\n * @param {Object} bounds\n * @param {?Number} bounds.minY\n * @param {?Number} bounds.maxY\n * @param {?Number} bounds.minX\n * @param {?Number} bounds.maxX\n * @param {Array<Number>} [expandYWith]\n * @param {Number} [extendXForNBars=0]\n * @return {Object}\n */\nexport default function expandBounds(bounds, {expandYWith = [], extendXForNBars=0}) {\n const expandedBounds = Object.assign({}, bounds);\n for (let y of expandYWith) {\n if (y === null || y === undefined) {\n continue;\n }\n\n if (typeof expandedBounds.minY !== 'number' || y < expandedBounds.minY) {\n expandedBounds.minY = y;\n }\n\n if (typeof expandedBounds.maxY !== 'number' || y > expandedBounds.maxY) {\n expandedBounds.maxY = y;\n }\n }\n\n expandedBounds.unscaledMinY = expandedBounds.minY;\n expandedBounds.unscaledMaxY = expandedBounds.maxY;\n\n const range = expandedBounds.maxY - expandedBounds.minY;\n const midpoint = expandedBounds.minY + range/2;\n expandedBounds.minY = midpoint - 1.05*range/2;\n expandedBounds.maxY = midpoint + 1.05*range/2;\n\n if (expandedBounds.minY === expandedBounds.maxY && expandedBounds.minY !== null) {\n if (expandedBounds.minY > 0) {\n expandedBounds.minY *= 0.95;\n expandedBounds.maxY *= 1.05;\n } else if (expandedBounds.minY < 0) {\n expandedBounds.minY *= 1.05;\n expandedBounds.maxY *= 0.95;\n } else {\n expandedBounds.minY -= 1;\n expandedBounds.maxY += 1;\n }\n }\n\n if (extendXForNBars && expandedBounds.minX !== expandedBounds.maxX && expandedBounds.minX !== null && expandedBounds.maxX !== null) {\n // Base expansion factor on expected bar count\n const barWidth = (expandedBounds.maxX - expandedBounds.minX) / extendXForNBars;\n expandedBounds.minX -= barWidth/2;\n expandedBounds.maxX += barWidth/2;\n }\n\n return expandedBounds;\n}\n","/**\n * Finds the closest point to the target\n *\n * @param {Array} data - the data, in data space\n * @param {Number} targetX - the x coordinate to get closest to\n * @param {Object} [searchParams]\n * @param {String} [searchParams.searchType] - whether to search for the closest, one before, or one after\n * @param {Boolean} [searchParams.returnIndex] - whether to return the index or the object itself\n * @param {Number} [startIndex] - where to start the search from\n * @param {Number} [endIndex] - where to end the search\n * @return {Array|Number}\n */\nexport default function binarySearch(data, targetX, searchParams={}, startIndex=0, endIndex=undefined) {\n if (endIndex === undefined) {\n endIndex = data.length - 1;\n }\n\n if (data.length === 0) {\n return searchParams.returnIndex ? -1 : [null, null];\n }\n\n const middleIndex = Math.floor((startIndex + endIndex)/2);\n\n if (targetX === data[middleIndex][0] || (data[middleIndex][0] instanceof Date && data[middleIndex][0].valueOf() === targetX)) {\n if (searchParams.returnIndex) {\n return middleIndex;\n } else {\n return data[middleIndex];\n }\n }\n\n if (startIndex === endIndex) {\n if (data[startIndex][0] < targetX && searchParams.searchType === 'before') {\n return searchParams.returnIndex ? startIndex : data[startIndex];\n } else if (data[startIndex][0] > targetX && searchParams.searchType === 'after') {\n return searchParams.returnIndex ? startIndex : data[startIndex];\n } else {\n return searchParams.returnIndex ? -1 : [null, null];\n }\n }\n\n if (endIndex - 1 === startIndex) {\n let index;\n\n if (searchParams.searchType === 'before') {\n index = startIndex;\n // index = (targetX <= data[startIndex][0]) ? startIndex : endIndex;\n } else if (searchParams.searchType === 'after') {\n index = endIndex;\n // index = (targetX >= data[endIndex][0]) ? endIndex : startIndex;\n } else {\n index = Math.abs(data[startIndex][0] - targetX) > Math.abs(data[endIndex][0] - targetX) ?\n endIndex :\n startIndex;\n }\n\n return searchParams.returnIndex ? index : data[index];\n }\n\n if (targetX > data[middleIndex][0]) {\n return binarySearch(data, targetX, searchParams, middleIndex, endIndex);\n }\n\n if (targetX < data[middleIndex][0]) {\n return binarySearch(data, targetX, searchParams, startIndex, middleIndex);\n }\n}\n","import binarySearch from '../../helpers/binary_search';\n\nfunction validateSelectedSpaceConversion({ data, inSelectedSpace, firstIndex, lastIndex, ignoreDiscontinuities }) { // eslint-disable-line no-unused-vars\n let correct = data.slice(firstIndex + 1, lastIndex);\n if (ignoreDiscontinuities) {\n correct = correct.filter(([_x, y]) => (y !== null && y !== undefined));\n }\n\n if (correct.length !== inSelectedSpace.length) {\n console.log({ // eslint-disable-line no-console\n data,\n attempt: inSelectedSpace.map(([x, y]) => [undateify(x), y]),\n correct: correct.map(([x, y]) => [undateify(x), y]),\n sdl: window.sdl\n });\n window.tacomaDataPaused = true;\n throw new Error('Failed to select via swap');\n }\n\n for (let i = 0; i < correct.length; i++) {\n if (undateify(correct[i][0]) !== undateify(inSelectedSpace[i][0]) || correct[i][1] !== inSelectedSpace[i][1]) {\n console.log({ // eslint-disable-line no-console\n i,\n attempt: inSelectedSpace.map(([x, y]) => [undateify(x), y]),\n correct: correct.map(([x, y]) => [undateify(x), y]),\n correctX: undateify(correct[i][0]),\n correctY: correct[i][1],\n attemptX: undateify(inSelectedSpace[i][0]),\n attemptY: inSelectedSpace[i][1]\n });\n window.tacomaDataPaused = true;\n throw new Error('Failed to select via swap');\n }\n }\n}\n\n/**\n * Converts from data space to selected space\n *\n * @param {Array<Array<Number>>} data\n * @param {{data: Array<Array<Number>>}|*} [swap]\n * @param {Number} minX\n * @param {Number} maxX\n * @param {Boolean} ignoreDiscontinuities\n * @param {Boolean} square\n * @return {{data: Array<Array<Number>>, lastAdded: boolean, firstAdded: boolean, afterIndex: Number, ignoreDiscontinuities: boolean, minX: Number, maxX: Number, beforeIndex: Number}}\n */\nexport default function dataSpaceToSelectedSpace({ data, swap, minX, maxX, ignoreDiscontinuities, square }) {\n if (!data.length || data.length && minX > data[data.length - 1][0] || data.length && maxX < data[0][0]) {\n //let previouslyEmpty = !data.length;\n return {\n data: [\n [minX, null],\n [maxX, null]\n ],\n firstAdded: true,\n lastAdded: true\n //previouslyEmpty\n };\n }\n\n let beforeIndex = binarySearch(data, minX, { searchType: 'before', returnIndex: true }) || 0;\n let afterIndex = binarySearch(data, maxX, { searchType: 'after', returnIndex: true }) || 0;\n if (afterIndex === -1) {\n afterIndex = 0;\n }\n\n while (beforeIndex >= 0 && data[beforeIndex][0] >= minX) {\n beforeIndex --;\n }\n\n while (afterIndex < data.length && data[afterIndex][0] <= maxX) {\n afterIndex ++;\n }\n\n let inSelectedSpace;\n let addToEndOnly = false;\n\n let firstAdded = false;\n let lastAdded = false;\n\n let beginningInterpolationIndex = beforeIndex;\n let endInterpolationIndex = afterIndex;\n if (ignoreDiscontinuities) {\n while (beginningInterpolationIndex >= 0 && data[beginningInterpolationIndex][1] === null) {\n beginningInterpolationIndex --;\n }\n while (endInterpolationIndex < data.length && data[endInterpolationIndex][1] === null) {\n endInterpolationIndex++;\n }\n }\n\n if (swap) {\n inSelectedSpace = swap.data;\n if (swap.lastAdded) {\n inSelectedSpace.pop();\n }\n if (minX === swap.minX) {\n addToEndOnly = true;\n }\n if (beforeIndex !== swap.beforeIndex) {\n addToEndOnly = false;\n if (swap.firstAdded) {\n inSelectedSpace.shift();\n }\n let index = swap.beforeIndex;\n while (index >= 0 && inSelectedSpace.length && inSelectedSpace[0][0] >= minX) {\n if (!ignoreDiscontinuities || data[index][1] || data[index][1] === 0) {\n inSelectedSpace.unshift(data[index]);\n }\n index --;\n }\n while (index < data.length && inSelectedSpace.length && inSelectedSpace[0][0] < minX) {\n inSelectedSpace.shift();\n index ++;\n }\n }\n\n if (ignoreDiscontinuities && !swap.ignoreDiscontinuities) {\n inSelectedSpace = inSelectedSpace.filter(([_x, y]) => (y !== null && y !== undefined));\n }\n\n if (beforeIndex === swap.beforeIndex && swap.firstAdded) {\n firstAdded = true;\n\n let interpolationIndex = beforeIndex + 1;\n if (ignoreDiscontinuities) {\n while (interpolationIndex < data.length && data[interpolationIndex][1] === null) {\n interpolationIndex ++;\n }\n }\n\n if (beginningInterpolationIndex === -1 && inSelectedSpace.length) {\n inSelectedSpace[0] = [minX, null];\n } else {\n if (square && inSelectedSpace.length) {\n inSelectedSpace[0] = [minX, data[beginningInterpolationIndex][1]];\n } else {\n if (inSelectedSpace.length) {\n inSelectedSpace[0] = [minX, interpolate(data, beginningInterpolationIndex, interpolationIndex, minX)];\n }\n }\n }\n if (data[beforeIndex + 1][0] === inSelectedSpace[0][0] && data[beforeIndex + 1][1] === inSelectedSpace[0][1]) {\n firstAdded = false;\n }\n }\n let lastIncluded = swap.afterIndex;\n if (swap.ignoreDiscontinuities && !ignoreDiscontinuities) {\n let nullIndex = beforeIndex + 1;\n let selectedIndex = 0;\n if (firstAdded) {\n selectedIndex ++;\n }\n while (selectedIndex <= inSelectedSpace.length && nullIndex < data.length && nullIndex < afterIndex) {\n if (data[nullIndex][0] <= maxX && data[nullIndex][1] === null && (!inSelectedSpace[selectedIndex] || inSelectedSpace[selectedIndex][0] !== data[nullIndex][0] || inSelectedSpace[selectedIndex][1] !== data[nullIndex][1])) {\n inSelectedSpace.splice(selectedIndex, 0, data[nullIndex]);\n if (nullIndex >= lastIncluded) {\n lastIncluded = nullIndex + 1;\n }\n }\n nullIndex ++;\n selectedIndex ++;\n }\n }\n\n let dataIndex = lastIncluded || 0;\n while (dataIndex < data.length && data[dataIndex][0] <= maxX) {\n if (data[dataIndex][0] >= minX) {\n if (!ignoreDiscontinuities || data[dataIndex][1] || data[dataIndex][1] === 0) {\n inSelectedSpace.push(data[dataIndex]);\n }\n }\n dataIndex ++;\n }\n while (inSelectedSpace.length && inSelectedSpace[inSelectedSpace.length - 1][0] > maxX) {\n inSelectedSpace.pop();\n }\n\n } else {\n inSelectedSpace = data.slice(beforeIndex + 1, afterIndex);\n if (ignoreDiscontinuities) {\n inSelectedSpace = inSelectedSpace.filter(([_x, y]) => (y !== null && y !== undefined));\n }\n }\n\n if (!inSelectedSpace.length) {\n if (square) {\n if (beginningInterpolationIndex < 0) {\n inSelectedSpace = [[minX, null], [maxX, null]];\n } else {\n inSelectedSpace = [[minX, data[beginningInterpolationIndex][1]], [maxX, data[beginningInterpolationIndex][1]]];\n }\n } else {\n inSelectedSpace = [[minX, interpolate(data, beginningInterpolationIndex, endInterpolationIndex, minX)], [maxX, interpolate(data, beginningInterpolationIndex, endInterpolationIndex, maxX)]];\n }\n firstAdded = true;\n lastAdded = true;\n }\n\n if (!addToEndOnly) {\n let interpolationIndex = beforeIndex + 1;\n if (ignoreDiscontinuities) {\n while (interpolationIndex < data.length && data[interpolationIndex][1] === null) {\n interpolationIndex ++;\n }\n }\n\n if (inSelectedSpace.length && inSelectedSpace[0][0] > minX) {\n firstAdded = true;\n if (beginningInterpolationIndex === -1) {\n inSelectedSpace.unshift([minX, null]);\n } else {\n if (square) {\n inSelectedSpace.unshift([minX, data[beginningInterpolationIndex][1]]);\n } else {\n inSelectedSpace.unshift([minX, interpolate(data, beginningInterpolationIndex, interpolationIndex, minX)]);\n }\n }\n }\n }\n\n if (inSelectedSpace.length && inSelectedSpace[inSelectedSpace.length - 1][0] < maxX) {\n lastAdded = true;\n\n let interpolationIndex = afterIndex - 1;\n if (ignoreDiscontinuities) {\n while (interpolationIndex >= 0 && data[interpolationIndex][1] === null) {\n interpolationIndex --;\n }\n }\n\n if (endInterpolationIndex === data.length) {\n inSelectedSpace.push([maxX, null]);\n } else {\n if (square) {\n inSelectedSpace.push([maxX, inSelectedSpace[inSelectedSpace.length - 1][1]]);\n } else {\n inSelectedSpace.push([maxX, interpolate(data, interpolationIndex, endInterpolationIndex, maxX)]);\n }\n }\n }\n\n if (inSelectedSpace.length === 1) {\n let begPoint;\n let endPoint;\n if (square) {\n if (beginningInterpolationIndex < 0) {\n begPoint = [minX, null];\n } else {\n begPoint = [minX, data[beginningInterpolationIndex][1]];\n }\n endPoint = [maxX, inSelectedSpace[0][1]];\n } else {\n begPoint = [minX, interpolate(data, beginningInterpolationIndex, beforeIndex + 1, minX)];\n endPoint = [maxX, interpolate(data, afterIndex - 1, endInterpolationIndex, maxX)];\n }\n inSelectedSpace.unshift(begPoint);\n inSelectedSpace.push(endPoint);\n firstAdded = true;\n lastAdded = true;\n }\n\n return {\n data: inSelectedSpace,\n minX,\n maxX,\n beforeIndex,\n afterIndex,\n firstAdded,\n lastAdded,\n ignoreDiscontinuities\n //previouslyEmpty: false\n };\n}\n\nfunction undateify(potentialDate) {\n if (potentialDate instanceof Date) {\n return potentialDate.valueOf();\n }\n\n return potentialDate;\n}\n\n/**\n * Finds the point at the boundary via interpolation\n *\n * @param {Array<Array<Number>>} data\n * @param {Number} firstIndex\n * @param {Number} secondIndex\n * @param {Number} boundary\n * @return {null|*}\n */\nfunction interpolate(data, firstIndex, secondIndex, boundary) {\n if (firstIndex < 0 || secondIndex < 0) {\n return null;\n }\n\n if (firstIndex >= data.length || secondIndex >= data.length) {\n return null;\n }\n\n if (firstIndex === secondIndex) {\n return data[firstIndex][1];\n }\n\n const [xBefore, yBefore] = data[firstIndex];\n const [xAfter, yAfter] = data[secondIndex];\n\n if (boundary === xBefore && yBefore !== null) {\n return yBefore;\n }\n\n if (boundary === xAfter && yAfter !== null) {\n return yAfter;\n }\n\n if (yBefore === null || yAfter === null) {\n return null;\n }\n\n const percent = (boundary - xBefore)/(xAfter - xBefore);\n if (percent < 0 || percent > 1) {\n return null;\n }\n\n return percent*(yAfter - yBefore) + yBefore;\n}\n","/**\n * Scales y min and max bounds according to linear or log\n *\n * @param {Number} minY\n * @param {Number} maxY\n * @param {'linear'|'log'} scale\n * @return {{minY: Number, maxY: Number}}\n */\nexport default function scaleBounds({ minY, maxY, scale }) {\n if (scale === 'log') {\n maxY = Math.log10(maxY);\n\n if (minY <= 0) {\n if (maxY > 0) {\n minY = -maxY;\n } else {\n minY = 2*maxY;\n }\n } else {\n minY = Math.log10(minY);\n }\n }\n\n return {\n minY,\n maxY\n };\n}\n","import scaleBounds from '../../renderer/scale_bounds';\nimport RustAPI from '../rust_api';\n\n\nfunction selectedSpaceToRenderSpaceInPlace({ data, renderWidth, renderHeight, minX, maxX, minY, maxY, scale }, { nullMask, yValues, minYValues, maxYValues }) {\n let i = 0;\n let prevI = i - 1;\n\n for (let pixelX = 0; pixelX < renderWidth; pixelX++) {\n // find the x value that corresponds to the x pixel\n const x = (pixelX/(renderWidth - 1))*(maxX - minX) + minX;\n\n // set i such that data[i][0] < x <= data[i+1][0]\n let minSeenY = null;\n let maxSeenY = null;\n\n if (i > 0 && i <= data.length && data[i - 1][1] === null) {\n i--;\n }\n\n if (i < data.length - 2 && data[i + 1][0] < x) {\n i++;\n }\n\n for (i; i < data.length - 2 && data[i + 1][0] < x; i++) {\n const curY = data[i][1];\n\n if (curY === null) {\n continue;\n }\n\n if (minSeenY === null || curY < minSeenY) {\n minSeenY = curY;\n }\n\n if (maxSeenY === null || curY > maxSeenY) {\n maxSeenY = curY;\n }\n }\n\n minYValues[pixelX] = minSeenY === null ? 0 : renderHeight*(1 - ((scale === 'log' ? Math.log10(minSeenY) : minSeenY) - minY)/(maxY - minY));\n maxYValues[pixelX] = maxSeenY === null ? 0 : renderHeight*(1 - ((scale === 'log' ? Math.log10(maxSeenY) : maxSeenY) - minY)/(maxY - minY));\n\n // pass any discontinuities along\n if (i >= data.length - 1 || data[i][1] === null || data[i + 1][1] === null) {\n const y = i >= data.length - 1 ? null : data[i][1];\n\n nullMask[pixelX] = ((y === null) << 0) | ((minSeenY === null) << 1) | ((maxSeenY === null) << 2);\n yValues[pixelX] = y === null ? 0 : renderHeight*(1 - ((scale === 'log' ? Math.log10(y) : y) - minY)/(maxY - minY));\n\n i++;\n\n continue;\n }\n\n // interpolate\n const [xBefore, yBefore] = data[i];\n const [xAfter, yAfter] = data[i + 1];\n\n const percent = (x - xBefore) / (xAfter - xBefore);\n let y = percent * (yAfter - yBefore) + yBefore;\n\n // we're at the first point after the direction changed. Don't interpolate\n if (prevI !== i) {\n y = yBefore;\n }\n\n // // two x's with the same value; common in area charts\n // // to avoid this from having gotten skipped over, save in either min or max as appropriate\n // if (i > 0 && data[i - 1][0] === data[i][0]) {\n // // 0: minY a\n // // 1: original a\n // // 2: minY b\n // // 3: original b\n //\n // const [xBeforeOffset, yBeforeOffset] = data[i - 1];\n // const [xAfter, yAfter] = data[i + 1];\n // }\n\n yValues[pixelX] = y === null ? 0 : renderHeight*(1 - ((scale === 'log' ? Math.log10(y) : y) - minY)/(maxY - minY));\n nullMask[pixelX] = ((y === null) << 0) | ((minSeenY === null) << 1) | ((maxSeenY === null) << 2);\n\n prevI = i;\n }\n}\n\n/**\n * Convert from selected space to value space\n *\n * @param data\n * @param {Object} [swap]\n * @param {Number} renderWidth - width, in pixels, of the area in which the graph is rendered\n * @param {Number} renderHeight - height, in pixels, of the area in which the graph is rendered\n * @param {Number} minX - the minimum x value that is rendered\n * @param {Number} maxX - the maximum x value that is rendered\n * @param {Number} minY - the minimum y value that is rendered\n * @param {Number} maxY - the maximum y value that is rendered\n * @param {'log'|'linear'} scale\n * @param {Boolean} [dataChanged] - if true, will not rely on the prior data state from swap being accurate\n * @return {{nullMask: Uint8Array, maxYValues: Float64Array, minYValues: Float64Array, yValues: Float64Array, dataF64: Float64Array, dataNullMask: Uint8Array}}\n */\nexport default function selectedSpaceToRenderSpace({ data, swap, renderWidth, renderHeight, minX, maxX, minY, maxY, scale, dataChanged }) {\n if (swap && swap.yValues.length !== renderWidth) {\n swap = null;\n }\n\n const nullMask = (swap && swap.nullMask) || new Uint8Array(renderWidth);\n nullMask.fill(0);\n const yValues = new Float64Array(renderWidth);\n const minYValues = new Float64Array(renderWidth);\n const maxYValues = new Float64Array(renderWidth);\n\n const scaledBounds = scaleBounds({ minY, maxY, scale});\n minY = scaledBounds.minY;\n maxY = scaledBounds.maxY;\n\n const inParams = { data, renderWidth, renderHeight, minX, maxX, minY, maxY, scale };\n\n let dataF64, dataNullMask;\n\n if (RustAPI()) {\n let copyIndexStart = 0;\n\n const hasSwap = swap && swap.dataNullMask && swap.dataF64;\n const useSwap = !dataChanged && hasSwap && swap.minX === minX && swap.maxX <= maxX && swap.length <= data.length;\n\n if (!useSwap || swap.dataNullMask.length < data.length) {\n const extraSpaceFactor = 1.25;\n dataF64 = new Float64Array(Math.floor(data.length*2*extraSpaceFactor));\n dataNullMask = new Uint8Array(Math.floor(data.length*extraSpaceFactor));\n\n if (useSwap) {\n dataNullMask.set(swap.dataNullMask);\n dataF64.set(swap.dataF64);\n }\n } else {\n dataF64 = swap.dataF64;\n dataNullMask = swap.dataNullMask;\n }\n\n if (useSwap) {\n copyIndexStart = Math.max(swap.length - 1, 0);\n }\n\n for (let i = copyIndexStart; i < data.length; i++) {\n dataF64[2*i] = data[i][0];\n dataF64[2*i + 1] = data[i][1];\n\n if (data[i][1] === null) {\n dataNullMask[i] = 1;\n } else {\n dataNullMask[i] = 0;\n }\n }\n RustAPI().selected_space_to_render_space(data.length, dataF64, dataNullMask, inParams, nullMask, yValues, minYValues, maxYValues);\n } else {\n selectedSpaceToRenderSpaceInPlace(inParams, { nullMask, yValues, minYValues, maxYValues });\n }\n\n return {\n nullMask,\n yValues,\n minYValues,\n maxYValues,\n dataF64,\n dataNullMask,\n minX,\n maxX,\n length: data.length\n };\n}\n","/**\n * Flattens simple data\n * Returns an array of tuples (x value, simple point)\n *\n * @param simpleData\n * @param series\n * @param inDataSpace\n * @return {[]}\n */\nexport default function flattenSimpleData(simpleData, {series, inDataSpace }) {\n const flattened = [];\n let fI = 0;\n\n for (let point of simpleData) {\n const yValue = extractYValue(point, series);\n\n if (series.yKey && Array.isArray(yValue)) {\n for (let subpoint of point[series.yKey]) {\n if (series.ignoreDiscontinuities && typeof subpoint[series.yKey] !== 'number' && !Array.isArray(subpoint)) {\n continue;\n }\n\n const x = inDataSpace[fI++][0];\n\n if (series.square && flattened.length > 0) {\n flattened.push([x, flattened[flattened.length - 1][1]]);\n }\n\n flattened.push([x, subpoint]);\n }\n\n continue;\n }\n\n if (series.ignoreDiscontinuities && (yValue === undefined || yValue === null)) {\n continue;\n }\n\n const x = inDataSpace[fI++][0];\n\n if (series.square && flattened.length > 0) {\n flattened.push([x, flattened[flattened.length - 1][1]]);\n }\n\n flattened.push([x, point]);\n }\n\n if (flattened.length !== inDataSpace.length) {\n console.warn('Flattening didn\\'t give the same length as it has in data space'); // eslint-disable-line no-console\n }\n\n return flattened;\n}\n\nexport function extractYValue(point, series) {\n if (series.yKey) {\n return point[series.yKey];\n }\n\n if (Array.isArray(point)) {\n if (point.length === 1) {\n return point[0];\n } else {\n return point[1];\n }\n }\n\n return point;\n}\n\nexport function extractXValue(point, series) {\n if (series.xKey) {\n return point[series.xKey];\n }\n\n if (Array.isArray(point)) {\n return point[0];\n }\n\n return point;\n}\n","import binarySearch from '../helpers/binary_search';\nimport scaleBounds from '../renderer/scale_bounds';\nimport getColor from '../helpers/colors';\nimport flattenSimpleData, {extractXValue, extractYValue} from '../helpers/flatten_simple_data';\nimport {getBarWidths} from '../renderer/draw_bars';\n\nconst DISTANCE_THRESHOLD = 20;\n\n/**\n * Figures out the tooltip state\n *\n * @param {Boolean} mousePresent\n * @param {Number} mouseX\n * @param {Number} mouseY\n * @param {Object} sizing\n * @param {Array<Object>} series\n * @param {Set} alwaysTooltipped\n * @param {Array<Object>} savedTooltips\n * @param {Boolean} [allTooltipped]\n * @param {Number} closestSpacing\n * @return {{mouseX: *, mouseY: *, elementWidth: number, elementHeight: number, tooltips: any[]}}\n */\nexport default function calculateTooltipState({mousePresent, mouseX, mouseY, sizing, series, alwaysTooltipped, savedTooltips, allTooltipped, closestSpacing }) {\n // filter out saved tooltips for nonexistent series\n savedTooltips = savedTooltips.filter((tooltip) => tooltip.series.axis);\n\n for (let savedTooltip of savedTooltips) {\n moveTooltip({ mouseX, mouseY, sizing}, savedTooltip);\n }\n\n if (!mousePresent) {\n return {\n mouseX,\n mouseY,\n elementWidth: sizing.elementWidth,\n elementHeight: sizing.elementHeight,\n tooltips: [...savedTooltips]\n };\n }\n\n const tooltips = [];\n\n let minDistance = Infinity;\n\n for (let i = 0; i < series.length; i++) {\n const singleSeries = series[i];\n\n if (singleSeries.hidden) {\n continue;\n }\n\n const axis = singleSeries.axis;\n\n const scale = axis.scale;\n const bounds = axis.currentBounds;\n const { minY, maxY } = scaleBounds({...bounds, scale });\n\n const trueX = mouseX/sizing.elementWidth * (bounds.maxX - bounds.minX) + bounds.minX;\n\n let data = singleSeries.inDataSpace;\n if (singleSeries.ignoreDiscontinuities) {\n data = data.filter((tuple) => typeof tuple[1] === 'number');\n }\n\n if (data.length === 0) {\n continue;\n }\n\n let dataMinX = data[0][0];\n let dataMaxX = data[data.length - 1][0];\n \n if (dataMinX instanceof Date) {\n dataMinX = dataMinX.getTime();\n }\n if (dataMaxX instanceof Date) {\n dataMaxX = dataMaxX.getTime();\n }\n \n const dataRange = dataMaxX - dataMinX;\n const padding = 0; \n\n if (trueX < dataMinX - padding || trueX > dataMaxX + padding) {\n continue;\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 ignoreYDistanceCheck = 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 (!ignoreYDistanceCheck && (xDistance > xDistanceThreshold || yDistance > yDistanceThreshold || 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 ignoreYDistanceCheck\n });\n }\n\n const unsavedTooltips = tooltips.filter(({ distance, ignoreYDistanceCheck }) => {\n return distance === minDistance || ignoreYDistanceCheck;\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.ignoreYDistanceCheck && lastTooltip.distance > DISTANCE_THRESHOLD)) {\n return savedTooltips;\n }\n\n const currentTooltipIndex = savedTooltips.findIndex((tooltip) => {\n return tooltip.x === lastTooltip.x && tooltip.y === lastTooltip.y;\n });\n\n if (currentTooltipIndex === -1) {\n return [...savedTooltips, lastTooltip];\n } else {\n return savedTooltips.filter((_, index) => index !== currentTooltipIndex);\n }\n}\n","const BOUND_CALCULATORS = {\n all: () => {},\n lastMinute: (globalBounds) => {\n if (!globalBounds.dates) {\n return;\n }\n\n return {\n minX: Math.max(new Date(globalBounds.maxX).valueOf() - 60*1000, globalBounds.minX)\n };\n },\n last10Minutes: (globalBounds) => {\n if (!globalBounds.dates) {\n return;\n }\n\n return {\n minX: Math.max(new Date(globalBounds.maxX).valueOf() - 10*60*1000, globalBounds.minX)\n };\n },\n lastHour: (globalBounds) => {\n if (!globalBounds.dates) {\n return;\n }\n\n return {\n minX: Math.max(new Date(globalBounds.maxX).valueOf() - 60*60*1000, globalBounds.minX)\n };\n },\n lastDay: (globalBounds) => {\n if (!globalBounds.dates) {\n return;\n }\n\n return {\n minX: Math.max(new Date(globalBounds.maxX).valueOf() - 24*60*60*1000, globalBounds.minX)\n };\n }\n};\n\nexport default BOUND_CALCULATORS;\n","const BUCKETS_PER_PIXEL = 2;\nconst CONDENSE_THRESHOLD = 2;\n\n/**\n * Condenses the dataset down to a lower number of points to make subsequent operations more efficient\n * Will only condense when data length passes a given threshold\n * Note that this works best on datasets that are relatively evenly distributed across the x axis\n *\n * @param {Array<Array>} data\n * @param {{data: [], minX: Number, maxX: Number, length: Number}} swap\n * @param {Number} minX\n * @param maxX\n * @param renderWidth\n * @param dataChanged\n * @return {{data: [], minX: Number, maxX: Number, length: Number}}\n */\nexport default function condenseDataSpace({ data, swap, minX, maxX, renderWidth, dataChanged }) {\n const targetBucketCount = renderWidth*BUCKETS_PER_PIXEL;\n\n const useSwap = !dataChanged && swap && swap.minX === minX && swap.maxX <= maxX && swap.length <= data.length;\n\n let partiallyCondensedData;\n if (useSwap) {\n partiallyCondensedData = swap.data;\n\n if (data.length > swap.length) {\n // always overwrite the last in case it was mangled by the selected space interpolation\n if (data.length > 0 && partiallyCondensedData.length > 0) {\n partiallyCondensedData[partiallyCondensedData.length - 1] = data[swap.length - 1];\n }\n\n partiallyCondensedData = partiallyCondensedData.concat(data.slice(swap.length));\n }\n } else {\n partiallyCondensedData = [...data];\n }\n\n if (partiallyCondensedData.length / targetBucketCount < CONDENSE_THRESHOLD*2) { // * 2 because min and max\n return {\n data: partiallyCondensedData,\n minX,\n maxX,\n length: data.length\n };\n }\n\n const condensedData = [];\n const bucketSize = (maxX - minX)/targetBucketCount;\n let minInBucket = null;\n let maxInBucket = null;\n let currentBucketIndex = 0;\n\n // always add the first point so that x ranges are preserved\n if (data.length) {\n condensedData.push(data[0]);\n }\n\n for (let tuple of partiallyCondensedData) {\n const [x, y] = tuple;\n\n if (y === null) {\n continue;\n }\n\n const bucketIndex = Math.floor((x - minX)/bucketSize);\n\n if (bucketIndex !== currentBucketIndex) {\n if (minInBucket && maxInBucket) {\n if (minInBucket === maxInBucket) {\n if (condensedData[condensedData.length - 1] !== minInBucket) {\n condensedData.push(minInBucket);\n }\n } else if (minInBucket[0] < maxInBucket[0]) {\n condensedData.push(maxInBucket, minInBucket);\n } else {\n condensedData.push(minInBucket, maxInBucket);\n }\n }\n\n minInBucket = null;\n maxInBucket = null;\n currentBucketIndex = bucketIndex;\n }\n\n if (!minInBucket || y < minInBucket[1]) {\n minInBucket = tuple;\n }\n\n if (!maxInBucket || y > maxInBucket[1]) {\n maxInBucket = tuple;\n }\n }\n\n if (minInBucket && maxInBucket) {\n if (minInBucket === maxInBucket) {\n condensedData.push(minInBucket);\n } else if (minInBucket[0] < maxInBucket[0]) {\n condensedData.push(maxInBucket, minInBucket);\n } else {\n condensedData.push(minInBucket, maxInBucket);\n }\n }\n\n // always add the last point so that x ranges are preserved\n if (data.length >= 2 && data[data.length - 1] !== minInBucket && data[data.length - 1] !== maxInBucket) {\n condensedData.push(data[data.length - 1]);\n }\n\n return {\n data: condensedData,\n minX,\n maxX,\n length: data.length\n };\n}\n","/**\n * Gets the proper name for a series\n *\n * @param {Object} singleSeries\n * @param {Number} index\n * @return {string}\n */\nexport default function nameForSeries(singleSeries, index) {\n let name = singleSeries.name || singleSeries.yKey;\n\n if (!name) {\n name = index.toString();\n }\n\n return name;\n}\n","export function selectedSpaceToBackgroundSpace({ data, background, minX, maxX }) {\n if (!background) {\n return null;\n }\n\n const conditions = [];\n for (let [key, color] of Object.entries(background)) {\n if (typeof color === 'object') {\n if (typeof color.evaluator !== 'function') {\n throw new Error('Invalid background declaration: ' + key + ' (evaluator must be a function)');\n }\n\n conditions.push(Object.assign({\n key,\n comparator: 'custom',\n comparedAgainst: null\n }, color));\n continue;\n }\n\n if (key === 'null') {\n conditions.push({\n evaluator: (y) => y === null && color,\n color,\n key,\n comparator: '=',\n comparedAgainst: null\n });\n continue;\n }\n\n const [comparator, value] = key.split(' ');\n if (!comparator || !value || isNaN(parseFloat(value))) {\n throw new Error('Invalid background declaration: ' + key);\n }\n\n const parsedValue = parseFloat(value);\n\n let evaluator;\n if (comparator === '=') {\n evaluator = (y) => typeof y === 'number' && y === parsedValue && color;\n } else if (comparator === '<') {\n evaluator = (y) => typeof y === 'number' && y < parsedValue && color;\n } else if (comparator === '>') {\n evaluator = (y) => typeof y === 'number' && y > parsedValue && color;\n } else if (comparator === '<=') {\n evaluator = (y) => typeof y === 'number' && y <= parsedValue && color;\n } else if (comparator === '>=') {\n evaluator = (y) => typeof y === 'number' && y >= parsedValue && color;\n } else {\n throw new Error('Invalid background declaration: ' + key);\n }\n\n conditions.push({\n evaluator,\n color,\n key,\n comparator,\n comparedAgainst: parsedValue\n });\n }\n\n const inBackgroundSpace = [];\n let currentSection = null;\n\n for (let i = 0; i < data.length; i++) {\n let [x, y] = data[i];\n if (x instanceof Date) {\n x = x.valueOf();\n }\n\n for (let condition of currentSection ? [currentSection.condition, ...conditions] : conditions) {\n const color = condition.evaluator(y);\n\n if (currentSection) {\n if (currentSection.color === color) {\n break;\n }\n\n let interpolatedMaxX = x;\n if (i > 0) {\n let [prevX, prevY] = data[i - 1];\n if (prevX instanceof Date) {\n prevX = prevX.valueOf();\n }\n\n if (currentSection.condition.comparedAgainst === null) {\n interpolatedMaxX = x;\n } else if (y === null) {\n interpolatedMaxX = prevX;\n } else {\n interpolatedMaxX = prevX + (condition.comparedAgainst - prevY)/(y - prevY)*(x - prevX);\n }\n }\n\n inBackgroundSpace.push({\n ...currentSection,\n maxX: interpolatedMaxX,\n maxXt: (interpolatedMaxX - minX)/(maxX - minX)\n });\n currentSection = null;\n }\n\n if (color) {\n let interpolatedMinX = x;\n if (i > 0) {\n let [prevX, prevY] = data[i - 1];\n if (prevX instanceof Date) {\n prevX = prevX.valueOf();\n }\n\n if (condition.comparedAgainst === null) {\n interpolatedMinX = prevX;\n } else if (prevY === null) {\n interpolatedMinX = x;\n } else {\n interpolatedMinX = prevX + (condition.comparedAgainst - prevY)/(y - prevY)*(x - prevX);\n }\n }\n\n currentSection = {\n minX: interpolatedMinX,\n minXt: (interpolatedMinX - minX)/(maxX - minX),\n color,\n condition\n };\n\n break;\n }\n }\n }\n\n if (currentSection) {\n inBackgroundSpace.push({\n ...currentSection,\n maxX: data[data.length - 1][0],\n maxXt: (data[data.length - 1][0] - minX)/(maxX - minX)\n });\n }\n\n return {\n data: inBackgroundSpace\n };\n}\n","import simpleSeriesToDataSpace from './space_conversions/simple_series_to_data_space';\nimport calculateDataBounds from './calculate_data_bounds';\nimport mergeBounds from './merge_bounds';\nimport expandBounds from './expand_bounds';\nimport selectionFromGlobalBounds from './selection_from_global_bounds';\nimport dataSpaceToSelectedSpace from './space_conversions/data_space_to_selected_space';\nimport selectedSpaceToRenderSpace from './space_conversions/selected_space_to_render_space';\nimport Eventable from '../eventable';\nimport boundCalculatorFromSelection from './bound_calculator_from_selection';\nimport calculateTooltipState, {toggleTooltipSaved} from './calculate_tooltip_state';\nimport getDefaultBoundsCalculator from './get_default_bounds_calculator';\nimport inferType from './infer_type';\nimport {SIMPLE_DATA_TYPES} from './data_types';\nimport generatorParamsEqual from '../helpers/generator_params_equal';\nimport findMatchingAxis from './find_matching_axis';\nimport {DPI_INCREASE} from '../renderer/size_canvas';\nimport {averageLoopTimes} from './average_loop_times';\nimport condenseDataSpace from './space_conversions/condense_data_space.js';\nimport calculateAnnotationsState from './calculate_annotations_state.js';\nimport {selectedSpaceToBackgroundSpace} from './space_conversions/selected_space_to_background_space.js';\nimport RustAPI, {RustAPIPromise} from './rust_api';\n\nexport default class StateController extends Eventable {\n\n constructor({ defaultBoundsCalculator, customBoundsSelectors, requireWASM, defaultShowIndividualPoints, defaultShowSidebar, defaultShowAnnotations, defaultShowOptions, syncPool, grapherID, sharedDataCache, sharedSubscriptions, fullscreen }) {\n super();\n\n this._requireWASM = requireWASM;\n if (requireWASM) {\n RustAPIPromise.then(() => {\n this._markDirty();\n });\n }\n\n this._series = [];\n this._seriesFromOriginalSeries = new Map();\n\n this._axes = [\n {\n series: [],\n scale: 'linear',\n side: 'left',\n axisIndex: 0\n }\n ];\n this._highlightedSeries = null;\n\n this._showIndividualPoints = defaultShowIndividualPoints || false;\n this._autoscaleY = true;\n this._percentile = 100;\n this._percentileAsymmetry = 0;\n this._showingOptions = defaultShowOptions;\n this._maxPrecision = false;\n this._showingSidebar = defaultShowSidebar || false;\n this._showingAnnotations = defaultShowAnnotations || false;\n this._grapherID = grapherID;\n this._fullscreen = fullscreen || false;\n\n this._alwaysTooltipped = new Set();\n this._tooltipState = {\n mousePresent: false,\n mouseX: 0,\n mouseY: 0,\n elementWidth: 0,\n elementHeight: 0,\n tooltips: []\n };\n this._contextMenuPosition = {\n x: 0,\n y: 0,\n showing: false,\n value: null\n };\n this._savedTooltips = [];\n this._draggingY = false;\n this._annotations = [];\n this._annotationsState = {\n elementWidth: 0,\n annotations: []\n };\n this._enumMap = {};\n this._hasXEnum = false;\n\n this._timingBuffer = [];\n this._timingIndex = 0;\n this._timingFrameCount = 0;\n\n this._modifiedSeries = new Set();\n this._deferredEmissions = {};\n this._deferredPriorityEmissions = {};\n this.primaryRenderer = null;\n this.rangeGraphRenderer = null;\n\n this._boundsCalculator = getDefaultBoundsCalculator(defaultBoundsCalculator, customBoundsSelectors);\n this._boundsHistory = [this._boundsCalculator];\n this._boundsIndex = 0;\n\n this._dataCache = sharedDataCache || new Map();\n this._subscriptions = sharedSubscriptions || new Map();\n this._subscriptionsShared = !!sharedSubscriptions;\n this._observablesToSeries = new Map();\n this._generators = new Set();\n this._generatorsToSeries = new Map();\n this._generatorCallArgs = new Map();\n this._seriesChangedFromPromises = new Set();\n\n this._syncPool = syncPool;\n if (this._syncPool) {\n this._syncPool.add(this);\n }\n\n this._onDataChange();\n }\n\n dispose() {\n this.emit('dispose', this);\n\n this.clearListeners();\n\n if (!this._subscriptionsShared) {\n for (let listener of this._subscriptions.values()) {\n listener.unsubscribe();\n }\n this._subscriptions.clear();\n }\n\n for (let singleSeries of this._series) {\n this._removeSeries(singleSeries);\n }\n\n if (this._syncPool) {\n this._syncPool.remove(this);\n }\n\n this.disposed = true;\n }\n\n setSeries(series) {\n const userSeries = this._series.filter((singleSeries) => singleSeries.userCreated);\n const propsSeries = this._series.filter((singleSeries) => !singleSeries.userCreated);\n\n if (series.length === propsSeries.length) {\n let anyDifferent = false;\n for (let i = 0; i < series.length; i++) {\n if (series[i] !== this._series[i].originalSeries) {\n anyDifferent = true;\n break;\n }\n }\n\n if (!anyDifferent) {\n return;\n }\n } else {\n this._mustResize = this._mustResize || this._fullscreen;\n }\n\n const newSeriesSet = new Set(series);\n for (let singleSeries of propsSeries) {\n if (!newSeriesSet.has(singleSeries.originalSeries)) {\n this._removeSeries(singleSeries);\n }\n }\n\n this._series.splice(0);\n for (let i = 0; i < series.length; i++) {\n const originalSeries = series[i];\n\n let singleSeries = this._seriesFromOriginalSeries.get(originalSeries);\n if (!singleSeries) {\n singleSeries = {\n ...originalSeries,\n originalSeries\n };\n this._seriesFromOriginalSeries.set(originalSeries, singleSeries);\n\n if (singleSeries.defaultAlwaysTooltipped) {\n this._alwaysTooltipped.add(singleSeries);\n this._tooltipsChanged = true;\n this.deferredEmit('always_tooltipped_changed', this._alwaysTooltipped);\n }\n }\n\n singleSeries.index = i;\n this._series.push(singleSeries);\n this._assignAxisTo(singleSeries);\n\n if (singleSeries.hidden) {\n this._hideSeries(singleSeries);\n }\n }\n\n for (let i = 0; i < userSeries.length; i++) {\n const singleSeries = userSeries[i];\n singleSeries.index = i + series.length;\n this._series.push(singleSeries);\n }\n\n this.deferredEmit('series_changed', this._series);\n\n this._dataChanged = true;\n this._markDirty();\n }\n\n _markDirty() {\n if (this._frameRequested) {\n return;\n }\n\n if (this._requireWASM && !RustAPI) {\n return;\n }\n\n const frameRequestStart = performance.now();\n this._frameRequested = true;\n requestAnimationFrame(() => {\n if (this.disposed) {\n return;\n }\n\n const frameExecutionStart = performance.now();\n\n const dataProcessingStart = performance.now();\n if (this._dataChanged) {\n this._onDataChange();\n this._mustRerender = true;\n this._tooltipsChanged = true;\n this._annotationsChanged = true;\n } else if (this._modifiedSeries.size) {\n this._onDataAdd(this._modifiedSeries);\n this._mustRerender = true;\n this._tooltipsChanged = true;\n this._annotationsChanged = true;\n } else {\n if (this._primarySizeChanged) {\n this._calculatePrimarySizeDependents();\n this._mustRerender = true;\n }\n if (this._rangeGraphSizeChanged) {\n this._calculateRangeGraphSizeDependents();\n this._mustRerender = true;\n }\n }\n const dataProcessingEnd = performance.now();\n\n const renderPipelineStart = performance.now();\n if (this._mustRerender) {\n this._render();\n }\n const renderPipelineEnd = performance.now();\n\n const generatorsStart = performance.now();\n if (this._mustCallGenerators) {\n this._callGenerators();\n }\n const generatorsEnd = performance.now();\n\n const tooltipStart = performance.now();\n if (this._tooltipsChanged) {\n this._recalculateTooltips();\n }\n const tooltipEnd = performance.now();\n\n const contextMenuStart = performance.now();\n if (this._contextMenuChanged) {\n this._recalculateContextMenu();\n }\n const contextMenuEnd = performance.now();\n\n const annotationStart = performance.now();\n if (this._annotationsChanged) {\n this._recalculateAnnotations();\n }\n const annotationEnd = performance.now();\n\n if (this._mustResize) {\n this.primaryRenderer.resizeDebounced();\n this.rangeGraphRenderer && this.rangeGraphRenderer.resizeDebounced();\n }\n\n this._frameRequested = false;\n this._mustRerender = false;\n this._dataChanged = false;\n this._primarySizeChanged = false;\n this._rangeGraphSizeChanged = false;\n this._modifiedSeries.clear();\n this._seriesChangedFromPromises.clear();\n this._tooltipsChanged = false;\n this._contextMenuChanged = false;\n this._annotationsChanged = false;\n this._mustCallGenerators = false;\n this._mustResize = false;\n\n const callbacksStart = performance.now();\n for (let emission of [...Object.values(this._deferredPriorityEmissions), ...Object.values(this._deferredEmissions)]) {\n this.emit(...emission);\n }\n const callbacksEnd = performance.now();\n this._deferredEmissions = {};\n this._deferredPriorityEmissions = {};\n\n const completionTime = performance.now();\n const loopTime = {\n frameExecution: completionTime - frameExecutionStart,\n frameRequestAndExecution: completionTime - frameRequestStart,\n generators: generatorsEnd - generatorsStart,\n dataProcessing: dataProcessingEnd - dataProcessingStart,\n renderPipeline: renderPipelineEnd - renderPipelineStart,\n tooltips: tooltipEnd - tooltipStart,\n contextMenu: contextMenuEnd - contextMenuStart,\n annotations: annotationEnd - annotationStart,\n callbacks: callbacksEnd - callbacksStart\n };\n this.lastLoopTime = loopTime;\n if (this._timingFrameCount) {\n if (this._timingBuffer.length < this._timingFrameCount) {\n this._timingBuffer.push(loopTime);\n } else {\n this._timingBuffer[this._timingIndex % this._timingFrameCount] = loopTime;\n }\n this._timingIndex++;\n }\n this.emit('render_time', completionTime - frameExecutionStart, loopTime);\n });\n }\n\n deferredEmit(...args) {\n this._deferredEmissions[args[0]] = args;\n }\n\n deferredPriorityEmit(...args) {\n this._deferredPriorityEmissions[args[0]] = args;\n }\n\n _seriesToSimpleData(singleSeries) {\n const type = inferType(singleSeries);\n if (SIMPLE_DATA_TYPES.includes(type)) {\n return singleSeries.data;\n }\n\n // get a reference to whatever you already have\n let currentData = this._dataCache.get(singleSeries.data);\n\n if (currentData && this._seriesChangedFromPromises.has(singleSeries.data)) {\n return currentData;\n }\n\n if (!currentData) {\n currentData = [];\n this._dataCache.set(singleSeries.data, currentData);\n singleSeries.simpleData = currentData;\n }\n\n if (type === 'object_observable' || type === 'tuple_observable') {\n let sameDataSet = this._observablesToSeries.get(singleSeries.data);\n if (sameDataSet) {\n const firstSameDataSeries = sameDataSet.values().next().value;\n currentData = firstSameDataSeries.simpleData;\n if (!currentData) {\n throw new Error(`Cannot find simpleData in ${firstSameDataSeries.name || firstSameDataSeries.yKey || firstSameDataSeries.data}`);\n }\n this._dataCache.set(singleSeries.data, currentData);\n singleSeries.simpleData = currentData;\n } else {\n sameDataSet = new Set();\n singleSeries.simpleData = currentData;\n this._observablesToSeries.set(singleSeries.data, sameDataSet);\n }\n\n sameDataSet.add(singleSeries);\n\n this._listenToObservableData({\n observable: singleSeries.data,\n currentData\n });\n }\n\n if (type === 'generator') {\n if (!this._generatorsToSeries.has(singleSeries.data)) {\n this._generatorsToSeries.set(singleSeries.data, new Set());\n }\n\n this._generatorsToSeries.get(singleSeries.data).add(singleSeries);\n\n if (!this._generators.has(singleSeries.data)) {\n this._generators.add(singleSeries.data);\n this._callGenerator(singleSeries.data);\n }\n }\n\n // return whatever you have; it'll fetch more in the background\n return currentData;\n }\n\n _listenToPromise(singleSeries, dataPromise) {\n dataPromise.then((resolved) => {\n this._dataCache.set(singleSeries.data, resolved);\n singleSeries.simpleData = resolved;\n this._seriesChangedFromPromises.add(singleSeries.data);\n this._dataChanged = true;\n this._markDirty();\n });\n }\n\n _listenToObservableData({ observable, currentData }) {\n if (this._subscriptions.has(observable)) { // someone else already listened to it\n return;\n }\n this._subscriptions.set(observable, true);\n\n // listen to the new data\n const listener = observable.observe((point) => {\n if (Array.isArray(point)) {\n for (let datum of point) {\n currentData.push(datum);\n }\n } else {\n currentData.push(point);\n }\n\n this.emit('observable_modified', observable);\n\n this.markObservableModified(observable);\n });\n this._subscriptions.set(observable, listener);\n }\n\n markObservableModified(observable) {\n if (!this._observablesToSeries.has(observable)) {\n return;\n }\n\n for (let singleSeries of this._observablesToSeries.get(observable)) {\n this._modifiedSeries.add(singleSeries);\n }\n this._markDirty();\n }\n\n _unsubscribeFromStaleSeries() {\n const currentSeries = new Set(this._series);\n for (let [observable, seriesSet] of this._observablesToSeries) {\n let stillHasListener = false;\n\n for (let singleSeries of seriesSet) {\n if (currentSeries.has(singleSeries)) {\n stillHasListener = true;\n break;\n }\n }\n\n if (!stillHasListener) {\n this._subscriptions.get(observable).unsubscribe();\n this._subscriptions.delete(observable);\n this._observablesToSeries.delete(observable);\n }\n }\n\n for (let [generator, seriesSet ] of this._generatorsToSeries) {\n let stillHasSeries = false;\n\n for (let singleSeries of seriesSet) {\n if (currentSeries.has(singleSeries)) {\n stillHasSeries = true;\n break;\n }\n }\n\n if (!stillHasSeries) {\n this._generatorsToSeries.delete(generator);\n this._generators.delete(generator);\n this._generatorCallArgs.delete(generator);\n }\n }\n }\n\n async _callGenerator(generator) {\n const parameters = {\n minX: this._selection.minX,\n maxX: this._selection.maxX,\n sizing: this.primaryRenderer.sizing\n };\n\n if (generatorParamsEqual(this._generatorCallArgs.get(generator), parameters)) {\n return;\n }\n this._generatorCallArgs.set(generator, parameters);\n\n // Note: potential race condition if generator is stupid. For now, we'll rely on generator being smart\n // Race condition: a new, faster one runs before completed\n const data = await Promise.resolve(generator(parameters));\n\n // do nothing if the generator returned nothing\n if (!data) {\n return;\n }\n\n // because calling the generator may have taken some time, check that there are still listeners for it\n if (!this._generatorsToSeries.has(generator)) {\n return;\n }\n\n this._dataChanged = true;\n this._markDirty();\n\n if (typeof data.observe === 'function') {\n const currentData = [];\n this._dataCache.set(generator, currentData);\n for (let singleSeries of this._generatorsToSeries.get(generator)) {\n singleSeries.simpleData = currentData;\n }\n\n for (let singleSeries of this._generatorsToSeries.get(generator)) {\n if (!this._observablesToSeries.has(data)) {\n this._observablesToSeries.set(data, new Set());\n }\n\n this._observablesToSeries.get(data).add(singleSeries);\n }\n\n this._listenToObservableData({\n observable: data,\n currentData\n });\n } else {\n this._dataCache.set(generator, data);\n for (let singleSeries of this._generatorsToSeries.get(generator)) {\n singleSeries.simpleData = data;\n }\n }\n }\n\n _callGenerators() {\n for (let generator of this._generators) {\n this._callGenerator(generator);\n }\n }\n\n _recalculateTooltips() {\n if (!this.primaryRenderer || !this.primaryRenderer.sizing) {\n return;\n }\n\n this._tooltipState = calculateTooltipState({\n mousePresent: this._tooltipState.mousePresent,\n mouseX: this._tooltipState.mouseX,\n mouseY: this._tooltipState.mouseY,\n sizing: this.primaryRenderer.sizing,\n series: this._series,\n alwaysTooltipped: this._alwaysTooltipped,\n savedTooltips: this._savedTooltips,\n allTooltipped: this._tooltipAllNext,\n closestSpacing: this._globalBounds.closestSpacing\n });\n this._tooltipAllNext = false;\n this.deferredEmit('tooltip_state_changed', this._tooltipState, this._tooltipStateArg);\n this._tooltipStateArg = null;\n }\n \n _recalculateContextMenu() {\n if (!this.primaryRenderer || !this.primaryRenderer.sizing) {\n return;\n }\n\n const boundingRect = this.primaryRenderer.boundingRect;\n const sizing = this.primaryRenderer.sizing;\n let value = null;\n let newX = null;\n \n for (let series of this._series) {\n const bounds = series.axis.currentBounds;\n \n newX = this._contextMenuPosition.x - boundingRect.left;\n \n // if it's on the right side, move it to the left one width\n if (this._contextMenuPosition.x > (boundingRect.right - sizing.elementWidth) * 2) newX -= 130;\n\n if (series.xKey === 'timestamp' || series.xKey === 'time' || series.xKey === 'date') {\n value = new Date((this._contextMenuPosition.x - boundingRect.left) / sizing.elementWidth * (bounds.maxX - bounds.minX) + bounds.minX);\n } else {\n value = (this._contextMenuPosition.x - boundingRect.left) / sizing.elementWidth * (bounds.maxX - bounds.minX) + bounds.minX;\n }\n }\n this._contextMenuPosition = {\n x: newX,\n y: this._contextMenuPosition.y - boundingRect.top,\n showing: this._contextMenuPosition.showing,\n value: value\n };\n this.deferredEmit('context_menu_position_changed', this._contextMenuPosition);\n }\n\n _recalculateAnnotations() {\n if (!this.primaryRenderer || !this.primaryRenderer.sizing) {\n return;\n }\n\n this._annotationsState = calculateAnnotationsState({\n annotations: this._annotations,\n series: this._series,\n sizing: this.primaryRenderer.sizing,\n selection: this._selection\n });\n this.deferredEmit('annotations_changed', this._annotationsState);\n }\n\n _onDataChange() {\n this._expandYWith = [];\n const dataBoundsList = [];\n\n for (let singleSeries of this._series) {\n if (singleSeries.hidden) {\n continue;\n }\n\n const simpleData = this._seriesToSimpleData(singleSeries);\n singleSeries.inDataSpace = simpleSeriesToDataSpace({\n ...singleSeries,\n data: simpleData\n }, {\n stateController: this\n });\n singleSeries.simpleDataSliceStart = simpleData.length;\n singleSeries.dataBounds = calculateDataBounds(singleSeries.inDataSpace);\n if (singleSeries.rendering === 'bar') {\n singleSeries.dataBounds = expandBounds(singleSeries.dataBounds, { extendXForNBars: singleSeries.inDataSpace.length, expandYWith: singleSeries.expandYWith });\n }\n\n dataBoundsList.push(singleSeries.dataBounds);\n\n if (singleSeries.expandYWith) {\n this._expandYWith.push(singleSeries.expandYWith);\n }\n }\n\n this._unsubscribeFromStaleSeries();\n\n this._dataBounds = mergeBounds(dataBoundsList);\n\n this._recalculateSelection({ disableSwap: true});\n\n for (let singleSeries of this._series) {\n if (singleSeries.hidden) {\n continue;\n }\n\n singleSeries.selectedBounds = calculateDataBounds(singleSeries.inSelectedSpace.data, { percentile: this._percentile, percentileAsymmetry: this._percentileAsymmetry });\n if (singleSeries.hasAreaBottom) {\n singleSeries.selectedBoundsAreaTop = singleSeries.selectedBounds;\n singleSeries.selectedBoundsAreaBottom = calculateDataBounds(singleSeries.inSelectedSpaceAreaBottom.data, { percentile: this._percentile, percentileAsymmetry: this._percentileAsymmetry });\n\n singleSeries.selectedBounds = mergeBounds([\n singleSeries.selectedBoundsAreaTop,\n singleSeries.selectedBoundsAreaBottom\n ]);\n }\n }\n\n this._recalculateAxisBounds();\n\n for (let singleSeries of this._series) {\n if (singleSeries.hidden) {\n continue;\n }\n\n this._calculatePrimarySizeDependents(singleSeries, { dataChanged: true });\n this._calculateRangeGraphSizeDependents(singleSeries, { dataChanged: true });\n }\n }\n\n _onDataAdd(modifiedSeries) {\n const newData = new Map();\n const modifiedAxes = new Set();\n\n const modifiedSeriesAndDependents = new Set();\n for (let singleSeries of modifiedSeries) {\n modifiedSeriesAndDependents.add(singleSeries);\n }\n\n for (let singleSeries of modifiedSeries) {\n modifiedAxes.add(singleSeries.axis);\n\n if (!singleSeries.inDataSpace) {\n throw new Error('inDataSpace must be present for onDataAdd to be called');\n }\n\n const simpleData = this._seriesToSimpleData(singleSeries);\n\n let prevY;\n if (singleSeries.inDataSpace.length) {\n prevY = singleSeries.inDataSpace[singleSeries.inDataSpace.length - 1][1];\n }\n\n const newDataInDataSpace = simpleSeriesToDataSpace(singleSeries, {\n data: simpleData.slice(singleSeries.simpleDataSliceStart || 0),\n valueXStart: singleSeries.inDataSpace.length,\n prevY,\n stateController: this\n });\n newData.set(singleSeries, newDataInDataSpace);\n singleSeries.simpleDataSliceStart = simpleData.length;\n\n if (newDataInDataSpace.length < 32) {\n singleSeries.inDataSpace.push(...newDataInDataSpace);\n } else {\n for (let point of newDataInDataSpace) {\n singleSeries.inDataSpace.push(point);\n }\n }\n\n let newDataBounds = calculateDataBounds(newDataInDataSpace);\n if (singleSeries.rendering === 'bar') {\n newDataBounds = expandBounds(newDataBounds, { extendXForNBars: singleSeries.inDataSpace.length, expandYWith: singleSeries.expandYWith });\n }\n\n singleSeries.dataBounds = mergeBounds([singleSeries.dataBounds, newDataBounds]);\n this._dataBounds = mergeBounds([this._dataBounds, newDataBounds]);\n\n // save these off for debugging only\n singleSeries.newPointCount = newDataInDataSpace.length;\n singleSeries.newDataBounds = newDataBounds;\n }\n\n const previousSelection = this._selection;\n this._recalculateSelection();\n\n for (let singleSeries of modifiedSeries) {\n if (!singleSeries.inSelectedSpace.data.length) { // empty, trivially fast\n singleSeries.selectedBounds = calculateDataBounds(singleSeries.inSelectedSpace.data);\n continue;\n }\n\n const firstX = singleSeries.inSelectedSpace.data[0][0];\n const lastX = singleSeries.inSelectedSpace.data[singleSeries.inSelectedSpace.data.length - 1][0];\n\n const oldBoundSubsetOfNewBounds = previousSelection.minX >= firstX && previousSelection.maxX <= lastX;\n\n if (!oldBoundSubsetOfNewBounds || this._percentile !== 100) {\n // this is significantly slower, but it's too complex to diff the old bounds and new bounds or diff percentiles\n // besides, it not being a subset hopefully means its a lower volume of data\n singleSeries.selectedBounds = calculateDataBounds(singleSeries.inSelectedSpace.data, { percentile: this._percentile, percentileAsymmetry: this._percentileAsymmetry});\n if (singleSeries.hasAreaBottom) {\n singleSeries.selectedBoundsAreaTop = singleSeries.selectedBounds;\n singleSeries.selectedBoundsAreaBottom = calculateDataBounds(singleSeries.inSelectedSpaceAreaBottom.data, { percentile: this._percentile, percentileAsymmetry: this._percentileAsymmetry });\n\n singleSeries.selectedBounds = mergeBounds([\n singleSeries.selectedBoundsAreaTop,\n singleSeries.selectedBoundsAreaBottom\n ]);\n }\n continue;\n }\n\n // note: we could do a binary search here, but there are typically only a few points added each frame, so it isn't worth it\n const newSelectedData = newData.get(singleSeries)\n .filter((tuple) => tuple[0] >= this._selection.minX && tuple[0] <= this._selection.maxX);\n\n singleSeries.newSelectedData = newSelectedData;\n singleSeries.selectedBounds = mergeBounds([singleSeries.selectedBounds, calculateDataBounds(newSelectedData)]);\n }\n\n this._recalculateAxisBounds();\n\n this.deferredPriorityEmit('axis_bounds_changed', this._axes.map(({ currentBounds }) => currentBounds));\n\n for (let axis of modifiedAxes) {\n for (let singleSeries of axis.series) {\n this._calculatePrimarySizeDependents(singleSeries);\n this._calculateRangeGraphSizeDependents(singleSeries);\n }\n }\n }\n\n _recalculateAxisBounds() {\n for (let axis of this._axes) {\n if (this._selection.fixedY || !this._autoscaleY) {\n axis.targetBounds = this._selection;\n if (axis.targetBounds.byAxis) {\n axis.targetBounds = axis.targetBounds.byAxis[axis.axisIndex];\n }\n\n axis.currentBounds = axis.targetBounds;\n continue;\n }\n\n const selectedBoundsList = [];\n const expandYWith = [];\n\n for (let singleSeries of axis.series) {\n selectedBoundsList.push(singleSeries.selectedBounds);\n\n if (singleSeries.expandYWith) {\n expandYWith.push(...singleSeries.expandYWith);\n }\n\n if (singleSeries.rendering === 'bar') {\n expandYWith.push(singleSeries.selectedBounds.minY, singleSeries.selectedBounds.maxY);\n }\n }\n\n axis.selectedDataBounds = mergeBounds(selectedBoundsList);\n axis.targetBounds = axis.currentBounds = expandBounds(axis.selectedDataBounds, {expandYWith});\n }\n this.deferredPriorityEmit('axis_bounds_changed', this._axes.map(({ currentBounds }) => currentBounds));\n }\n\n /**\n * Recalculates global bounds, selection, and data in selected space (for each series)\n * REQUIRES that this._dataBounds and this._expandYWith are set & up-to-date\n *\n * @private\n */\n _recalculateSelection({disableSwap = false}={}) {\n this._globalBounds = expandBounds(this._dataBounds, {expandYWith: this._expandYWith.flat()});\n this.deferredPriorityEmit('global_bounds_changed', this._globalBounds);\n this._selection = selectionFromGlobalBounds(this._globalBounds, this._boundsCalculator);\n this.deferredPriorityEmit('selection_changed', this._selection);\n\n for (let singleSeries of this._series) {\n if (singleSeries.hidden) {\n continue;\n }\n\n singleSeries.inSelectedSpace = dataSpaceToSelectedSpace({\n data: singleSeries.hasAreaBottom ? singleSeries.inDataSpace.filter((_, i) => i % 2 === 1) : singleSeries.inDataSpace,\n swap: disableSwap ? null : singleSeries.inSelectedSpace,\n minX: this._selection.minX,\n maxX: this._selection.maxX,\n ignoreDiscontinuities: singleSeries.ignoreDiscontinuities,\n square: singleSeries.square\n });\n\n if (singleSeries.hasAreaBottom) {\n singleSeries.inSelectedSpaceAreaBottom = dataSpaceToSelectedSpace({\n data:singleSeries.inDataSpace.filter((_, i) => i % 2 === 0),\n swap: disableSwap ? null : singleSeries.inSelectedSpaceAreaBottom,\n minX: this._selection.minX,\n maxX: this._selection.maxX,\n ignoreDiscontinuities: singleSeries.ignoreDiscontinuities,\n square: singleSeries.square\n });\n }\n }\n }\n\n _render() {\n if (!this.primaryRenderer || !this.primaryRenderer.sizing) {\n return;\n }\n\n this.primaryRenderer.clear();\n if (this.rangeGraphRenderer) {\n this.rangeGraphRenderer.clear();\n }\n\n for (let singleSeries of this._series) {\n if (singleSeries.hidden) {\n continue;\n }\n\n const shadowColor = singleSeries.shadowColor || {\n day: 'white',\n export: 'transparent',\n night: 'black'\n }[this._theme] || 'black';\n\n const shadowBlur = undefined;\n\n this.primaryRenderer.renderBackground(singleSeries.inBackgroundSpacePrimary);\n\n this.primaryRenderer.render(singleSeries, singleSeries.inRenderSpacePrimary, {\n highlighted: this._highlightedSeries === singleSeries.index,\n showIndividualPoints: this._showIndividualPoints,\n shadowColor,\n shadowBlur,\n defaultLineWidth: this._defaultLineWidth,\n globalBounds: this._globalBounds,\n inRenderSpaceAreaBottom: singleSeries.inRenderSpacePrimaryAreaBottom\n });\n\n if (this.rangeGraphRenderer && this.rangeGraphRenderer.sizing) {\n // Use tighter bounds for range graph to prevent clipping\n const rangeGraphBounds = {\n ...this._globalBounds,\n minY: this._globalBounds.unscaledMinY !== undefined ? this._globalBounds.unscaledMinY : this._globalBounds.minY,\n maxY: this._globalBounds.unscaledMaxY !== undefined ? this._globalBounds.unscaledMaxY : this._globalBounds.maxY\n };\n \n this.rangeGraphRenderer.render(singleSeries, singleSeries.inRenderSpaceRangeGraph, {\n shadowColor: 'transparent',\n shadowBlur: 0,\n width: 1,\n showIndividualPoints: false,\n bounds: rangeGraphBounds,\n globalBounds: rangeGraphBounds,\n inRenderSpaceAreaBottom: singleSeries.inRenderSpaceRangeGraphAreaBottom\n });\n }\n }\n }\n\n _calculatePrimarySizeDependents(singleSeries, { dataChanged=false } = {}) {\n if (!this.primaryRenderer || !this.primaryRenderer.sizing) {\n return;\n }\n\n if (!singleSeries) {\n for (let s of this._series) {\n this._calculatePrimarySizeDependents(s);\n }\n return;\n }\n\n if (!this._series.includes(singleSeries)) {\n throw new Error('Series no longer exists');\n }\n\n if (singleSeries.hidden) {\n return;\n }\n\n const { currentBounds, scale } = singleSeries.axis;\n const renderWidth = Math.ceil(this.primaryRenderer.sizing.renderWidth/DPI_INCREASE);\n const renderHeight = Math.ceil(this.primaryRenderer.sizing.renderHeight);\n\n const toCondensedSelectedSpaceParams = {\n minX: currentBounds.minX,\n maxX: currentBounds.maxX,\n renderWidth,\n dataChanged\n };\n\n singleSeries.inCondensedSelectedSpacePrimary = condenseDataSpace({\n data: singleSeries.inSelectedSpace.data,\n swap: singleSeries.inCondensedSelectedSpacePrimary,\n ...toCondensedSelectedSpaceParams\n });\n\n const toRenderSpaceParams = {\n minX: currentBounds.minX,\n maxX: currentBounds.maxX,\n minY: currentBounds.minY,\n maxY: currentBounds.maxY,\n renderWidth,\n renderHeight,\n scale,\n dataChanged\n };\n\n singleSeries.inRenderSpacePrimary = selectedSpaceToRenderSpace({\n data: singleSeries.inCondensedSelectedSpacePrimary.data,\n swap: singleSeries.inRenderSpacePrimary,\n ...toRenderSpaceParams\n });\n\n singleSeries.inBackgroundSpacePrimary = selectedSpaceToBackgroundSpace({\n data: singleSeries.inCondensedSelectedSpacePrimary.data,\n background: singleSeries.background,\n swap: singleSeries.inBackgroundSpacePrimary,\n minX: currentBounds.minX,\n maxX: currentBounds.maxX\n });\n\n if (singleSeries.hasAreaBottom) {\n singleSeries.inCondensedSelectedSpacePrimaryAreaBottom = condenseDataSpace({\n data: singleSeries.inSelectedSpaceAreaBottom.data,\n swap: singleSeries.inCondensedSelectedSpacePrimaryAreaBottom,\n ...toCondensedSelectedSpaceParams\n });\n\n singleSeries.inRenderSpacePrimaryAreaBottom = selectedSpaceToRenderSpace({\n data: singleSeries.inCondensedSelectedSpacePrimaryAreaBottom.data,\n swap: singleSeries.inRenderSpacePrimaryAreaBottom,\n ...toRenderSpaceParams\n });\n\n singleSeries.inBackgroundSpacePrimaryAreaBottom = selectedSpaceToBackgroundSpace({\n data: singleSeries.inCondensedSelectedSpacePrimaryAreaBottom.data,\n background: singleSeries.background,\n swap: singleSeries.inBackgroundSpacePrimaryAreaBottom,\n minX: currentBounds.minX,\n maxX: currentBounds.maxX\n });\n }\n }\n\n _calculateRangeGraphSizeDependents(singleSeries, { dataChanged=false } = {}) {\n if (!this.rangeGraphRenderer || !this.rangeGraphRenderer.sizing) {\n return;\n }\n\n if (!singleSeries) {\n for (let s of this._series) {\n this._calculateRangeGraphSizeDependents(s);\n }\n return;\n }\n\n if (!this._series.includes(singleSeries)) {\n throw new Error('Series no longer exists');\n }\n\n if (singleSeries.hidden) {\n return;\n }\n\n const { scale } = singleSeries.axis;\n const globalBounds = this._globalBounds;\n \n const rangeGraphBounds = {\n ...globalBounds,\n minY: globalBounds.unscaledMinY !== undefined ? globalBounds.unscaledMinY : globalBounds.minY,\n maxY: globalBounds.unscaledMaxY !== undefined ? globalBounds.unscaledMaxY : globalBounds.maxY\n };\n \n const renderWidth = Math.ceil(this.rangeGraphRenderer.sizing.renderWidth/DPI_INCREASE);\n const renderHeight = Math.ceil(this.rangeGraphRenderer.sizing.renderHeight);\n\n const toSelectedSpaceParams = {\n minX: globalBounds.minX,\n maxX: globalBounds.maxX,\n ignoreDiscontinuities: singleSeries.ignoreDiscontinuities,\n square: singleSeries.square\n };\n\n singleSeries.inSelectedSpaceRangeGraph = dataSpaceToSelectedSpace({\n data: singleSeries.hasAreaBottom ? singleSeries.inDataSpace.filter((_, i) => i % 2 === 1) : singleSeries.inDataSpace,\n swap: singleSeries.inSelectedSpaceRangeGraph,\n ...toSelectedSpaceParams\n });\n\n const toCondensedSelectedSpaceParams = {\n minX: globalBounds.minX,\n maxX: globalBounds.maxX,\n renderWidth,\n dataChanged\n };\n\n singleSeries.inCondensedSelectedSpaceRangeGraph = condenseDataSpace({\n data: singleSeries.inSelectedSpaceRangeGraph.data,\n swap: singleSeries.inCondensedSelectedSpaceRangeGraph\n });\n\n const toRenderSpaceParams = {\n minX: rangeGraphBounds.minX,\n maxX: rangeGraphBounds.maxX,\n minY: rangeGraphBounds.minY,\n maxY: rangeGraphBounds.maxY,\n renderWidth,\n renderHeight,\n scale,\n dataChanged\n };\n\n singleSeries.inRenderSpaceRangeGraph = selectedSpaceToRenderSpace({\n data: singleSeries.inCondensedSelectedSpaceRangeGraph.data,\n swap: singleSeries.inRenderSpaceRangeGraph,\n ...toRenderSpaceParams\n });\n\n if (singleSeries.hasAreaBottom) {\n singleSeries.inSelectedSpaceRangeGraphAreaBottom = dataSpaceToSelectedSpace({\n data: singleSeries.inDataSpace.filter((_, i) => i % 2 === 0), // take the odd points for area bottom\n swap: singleSeries.inSelectedSpaceRangeGraphAreaBottom,\n ...toSelectedSpaceParams\n });\n\n singleSeries.inCondensedSelectedSpaceRangeGraphAreaBottom = condenseDataSpace({\n data: singleSeries.inSelectedSpaceRangeGraphAreaBottom.data,\n swap: singleSeries.inCondensedSelectedSpaceRangeGraphAreaBottom,\n ...toCondensedSelectedSpaceParams\n });\n\n singleSeries.inRenderSpaceRangeGraphAreaBottom = selectedSpaceToRenderSpace({\n data: singleSeries.inCondensedSelectedSpaceRangeGraphAreaBottom.data,\n swap: singleSeries.inRenderSpaceRangeGraphAreaBottom,\n ...toRenderSpaceParams\n });\n }\n }\n\n _createAxis({ side }) {\n const axis = {\n series: [],\n scale: 'linear',\n side,\n axisIndex: this._axes.length\n };\n this._axes.push(axis);\n return axis;\n }\n\n _moveAxis(singleSeries, axisIndex) {\n if (!this._series.includes(singleSeries)) {\n throw new Error('Series no longer exists');\n }\n\n let newAxis;\n if (axisIndex === 'new-left' || axisIndex === 'new-right') {\n newAxis = this._createAxis({ side: axisIndex.split('-')[1] });\n } else {\n newAxis = this._axes[parseInt(axisIndex)];\n }\n\n if (singleSeries.axis === newAxis) {\n return;\n }\n\n const oldAxis = singleSeries.axis;\n const oldIndex = oldAxis.series.indexOf(singleSeries);\n if (oldIndex === -1) {\n throw new Error('Series not present in axis');\n }\n oldAxis.series.splice(oldIndex, 1);\n\n newAxis.series.push(singleSeries);\n singleSeries.axis = newAxis;\n\n this._dataChanged = true;\n this.deferredEmit('axes_changed', this._axes);\n this.deferredEmit('left_axes_changed', this.leftAxes);\n this.deferredEmit('right_axes_changed', this.rightAxes);\n this.deferredEmit('exported_axes_changed', this.exportedAxes);\n this._markDirty();\n }\n\n _assignAxisTo(singleSeries) {\n if (singleSeries.axis && typeof singleSeries.axis === 'object') {\n return;\n }\n\n let axis;\n\n if (singleSeries.axisIndex) {\n const { axisIndex } = singleSeries;\n\n if (axisIndex === 'new-left' || axisIndex === 'new-right') {\n axis = this._createAxis({ side: axisIndex.split('-')[1] });\n } else {\n axis = this._axes[parseInt(axisIndex)];\n }\n } else if (singleSeries.axis) {\n singleSeries.originalAxis = singleSeries.axis;\n let [side, number] = singleSeries.axis.split('-');\n axis = findMatchingAxis({ axes: this._axes, side, number });\n\n if (!axis) {\n axis = this._createAxis({\n side\n });\n }\n } else {\n axis = this._axes[0];\n }\n\n axis.series.push(singleSeries);\n singleSeries.axis = axis;\n\n this.deferredEmit('axes_changed', this._axes);\n this.deferredEmit('exported_axes_changed', this.exportedAxes);\n\n if (singleSeries.axis.side === 'left') {\n this.deferredEmit('left_axes_changed', this.leftAxes);\n } else {\n this.deferredEmit('right_axes_changed', this.rightAxes);\n }\n }\n\n _removeSeries(singleSeries) {\n this._seriesFromOriginalSeries.delete(singleSeries.originalSeries);\n\n const { axis, data } = singleSeries;\n axis.series.splice(axis.series.indexOf(singleSeries), 1);\n const sameDataSet = this._observablesToSeries.get(data);\n if (sameDataSet) {\n sameDataSet.delete(singleSeries);\n if (sameDataSet.size === 0) {\n this._observablesToSeries.delete(data);\n }\n }\n\n if (this._generatorsToSeries.has(data)) {\n this._generatorsToSeries.get(data).delete(singleSeries);\n if (this._generatorsToSeries.get(data).size === 0) {\n this._generatorsToSeries.delete(data);\n this._generators.delete(data);\n }\n }\n\n this._alwaysTooltipped.delete(singleSeries);\n\n singleSeries.axis = singleSeries.originalAxis;\n delete singleSeries.originalAxis;\n delete singleSeries.inDataSpace;\n delete singleSeries.inSelectedSpace;\n delete singleSeries.inValueSpacePrimary;\n delete singleSeries.inValueSpaceRangeGraph;\n delete singleSeries.inRenderSpacePrimary;\n delete singleSeries.inRenderSpaceRangeGraph;\n delete singleSeries.newPointCount;\n delete singleSeries.newDataBounds;\n delete singleSeries.simpleDataSliceStart;\n\n this.deferredEmit('axes_changed', this._axes);\n this.deferredEmit('exported_axes_changed', this.exportedAxes);\n\n if (axis.side === 'left') {\n this.deferredEmit('left_axes_changed', this.leftAxes);\n } else {\n this.deferredEmit('right_axes_changed', this.rightAxes);\n }\n }\n\n _hideSeries(singleSeries) {\n const { axis } = singleSeries;\n const indexInAxis = axis.series.indexOf(singleSeries);\n singleSeries.indexInAxis = indexInAxis;\n axis.series.splice(indexInAxis, 1);\n\n this.deferredEmit('axes_changed', this._axes);\n\n if (axis.side === 'left') {\n this.deferredEmit('left_axes_changed', this.leftAxes);\n } else {\n this.deferredEmit('right_axes_changed', this.rightAxes);\n }\n }\n\n _showSeries(singleSeries) {\n const { axis } = singleSeries;\n axis.series.splice(singleSeries.indexInAxis, 0, singleSeries);\n\n this.deferredEmit('axes_changed', this._axes);\n\n if (axis.side === 'left') {\n this.deferredEmit('left_axes_changed', this.leftAxes);\n } else {\n this.deferredEmit('right_axes_changed', this.rightAxes);\n }\n }\n\n /*\n * Getters\n *******************\n */\n\n get boundCalculator() {\n return this._boundsCalculator;\n }\n\n get axes() {\n return this._axes;\n }\n\n get leftAxes() {\n const leftAxes = this._axes.filter(({ side, series }) => side === 'left' && series.length > 0).reverse();\n\n if (leftAxes.length === 0 && this.rightAxes.length === 0) {\n leftAxes.push(this._axes[0]);\n }\n\n return leftAxes;\n }\n\n get rightAxes() {\n return this._axes.filter(({ side, series }) => side === 'right' && series.length > 0 );\n }\n\n get bounds() {\n return this._axes.map(({ targetBounds }) => targetBounds);\n }\n\n get selection() {\n return this._selection;\n }\n\n get globalBounds() {\n return this._globalBounds;\n }\n\n get series() {\n return this._series;\n }\n\n get highlightedSeries() {\n return this._highlightedSeries;\n }\n\n get showIndividualPoints() {\n return this._showIndividualPoints;\n }\n\n get autoscaleY() {\n return this._autoscaleY;\n }\n\n get boundHistory() {\n return {\n hasNextBounds: this._boundsIndex < this._boundsHistory.length - 1,\n hasPreviousBounds: this._boundsIndex > 0\n };\n }\n\n get tooltipState() {\n return this._tooltipState;\n }\n \n get contextMenuState() {\n return this._contextMenuPosition;\n }\n\n get alwaysTooltipped() {\n return this._alwaysTooltipped;\n }\n\n get draggingY() {\n return this._draggingY;\n }\n\n get averageLoopTime() {\n return averageLoopTimes(this._timingBuffer);\n }\n\n get exportedAxes() {\n const axisToName = new Map();\n let leftCount = 0;\n let rightCount = 0;\n\n for (let axis of this._axes) {\n let name;\n if (axis.side === 'left') {\n name = `left-${leftCount}`;\n leftCount++;\n } else {\n name = `right-${rightCount}`;\n rightCount++;\n }\n\n for (let singleSeries of axis.series) {\n axisToName.set(singleSeries, name);\n }\n }\n\n return this.series.map((singleSeries) => {\n return {\n ...singleSeries.originalSeries,\n axis: axisToName.get(singleSeries)\n };\n });\n }\n\n get percentile() {\n return this._percentile;\n }\n\n get percentileAsymmetry() {\n return this._percentileAsymmetry;\n }\n\n get showingOptions() {\n return this._showingOptions;\n }\n\n get maxPrecision() {\n return this._maxPrecision;\n }\n\n get showingSidebar() {\n return this._showingSidebar;\n }\n\n get showingAnnotations() {\n return this._showingAnnotations;\n }\n\n get userCreatedSeries() {\n return this._series.filter((singleSeries) => singleSeries.userCreated);\n }\n\n get grapherID() {\n return this._grapherID;\n }\n\n get annotationState() {\n return this._annotationsState;\n }\n\n get sizing() {\n return this.primaryRenderer && this.primaryRenderer.sizing;\n }\n\n get theme() {\n return this._theme;\n }\n\n get exportMode() {\n return this._exportMode;\n }\n\n get enumMap() {\n return this._enumMap;\n }\n\n get hasXEnum() {\n return this._hasXEnum;\n }\n\n /*\n * Setters / ways to mutate the state that aren't the underlying data changing\n ***********************************************************************************\n */\n\n markSizeChanged(renderer) {\n if (renderer === this.primaryRenderer) {\n this.deferredEmit('primary_size_change', this.primaryRenderer.sizing);\n this.deferredEmit('primary_bounding_rect_change', this.primaryRenderer.boundingRect);\n this._primarySizeChanged = true;\n } else if (renderer === this.rangeGraphRenderer) {\n this.deferredEmit('range_graph_size_change', this.rangeGraphRenderer.sizing);\n this.deferredEmit('range_graph_bounding_rect_change', this.rangeGraphRenderer.boundingRect);\n this._rangeGraphSizeChanged = true;\n }\n\n this._mustRerender = true;\n this._tooltipsChanged = true;\n this._annotationsChanged = true;\n this._mustCallGenerators = true;\n this._markDirty();\n }\n\n set theme(value) {\n this._theme = value;\n this._mustRerender = true;\n this.deferredEmit('theme_change', this._theme);\n this._markDirty();\n }\n\n set exportMode(value) {\n this._exportMode = value;\n\n if (value) {\n this._nonExportTheme = this.theme;\n this.theme = 'export';\n } else {\n this.theme = this._nonExportTheme;\n }\n\n this.deferredEmit('export_mode_change', this._exportMode);\n this._markDirty();\n }\n\n set defaultLineWidth(value) {\n this._defaultLineWidth = value;\n this._mustRerender = true;\n this._markDirty();\n }\n\n set boundCalculator(boundingFunction) {\n if (!boundingFunction) {\n return;\n }\n\n if (boundingFunction === this._boundsCalculator) {\n return;\n }\n\n if (boundingFunction.debounceHistory) {\n clearTimeout(this._boundingCalculatorDebouncer);\n this._boundingCalculatorDebouncer = setTimeout(() => {\n this._addBoundCalculatorToHistory(boundingFunction);\n }, 250);\n } else {\n this._addBoundCalculatorToHistory(boundingFunction);\n }\n\n this._boundsCalculator = boundingFunction;\n this.deferredEmit('bound_calculator_changed', this._boundsCalculator);\n this._dataChanged = true;\n this._mustCallGenerators = true;\n this._markDirty();\n }\n\n set customBoundsSelectors(boundsSelectors) {\n this._customBoundsSelectors = this._customBoundsSelectors || {};\n\n const indexedCustomBoundSelectors = {};\n\n for (let { label, calculator } of boundsSelectors) {\n indexedCustomBoundSelectors[label] = calculator;\n\n if (this._boundsCalculator === this._customBoundsSelectors[label] && this._boundsCalculator !== calculator) {\n this.boundCalculator = calculator;\n }\n }\n\n this._customBoundsSelectors = indexedCustomBoundSelectors;\n }\n\n _addBoundCalculatorToHistory(boundingFunction) {\n this._boundsIndex++;\n this._boundsHistory = this._boundsHistory.slice(0, this._boundsIndex);\n this._boundsHistory.push(boundingFunction);\n this.emit('bound_history_changed', this.boundHistory);\n }\n\n registerSeriesClick(selectedSeriesIndex) {\n this.emit('series_click', this._series[selectedSeriesIndex], selectedSeriesIndex);\n }\n\n setHighlightedSeries(highlightedSeries) {\n this._highlightedSeries = highlightedSeries;\n this.deferredEmit('highlighted_series_changed', highlightedSeries);\n this._mustRerender = true;\n this._markDirty();\n }\n\n toggleIndividualPoints() {\n this._showIndividualPoints = !this._showIndividualPoints;\n this.deferredEmit('show_individual_points_changed', this._showIndividualPoints);\n this._mustRerender = true;\n this._markDirty();\n }\n\n toggleYAutoscaling() {\n this._autoscaleY = !this._autoscaleY;\n this.deferredEmit('autoscale_y_changed', this._autoscaleY);\n this._markDirty();\n }\n\n toggleExportMode() {\n this.exportMode = !this._exportMode;\n }\n\n setBoundsFromSelection(pixelSelection) {\n this.boundCalculator = boundCalculatorFromSelection(pixelSelection, {\n elementWidth: this.primaryRenderer.sizing.elementWidth,\n elementHeight: this.primaryRenderer.sizing.elementHeight,\n selection: this._selection,\n axes: this._axes\n });\n }\n\n nextBounds() {\n this._boundsIndex++;\n this._boundsCalculator = this._boundsHistory[this._boundsIndex];\n this.deferredEmit('bound_calculator_changed', this._boundsCalculator);\n this.deferredEmit('bound_history_changed', this.boundHistory);\n this._dataChanged = true;\n this._markDirty();\n }\n\n previousBounds() {\n this._boundsIndex--;\n this._boundsCalculator = this._boundsHistory[this._boundsIndex];\n this.deferredEmit('bound_calculator_changed', this._boundsCalculator);\n this.deferredEmit('bound_history_changed', this.boundHistory);\n this._dataChanged = true;\n this._markDirty();\n }\n\n setLabel({ axisIndex, label }) {\n this._axes[axisIndex].label = label;\n this.deferredEmit('axes_changed', [...this._axes]);\n this._markDirty();\n }\n\n toggleScale({ axisIndex }) {\n const oldScale = this._axes[axisIndex].scale;\n this._axes[axisIndex].scale = oldScale === 'log' ? 'linear' : 'log';\n\n this._dataChanged = true;\n this.deferredEmit('axes_changed', [...this._axes]);\n this._markDirty();\n }\n\n recalculateTooltips() {\n this.primaryRenderer.recalculatePosition();\n this.setTooltipMousePosition({\n clientX: this._tooltipClientX,\n clientY: this._tooltipClientY,\n shiftKey: this.shiftKeyPressedOnMove,\n tooltipAllNext: this._tooltipAllNext,\n tooltipStateArg: this._tooltipStateArg\n });\n }\n\n setTooltipMousePosition({ clientX, clientY, shiftKey, mouseX, mouseY, tooltipAllNext, tooltipStateArg }) {\n const sizing = this.primaryRenderer.sizing;\n if (!sizing) {\n return;\n }\n\n if (typeof clientX === 'number') {\n this._tooltipClientX = clientX;\n\n if (clientX < sizing.boundingRect.left || clientX > sizing.boundingRect.right) {\n this.showOnlySavedTooltips();\n return;\n }\n } else if (typeof mouseY !== 'number') {\n return;\n }\n\n if (typeof clientY === 'number') {\n this._tooltipClientY = clientY;\n\n if (clientY < sizing.boundingRect.top || clientY > sizing.boundingRect.bottom) {\n this.showOnlySavedTooltips();\n return;\n }\n } else if (typeof mouseY !== 'number') {\n return;\n }\n\n const newMouseX = mouseX || (clientX - sizing.boundingRect.left);\n const newMouseY = mouseY || (clientY - sizing.boundingRect.top);\n if (this._tooltipState.mousePresent && newMouseX === this._tooltipState.mouseX && newMouseY === this._tooltipState.mouseY) {\n return;\n }\n\n this._tooltipsChanged = true;\n this._tooltipState.mousePresent = true;\n this._tooltipState.mouseX = newMouseX;\n this._tooltipState.mouseY = newMouseY;\n this.shiftKeyPressedOnMove = shiftKey;\n this._tooltipAllNext = tooltipAllNext;\n this._tooltipStateArg = tooltipStateArg;\n this._markDirty();\n }\n \n setContextMenuMousePosition({ clientX, clientY }) {\n this._contextMenuPosition = { x: clientX, y: clientY, showing: !this._contextMenuPosition.showing };\n this._contextMenuChanged = true;\n this._markDirty();\n }\n\n toggleAlwaysTooltipped(singleSeries, shiftKey) {\n if (this._alwaysTooltipped.has(singleSeries)) {\n if (shiftKey) {\n this._alwaysTooltipped.clear();\n } else {\n this._alwaysTooltipped.delete(singleSeries);\n }\n } else {\n if (shiftKey) {\n for (let series of this._series) {\n this._alwaysTooltipped.add(series);\n }\n } else {\n this._alwaysTooltipped.add(singleSeries);\n }\n }\n\n this._tooltipsChanged = true;\n this.deferredEmit('always_tooltipped_changed', this._alwaysTooltipped);\n this._markDirty();\n }\n\n showOnlySavedTooltips(tooltipStateArg) {\n if (!this._tooltipState.mousePresent) {\n return;\n }\n\n this._tooltipsChanged = true;\n this._tooltipState.mousePresent = false;\n this._tooltipStateArg = tooltipStateArg;\n this._markDirty();\n }\n\n registerClick({ clientX }) {\n if (!this._listeners['series_click']) {\n return;\n }\n\n const boundingRect = this.primaryRenderer.boundingRect;\n const sizing = this.primaryRenderer.sizing;\n\n for (let series of this._series) {\n const bounds = series.axis.currentBounds;\n\n const x = (clientX - boundingRect.left) / sizing.elementWidth * (bounds.maxX - bounds.minX) + bounds.minX;\n this.emit('series_click', { x, series });\n }\n }\n\n toggleTooltipSaved() {\n const oldSavedTooltips = this._savedTooltips;\n this._savedTooltips = toggleTooltipSaved({\n currentTooltips: this._tooltipState.tooltips,\n savedTooltips: this._savedTooltips\n });\n this._tooltipsChanged = this._savedTooltips !== oldSavedTooltips;\n this._markDirty();\n }\n\n clearSavedTooltips() {\n if (this._savedTooltips.length === 0) {\n return;\n }\n\n this._savedTooltips = [];\n this._tooltipsChanged = true;\n this._markDirty();\n }\n\n markDragStart() {\n if (this._draggingY) {\n return;\n }\n\n this._draggingY = true;\n this.deferredEmit('dragging_y_changed', this._draggingY);\n this._markDirty();\n }\n\n finalizeDrag(draggedSeries, axisIndex, grapherID) {\n if (!this._draggingY) {\n return;\n }\n\n this._draggingY = false;\n this.deferredEmit('dragging_y_changed', this._draggingY);\n\n const hasAxis = axisIndex && axisIndex !== 0;\n const sameGrapherID = grapherID === this._grapherID;\n\n if (hasAxis && sameGrapherID) {\n this._moveAxis(draggedSeries, axisIndex);\n this.deferredEmit('dragging_y_finalized', { draggedSeries, axisIndex, grapherID });\n } else if (grapherID) {\n this.deferredEmit('dragging_y_finalized', { draggedSeries, axisIndex, grapherID });\n }\n\n this._markDirty();\n }\n\n set timingFrameCount(value) {\n if (typeof value !== 'number') {\n return;\n }\n\n this._timingBuffer = [];\n this._timingIndex = 0;\n this._timingFrameCount = value;\n }\n\n set percentile(value) {\n if (value === undefined) {\n return;\n }\n\n this.deferredEmit('percentile_changed', value);\n\n if (value === '') {\n value = 100;\n }\n\n value = parseFloat(value);\n if (!isNaN(value) && value <= 100 && value >= 0) {\n this._percentile = value;\n this._dataChanged = true;\n }\n\n this._markDirty();\n }\n\n set percentileAsymmetry(value) {\n if (value === undefined) {\n return;\n }\n\n this.deferredEmit('percentile_asymmetry_changed', value);\n\n if (value === '') {\n value = 0;\n }\n\n value = parseFloat(value);\n if (!isNaN(value) && value <= 50 && value >= -50) {\n this._percentileAsymmetry = value;\n this._dataChanged = true;\n }\n\n this._markDirty();\n }\n\n set showingOptions(value) {\n if (value === undefined) {\n return;\n }\n\n this._showingOptions = value;\n this.deferredEmit('showing_options_changed', value);\n this._markDirty();\n }\n\n toggleShowingOptions() {\n this.showingOptions = !this.showingOptions;\n }\n\n toggleMaxPrecision() {\n this._maxPrecision = !this._maxPrecision;\n this.deferredEmit('max_precision_changed', this._maxPrecision);\n this._markDirty();\n }\n\n toggleShowingAnnotations() {\n this._showingAnnotations = !this._showingAnnotations;\n this.deferredEmit('showing_annotations_changed', this._showingAnnotations);\n this._markDirty();\n }\n\n toggleShowingSidebar() {\n this._showingSidebar = !this._showingSidebar;\n this.deferredEmit('showing_sidebar_changed', this._showingSidebar);\n this._markDirty();\n }\n\n setShowing(singleSeries, showing) {\n singleSeries.hidden = !showing;\n this._series = [...this._series];\n\n if (singleSeries.hidden) {\n this._hideSeries(singleSeries);\n } else {\n this._showSeries(singleSeries);\n }\n\n this.deferredEmit('series_changed', this._series, { skipResize: true });\n this._dataChanged = true;\n this._markDirty();\n }\n\n set annotations(value) {\n this._annotations = value || [];\n this._annotationsChanged = true;\n this._markDirty();\n }\n\n /**\n * Converts an enum to a number, mutating saved state if necessary to track that\n *\n * @param {String} value\n * @param {Object} singleSeries\n * @param {Boolean} [isX]\n * @return {Number}\n */\n enumToNumber(value, singleSeries, isX) {\n const existingIndex = this._enumMap[value];\n if (typeof existingIndex === 'number') {\n return existingIndex;\n }\n\n const indexToSet = Object.keys(this._enumMap).length;\n this._enumMap[value] = indexToSet;\n\n // safely handle reference changes\n this._series[singleSeries.index].hasEnum = true;\n if (isX) {\n this._series[singleSeries.index].hasXEnum = true;\n this._hasXEnum = true;\n this.deferredEmit('has_x_enum_change', this._hasXEnum);\n this.deferredEmit('x_enum_map_change', this._enumMap);\n }\n\n this.deferredEmit('enum_map_change', this._enumMap);\n\n return indexToSet;\n }\n\n triggerResize() {\n this._mustResize = true;\n this._markDirty();\n }\n}\n","import BOUND_CALCULATORS from './bound_calculators';\n\nexport default function getDefaultBoundsCalculator(givenLabel, customCalculators) {\n if (BOUND_CALCULATORS[givenLabel]) {\n return BOUND_CALCULATORS[givenLabel];\n }\n\n for (let { label, calculator } of customCalculators) {\n if (givenLabel === label) {\n return calculator;\n }\n }\n\n return BOUND_CALCULATORS.all;\n}\n","export default function generatorParamsEqual(a, b) {\n if (a === undefined || b === undefined) {\n return a === b;\n }\n\n return (a.minX === b.minX) &&\n (a.maxX === b.maxX) &&\n (a.sizing.elementWidth === b.sizing.elementWidth) &&\n (a.sizing.renderWidth === b.sizing.renderWidth);\n}\n","import nameForSeries from '../helpers/name_for_series.js';\n\nexport default function calculateAnnotationsState({ annotations, series, sizing, selection }) {\n const shownSeries = new Set(series.map((singleSeries, i) => {\n return {\n name: nameForSeries(singleSeries, i),\n hidden: singleSeries.hidden\n };\n }).filter(({ hidden }) => !hidden).map(({ name }) => name));\n\n const { elementWidth } = sizing;\n const { minX, maxX } = selection;\n const xRange = maxX - minX;\n\n // Avoid division by zero if minX === maxX\n if (xRange === 0) {\n return {\n annotations: [],\n elementWidth\n };\n }\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 const isRange = annotation.startX !== undefined && annotation.endX !== undefined;\n const isPoint = annotation.x !== undefined;\n\n let xStartValue = annotation.startX;\n let xEndValue = annotation.endX;\n\n if (!isRange && isPoint) {\n xStartValue = annotation.x;\n xEndValue = annotation.x;\n } else if (!isRange && !isPoint) {\n return null;\n }\n\n const convertToNumber = (val) => {\n if (typeof val === 'string') return new Date(val).valueOf();\n if (val instanceof Date) return val.valueOf();\n return val;\n };\n\n let startX = convertToNumber(xStartValue);\n let endX = convertToNumber(xEndValue);\n\n if (startX > endX) {\n [startX, endX] = [endX, startX];\n }\n\n let pixelStartX = (startX - minX) / xRange * elementWidth;\n let pixelEndX = (endX - minX) / xRange * elementWidth;\n\n // Clamp values to be within the element width\n pixelStartX = Math.max(0, Math.min(elementWidth, pixelStartX));\n pixelEndX = Math.max(0, Math.min(elementWidth, pixelEndX));\n\n let pixelWidth = pixelEndX - pixelStartX;\n if (pixelWidth < 1 && pixelEndX > 0 && pixelStartX < elementWidth) {\n if (!isRange && isPoint) {\n pixelWidth = 1;\n pixelStartX -= 0.5;\n } else if (isRange) {\n pixelWidth = 1;\n } else {\n pixelWidth = 0;\n }\n }\n \n pixelStartX = Math.max(0, Math.min(elementWidth - pixelWidth, pixelStartX));\n\n\n if (pixelWidth <= 0) {\n return null;\n }\n\n\n return {\n ...annotation,\n isRange,\n pixelStartX,\n pixelWidth\n };\n }).filter(annotation => annotation !== null);\n\n return {\n annotations: renderableAnnotations,\n elementWidth\n };\n}\n","export default function selectionFromGlobalBounds(globalBounds, boundsCalculator) {\n const targetBounds = Object.assign({}, globalBounds, boundsCalculator(globalBounds));\n\n if (targetBounds.maxX instanceof Date) {\n targetBounds.maxX = targetBounds.maxX.valueOf();\n }\n\n if (targetBounds.minX instanceof Date) {\n targetBounds.minX = targetBounds.minX.valueOf();\n }\n\n if (targetBounds.maxX < targetBounds.minX) {\n targetBounds.maxX = targetBounds.minX;\n }\n\n if (targetBounds.minX < globalBounds.minX) {\n targetBounds.minX = globalBounds.minX;\n }\n\n if (targetBounds.maxX > globalBounds.maxX) {\n targetBounds.maxX = globalBounds.maxX;\n }\n\n return targetBounds;\n}\n","/**\n *\n * @param {Array<Object>} axes\n * @param {'left'|'right'} [side]\n * @param {String|Number} [number]\n * @return {Object|undefined}\n */\nexport default function findMatchingAxis({ axes, side, number }) {\n if (number) {\n number = parseInt(number) || 0;\n } else {\n number = 0;\n }\n\n let axis;\n let seen = 0;\n for (let candidateAxis of axes) {\n if (candidateAxis.side !== side) {\n continue;\n }\n\n if (seen === number) {\n axis = candidateAxis;\n break;\n }\n\n seen++;\n }\n\n return axis;\n}\n","export function averageLoopTimes(loopTimes) {\n const result = {};\n\n for (let loopTime of loopTimes) {\n for (let [key, value] of Object.entries(loopTime)) {\n result[key] = (result[key] || 0) + value;\n }\n }\n\n for (let [key, value] of Object.entries(result)) {\n result[key] = value/loopTimes.length;\n }\n\n return result;\n}\n","import scaleBounds from '../renderer/scale_bounds';\n\nexport default function boundCalculatorFromSelection({ minPixelX, maxPixelX, minPixelY, maxPixelY}, { elementWidth, elementHeight, selection, axes }) {\n if (Math.abs(maxPixelX - minPixelX) < 1 || Math.abs(maxPixelY - minPixelY) < 1) {\n return;\n }\n\n const minX = (minPixelX/elementWidth)*(selection.maxX - selection.minX) + selection.minX;\n const maxX = (maxPixelX/elementWidth)*(selection.maxX - selection.minX) + selection.minX;\n\n const byAxis = [];\n for (let { currentBounds, scale } of axes) {\n const scaledBounds = scaleBounds({ ...currentBounds, scale });\n let maxY = (1 - minPixelY/elementHeight)*(scaledBounds.maxY - scaledBounds.minY) + scaledBounds.minY;\n let minY = (1 - maxPixelY/elementHeight)*(scaledBounds.maxY - scaledBounds.minY) + scaledBounds.minY;\n\n if (scale === 'log') {\n minY = Math.pow(10, minY);\n maxY = Math.pow(10, maxY);\n }\n byAxis.push({\n minX,\n maxX,\n minY,\n maxY\n });\n }\n\n return () => {\n return {\n minX,\n maxX,\n byAxis\n };\n };\n}\n","import { useState, useEffect } from 'react';\n\nexport function useEvent(eventSource, eventName, initialState=null, watch=[]) {\n if (typeof initialState === 'function') {\n const originalInitialState = initialState;\n initialState = () => originalInitialState;\n }\n\n const [value, setValue] = useState(initialState);\n\n useEffect(() => {\n const listener = (updatedValue) => {\n if (typeof updatedValue === 'function') {\n const originalUpdatedValue = updatedValue;\n updatedValue = () => originalUpdatedValue;\n }\n setValue(updatedValue);\n };\n\n eventSource.on(eventName, listener);\n return () => {\n eventSource.off(eventName, listener);\n };\n }, [...watch, setValue, eventSource]);\n\n return value;\n}\n\nexport function usePrimarySize(stateController) {\n return useEvent(stateController, 'primary_size_change', stateController.primaryRenderer ? stateController.primaryRenderer.sizing : {\n elementWidth: 0,\n elementHeight: 0,\n renderWidth: 0,\n renderHeight: 0\n });\n}\n\nexport function useAxes(stateController) {\n return useEvent(stateController, 'axes_changed', stateController.axes);\n}\n\nexport function useSeries(stateController) {\n return useEvent(stateController, 'series_changed', stateController.series);\n}\n\nexport function useHighlightedSeries(stateController) {\n return useEvent(stateController, 'highlighted_series_changed', stateController.highlightedSeries);\n}\n\nexport function useRightAxisCount(stateController) {\n return useRightAxes(stateController).length;\n}\n\nexport function useLeftAxisCount(stateController) {\n return useLeftAxes(stateController).length;\n}\n\nexport function useRightAxes(stateController) {\n return useEvent(stateController, 'right_axes_changed', stateController.rightAxes);\n}\n\nexport function useLeftAxes(stateController) {\n return useEvent(stateController, 'left_axes_changed', stateController.leftAxes);\n}\n\nexport function useSelection(stateController) {\n return useEvent(stateController, 'selection_changed', stateController.selection);\n}\n\nexport function useGlobalBounds(stateController) {\n return useEvent(stateController, 'global_bounds_changed', stateController.globalBounds);\n}\n\nexport function useAxisBounds(stateController) {\n return useEvent(stateController, 'axis_bounds_changed', stateController.axes.map(({ currentBounds }) => currentBounds));\n}\n\nexport function useBoundCalculator(stateController) {\n return useEvent(stateController, 'bound_calculator_changed', stateController.boundCalculator);\n}\n\nexport function useShowIndividualPoints(stateController) {\n return useEvent(stateController, 'show_individual_points_changed', stateController.showIndividualPoints);\n}\n\nexport function useAutoscaleY(stateController) {\n return useEvent(stateController, 'autoscale_y_changed', stateController.autoscaleY);\n}\n\nexport function useBoundHistory(stateController) {\n return useEvent(stateController, 'bound_history_changed', stateController.boundHistory);\n}\n\nexport function useAlwaysTooltipped(stateController) {\n return useEvent(stateController, 'always_tooltipped_changed', stateController.alwaysTooltipped);\n}\n\nexport function useTooltipState(stateController) {\n return useEvent(stateController, 'tooltip_state_changed', stateController.tooltipState);\n}\n\nexport function useContextMenu(stateController) {\n return useEvent(stateController, 'context_menu_position_changed', stateController.contextMenuState);\n}\n\nexport function useDraggingY(stateController) {\n return useEvent(stateController, 'dragging_y_changed', stateController.draggingY);\n}\n\nexport function usePercentile(stateController) {\n return useEvent(stateController, 'percentile_changed', stateController.percentile);\n}\n\nexport function useShowingOptions(stateController) {\n return useEvent(stateController, 'showing_options_changed', stateController.showingOptions);\n}\n\nexport function useMaxPrecision(stateController) {\n return useEvent(stateController, 'max_precision_changed', stateController.maxPrecision);\n}\n\nexport function usePercentileAsymmetry(stateController) {\n return useEvent(stateController, 'percentile_asymmetry_changed', stateController.percentileAsymmetry);\n}\n\nexport function useShowingSidebar(stateController) {\n return useEvent(stateController, 'showing_sidebar_changed', stateController.showingSidebar);\n}\n\nexport function useShowingAnnotations(stateController) {\n return useEvent(stateController, 'showing_annotations_changed', stateController.showingAnnotations);\n}\n\nexport function useMultiSeries(multigraphStateController) {\n return useEvent(multigraphStateController, 'multi_series_changed', multigraphStateController.multiSeries);\n}\n\nexport function useAnnotationState(stateController) {\n return useEvent(stateController, 'annotations_changed', stateController.annotationState);\n}\n\nexport function useSizing(stateController) {\n return useEvent(stateController, 'primary_size_change', stateController.sizing);\n}\n\nexport function useTheme(stateController) {\n return useEvent(stateController, 'theme_change', stateController.theme);\n}\n\nexport function useExportMode(stateController) {\n return useEvent(stateController, 'export_mode_change', stateController.exportMode);\n}\n\nexport function useHasXEnum(stateController) {\n return useEvent(stateController, 'has_x_enum_change', stateController.hasXEnum);\n}\n\nexport function useEnumMap(stateController) {\n return useEvent(stateController, 'enum_map_change', stateController.enumMap);\n}\n\nexport function useXEnumMap(stateController) {\n return useEvent(stateController, 'x_enum_map_change', stateController.enumMap);\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nexport default class Annotations extends React.PureComponent {\n\n render() {\n const { bodyHeight, annotationState } = this.props;\n const { annotations, elementWidth } = annotationState;\n\n const validAnnotations = annotations.filter(a => a.pixelStartX !== undefined && a.pixelWidth !== undefined);\n\n return (\n <div className=\"grapher-annotations\">\n {\n validAnnotations.map(({ pixelStartX, pixelWidth, content, isRange, lineOnly }, i) => {\n const annotationStyle = {\n left: pixelStartX\n };\n\n if (isRange) {\n return (\n <div key={`range-${i}`} className=\"grapher-annotation grapher-annotation-range\" style={annotationStyle}>\n <div\n className=\"annotation-range-marker\"\n style={{ width: pixelWidth, height: bodyHeight }}\n />\n </div>\n );\n } else {\n const pointMarkerWidth = lineOnly ? pixelWidth : Math.max(pixelWidth, 1);\n\n const textStyle = {};\n if (content) {\n textStyle.top = 21 * i;\n textStyle.position = 'absolute';\n const approxTextWidth = (content || '').length * 5.5;\n if (elementWidth > 0 && elementWidth - pixelStartX < approxTextWidth + 10) {\n textStyle.left = -approxTextWidth - 5;\n textStyle.textAlign = 'right';\n } else {\n textStyle.left = pointMarkerWidth + 5;\n }\n }\n\n return (\n <div key={`point-${i}`} className=\"grapher-annotation grapher-annotation-point\" style={annotationStyle}>\n <div\n className=\"annotation-marker\"\n style={{ width: pointMarkerWidth, height: bodyHeight }}\n />\n {content && !lineOnly &&\n <div className=\"annotation-text\" style={textStyle}>\n {content}\n </div>\n }\n </div>\n );\n }\n })\n }\n </div>\n );\n }\n}\n\nAnnotations.propTypes = {\n annotationState: PropTypes.shape({\n annotations: PropTypes.arrayOf(PropTypes.shape({\n pixelStartX: PropTypes.number,\n pixelWidth: PropTypes.number,\n content: PropTypes.string,\n isRange: PropTypes.bool,\n lineOnly: PropTypes.bool\n })).isRequired,\n elementWidth: PropTypes.number.isRequired\n }),\n bodyHeight: PropTypes.number\n};\n","import React from 'react';\nimport CustomPropTypes from '../helpers/custom_prop_types.js';\nimport PropTypes from 'prop-types';\nimport StateController from '../state/state_controller.js';\nimport {LINE_COLORS} from '../helpers/colors.js';\nimport {useAxisBounds, useSizing} from '../state/hooks.js';\n\nexport default React.memo(DraggablePoints);\n\nfunction DraggablePoints({ stateController, draggablePoints, onPointDrag, onDraggablePointsDoubleClick }) {\n const bounds = useAxisBounds(stateController)[0];\n const sizing = useSizing(stateController);\n\n if (!sizing) {\n return null;\n }\n\n const onPointlessDoubleClick = onDraggablePointsDoubleClick && ((event) => {\n const newXT = (event.clientX - sizing.boundingRect.left)/sizing.elementWidth;\n const newYT = 1 - (event.clientY - sizing.boundingRect.top)/sizing.elementHeight;\n\n onDraggablePointsDoubleClick(event, {\n x: newXT*(bounds.maxX - bounds.minX) + bounds.minX,\n y: newYT*(bounds.maxY - bounds.minY) + bounds.minY\n });\n });\n\n return (\n <div className=\"grapher-draggable-points\" onDoubleClick={onPointlessDoubleClick}>\n <svg width={sizing.elementWidth} height={sizing.elementHeight}>\n {\n draggablePoints.map((point, index) => {\n const xT = (point.x - bounds.minX)/(bounds.maxX - bounds.minX);\n const yT = (1 - (point.y - bounds.minY)/(bounds.maxY - bounds.minY));\n\n if (xT < 0 || xT > 1 || yT < 0 || yT > 1) {\n return null;\n }\n\n const pixelX = xT * sizing.elementWidth;\n const pixelY = yT * sizing.elementHeight;\n\n const radius = point.radius || 5;\n const fillColor = point.fillColor || LINE_COLORS[0];\n const strokeColor = point.strokeColor || 'white';\n const strokeWidth = point.strokeWidth || 1;\n\n const onMouseDown = (event) => {\n event.stopPropagation();\n\n if (!onPointDrag) {\n return;\n }\n\n const xOffset = pixelX - event.clientX;\n const yOffset = pixelY - event.clientY;\n\n const onMouseMove = (moveEvent) => {\n const newXT = (moveEvent.clientX + xOffset)/sizing.elementWidth;\n const newYT = 1 - (moveEvent.clientY + yOffset)/sizing.elementHeight;\n\n onPointDrag({\n index,\n point,\n x: newXT*(bounds.maxX - bounds.minX) + bounds.minX,\n y: newYT*(bounds.maxY - bounds.minY) + bounds.minY\n }, moveEvent);\n };\n\n const onMouseUp = () => {\n window.removeEventListener('mousemove', onMouseMove);\n window.removeEventListener('mouseup', onMouseUp);\n };\n\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('mouseup', onMouseUp);\n };\n\n const onClick = point.onClick && ((event) => {\n point.onClick(event, point);\n });\n\n const onDoubleClick = point.onDoubleClick && ((event) => {\n event.stopPropagation();\n point.onDoubleClick(event, point);\n });\n\n return (\n <circle\n key={index}\n cx={pixelX}\n cy={pixelY}\n r={radius}\n fill={fillColor}\n stroke={strokeColor}\n strokeWidth={strokeWidth}\n onMouseDown={onMouseDown}\n onClick={onClick}\n onDoubleClick={onDoubleClick}\n />\n );\n })\n }\n </svg>\n </div>\n );\n}\n\nDraggablePoints.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n draggablePoints: CustomPropTypes.DraggablePoints.isRequired,\n onPointDrag: PropTypes.func,\n onDraggablePointsDoubleClick: PropTypes.func\n};\n","import React from 'react';\nimport CustomPropTypes from '../helpers/custom_prop_types.js';\nimport PropTypes from 'prop-types';\nimport StateController from '../state/state_controller.js';\nimport {useAxisBounds, useSizing} from '../state/hooks.js';\n\nexport default React.memo(VerticalLines);\n\nfunction VerticalLines({ stateController, verticalLines, isRangeGraph, bounds, elementWidth, elementHeight }) {\n bounds = bounds || useAxisBounds(stateController)[0];\n const sizing = useSizing(stateController);\n\n if (!sizing) {\n return null;\n }\n\n const relevantVerticalLines = verticalLines.filter(line => {\n if (isRangeGraph && !line.onRangeGraph) {\n return false;\n }\n\n if (line.onRangeGraphOnly && !isRangeGraph) {\n return false;\n }\n\n return true;\n });\n\n if (relevantVerticalLines.length === 0) {\n return null;\n }\n\n return (\n <div className=\"grapher-vertical-lines\">\n <svg width={elementWidth || sizing.elementWidth} height={elementHeight || sizing.elementHeight}>\n {\n relevantVerticalLines.map((line, index) => {\n if (isRangeGraph && typeof line.onRangeGraph === 'object') {\n line = {\n ...line,\n ...line.onRangeGraph\n };\n }\n\n const xT = (line.x - bounds.minX)/(bounds.maxX - bounds.minX);\n\n if (xT < 0 || xT > 1) {\n return null;\n }\n\n const pixelX = xT * (elementWidth || sizing.elementWidth);\n if (typeof line.minPixelX === 'number' && pixelX < line.minPixelX) {\n return null;\n }\n\n if (typeof line.maxPixelX === 'number' && pixelX > line.maxPixelX) {\n return null;\n }\n\n const lineStyle = {\n stroke: line.color,\n strokeWidth: line.width,\n ...(line.style || {})\n };\n\n const markerStyle = {\n fill: line.color,\n ...(line.markerStyle || {})\n };\n\n const textStyle = {\n ...{\n fontSize: '12px',\n fill: line.color,\n stroke: 'none',\n textAnchor: 'middle',\n dominantBaseline: 'hanging'\n },\n ...(line.textStyle || {})\n };\n\n let lineTop = 0;\n if (typeof line.lineTop === 'number') {\n lineTop = line.lineTop;\n } else if (line.text) {\n lineTop = 18;\n }\n\n let textTop = 5;\n if (typeof line.textTop === 'number') {\n textTop = line.textTop;\n }\n\n return (\n <React.Fragment key={index}>\n <line\n x1={pixelX}\n y1={lineTop}\n x2={pixelX}\n y2={(elementHeight || sizing.elementHeight)}\n style={lineStyle}\n />\n\n {\n line.markTop &&\n <polygon\n points={`${pixelX - 3},0 ${pixelX + 3},0 ${pixelX},3`}\n style={markerStyle}\n />\n }\n\n {\n line.text &&\n <text\n x={pixelX}\n y={textTop}\n style={textStyle}\n >\n {line.text}\n </text>\n }\n </React.Fragment>\n );\n })\n }\n </svg>\n </div>\n );\n}\n\nVerticalLines.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n verticalLines: CustomPropTypes.VerticalLines.isRequired,\n isRangeGraph: PropTypes.bool,\n bounds: PropTypes.object,\n elementWidth: PropTypes.number,\n elementHeight: PropTypes.number\n};\n","import React, { useCallback, useState, useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport CustomPropTypes from '../helpers/custom_prop_types';\nimport GraphBodyRenderer from '../renderer/graph_body_renderer';\nimport Tooltip from './tooltip.jsx';\nimport ContextMenu from './context_menu.jsx';\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.jsx';\nimport DraggablePoints from './draggable_points.jsx';\nimport VerticalLines from './vertical_lines.jsx';\nimport binarySearch from '../helpers/binary_search';\n\nexport default React.memo(GraphBody);\n\nfunction GraphBody({ stateController, webgl, bodyHeight, boundsSelectionEnabled, showTooltips, showContextMenu=true, tooltipOptions, checkIntersection, draggablePoints, onPointDrag, onDraggablePointsDoubleClick, verticalLines, clockStyle, timeZone, onPointClick }) {\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 const getTouch = (event) => event.touches?.[0] || event.changedTouches?.[0];\n\n const onGlobalTouchStart = (event) => {\n if (!showTooltips) {\n return;\n }\n const touch = getTouch(event);\n if (!touch) return;\n stateController.setTooltipMousePosition({\n clientX: touch.clientX,\n clientY: touch.clientY\n });\n \n // Only prevent default if touch is within grapher bounds\n if (event.cancelable && event.target.closest('.graph-body')) {\n event.preventDefault();\n }\n };\n\n const onGlobalTouchMove = (event) => {\n if (!showTooltips) {\n return;\n }\n const touch = getTouch(event);\n if (!touch) return;\n stateController.setTooltipMousePosition({\n clientX: touch.clientX,\n clientY: touch.clientY\n });\n \n // Only prevent default if touch is within grapher bounds\n if (event.cancelable && event.target.closest('.graph-body')) {\n event.preventDefault();\n }\n };\n\n const onGlobalTouchEnd = () => {\n stateController.showOnlySavedTooltips();\n };\n\n window.addEventListener('scroll', onScroll, { passive: true });\n window.addEventListener('mousemove', onGlobalMouseMove, { passive: true });\n window.addEventListener('touchstart', onGlobalTouchStart, { passive: false });\n window.addEventListener('touchmove', onGlobalTouchMove, { passive: false });\n window.addEventListener('touchend', onGlobalTouchEnd, { passive: true });\n window.addEventListener('touchcancel', onGlobalTouchEnd, { passive: true });\n\n return () => {\n window.removeEventListener('scroll', onScroll);\n window.removeEventListener('mousemove', onGlobalMouseMove);\n window.removeEventListener('touchstart', onGlobalTouchStart);\n window.removeEventListener('touchmove', onGlobalTouchMove);\n window.removeEventListener('touchend', onGlobalTouchEnd);\n window.removeEventListener('touchcancel', onGlobalTouchEnd);\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 if (onPointClick) {\n const seriesToNearestPoint = {};\n\n const series = stateController.series;\n for (let i = 0; i < series.length; i++) {\n const singleSeries = series[i];\n\n const sizing = stateController.sizing;\n const bounds = singleSeries.axis.currentBounds;\n // const trueX = event.clientX/sizing.elementWidth * (bounds.maxX - bounds.minX) + bounds.minX;\n const trueX = stateController.tooltipState.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 seriesToNearestPoint[singleSeries.name] = closestPoint[0];\n }\n\n\n\n onPointClick(event, seriesToNearestPoint);\n }\n };\n const onDoubleClick = () => {\n stateController.clearSavedTooltips();\n };\n \n const onContextMenu = (event) => {\n event.preventDefault();\n if (showContextMenu !== false) {\n stateController.setContextMenuMousePosition({\n clientX: event.clientX,\n clientY: event.clientY,\n showing: true\n });\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 || stateController?.primaryRenderer?.boundingRect?.height}\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 onPointClick: PropTypes.func,\n clockStyle: PropTypes.oneOf(['12h', '24h']),\n timeZone: PropTypes.string\n};","\n import API from \"!../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../node_modules/css-loader/dist/cjs.js!../node_modules/sass-loader/dist/cjs.js!./grapher.scss\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../node_modules/css-loader/dist/cjs.js!../node_modules/sass-loader/dist/cjs.js!./grapher.scss\";\n export default content && content.locals ? content.locals : undefined;\n","import {startOfDayInTimezone} from './format';\n\nfunction placeTick(trueValue, {scale, min, max, inverted, totalSize, precision, formatter, dates, justTime, justDate, formatOptions={} }, opts={}) {\n let scaledValue = trueValue;\n\n if (scale === 'log') {\n scaledValue = 10**trueValue;\n }\n\n let percent = (trueValue - min)/(max - min);\n if (inverted) {\n percent = 1.0 - percent;\n }\n\n let pixelValue = percent * totalSize;\n if (isNaN(pixelValue)) {\n pixelValue = 0;\n }\n\n return {\n pixelValue,\n trueValue: scaledValue,\n label: formatter(scaledValue, { ...formatOptions, precision, log: scale === 'log', dates, justTime, justDate }),\n size: 'major',\n ...opts\n };\n}\n\nfunction placeTickByPixel(pixelValue, {scale, min, max, inverted, totalSize, precision, formatter, dates, justTime, justDate, formatOptions={} }, opts={}) {\n let percent = pixelValue/totalSize;\n if (inverted) {\n percent = 1.0 - percent;\n }\n\n let trueValue = percent * (max - min) + min;\n\n if (scale === 'log') {\n trueValue = Math.pow(10, trueValue);\n }\n\n return {\n pixelValue,\n trueValue,\n label: formatter(trueValue, { ...formatOptions, precision, log: scale === 'log', dates, justTime, justDate }),\n size: 'major',\n ...opts\n };\n}\n\nfunction roundToEvenNumber(value, tickSpacing) {\n return Math.round(value/tickSpacing)*tickSpacing;\n}\n\nfunction getEvenTickSpacing(span, desiredCount) {\n const subspan = span/desiredCount;\n\n const precision = -Math.log10(Math.abs(subspan)) + 1;\n const multiplier = (precision - Math.floor(precision)) > 0.5 ? 2 : 1;\n\n const roundTo = 10**Math.floor(precision) * multiplier;\n\n return Math.round(subspan * roundTo)/roundTo;\n}\n\nfunction roundToDivisor(value, divisor) {\n if (value <= 1) {\n return 1;\n }\n\n if (divisor === 1) {\n return Math.round(value);\n }\n\n if (value >= divisor) {\n return Math.round(value/divisor)*divisor;\n }\n\n let divisors;\n if (divisor === 24) {\n divisors = [1, 2, 6, 12, 24];\n } else if (divisor === 60) {\n divisors = [1, 2, 5, 10, 15, 30, 60];\n } else {\n throw new Error('Invalid divisor');\n }\n\n let bestDelta = Infinity;\n let bestDivisor = 1;\n for (let i = 0; i < divisors.length; i++) {\n const delta = Math.abs(divisors[i] - value);\n if (delta < bestDelta) {\n bestDivisor = divisors[i];\n bestDelta = delta;\n }\n }\n\n return bestDivisor;\n}\n\nfunction getEvenDateTickSpacing(span, desiredCount, unitOverride) {\n const subspan = span / desiredCount;\n\n if (subspan < 60*1000 && (!unitOverride || unitOverride === 'second')) {\n return {\n amount: roundToDivisor(subspan/1000, 60),\n unit: 's'\n };\n }\n\n if (subspan < 60*60*1000 && (!unitOverride || unitOverride === 'minute')) {\n return {\n amount: roundToDivisor(subspan/(60*1000), 60),\n unit: 'm'\n };\n }\n\n if (subspan < 24*60*60*1000 && (!unitOverride || unitOverride === 'hour')) {\n return {\n amount: roundToDivisor(subspan/(60*60*1000), 24),\n unit: 'h'\n };\n }\n\n if (unitOverride === 'day' || (subspan < 30*24*60*60*1000 && !unitOverride)) {\n return {\n amount: roundToDivisor(subspan/(24*60*60*1000), 1),\n unit: 'd'\n };\n }\n\n if (subspan > 30*24*60*60*1000 && (!unitOverride || unitOverride === 'month')) {\n return {\n amount: roundToDivisor(subspan/30*24*60*60*1000, 1),\n unit: 'month'\n };\n }\n\n if (unitOverride === 'year') {\n return {\n amount: roundToDivisor(subspan/365*24*60*60*1000, 1),\n unit: 'year'\n };\n }\n\n return {\n unit: 'm',\n amount: 60\n };\n}\n\nfunction placeNumbersGrid({ min, max, precision, expectedLabelSize, labelPadding, totalSize, scale='linear', formatter, inverted=false, formatOptions }) {\n const paddedLabelSize = expectedLabelSize + 2*labelPadding;\n\n const ticks = [];\n const placementParams = {scale, min, max, inverted, totalSize, precision, formatter, formatOptions, dates: false };\n\n const labelCount = Math.floor((totalSize - expectedLabelSize*2)/paddedLabelSize);\n const tickSpacing = getEvenTickSpacing(max - min, labelCount);\n if (tickSpacing > 0) {\n for (let value = roundToEvenNumber(min, tickSpacing); value < max; value += tickSpacing) {\n ticks.push(placeTick(value, placementParams));\n }\n }\n\n if (ticks.length) {\n if (inverted && ticks[ticks.length - 1].pixelValue > labelPadding) {\n ticks.push(placeTickByPixel(expectedLabelSize / 2, placementParams));\n }\n }\n\n return ticks.filter(({ pixelValue }) => pixelValue <= totalSize && pixelValue >= 0);\n}\n\nfunction placeDatesGrid({ min, max, precision, expectedLabelSize, labelPadding, totalSize, skipFirst=false, skipLast=false, scale='linear', formatter, inverted=false, formatOptions }) {\n const paddedLabelSize = expectedLabelSize + 2*labelPadding;\n\n const ticks = [];\n const placementParams = {scale, min, max, inverted, totalSize, precision, formatter, formatOptions, dates: true };\n\n const { amount, unit } = getEvenDateTickSpacing(max - min, totalSize/paddedLabelSize, formatOptions.unitOverride);\n\n const justDate = unit === 'month';\n\n if (!skipFirst) {\n ticks.push(placeTickByPixel(0, {...placementParams, justDate}, {position: 'first'}));\n }\n\n let currentDate = new Date(min);\n\n if (unit === 'h') {\n currentDate.setMinutes(0, 0, 0);\n } else if (unit === 'm') {\n currentDate.setSeconds(0, 0);\n } else if (unit === 's') {\n currentDate.setMilliseconds(0);\n } else if (unit === 'month') {\n currentDate = startOfDayInTimezone(currentDate, formatOptions.timeZone);\n currentDate.setDate(1);\n } else if (unit === 'd') {\n currentDate = startOfDayInTimezone(currentDate, formatOptions.timeZone);\n }\n\n let lastDateString = formatter(currentDate, {...formatOptions, ...placementParams, justDate: true });\n while (currentDate < max) {\n let delta = 24*60*60*1000;\n\n if (unit === 'h') {\n delta = (amount - currentDate.getHours() % amount)*60*60*1000;\n } else if (unit === 'm') {\n delta = (amount - currentDate.getMinutes() % amount)*60*1000;\n } else if (unit === 's') {\n delta = (amount - currentDate.getSeconds() % amount)*1000;\n } else if (unit === 'month') {\n delta = 0;\n if (currentDate.getMonth() === 11) {\n currentDate = new Date(currentDate.getFullYear() + 1, 0, 1);\n } else {\n currentDate = new Date(currentDate.getFullYear(), currentDate.getMonth() + 1, 1);\n }\n } else if (unit === 'year') {\n currentDate = new Date(currentDate.getFullYear() + 1, 0, 0);\n }\n\n currentDate = new Date(currentDate.valueOf() + delta);\n\n const justTime = formatter(currentDate, {...formatOptions, ...placementParams, justDate: true }) === lastDateString;\n\n const tick = placeTick(currentDate, {...placementParams, justTime, justDate});\n\n if (ticks.length && (tick.pixelValue - ticks[ticks.length - 1].pixelValue) < (expectedLabelSize + (labelPadding || 0))) {\n continue;\n }\n\n if (tick.pixelValue + expectedLabelSize/2 >= totalSize) {\n continue;\n }\n\n ticks.push(tick);\n lastDateString = formatter(currentDate, {...formatOptions, ...placementParams, justDate: true });\n }\n\n const justTime = lastDateString === formatter(max, {...formatOptions, ...placementParams, justDate: true });\n\n if (!skipLast && ticks[ticks.length - 1].pixelValue + expectedLabelSize < totalSize) {\n ticks.push(placeTickByPixel(totalSize, {...placementParams, justTime, justDate}, {position: 'last'}));\n }\n\n return ticks.filter(({ pixelValue }) => pixelValue <= totalSize && pixelValue >= 0);\n}\n\nfunction placeTimeOnlyGrid({ min, max, precision, expectedLabelSize, labelPadding, totalSize, skipFirst=false, skipLast=false, scale='linear', formatter, inverted=false, formatOptions={} }) {\n const paddedLabelSize = expectedLabelSize + 2*labelPadding;\n const ticks = [];\n const placementParams = { scale, min, max, inverted, totalSize, precision, formatter, formatOptions, dates: true };\n\n const desiredCount = Math.floor(totalSize/paddedLabelSize);\n const span = max - min;\n \n let unit, amount;\n \n const hourSpan = span / (60 * 60 * 1000);\n const minuteSpan = span / (60 * 1000);\n \n if (hourSpan <= desiredCount * 8) {\n unit = 'h';\n amount = Math.max(1, Math.ceil(hourSpan / desiredCount));\n if (amount <= 6) {\n } else if (amount <= 12) {\n amount = 12;\n } else if (amount <= 24) {\n amount = 24;\n } else {\n amount = Math.ceil(amount / 24) * 24;\n }\n } else {\n unit = 'h';\n amount = 24;\n }\n \n if (!skipFirst) {\n ticks.push(placeTickByPixel(0, {...placementParams, justTime: true}, {position: 'first'}));\n }\n \n let currentDate = new Date(min);\n \n if (unit === 'h') {\n currentDate.setMinutes(0, 0, 0);\n if (amount === 24) {\n currentDate.setHours(0);\n } else if (amount === 12) {\n const currentHour = currentDate.getHours();\n const alignedHour = currentHour < 12 ? 0 : 12;\n currentDate.setHours(alignedHour);\n } else {\n const currentHour = currentDate.getHours();\n const alignedHour = Math.floor(currentHour / amount) * amount;\n currentDate.setHours(alignedHour);\n }\n } else if (unit === 'm') {\n currentDate.setSeconds(0, 0);\n const currentMinute = currentDate.getMinutes();\n const alignedMinute = Math.floor(currentMinute / amount) * amount;\n currentDate.setMinutes(alignedMinute);\n } else if (unit === 's') {\n currentDate.setMilliseconds(0);\n const currentSecond = currentDate.getSeconds();\n const alignedSecond = Math.floor(currentSecond / amount) * amount;\n currentDate.setSeconds(alignedSecond);\n }\n \n while (currentDate < min) {\n if (unit === 'h') {\n currentDate = new Date(currentDate.valueOf() + amount * 60 * 60 * 1000);\n } else if (unit === 'm') {\n currentDate = new Date(currentDate.valueOf() + amount * 60 * 1000);\n } else if (unit === 's') {\n currentDate = new Date(currentDate.valueOf() + amount * 1000);\n }\n }\n \n while (currentDate < max) {\n const tick = placeTick(currentDate, {...placementParams, justTime: true});\n \n const reservedSpaceForLast = expectedLabelSize + labelPadding;\n const maxPixelForMiddleTicks = totalSize - reservedSpaceForLast;\n \n if (ticks.length && (tick.pixelValue - ticks[ticks.length - 1].pixelValue) < (expectedLabelSize + labelPadding)) {\n } else if (tick.pixelValue + expectedLabelSize < maxPixelForMiddleTicks) {\n ticks.push(tick);\n } else {\n break;\n }\n \n if (unit === 'h') {\n currentDate = new Date(currentDate.valueOf() + amount * 60 * 60 * 1000);\n } else if (unit === 'm') {\n currentDate = new Date(currentDate.valueOf() + amount * 60 * 1000);\n } else if (unit === 's') {\n currentDate = new Date(currentDate.valueOf() + amount * 1000);\n } else {\n break;\n }\n }\n \n if (!skipLast) {\n const lastTick = placeTick(max, {...placementParams, justTime: true}, {position: 'last'});\n if (ticks.length === 0 || (lastTick.pixelValue - ticks[ticks.length - 1].pixelValue) >= (expectedLabelSize + labelPadding/2)) {\n ticks.push(lastTick);\n } else {\n ticks[ticks.length - 1] = lastTick;\n }\n }\n \n return ticks.filter(({ pixelValue }) => pixelValue <= totalSize && pixelValue >= 0);\n}\n\nfunction placeDateOnlyGrid({ min, max, precision, expectedLabelSize, labelPadding, totalSize, skipFirst=false, skipLast=false, scale='linear', formatter, inverted=false, formatOptions={} }) {\n const paddedLabelSize = expectedLabelSize + 2*labelPadding;\n const ticks = [];\n \n const minYear = new Date(min).getFullYear();\n const maxYear = new Date(max).getFullYear();\n const spanMultipleYears = minYear !== maxYear;\n\n const customDateFormatter = (date, options) => {\n const monthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n const d = new Date(date);\n const month = monthNames[d.getMonth()];\n const day = d.getDate();\n const year = d.getFullYear();\n \n if (spanMultipleYears) {\n return `${month} ${day} ${year}`;\n } else {\n return `${month} ${day}`;\n }\n };\n \n const placementParams = { scale, min, max, inverted, totalSize, precision, formatter: customDateFormatter, formatOptions, dates: true };\n \n const span = max - min;\n const hourSpan = span / (60 * 60 * 1000);\n \n let { amount, unit } = getEvenDateTickSpacing(span, totalSize/paddedLabelSize, formatOptions.unitOverride);\n \n if ((unit === 'h' || unit === 'm' || unit === 's') && hourSpan >= 48) {\n unit = 'd';\n amount = Math.max(1, Math.ceil(hourSpan / 24 / Math.floor(totalSize/paddedLabelSize)));\n } else if ((unit === 'h' || unit === 'm' || unit === 's') && hourSpan < 48) {\n const startTick = placeTick(min, {...placementParams, justDate: true}, {position: 'first'});\n const endTick = placeTick(max, {...placementParams, justDate: true}, {position: 'last'});\n \n const ticks = [startTick];\n if ((endTick.pixelValue - startTick.pixelValue) >= (expectedLabelSize + labelPadding)) {\n ticks.push(endTick);\n }\n \n return ticks.filter(({ pixelValue }) => pixelValue <= totalSize && pixelValue >= 0);\n }\n \n if (!skipFirst) {\n ticks.push(placeTickByPixel(0, {...placementParams, justDate: true}, {position: 'first'}));\n }\n \n let currentDate = new Date(min);\n \n 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 currentDate.setHours(0, 0, 0, 0);\n }\n \n while (currentDate < max) {\n let delta = 24*60*60*1000;\n \n 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, 1);\n delta = 0;\n } else if (unit === 'd') {\n delta = amount * 24 * 60 * 60 * 1000;\n }\n \n if (delta > 0) {\n currentDate = new Date(currentDate.valueOf() + delta);\n }\n \n const tick = placeTick(currentDate, {...placementParams, justDate: true});\n \n const reservedSpaceForLast = expectedLabelSize + labelPadding;\n const maxPixelForMiddleTicks = totalSize - reservedSpaceForLast;\n \n if (ticks.length && (tick.pixelValue - ticks[ticks.length - 1].pixelValue) < (expectedLabelSize + (labelPadding || 0))) {\n continue;\n }\n \n if (tick.pixelValue + expectedLabelSize < maxPixelForMiddleTicks) {\n ticks.push(tick);\n } else {\n break;\n }\n }\n \n if (!skipLast) {\n const lastTick = placeTick(max, {...placementParams, justDate: true}, {position: 'last'});\n if (ticks.length === 0 || (lastTick.pixelValue - ticks[ticks.length - 1].pixelValue) >= (expectedLabelSize + labelPadding/2)) {\n ticks.push(lastTick);\n } else {\n ticks[ticks.length - 1] = lastTick;\n }\n }\n\n if (ticks.length === 0 && hourSpan >= 48) {\n ticks.push(placeTickByPixel(0, {...placementParams, justDate: true}, {position: 'first'}));\n }\n \n return ticks.filter(({ pixelValue }) => pixelValue <= totalSize && pixelValue >= 0);\n}\n\nexport { placeTimeOnlyGrid, placeDateOnlyGrid };\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, { placeTimeOnlyGrid, placeDateOnlyGrid } from '../helpers/place_grid';\nimport {useEnumMap, useHasXEnum, usePrimarySize, useSelection} from '../state/hooks';\nimport StateController from '../state/state_controller';\n\nexport default React.memo(XAxis);\n\nfunction XAxis({ showAxes, showGrid, stateController, bigLabels, xTickUnit, clockStyle, timeZone, integersOnly, formatXAxisLabel }) {\n if (!showAxes && !showGrid) {\n return null;\n }\n\n const { elementWidth, elementHeight } = usePrimarySize(stateController);\n const {minX, maxX, dates} = useSelection(stateController);\n const hasXEnum = useHasXEnum(stateController);\n const enumMap = useEnumMap(stateController);\n\n let precision;\n if (dates) {\n precision = calculateTimePrecision(minX, maxX);\n } else {\n precision = calculatePrecision(maxX - minX);\n }\n\n let inverseEnumMap = null;\n if (hasXEnum) {\n inverseEnumMap = {};\n for (const [key, value] of Object.entries(enumMap)) {\n inverseEnumMap[value] = key;\n }\n }\n\n const formatOptions = {\n unitOverride: xTickUnit,\n clockStyle,\n timeZone,\n integersOnly,\n inverseEnumMap,\n formatter: formatXAxisLabel\n };\n\n const minLabel = formatX(minX, {...formatOptions, dates, precision }).toString();\n const maxLabel = formatX(maxX, {...formatOptions, dates, precision }).toString();\n\n let expectedLabelWidth = Math.max(minLabel.length, maxLabel.length);\n if (bigLabels) {\n expectedLabelWidth *= 2;\n }\n\n const labelPadding = 30;\n\n let timeTicks = null;\n let dateTicks = null;\n let regularTicks = null;\n \n if (dates) {\n timeTicks = placeTimeOnlyGrid({\n min: minX,\n max: maxX,\n totalSize: elementWidth,\n precision,\n expectedLabelSize: expectedLabelWidth,\n labelPadding: labelPadding * 0.8,\n formatter: formatXAxisLabel || formatX,\n formatOptions\n });\n \n dateTicks = placeDateOnlyGrid({\n min: minX,\n max: maxX,\n totalSize: elementWidth,\n precision,\n expectedLabelSize: expectedLabelWidth * 2,\n labelPadding: labelPadding * 1.5,\n formatter: formatXAxisLabel || formatX,\n formatOptions\n });\n } else {\n regularTicks = placeGrid({\n min: minX,\n max: maxX,\n totalSize: elementWidth,\n precision,\n dates,\n formatter: formatXAxisLabel || formatX,\n expectedLabelSize: expectedLabelWidth,\n labelPadding,\n formatOptions\n });\n }\n\n const xAxisHeight = dates ? 30 : 20;\n\n return (\n <svg className={`axis x-axis${dates ? ' x-axis-dual' : ''}`} style={showAxes ? undefined : {marginBottom: -20}}>\n {\n showAxes &&\n <path d={`M-1,0 H${elementWidth}`} className=\"axis-line\" />\n }\n\n {/* Render time ticks in first row */}\n {\n dates && timeTicks && timeTicks.map(({ pixelValue, label, size, position, skipGrid }, i) => {\n\n const singleTick = timeTicks.length === 1;\n \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={`time-${i}`} className={classes.join(' ')}>\n {\n showAxes &&\n <path d={`M${pixelValue},1 v12`} className=\"axis-tick\" />\n }\n\n {\n showGrid && !skipGrid &&\n <path d={`M${pixelValue},0 v-${elementHeight}`} />\n }\n\n {\n showAxes &&\n <text \n x={(position === 'last' && !singleTick) ? pixelValue - 3 : pixelValue + 3} \n y={12} \n textAnchor={(position === 'last' && !singleTick) ? 'end' : 'start'}\n className='x-axis-text x-axis-time-text'\n >\n {label}\n </text>\n }\n </g>\n );\n })\n }\n \n {/* Render date ticks in second row */}\n {\n dates && dateTicks && dateTicks.map(({ pixelValue, label, size, position, trueValue }, i) => {\n \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 let timezoneLabel = undefined;\n if (timeZone) {\n if (i === 0) {\n timezoneLabel = timeZone.toLowerCase() === 'utc' ? 'UTC' : timeZone;\n }\n }\n\n return (\n <g key={`date-${i}`} className={classes.join(' ')}>\n {\n showAxes &&\n <text \n x={position === 'last' ? pixelValue - 3 : pixelValue + 3} \n y={25} \n textAnchor={position === 'last' ? 'end' : 'start'}\n className='x-axis-text x-axis-date-text'\n >\n <tspan className='x-axis-date-label'>\n {label}\n </tspan>\n {timezoneLabel && (\n <tspan className='x-axis-timezone-label'>\n {' '}({timezoneLabel})\n </tspan>\n )}\n </text>\n }\n </g>\n );\n })\n }\n \n {/* Render regular ticks for non-date data */}\n {\n !dates && regularTicks && regularTicks.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 v12`} className=\"axis-tick\" />\n }\n\n {\n showGrid && !skipGrid &&\n <path d={`M${pixelValue},0 v-${elementHeight}`} />\n }\n\n {\n showAxes &&\n <text \n x={position === 'last' ? pixelValue - 3 : pixelValue + 3} \n y={xAxisHeight - 5} \n textAnchor={position === 'last' ? 'end' : 'start'}\n className='x-axis-text'\n >\n {label}\n </text>\n }\n </g>\n );\n })\n }\n </svg>\n );\n}\n\nXAxis.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n showAxes: PropTypes.bool.isRequired,\n showGrid: PropTypes.bool.isRequired,\n bigLabels: PropTypes.bool,\n xTickUnit: PropTypes.oneOf(['year']),\n clockStyle: PropTypes.oneOf(['12h', '24h']),\n timeZone: PropTypes.string,\n integersOnly: PropTypes.bool,\n formatXAxisLabel: PropTypes.func\n};\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport {calculatePrecision, formatY} from '../helpers/format';\nimport {Y_AXIS_WIDTH, BIG_Y_AXIS_LABEL_OFFSET} from '../helpers/axis_sizes';\nimport scaleBounds from '../renderer/scale_bounds';\nimport getColor from '../helpers/colors';\nimport placeGrid from '../helpers/place_grid';\nimport {useAxes, useAxisBounds, useHighlightedSeries, usePrimarySize} from '../state/hooks';\nimport StateController from '../state/state_controller';\nimport CustomPropTypes from '../helpers/custom_prop_types';\n\nexport default React.memo(YAxis);\n\nfunction YAxis({ stateController, showAxes, showGrid, showSeriesKey, axis, sideIndex, bodyHeight, theme, grapherID, dragPositionYOffset=0, bigLabels, showAxisColors }) {\n if (!showAxes && !showGrid) {\n return null;\n }\n\n const { side, scale, axisIndex, label } = useAxes(stateController)[axis.axisIndex];\n\n const { elementWidth, elementHeight } = usePrimarySize(stateController);\n let { minY, maxY } = useAxisBounds(stateController)[axisIndex];\n\n const scaledBounds = scaleBounds({ minY, maxY, scale});\n minY = scaledBounds.minY;\n maxY = scaledBounds.maxY;\n\n const ticks = placeGrid({\n min: minY,\n max: maxY,\n totalSize: elementHeight,\n scale,\n precision: calculatePrecision(maxY - minY),\n formatter: formatY,\n inverted: true,\n expectedLabelSize: bigLabels ? 20 : 10,\n labelPadding: 30\n });\n\n const colorBoxSize = 10;\n const colorBoxPadding = 4;\n\n let sidePadding = 5;\n\n if (scale === 'log') {\n sidePadding = 2;\n }\n\n const highlightedSeries = useHighlightedSeries(stateController);\n\n const [draggedSeries, setDraggedSeries] = useState(null);\n const [dragDelta, setDragDelta] = useState({ dx: 0, dy: 0 });\n\n const startDrag = (event, singleSeries) => {\n let startX = event.clientX;\n let startY = event.clientY;\n\n if (side === 'left') {\n startX += Y_AXIS_WIDTH;\n }\n\n if (side === 'right') {\n startX -= Y_AXIS_WIDTH;\n }\n\n setDragDelta({\n dx: 0,\n dy: 0\n });\n\n const onMouseMove = (moveEvent) => {\n setDragDelta({\n dx: moveEvent.clientX - startX,\n dy: moveEvent.clientY - startY\n });\n };\n\n const onMouseUp = (mouseUpEvent) => {\n window.removeEventListener('mousemove', onMouseMove);\n window.removeEventListener('mouseup', onMouseUp);\n\n let target = mouseUpEvent.target;\n while (target && !(target.dataset || {}).axisIndex) {\n target = target.parentNode;\n }\n\n setDraggedSeries(null);\n stateController.finalizeDrag(singleSeries, target && (target.dataset || {}).axisIndex, target && (target.dataset || {}).grapherId);\n };\n\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('mouseup', onMouseUp);\n\n setDraggedSeries(singleSeries);\n stateController.markDragStart();\n };\n\n const highlightedOpacity = theme === 'day' ? 1.0 : 0.5;\n const unhighlightedOpacity = theme === 'day' ? 0.8 : 0.3;\n\n return (\n <svg className={`axis y-axis y-axis-${side}`}\n data-axis-index={axisIndex}\n data-grapher-id={grapherID}\n style={{\n width: Y_AXIS_WIDTH,\n marginLeft: showAxes ? undefined : -Y_AXIS_WIDTH,\n height: typeof bodyHeight === 'number' ? bodyHeight : undefined\n }}\n >\n {\n showAxes &&\n showAxisColors &&\n axis.series.map((singleSeries, i) => {\n const height = elementHeight/axis.series.length;\n\n return (\n <rect\n x={side === 'left' ? 0 : 2}\n y={i*height}\n width={Y_AXIS_WIDTH - 2}\n height={height}\n key={singleSeries.index}\n fill={getColor(singleSeries.color, singleSeries.index, singleSeries.multigrapherSeriesIndex)}\n opacity={singleSeries.index === highlightedSeries ? highlightedOpacity : unhighlightedOpacity}\n data-element-height={elementHeight}\n data-series-length={axis.series.length}\n />\n );\n })\n }\n\n {\n showAxes &&\n <path d={`M${side === 'left' ? Y_AXIS_WIDTH-1 : 1},3 V${elementHeight}`} className=\"axis-line\" />\n }\n\n {\n 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.jsx';\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.jsx';\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.jsx';\nimport RangeSelectionButtonBase from './range_selection_button_base.jsx';\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.jsx';\nimport RangeSelectionButtonBase from './range_selection_button_base.jsx';\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.jsx';\n\nexport default React.memo(RangeSelection);\n\nfunction RangeSelection({stateController, customBoundsSelectors, customBoundsSelectorsOnly, sidebarEnabled}) {\n const rightAxisCount = useRightAxisCount(stateController);\n const leftAxisCount = useLeftAxisCount(stateController);\n const showingOptions = useShowingOptions(stateController);\n\n let marginRight = Y_AXIS_WIDTH*rightAxisCount;\n if (rightAxisCount > 0) {\n marginRight += 5;\n }\n\n let marginLeft = Y_AXIS_WIDTH*leftAxisCount;\n if (leftAxisCount > 0) {\n marginLeft += 5;\n }\n\n const { dates } = useGlobalBounds(stateController);\n\n const currentBoundCalculator = useBoundCalculator(stateController);\n const { hasPreviousBounds, hasNextBounds } = useBoundHistory(stateController);\n\n const customBoundSelectorNames = new Set(customBoundsSelectors.map(({ label }) => label));\n\n return (\n <div className={`range-selection${dates ? '' : ' range-not-dates'}`} style={{ marginRight, marginLeft }}>\n <div className=\"range-buttons\">\n {\n showingOptions &&\n <Options\n stateController={stateController}\n sidebarEnabled={sidebarEnabled}\n />\n }\n\n <RangeSelectionButtonBase\n className=\"showing-options-button\"\n selected={showingOptions}\n onClick={() => stateController.toggleShowingOptions()}\n description=\"Show additional options\"\n >\n <div className=\"icon-container icon-container-square\">\n <svg focusable=\"false\" viewBox=\"0 0 512 512\">\n <path fill=\"currentColor\" d=\"M487.4 315.7l-42.6-24.6c4.3-23.2 4.3-47 0-70.2l42.6-24.6c4.9-2.8 7.1-8.6 5.5-14-11.1-35.6-30-67.8-54.7-94.6-3.8-4.1-10-5.1-14.8-2.3L380.8 110c-17.9-15.4-38.5-27.3-60.8-35.1V25.8c0-5.6-3.9-10.5-9.4-11.7-36.7-8.2-74.3-7.8-109.2 0-5.5 1.2-9.4 6.1-9.4 11.7V75c-22.2 7.9-42.8 19.8-60.8 35.1L88.7 85.5c-4.9-2.8-11-1.9-14.8 2.3-24.7 26.7-43.6 58.9-54.7 94.6-1.7 5.4.6 11.2 5.5 14L67.3 221c-4.3 23.2-4.3 47 0 70.2l-42.6 24.6c-4.9 2.8-7.1 8.6-5.5 14 11.1 35.6 30 67.8 54.7 94.6 3.8 4.1 10 5.1 14.8 2.3l42.6-24.6c17.9 15.4 38.5 27.3 60.8 35.1v49.2c0 5.6 3.9 10.5 9.4 11.7 36.7 8.2 74.3 7.8 109.2 0 5.5-1.2 9.4-6.1 9.4-11.7v-49.2c22.2-7.9 42.8-19.8 60.8-35.1l42.6 24.6c4.9 2.8 11 1.9 14.8-2.3 24.7-26.7 43.6-58.9 54.7-94.6 1.5-5.5-.7-11.3-5.6-14.1zM256 336c-44.1 0-80-35.9-80-80s35.9-80 80-80 80 35.9 80 80-35.9 80-80 80z\" />\n </svg>\n </div>\n </RangeSelectionButtonBase>\n \n <RangeSelectionButtonBase\n className=\"range-selection-history\"\n selected={false}\n onClick={() => stateController.previousBounds()}\n disabled={!hasPreviousBounds}\n >\n <div className=\"icon-container\">\n <svg focusable=\"false\" viewBox=\"0 0 256 512\">\n <path fill=\"currentColor\" d=\"M31.7 239l136-136c9.4-9.4 24.6-9.4 33.9 0l22.6 22.6c9.4 9.4 9.4 24.6 0 33.9L127.9 256l96.4 96.4c9.4 9.4 9.4 24.6 0 33.9L201.7 409c-9.4 9.4-24.6 9.4-33.9 0l-136-136c-9.5-9.4-9.5-24.6-.1-34z\" />\n </svg>\n </div>\n </RangeSelectionButtonBase>\n \n <RangeSelectionButtonBase\n className=\"range-selection-history\"\n selected={false}\n onClick={() => stateController.nextBounds()}\n disabled={!hasNextBounds}\n >\n <div className=\"icon-container\">\n <svg focusable=\"false\" viewBox=\"0 0 256 512\">\n <path fill=\"currentColor\" d=\"M224.3 273l-136 136c-9.4 9.4-24.6 9.4-33.9 0l-22.6-22.6c-9.4-9.4-9.4-24.6 0-33.9l96.4-96.4-96.4-96.4c-9.4-9.4-9.4-24.6 0-33.9L54.3 103c9.4-9.4 24.6-9.4 33.9 0l136 136c9.5 9.4 9.5 24.6.1 34z\"/>\n </svg>\n </div>\n </RangeSelectionButtonBase>\n\n {\n customBoundsSelectors.map(({label, calculator, datesOnly}, i) => {\n return (\n <RangeSelectionButton\n key={i}\n stateController={stateController}\n currentBoundCalculator={currentBoundCalculator}\n boundCalculator={calculator}\n disabled={datesOnly && !dates}\n >\n {label}\n </RangeSelectionButton>\n );\n })\n }\n\n {\n !customBoundSelectorNames.has('1m') && !customBoundsSelectorsOnly &&\n <RangeSelectionButton\n stateController={stateController}\n currentBoundCalculator={currentBoundCalculator}\n boundCalculator={BOUND_CALCULATORS.lastMinute}\n disabled={!dates}\n >\n 1m\n </RangeSelectionButton>\n }\n\n {\n !customBoundSelectorNames.has('10m') && !customBoundsSelectorsOnly &&\n <RangeSelectionButton\n stateController={stateController}\n currentBoundCalculator={currentBoundCalculator}\n boundCalculator={BOUND_CALCULATORS.last10Minutes}\n disabled={!dates}\n >\n 10m\n </RangeSelectionButton>\n }\n\n {\n !customBoundSelectorNames.has('1h') && !customBoundsSelectorsOnly &&\n <RangeSelectionButton\n stateController={stateController}\n currentBoundCalculator={currentBoundCalculator}\n boundCalculator={BOUND_CALCULATORS.lastHour}\n disabled={!dates}\n >\n 1h\n </RangeSelectionButton>\n }\n\n {\n !customBoundSelectorNames.has('1d') && !customBoundsSelectorsOnly &&\n <RangeSelectionButton\n stateController={stateController}\n currentBoundCalculator={currentBoundCalculator}\n boundCalculator={BOUND_CALCULATORS.lastDay}\n disabled={!dates}\n >\n 1d\n </RangeSelectionButton>\n }\n\n <RangeSelectionButton\n stateController={stateController}\n currentBoundCalculator={currentBoundCalculator}\n boundCalculator={BOUND_CALCULATORS.all}\n disabled={false}\n >\n All\n </RangeSelectionButton>\n </div>\n </div>\n );\n\n}\n\nRangeSelection.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n customBoundsSelectors: CustomPropTypes.CustomBoundsSelectors.isRequired,\n customBoundsSelectorsOnly: PropTypes.bool,\n sidebarEnabled: PropTypes.bool\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport GraphBodyRenderer from '../renderer/graph_body_renderer';\nimport StateController from '../state/state_controller';\nimport placeGrid from '../helpers/place_grid';\nimport {formatX} from '../helpers/format';\nimport VerticalLines from './vertical_lines.jsx';\nimport CustomPropTypes from '../helpers/custom_prop_types';\n\nexport default class RangeGraph extends React.PureComponent {\n\n constructor(props) {\n super(props);\n\n this.state = {\n elementWidth: 0,\n elementHeight: 0,\n selectionBounds: {\n minX: 0,\n maxX: 0\n },\n globalBounds: {\n minX: 0,\n maxX: 0\n }\n };\n\n this.onMouseMove = this.onMouseMove.bind(this);\n this.stopDragging = this.stopDragging.bind(this);\n this.startScroll = this.startScroll.bind(this);\n this.startLeftDrag = this.startLeftDrag.bind(this);\n this.startRightDrag = this.startRightDrag.bind(this);\n }\n\n getClientX(event) {\n if (event && event.touches && event.touches[0]) {\n return event.touches[0].clientX;\n }\n if (event && event.changedTouches && event.changedTouches[0]) {\n return event.changedTouches[0].clientX;\n }\n return event.clientX;\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 && this._renderer) {\n this._renderer.resize();\n }\n }\n\n componentWillUnmount() {\n if (this._renderer) {\n this._renderer.dispose();\n this._renderer = null;\n }\n }\n\n onMouseMove(event) {\n if (!this._dragType) {\n return;\n }\n\n // Prevent scrolling during touch-drag\n if (event && event.touches && event.preventDefault) {\n event.preventDefault();\n }\n\n let boundCalculator;\n const leftX = this.el.getBoundingClientRect().left;\n\n this.setState(({selectionBounds, globalBounds, elementWidth}) => {\n const pixelX = this.getClientX(event) - 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 window.addEventListener('touchmove', this.onMouseMove, { passive: false });\n window.addEventListener('touchend', this.stopDragging);\n window.addEventListener('touchcancel', this.stopDragging);\n }\n\n stopDragging() {\n this._dragType = null;\n this.forceUpdate();\n window.removeEventListener('mousemove', this.onMouseMove);\n window.removeEventListener('mouseup', this.stopDragging);\n window.removeEventListener('touchmove', this.onMouseMove);\n window.removeEventListener('touchend', this.stopDragging);\n window.removeEventListener('touchcancel', 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 = this.getClientX(event) - 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(event) {\n this._dragType = 'left';\n this.addListeners();\n }\n\n startRightDrag(event) {\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 const totalHeight = elementHeight + barSize; \n let ticks;\n\n if (selectionBounds.dates && this.props.markDates) {\n ticks = placeGrid({\n min: globalBounds.minX,\n max: globalBounds.maxX,\n totalSize: elementWidth,\n precision: 'day',\n dates: selectionBounds.dates,\n formatter: formatX,\n expectedLabelSize: 30,\n labelPadding: 5,\n formatOptions: {\n justMonthAndDay: true,\n unitOverride: 'day',\n timeZone: this.props.timeZone\n },\n skipFirst: true,\n skipLast: true\n });\n }\n\n return (\n <div className=\"range-selection-graph\">\n <div className=\"graph-body graph-body-secondary\" style={{ touchAction: 'none' }}>\n <canvas ref={(el) => this.el = el} />\n\n <svg style={{ height: totalHeight }}>\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 const isHighlighted = pixelValue >= pixelMinX && pixelValue <= pixelMaxX;\n if (isHighlighted) {\n classes.push('axis-item-highlighted');\n }\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 onTouchStart={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 onTouchStart={this.startScroll}\n />\n </g>\n\n <g>\n <rect\n x={pixelMinX}\n y={0}\n width={pixelMaxX - pixelMinX}\n height={totalHeight}\n className=\"target-selection-outline\"\n onMouseDown={this.startScroll}\n onTouchStart={this.startScroll}\n />\n </g>\n\n {/* Left handle */}\n <g className={`selection-handle${(this._dragType === 'left' || this._dragType === 'scroll') ? ' selection-handle-dragging' : ''}`}>\n <rect\n x={pixelMinX - 15}\n y={(elementHeight - 30)/2}\n width={30}\n height={30}\n fill=\"transparent\"\n className=\"selection-bar-handle-hit\"\n onMouseDown={this.startLeftDrag}\n onTouchStart={this.startLeftDrag}\n />\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 onTouchStart={this.startLeftDrag}\n />\n </g>\n\n {/* Right handle */}\n <g className={`selection-handle${(this._dragType === 'right' || this._dragType === 'scroll') ? ' selection-handle-dragging' : ''}`}>\n <rect\n x={pixelMaxX - 15}\n y={(elementHeight - 30)/2}\n width={30}\n height={30}\n fill=\"transparent\"\n className=\"selection-bar-handle-hit\"\n onMouseDown={this.startRightDrag}\n onTouchStart={this.startRightDrag}\n />\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 onTouchStart={this.startRightDrag}\n />\n </g>\n\n </svg>\n\n {\n this.props.verticalLines &&\n <VerticalLines\n stateController={this.props.stateController}\n verticalLines={this.props.verticalLines}\n isRangeGraph={true}\n bounds={globalBounds}\n elementHeight={elementHeight}\n elementWidth={elementWidth}\n />\n }\n </div>\n </div>\n );\n }\n\n}\n\nRangeGraph.defaultProps = {\n width: 3,\n shadowColor: 'transparent'\n};\n\nRangeGraph.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n webgl: PropTypes.bool,\n draggingY: PropTypes.bool,\n checkIntersection: PropTypes.bool,\n markDates: PropTypes.bool,\n timeZone: PropTypes.string,\n verticalLines: CustomPropTypes.VerticalLines\n};","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';\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.jsx';\nimport SeriesKeyAxisContainer from './series_key_axis_container.jsx';\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","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","import React, { useEffect, useMemo } from 'react';\nimport PropTypes from 'prop-types';\nimport CustomPropTypes from './helpers/custom_prop_types';\nimport GraphBody from './components/graph_body.jsx';\nimport './grapher.scss';\nimport XAxis from './components/x_axis.jsx';\nimport YAxis from './components/y_axis.jsx';\nimport RangeSelection from './components/range_selection.jsx';\nimport RangeGraph from './components/range_graph.jsx';\nimport SeriesKey from './components/series_key.jsx';\nimport {Y_AXIS_WIDTH} from './helpers/axis_sizes';\nimport GraphTitle from './components/graph_title.jsx';\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.jsx';\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 : true;\n const showAxes = typeof props.showAxes === 'boolean' ? props.showAxes : false;\n\n const commonYAxisProps = {\n stateController,\n 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 showContextMenu={props.showContextMenu}\n tooltipOptions={props.tooltipOptions}\n checkIntersection={props.checkIntersection}\n draggablePoints={props.draggablePoints}\n onPointDrag={props.onPointDrag}\n onDraggablePointsDoubleClick={props.onDraggablePointsDoubleClick}\n onPointClick={props.onPointClick}\n verticalLines={props.verticalLines}\n clockStyle={props.clockStyle}\n timeZone={props.timeZone}\n />\n\n <XAxis\n showGrid={showGrid}\n showAxes={showAxes}\n stateController={stateController}\n bigLabels={bigLabels}\n xTickUnit={props.xTickUnit}\n clockStyle={props.clockStyle}\n timeZone={props.timeZone}\n integersOnly={props.xAxisIntegersOnly}\n formatXAxisLabel={props.formatXAxisLabel}\n />\n\n {\n props.showRangeGraph &&\n <div className=\"range-graph-container\">\n <RangeGraph\n stateController={stateController}\n webgl={props.webgl}\n checkIntersection={props.checkIntersection}\n markDates={props.markRangeGraphDates}\n timeZone={props.timeZone}\n verticalLines={props.verticalLines}\n />\n </div>\n }\n </div>\n\n {\n rightAxes.map((axis, i) => {\n return <YAxis\n key={i}\n axis={axis}\n sideIndex={i}\n {...commonYAxisProps}\n />;\n })\n }\n\n {\n draggingY &&\n <div\n className=\"axis y-axis\"\n data-axis-index=\"new-right\"\n data-grapher-id={props.id}\n style={{\n width: Y_AXIS_WIDTH,\n height: typeof props.bodyHeight === 'number' ? props.bodyHeight : undefined\n }}\n />\n }\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nGrapher.propTypes = {\n series: CustomPropTypes.Series.isRequired,\n webgl: PropTypes.bool,\n requireWASM: PropTypes.bool,\n checkIntersection: PropTypes.bool,\n\n onAxisChange: PropTypes.func,\n onRenderTime: PropTypes.func,\n exportStateController: PropTypes.func,\n timingFrameCount: PropTypes.number,\n\n stateControllerInitialization: PropTypes.object,\n syncPool: PropTypes.instanceOf(SyncPool),\n id: PropTypes.string,\n dragPositionYOffset: PropTypes.number,\n\n theme: PropTypes.oneOf(['day', 'night', 'export']),\n title: PropTypes.string,\n fullscreen: PropTypes.bool,\n bodyHeight: PropTypes.number,\n height: PropTypes.number,\n width: PropTypes.number,\n\n showAxes: PropTypes.bool,\n showRangeGraph: PropTypes.bool,\n showRangeSelectors: PropTypes.bool,\n showSeriesKey: PropTypes.bool,\n showTooltips: PropTypes.bool,\n showGrid: PropTypes.bool,\n showAxisColors: PropTypes.bool,\n bigLabels: PropTypes.bool,\n xTickUnit: PropTypes.oneOf(['year']),\n formatXAxisLabel: PropTypes.func,\n xAxisIntegersOnly: PropTypes.bool,\n clockStyle: PropTypes.oneOf(['12h', '24h']),\n timeZone: PropTypes.string, // local, utc, or a full timezone string\n markRangeGraphDates: PropTypes.bool,\n\n boundsSelectionEnabled: PropTypes.bool,\n sidebarEnabled: PropTypes.bool,\n\n percentile: PropTypes.number,\n defaultShowOptions: PropTypes.bool,\n defaultShowIndividualPoints: PropTypes.bool,\n defaultShowSidebar: PropTypes.bool,\n defaultShowAnnotations: PropTypes.bool,\n defaultLineWidth: PropTypes.number,\n\n tooltipOptions: CustomPropTypes.TooltipOptions,\n\n customBoundsSelectors: CustomPropTypes.CustomBoundsSelectors,\n customBoundsSelectorsOnly: PropTypes.bool,\n defaultBoundsCalculator: PropTypes.string,\n\n annotations: CustomPropTypes.Annotations,\n draggablePoints: CustomPropTypes.DraggablePoints,\n onPointDrag: PropTypes.func,\n onDraggablePointsDoubleClick: PropTypes.func,\n verticalLines: CustomPropTypes.VerticalLines,\n onPointClick: PropTypes.func\n};\n\nexport const AVAILABLE_COLORS = LINE_COLORS;\nexport const BUILT_IN_BOUND_CALCULATORS = BOUND_CALCULATORS;\n","import Eventable from '../eventable.js';\nimport getColor from '../helpers/colors.js';\nimport nameForSeries from '../helpers/name_for_series.js';\n\nexport default class MultigraphStateController extends Eventable {\n\n constructor({ id }) {\n super();\n\n this._id = id;\n\n this._multiSeries = [];\n this._seriesToGraphIndices = new Map();\n this._graphIndicesToSeries = new Map();\n this._modifiedSeries = new Map();\n this._originalSeriesByMultigrapherIndex = new Map();\n this._stateControllers = new Set();\n this._prevSeries = [];\n\n this._dataCache = new Map();\n this._subscriptions = new Map();\n\n this._draggingY = false;\n\n this.on('multi_series_changed', () => {\n for (let stateController of this._stateControllers) {\n stateController._multiSeries = this._multiSeries;\n }\n });\n }\n\n /**\n * Takes an array of user-supplied series, then splits, modifies, and broadcasts them\n *\n * @param {Array<Object>} series\n */\n setSeries(series) {\n\n if (this._prevSeries.length === series.length) {\n let anyDifferent = false;\n for (let i = 0; i < series.length; i++) {\n if (series[i] !== this._prevSeries[i]) {\n anyDifferent = true;\n break;\n }\n }\n\n if (!anyDifferent) {\n return;\n }\n }\n\n this._prevSeries = series;\n\n const graphIndices = new Set();\n const currentSeriesSet = new Set(series);\n\n for (let singleSeries of series) {\n let graphIndex = singleSeries.graph || 0;\n\n if (this._seriesToGraphIndices.has(singleSeries)) {\n graphIndex = this._seriesToGraphIndices.get(singleSeries);\n }\n\n graphIndices.add(graphIndex);\n\n let seriesSet = this._graphIndicesToSeries.get(graphIndex);\n if (!seriesSet) {\n seriesSet = new Set();\n this._graphIndicesToSeries.set(graphIndex, seriesSet);\n }\n\n seriesSet.add(singleSeries);\n }\n\n const sortedGraphIndices = [...graphIndices].sort();\n\n this._multiSeries = [];\n let globalSeriesIndex = 0;\n\n for (let graphIndex of sortedGraphIndices) {\n const series = [];\n\n for (let singleSeries of this._graphIndicesToSeries.get(graphIndex)) {\n if (!currentSeriesSet.has(singleSeries)) {\n this._graphIndicesToSeries.get(graphIndex).delete(singleSeries);\n continue;\n }\n\n if (this._modifiedSeries.has(singleSeries)) {\n globalSeriesIndex++;\n series.push(this._modifiedSeries.get(singleSeries));\n continue;\n }\n\n const color = getColor(singleSeries.color, globalSeriesIndex);\n const name = nameForSeries(singleSeries, globalSeriesIndex);\n const modifiedSeries = {\n ...singleSeries,\n multigrapherSeriesIndex: globalSeriesIndex,\n multigrapherGraphIndex: graphIndex,\n color,\n name\n };\n\n this._modifiedSeries.set(singleSeries, modifiedSeries);\n this._originalSeriesByMultigrapherIndex.set(globalSeriesIndex, singleSeries);\n\n globalSeriesIndex++;\n series.push(modifiedSeries);\n }\n\n this._multiSeries.push(series);\n }\n\n if (this._nextMultigrapherSeriesIndex) {\n this._nextMultigrapherSeriesIndex = this._nextMultigrapherSeriesIndex - this._multiSeriesCount + globalSeriesIndex;\n } else {\n this._nextMultigrapherSeriesIndex = globalSeriesIndex;\n }\n this._multiSeriesCount = globalSeriesIndex;\n\n this.emit('multi_series_changed', this.multiSeries);\n }\n\n /**\n * Registers a state controller for series switching\n *\n * @param {StateController} stateController\n */\n registerStateController(stateController) {\n if (this._stateControllers.has(stateController)) {\n return;\n }\n\n this._stateControllers.add(stateController);\n stateController._multigraphStateController = this;\n stateController._multiSeries = this._multiSeries;\n\n stateController.on('dragging_y_finalized', ({ grapherID, axisIndex, draggedSeries }={}) => {\n if (grapherID === stateController.grapherID) {\n return;\n }\n\n const [check, multigrapherID, graphIndex] = grapherID.split('-');\n if (check !== 'multigrapher' || multigrapherID !== this._id) {\n return;\n }\n\n setTimeout(() => {\n this.moveSeries({ axisIndex, draggedSeries, graphIndex });\n });\n });\n\n stateController.on('dragging_y_changed', (draggingY) => {\n if (draggingY === this._draggingY) {\n return;\n }\n\n this._draggingY = draggingY;\n this.emit('dragging_y_changed', this._draggingY);\n });\n\n stateController.on('observable_modified', (observable) => {\n for (let otherStateController of this._stateControllers) {\n if (stateController === otherStateController) {\n continue;\n }\n\n otherStateController.markObservableModified(observable);\n }\n });\n\n stateController.on('dispose', () => {\n this._stateControllers.delete(stateController);\n });\n }\n\n /**\n * Moves the given dragged series (as specified by the child state controller) to a different graph\n *\n * @param {String} axisIndex - the axis index on the new graph to move the series to\n * @param {Object} draggedSeries - the series that got dragged. Different identity than what this may access\n * @param {String} graphIndex - the index of the graph to assign it to\n */\n moveSeries({ axisIndex, draggedSeries, graphIndex }) {\n const prevGraphCount = this.graphCount;\n\n const originalSeries = this._originalSeriesByMultigrapherIndex.get(draggedSeries.multigrapherSeriesIndex);\n const modifiedSeries = this._modifiedSeries.get(originalSeries);\n\n this._multiSeries[modifiedSeries.multigrapherGraphIndex].splice(\n this._multiSeries[modifiedSeries.multigrapherGraphIndex].indexOf(modifiedSeries), 1\n );\n this._multiSeries[modifiedSeries.multigrapherGraphIndex] = [...this._multiSeries[modifiedSeries.multigrapherGraphIndex]];\n\n if (graphIndex === 'top') {\n modifiedSeries.multigrapherGraphIndex = this._createGraphAtTop();\n } else if (graphIndex === 'bottom') {\n modifiedSeries.multigrapherGraphIndex = this._createGraphAtBottom();\n } else {\n modifiedSeries.multigrapherGraphIndex = parseInt(graphIndex);\n }\n\n modifiedSeries.axisIndex = axisIndex;\n // safe because stateController operates on a copy. We could also have changed the identify of modifiedSeries,\n // but with that we might reset data when moving it back\n delete modifiedSeries.axis;\n\n this._multiSeries[modifiedSeries.multigrapherGraphIndex] = [...this._multiSeries[modifiedSeries.multigrapherGraphIndex], modifiedSeries];\n this._multiSeries = [...this._multiSeries];\n\n for (let graphIndex = 0; graphIndex < this._multiSeries.length; graphIndex++) {\n const originalSeriesAtIndex = this._multiSeries[graphIndex].map(({ multigrapherSeriesIndex }) =>\n this._originalSeriesByMultigrapherIndex.get(multigrapherSeriesIndex));\n this._graphIndicesToSeries.set(graphIndex, new Set(originalSeriesAtIndex));\n\n for (let singleSeries of originalSeriesAtIndex) {\n this._seriesToGraphIndices.set(singleSeries, graphIndex);\n }\n }\n\n this.emit('multi_series_changed', this.multiSeries);\n this.emit('graph_count_changed', this.graphCount, prevGraphCount);\n }\n\n /**\n * Finds or creates an empty graph at the beginning and returns its index\n *\n * @return {number}\n * @private\n */\n _createGraphAtTop() {\n // check if there's anything at the beginning already\n let emptyAtTopIndex = null;\n\n for (let i = 0; i < this._multiSeries.length; i++) {\n if (this._multiSeries[i].length === 0) {\n emptyAtTopIndex = i;\n } else {\n break;\n }\n }\n\n if (emptyAtTopIndex !== null) {\n return emptyAtTopIndex;\n }\n\n // add a series at the beginning and mutate the graph index of each\n this._multiSeries = [[], ...this._multiSeries];\n for (let graphIndex = 0; graphIndex < this._multiSeries.length; graphIndex++) {\n if (!this._multiSeries[graphIndex].length) {\n continue;\n }\n\n this._multiSeries[graphIndex] = [...this._multiSeries[graphIndex]];\n\n for (let modifiedSeries of this._multiSeries[graphIndex]) {\n modifiedSeries.multigrapherGraphIndex = graphIndex;\n }\n }\n\n return 0;\n }\n\n /**\n * Finds or creates an empty graph at the end and returns its index\n *\n * @return {number}\n * @private\n */\n _createGraphAtBottom() {\n // check if there's anything at the beginning already\n let emptyAtBottomIndex = null;\n\n for (let i = this._multiSeries.length - 1; i >= 0; i--) {\n if (this._multiSeries[i].length === 0) {\n emptyAtBottomIndex = i;\n } else {\n break;\n }\n }\n\n if (emptyAtBottomIndex !== null) {\n return emptyAtBottomIndex;\n }\n\n // add something at the bottom\n this._multiSeries = [...this._multiSeries, []];\n\n return this._multiSeries.length - 1;\n }\n\n get multiSeries() {\n return this._multiSeries.filter((series) => series.length);\n }\n\n get series() {\n return [...this._stateControllers].map((stateController) => stateController.series).flat();\n }\n\n get graphCount() {\n return this.multiSeries.length;\n }\n\n get draggingY() {\n return this._draggingY;\n }\n\n dispose() {\n this.clearListeners();\n\n for (let listener of this._subscriptions.values()) {\n listener.unsubscribe();\n }\n\n this._subscriptions.clear();\n }\n\n get stateControllerInitialization() {\n return {\n sharedDataCache: this._dataCache,\n sharedSubscriptions: this._subscriptions\n };\n }\n\n incrementMultigrapherSeriesIndex() {\n const index = this._nextMultigrapherSeriesIndex;\n\n this._nextMultigrapherSeriesIndex ++;\n\n return index;\n }\n}\n","import React, { useEffect, useMemo } from 'react';\nimport PropTypes from 'prop-types';\nimport Grapher from './grapher.jsx';\nimport MultigraphStateController from './state/multigraph_state_controller.js';\nimport {useDraggingY, useMultiSeries} from './state/hooks.js';\nimport SyncPool from './state/sync_pool.js';\n\nexport default React.memo(MultiGrapher);\n\n\nfunction MultiGrapher(props) {\n /* eslint-disable react/prop-types */\n\n const multigrapherID = useMemo(() => Math.random().toString(36).slice(2), []);\n\n const multigraphStateController = useMemo(() => new MultigraphStateController({\n id: multigrapherID,\n ...props\n }), []);\n\n const multiSeries = useMultiSeries(multigraphStateController);\n\n const syncPool = useMemo(() => new SyncPool({\n syncBounds: props.syncBounds,\n syncTooltips: props.syncTooltips,\n syncDragState: true\n }), []);\n\n const registerStateController = useMemo(() => multigraphStateController.registerStateController.bind(multigraphStateController), [multigraphStateController]);\n\n useEffect(() => {\n if (process.env.NODE_ENV === 'development') {\n window.multigraphStateController = multigraphStateController;\n }\n\n return () => {\n multigraphStateController.dispose();\n };\n }, [multigraphStateController]);\n\n useEffect(() => {\n props.exportStateController && props.exportStateController(multigraphStateController);\n }, [multigraphStateController, props.exportStateController]);\n\n useEffect(() => {\n multigraphStateController.setSeries(props.series);\n }, [multigraphStateController, props.series]);\n\n useEffect(() => {\n if (!props.onMultiseriesChange) {\n return () => {};\n }\n\n multigraphStateController.on('multi_series_changed', props.onMultiseriesChange);\n return () => {\n multigraphStateController.off('multi_series_changed', props.onMultiseriesChange);\n };\n }, [multigraphStateController, props.onMultiseriesChange]);\n\n const draggingY = useDraggingY(multigraphStateController);\n\n return (\n <div className=\"multigrapher\">\n {\n draggingY && props.newUpperEnabled &&\n <div className={`new-grapher grapher-${props.theme}`} data-grapher-id={`multigrapher-${multigrapherID}-top`}>\n New grapher\n </div>\n }\n\n {\n multiSeries.map((series, i) =>\n <Grapher\n key={i}\n {...props}\n syncPool={syncPool}\n stateControllerInitialization={multigraphStateController.stateControllerInitialization}\n series={series}\n id={`multigrapher-${multigrapherID}-${i}`}\n dragPositionYOffset={props.newUpperEnabled ? 38 : 0}\n exportStateController={registerStateController}\n />\n )\n }\n\n {\n draggingY &&\n <div className={`new-grapher grapher-${props.theme}`} data-grapher-id={`multigrapher-${multigrapherID}-bottom`}>\n New grapher\n </div>\n }\n </div>\n );\n}\n\nMultiGrapher.defaultProps = {\n theme: 'night'\n};\n\nMultiGrapher.propTypes = Object.assign({}, Grapher.propTypes, {\n syncBounds: PropTypes.bool,\n syncTooltips: PropTypes.bool,\n newUpperEnabled: PropTypes.bool,\n onMultiseriesChange: PropTypes.func\n});\n"],"names":["LINE_COLORS","getColor","seriesColor","i","multigrapherSeriesIndex","length","undefined","applyReducedOpacity","color","opacityFactor","startsWith","matches","match","r","g","b","a","parseFloat","hex","slice","split","map","char","join","parseInt","applyReducedOpacityToGradient","gradient","Array","isArray","stop","position","createDefaultGradient","halfOpacityColor","___CSS_LOADER_EXPORT___","push","module","id","exports","cssWithMappingToString","list","toString","this","item","content","needLayer","concat","modules","media","dedupe","supports","layer","alreadyImportedModules","k","_k","cssMapping","btoa","base64","unescape","encodeURIComponent","JSON","stringify","data","sourceMapping","ReactPropTypesSecret","emptyFunction","emptyFunctionWithReset","resetWarningCache","shim","props","propName","componentName","location","propFullName","secret","err","Error","name","getShim","isRequired","ReactPropTypes","array","bigint","bool","func","number","object","string","symbol","any","arrayOf","element","elementType","instanceOf","node","objectOf","oneOf","oneOfType","shape","exact","checkPropTypes","PropTypes","stylesInDOM","getIndexByIdentifier","identifier","result","modulesToDom","options","idCountMap","identifiers","base","count","indexByIdentifier","obj","css","sourceMap","references","updater","addElementStyle","byIndex","splice","api","domAPI","update","newObj","remove","lastIdentifiers","newList","index","newLastIdentifiers","_i","_index","memo","insert","style","target","styleTarget","document","querySelector","window","HTMLIFrameElement","contentDocument","head","e","getTarget","appendChild","createElement","setAttributes","attributes","styleElement","nonce","setAttribute","insertStyleElement","styleTagTransform","apply","parentNode","removeChild","removeStyleElement","styleSheet","cssText","firstChild","createTextNode","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","m","n","getter","__esModule","d","definition","key","o","Object","defineProperty","enumerable","get","f","chunkId","Promise","all","keys","reduce","promises","u","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","p","URL","url","installedChunks","installChunk","ids","runtime","j","installedChunkData","promise","import","then","race","resolve","nc","y","__WEBPACK_EXTERNAL_MODULE_react__","x","SIMPLE_DATA_TYPES","DATA_TYPES","Data","SingleSeries","type","xKey","yKey","xUnixDates","xLabel","yLabel","ignoreDiscontinuities","dashed","dashPattern","width","rangeSelectorWidth","axis","expandYWith","defaultAlwaysTooltipped","square","shiftXBy","graph","background","hideFromKey","showIndividualPoints","minPointSpacing","rendering","negativeColor","negativeGradient","zeroLineWidth","zeroLineColor","zeroLineY","pointRadius","tooltipWidth","hasAreaBottom","shadowColor","rangeKey","Series","Axis","axisIndex","series","side","scale","label","Axes","CustomBoundsSelector","calculator","datesOnly","CustomBoundsSelectors","TooltipOptionsRaw","includeSeriesLabel","includeXLabel","includeYLabel","includeXValue","includeYValue","floating","alwaysFixedPosition","floatPosition","floatDelta","savingDisabled","customTooltip","combineTooltips","TooltipOptions","Annotation","Date","startX","endX","lineOnly","Annotations","DraggablePoint","radius","fillColor","strokeColor","strokeWidth","onClick","onDoubleClick","DraggablePoints","VerticalLine","lineTop","markTop","markerStyle","text","textTop","textStyle","minPixelX","maxPixelX","onRangeGraph","onRangeGraphOnly","VerticalLines","Eventable","constructor","_listeners","clearListeners","on","eventName","fn","Set","add","off","delete","size","emit","args","arguments","forEach","inferType","useSimpleData","simpleData","observe","colorToVector","parts","part","test","substr","createGLProgram","gl","vertShaderSource","fragShaderSource","vertexShader","createShader","VERTEX_SHADER","shaderSource","compileShader","getShaderParameter","COMPILE_STATUS","console","error","getShaderInfoLog","fragmentShader","FRAGMENT_SHADER","program","createProgram","attachShader","linkProgram","getProgramParameter","LINK_STATUS","validateProgram","VALIDATE_STATUS","getProgramInfoLog","BackgroundProgram","_gl","_program","backgroundVert","backgroundFrag","_vertexBuffer","createBuffer","_indexBuffer","getExtension","draw","useProgram","minXt","maxXt","uniform4f","getUniformLocation","vertices","Float32Array","bindBuffer","ARRAY_BUFFER","bufferData","STATIC_DRAW","positionLocation","getAttribLocation","enableVertexAttribArray","vertexAttribPointer","FLOAT","enable","BLEND","blendFunc","SRC_ALPHA","ONE_MINUS_SRC_ALPHA","drawArrays","TRIANGLES","DPI_INCREASE","async","sizeCanvas","canvas","context","reset","height","requestAnimationFrame","boundingRect","getBoundingClientRect","dpr","devicePixelRatio","bsr","webkitBackingStorePixelRatio","mozBackingStorePixelRatio","msBackingStorePixelRatio","oBackingStorePixelRatio","backingStorePixelRatio","pixelRatio","elementWidth","elementHeight","renderWidth","renderHeight","pathsFrom","dataInRenderSpace","splitAtY","paths","currentPath","previouslyDiscontinuous","nullMask","maxYValues","minYValues","yValues","minY","maxY","prevY","drawZeroLine","sizing","zeroColor","zeroWidth","strokeStyle","lineWidth","beginPath","moveTo","lineTo","stroke","renderEntireArea","path","areaBottomPath","zero","hasNegatives","fillStyle","globalGradient","createLinearGradient","addColorStop","areaBottom","firstX","_startY","lastX","_lastY","fill","renderAreaSegment","splitIndex","ghostPoint","isPreCutoff","areaBottomPaths","gradientColor","endIndex","Math","min","lastPoint","startIndex","startPoint","max","drawPointsNormally","individualPoints","pointColor","arc","PI","drawLinesNormally","linePaths","highlighted","drawLinesWithCutoff","timeRatio","cutoffOpacity","cutoffPixelX","preCutoffPaths","postCutoffPaths","prePath","postPath","lastPrePoint","firstPostPoint","x1","y1","x2","y2","unshift","reducedColor","drawPointsWithCutoffByRatio","isBeforeCutoff","getBarWidths","closestSpacing","bounds","axisSeriesCount","fullBarWidth","maxX","minX","totalBarWidth","barWidth","barSpacing","applyPointSpacing","points","minSpacing","spacedPoints","point","rustApiModule","RustAPIPromise","default","RustAPI","extractVerticesFromPaths","pointNumber","positions","prevPositions","indices","Uint32Array","verticesPattern","set","vertexPointer","sourceLength","copyWithin","pointI","prevX","LineProgram","lineVert","lineFrag","_circleProgram","circleVert","circleFrag","_positionBuffer","_prevPositionBuffer","_individualPointBuffer","dispose","clear","drawingBufferWidth","drawingBufferHeight","clearColor","viewport","parameters","thickness","shadowBlur","renderCutoffGradient","cutoffIndex","originalData","drawLineWithCutoff","get_point_number","extract_vertices","extractVertices","positionIndex","prevPositionIndex","vertexIndex","uniform1f","colorVector","cutoffX","ELEMENT_ARRAY_BUFFER","drawElements","UNSIGNED_INT","pointSize","getIndividualPoints","cutoffTime","baseIndex","floor","fraction","cutoffDate","getTime","currentDate","nextDate","currentTime","preCutoffPoints","postCutoffPoints","isPreview","visibleMinTime","selectionBounds","pixelX","pixelY","visibleMaxTime","reducedOpacityColor","flat","POINTS","visibleCutoffRatio","ShadowProgram","shadowVert","shadowFrag","positionLoc","trapezoidBoundsLoc","trapezoidBottomLoc","_trapezoidBoundsBuffer","_trapezoidBottomBuffer","_gradientTexture","createTexture","deleteTexture","generateTrapezoidGeometry","trapezoids","trapezoidBounds","trapezoidBottom","trap","bottomY1","bottomY2","bottom","parseGradient","fallbackColor","fallbackColorVec","textureData","Uint8Array","textureWidth","gradientCount","colors","stops","stopIndex","colorIndex","params","drawShadowWithCutoff","positiveTrapezoids","negativeTrapezoids","inRenderSpaceAreaBottom","y1RelativeToZero","y2RelativeToZero","xCross","abs","yCross","finalX2","finalY2","finalBottomY2","ratio","trapezoid","renderTrapezoidSet","trapSet","geometry","gradientData","activeTexture","TEXTURE0","bindTexture","TEXTURE_2D","texImage2D","RGBA","UNSIGNED_BYTE","texParameteri","TEXTURE_MIN_FILTER","NEAREST","TEXTURE_MAG_FILTER","TEXTURE_WRAP_S","CLAMP_TO_EDGE","TEXTURE_WRAP_T","uniform1i","uniform4fv","getError","NO_ERROR","_lastIndividualPoints","_lastParams","currentItem","nextItem","visibleBounds","firstTime","lastTime","firstItem","lastItem","translucentGradient","drawSplitShadowTrapezoids","disable","DEPTH_TEST","GraphBodyRenderer","stateController","canvasElement","webgl","checkIntersection","super","_stateController","_checkIntersection","_canvas","_webgl","_context","getContext","_lineProgram","_shadowProgram","alert","_context2d","_initialized","_initializeCanvas","_boundResize","resize","bind","_cachedAxisCount","_onAxisChange","axes","filter","_resizeObserver","disconnect","_intersectionObserver","_zeroLineCanvas","_zeroLineContext","_overlayContext","clearRect","_overlayCanvas","_overlayCanvasInitialized","render","singleSeries","inRenderSpace","defaultLineWidth","globalBounds","warn","cutoffData","xValue","yValue","currentPoint","nextPoint","nextTime","useDataSpace","includeBeyondBounds","currentBounds","threshold","pastThreshold","samples","xCoord","inSelectedSpace","inDataSpace","boundsMinX","boundsMaxX","foundBeyondBounds","lastPointBeforeBounds","_sizing","yCoord","beforeXValue","beforeY","beforeXCoord","beforeYCoord","commonCPUParams","willReadFrequently","flush","find","tuple","some","barParams","indexInAxis","indexOf","selection","rangeGraphRenderer","_bounds","_selection","barBottom","barColor","dataPoint","negColor","fillRect","drawBarsWithCutoff","drawBars","areaParams","shouldSplitAreaPaths","areaPaths","pathI","reducedOpacityGradient","renderCutoffIndex","preCutoffPath","preCutoffAreaBottomPath","bottomGhostPoint","postCutoffPath","postCutoffAreaBottomPath","visibleTimeRatio","drawAreaWithCutoff","isPositive","sumY","negGradient","positive","pointsToRender","drawArea","shadowProgram","boundsChanged","_lastBounds","_lastRenderHeight","_lastShadowCache","shadowParams","save","globalCompositeOperation","restore","top","left","pointerEvents","insertBefore","nextSibling","shouldShowIndividualPoints","drawContext","_fallbackContext","fallbackCanvas","drawParams","getRanges","range","pixelMinY","pixelMaxY","setLineDash","beforeIndex","afterIndex","ceil","beforePoint","afterPoint","ranges","horizontalBarWidth","now","require","drawLine","renderBackground","inBackgroundSpace","_backgroundProgram","drawBackground","markSizeChanged","ResizeObserver","first","disabled","IntersectionObserver","entries","clearTimeout","_intersectionTimeout","isIntersecting","setTimeout","sizingPromise","resizeDebounced","_resizeTimeout","recalculatePosition","calculatePrecision","log10","roundToPrecision","precision","isNaN","rounded","toFixed","stripped","includes","replace","DATE_TIME_FORMATTERS","timezoneToOffsetMS","timeZone","sampleDate","datetimeFormatter","properTimeZone","Intl","DateTimeFormat","resolvedOptions","timeZoneName","offsetPart","formatToParts","hours","minutes","startOfDayInTimezone","date","timezone","startOfDay","setHours","offset","setUTCHours","valueOf","formatX","dates","justTime","justDate","justMonthAndDay","clockStyle","unitOverride","integersOnly","inverseEnumMap","time","utc","toLowerCase","localOffset","year","getUTCFullYear","getFullYear","month","getUTCMonth","getMonth","day","getUTCDate","getDate","toLocaleDateString","getUTCHours","getHours","getUTCMinutes","getMinutes","seconds","getUTCSeconds","getSeconds","milliseconds","getUTCMilliseconds","getMilliseconds","timeString","padStart","formatTime","round","formatY","log","Y_AXIS_WIDTH","getYLabelContent","fullYPrecision","TooltipLabel","axisLabel","textLeft","formatXOptions","React","propTypes","CustomPropTypes","Tooltip","halfHeight","passThroughProps","preparedTooltips","tooltips","tooltip","fixedPosition","multiplier","caretSize","isFinite","transform","commonLabelProps","maxPrecision","baseLeft","yTranslation","axisCount","caretPadding","Boolean","CustomTooltipComponent","groupedTooltips","combinationThreshold","added","group","totalHeight","maxWidth","sort","className","_extends","defaultProps","mouseX","mouseY","ContextMenu","setTextRef","ref","textRef","contextMenu","showing","createRange","getSelection","removeAllRanges","selectNodeContents","addRange","focus","formatDateTime","dateTimeStr","datePart","timePart","formattedDate","period","toLocaleString","displayValue","autoFocus","simpleSeriesToDataSpace","tuples","tuplesToDataSpace","values","valuesToDataSpace","objects","objectsToDataSpace","originalXValue","enumToNumber","valueXStart","readBinaryFormatValue","view","getUint32","BYTES_PER_ELEMENT","getUint8","getFloat64","buffer","ArrayBuffer","DataView","xIndex","channels","yIndex","offsets","subpoint","finalizeBounds","initial","calculateDataBounds","percentile","percentileAsymmetry","sortedByY","_x","_x1","_x2","asymmetry","inBottomPercentile","inTopPercentile","percentileBounds","spacing","mergeBounds","boundsList","mergedBounds","expandBounds","extendXForNBars","expandedBounds","assign","unscaledMinY","unscaledMaxY","midpoint","binarySearch","targetX","searchParams","returnIndex","middleIndex","searchType","dataSpaceToSelectedSpace","swap","firstAdded","lastAdded","addToEndOnly","beginningInterpolationIndex","endInterpolationIndex","pop","shift","interpolationIndex","interpolate","lastIncluded","nullIndex","selectedIndex","dataIndex","begPoint","endPoint","firstIndex","secondIndex","boundary","xBefore","yBefore","xAfter","yAfter","percent","scaleBounds","selectedSpaceToRenderSpace","dataChanged","Float64Array","scaledBounds","inParams","dataF64","dataNullMask","copyIndexStart","hasSwap","useSwap","extraSpaceFactor","selected_space_to_render_space","prevI","minSeenY","maxSeenY","curY","selectedSpaceToRenderSpaceInPlace","flattenSimpleData","flattened","fI","extractYValue","extractXValue","moveTooltip","distance","sqrt","xDistance","pixelWidth","lastMinute","last10Minutes","lastHour","lastDay","condenseDataSpace","targetBucketCount","partiallyCondensedData","CONDENSE_THRESHOLD","condensedData","bucketSize","minInBucket","maxInBucket","currentBucketIndex","bucketIndex","nameForSeries","selectedSpaceToBackgroundSpace","conditions","evaluator","comparator","comparedAgainst","parsedValue","currentSection","condition","interpolatedMaxX","interpolatedMinX","StateController","defaultBoundsCalculator","customBoundsSelectors","requireWASM","defaultShowIndividualPoints","defaultShowSidebar","defaultShowAnnotations","defaultShowOptions","syncPool","grapherID","sharedDataCache","sharedSubscriptions","fullscreen","_requireWASM","_markDirty","_series","_seriesFromOriginalSeries","Map","_axes","_highlightedSeries","_showIndividualPoints","_autoscaleY","_percentile","_percentileAsymmetry","_showingOptions","_maxPrecision","_showingSidebar","_showingAnnotations","_grapherID","_fullscreen","_alwaysTooltipped","_tooltipState","mousePresent","_contextMenuPosition","_savedTooltips","_draggingY","_annotations","_annotationsState","annotations","_enumMap","_hasXEnum","_timingBuffer","_timingIndex","_timingFrameCount","_modifiedSeries","_deferredEmissions","_deferredPriorityEmissions","primaryRenderer","_boundsCalculator","givenLabel","customCalculators","BOUND_CALCULATORS","getDefaultBoundsCalculator","_boundsHistory","_boundsIndex","_dataCache","_subscriptions","_subscriptionsShared","_observablesToSeries","_generators","_generatorsToSeries","_generatorCallArgs","_seriesChangedFromPromises","_syncPool","_onDataChange","listener","unsubscribe","_removeSeries","disposed","setSeries","userSeries","userCreated","propsSeries","anyDifferent","originalSeries","_mustResize","newSeriesSet","has","_tooltipsChanged","deferredEmit","_assignAxisTo","hidden","_hideSeries","_dataChanged","_frameRequested","frameRequestStart","performance","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","alwaysTooltipped","savedTooltips","allTooltipped","savedTooltip","minDistance","Infinity","trueX","dataMinX","dataMaxX","padding","closestIndex","closestPoint","ignoreYDistanceCheck","xDistanceThreshold","yDistanceThreshold","distanceThreshold","yDistance","enumLike","hasEnum","simplePoint","hasXEnum","unsavedTooltips","unsavedTooltipsCount","calculateTooltipState","_tooltipAllNext","_globalBounds","_tooltipStateArg","newX","right","shownSeries","xRange","annotation","seriesName","isRange","isPoint","xStartValue","xEndValue","convertToNumber","val","pixelStartX","pixelEndX","calculateAnnotationsState","_expandYWith","dataBoundsList","simpleDataSliceStart","dataBounds","_dataBounds","_recalculateSelection","disableSwap","selectedBounds","selectedBoundsAreaTop","selectedBoundsAreaBottom","inSelectedSpaceAreaBottom","_recalculateAxisBounds","modifiedSeries","newData","modifiedAxes","modifiedSeriesAndDependents","newDataInDataSpace","newDataBounds","newPointCount","previousSelection","newSelectedData","fixedY","targetBounds","byAxis","selectedBoundsList","selectedDataBounds","boundsCalculator","selectionFromGlobalBounds","_","export","night","_theme","inBackgroundSpacePrimary","inRenderSpacePrimary","_defaultLineWidth","inRenderSpacePrimaryAreaBottom","rangeGraphBounds","inRenderSpaceRangeGraph","inRenderSpaceRangeGraphAreaBottom","s","toCondensedSelectedSpaceParams","inCondensedSelectedSpacePrimary","toRenderSpaceParams","inCondensedSelectedSpacePrimaryAreaBottom","inBackgroundSpacePrimaryAreaBottom","toSelectedSpaceParams","inSelectedSpaceRangeGraph","inCondensedSelectedSpaceRangeGraph","inSelectedSpaceRangeGraphAreaBottom","inCondensedSelectedSpaceRangeGraphAreaBottom","_createAxis","_moveAxis","newAxis","oldAxis","oldIndex","leftAxes","rightAxes","exportedAxes","originalAxis","seen","candidateAxis","findMatchingAxis","inValueSpacePrimary","inValueSpaceRangeGraph","_showSeries","boundCalculator","reverse","highlightedSeries","autoscaleY","boundHistory","hasNextBounds","hasPreviousBounds","tooltipState","contextMenuState","draggingY","averageLoopTime","loopTimes","averageLoopTimes","axisToName","leftCount","rightCount","showingOptions","showingSidebar","showingAnnotations","userCreatedSeries","annotationState","theme","exportMode","_exportMode","enumMap","renderer","_nonExportTheme","boundingFunction","debounceHistory","_boundingCalculatorDebouncer","_addBoundCalculatorToHistory","boundsSelectors","_customBoundsSelectors","indexedCustomBoundSelectors","registerSeriesClick","selectedSeriesIndex","setHighlightedSeries","toggleIndividualPoints","toggleYAutoscaling","toggleExportMode","setBoundsFromSelection","pixelSelection","minPixelY","maxPixelY","pow","boundCalculatorFromSelection","nextBounds","previousBounds","setLabel","toggleScale","oldScale","recalculateTooltips","setTooltipMousePosition","clientX","_tooltipClientX","clientY","_tooltipClientY","shiftKey","shiftKeyPressedOnMove","tooltipAllNext","tooltipStateArg","showOnlySavedTooltips","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","useDraggingY","useShowingOptions","useMaxPrecision","useShowingSidebar","useShowingAnnotations","useSizing","useTheme","bodyHeight","validAnnotations","annotationStyle","pointMarkerWidth","approxTextWidth","textAlign","draggablePoints","onPointDrag","onDraggablePointsDoubleClick","onPointlessDoubleClick","event","newXT","newYT","xT","yT","stopPropagation","cx","cy","onMouseDown","xOffset","yOffset","onMouseMove","moveEvent","onMouseUp","removeEventListener","addEventListener","verticalLines","isRangeGraph","relevantVerticalLines","line","lineStyle","fontSize","textAnchor","dominantBaseline","GraphBody","boundsSelectionEnabled","showTooltips","showContextMenu","tooltipOptions","onPointClick","canvasEl","useCallback","el","boundsSelection","setBoundsSelection","start","useTooltipState","showAnnotations","useAnnotationState","useContextMenu","onScroll","onGlobalMouseMove","getTouch","touches","changedTouches","onGlobalTouchStart","touch","cancelable","closest","preventDefault","onGlobalTouchMove","onGlobalTouchEnd","passive","onMouseLeave","currentNode","classList","contains","seriesToNearestPoint","onContextMenu","placeTick","trueValue","inverted","totalSize","formatter","formatOptions","opts","scaledValue","pixelValue","placeTickByPixel","roundToDivisor","divisor","divisors","bestDelta","bestDivisor","delta","getEvenDateTickSpacing","span","desiredCount","subspan","amount","unit","placeGrid","expectedLabelSize","labelPadding","skipFirst","skipLast","paddedLabelSize","ticks","placementParams","setMinutes","setSeconds","setMilliseconds","setDate","lastDateString","tick","placeDatesGrid","tickSpacing","roundTo","getEvenTickSpacing","roundToEvenNumber","placeNumbersGrid","locals","XAxis","showAxes","showGrid","bigLabels","xTickUnit","formatXAxisLabel","useSelection","useHasXEnum","useEnumMap","minDate","maxDate","calculateTimePrecision","minLabel","maxLabel","expectedLabelWidth","timeTicks","dateTicks","regularTicks","hourSpan","alignedHour","currentHour","currentMinute","alignedMinute","currentSecond","alignedSecond","maxPixelForMiddleTicks","lastTick","placeTimeOnlyGrid","spanMultipleYears","customDateFormatter","startTick","endTick","placeDateOnlyGrid","xAxisHeight","marginBottom","skipGrid","singleTick","classes","timezoneLabel","YAxis","showSeriesKey","sideIndex","dragPositionYOffset","showAxisColors","sidePadding","setDraggedSeries","dragDelta","setDragDelta","dx","dy","highlightedOpacity","unhighlightedOpacity","marginLeft","opacity","edge","strokeDasharray","startDrag","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","stopDragging","startScroll","startLeftDrag","startRightDrag","getClientX","componentDidMount","_renderer","setState","componentDidUpdate","prevProps","componentWillUnmount","_dragType","leftX","percentage","_scrollAnchorPercentage","boundToRight","boundToLeft","addListeners","forceUpdate","pixelMinX","pixelMaxX","markDates","touchAction","onTouchStart","SeriesKeyItem","backgroundColor","SeriesKeyAxisContainer","showingLabelInput","toggleLabelInputShowing","placeholder","SeriesKey","dragPosition","setDragPosition","keyRef","useRef","keyWidth","setKeyWidth","sizeCalculationHandle","current","cancelAnimationFrame","querySelectorAll","clientWidth","calculateStyles","useAlwaysTooltipped","toggleTooltipped","startDragging","seriesKeyEl","targetLeft","seriesKeyLeft","seriesKeyMarginLeft","clientStartX","clientStartY","zIndex","GraphTitle","title","SeriesToggle","checked","defaultChecked","borderColor","Sidebar","SyncPool","syncBounds","syncTooltips","syncDragState","_stateControllers","_syncBounds","_syncTooltips","_syncDragState","otherStateController","stateArg","_tooltipIgnoreState","shouldHideTooltips","random","Grapher","grapherDefaultProps","showRangeGraph","showRangeSelectors","useMemo","stateControllerInitialization","exportStateController","onRenderTime","onAxisChange","styles","classNames","calculateClassNamesAndStyles","commonYAxisProps","xAxisIntegersOnly","markRangeGraphDates","AVAILABLE_COLORS","BUILT_IN_BOUND_CALCULATORS","MultigraphStateController","_id","_multiSeries","_seriesToGraphIndices","_graphIndicesToSeries","_originalSeriesByMultigrapherIndex","_prevSeries","graphIndices","currentSeriesSet","graphIndex","sortedGraphIndices","globalSeriesIndex","multigrapherGraphIndex","_nextMultigrapherSeriesIndex","_multiSeriesCount","multiSeries","registerStateController","_multigraphStateController","check","multigrapherID","moveSeries","prevGraphCount","graphCount","_createGraphAtTop","_createGraphAtBottom","originalSeriesAtIndex","emptyAtTopIndex","emptyAtBottomIndex","incrementMultigrapherSeriesIndex","MultiGrapher","multigraphStateController","useMultiSeries","onMultiseriesChange","newUpperEnabled"],"sourceRoot":""}