From 7f8e14b3d8bdf28e3794ee66788f80ecc18d5663 Mon Sep 17 00:00:00 2001 From: Jae Sung Park Date: Thu, 8 Jun 2017 14:03:53 +0900 Subject: [PATCH] 1.0.0 release --- dist/billboard.css | 171 + dist/billboard.css.map | 1 + dist/billboard.js | 9993 +++++++ dist/billboard.js.map | 1 + dist/billboard.min.css | 1 + dist/billboard.min.css.map | 1 + dist/billboard.min.js | 11 + dist/billboard.min.js.map | 1 + dist/billboard.pkgd.js | 26951 ++++++++++++++++++ dist/billboard.pkgd.min.js | 13 + doc/Chart.html | 5365 ++++ doc/Options.html | 13135 +++++++++ doc/bb.html | 436 + doc/billboard.js.html | 10050 +++++++ doc/index.html | 228 + doc/scripts/linenumber.js | 25 + doc/scripts/prettify/Apache-License-2.0.txt | 202 + doc/scripts/prettify/lang-css.js | 2 + doc/scripts/prettify/prettify.js | 28 + doc/styles/jsdoc.css | 645 + doc/styles/prettify.css | 79 + package.json | 2 +- 22 files changed, 67340 insertions(+), 1 deletion(-) create mode 100644 dist/billboard.css create mode 100644 dist/billboard.css.map create mode 100644 dist/billboard.js create mode 100644 dist/billboard.js.map create mode 100644 dist/billboard.min.css create mode 100644 dist/billboard.min.css.map create mode 100644 dist/billboard.min.js create mode 100644 dist/billboard.min.js.map create mode 100644 dist/billboard.pkgd.js create mode 100644 dist/billboard.pkgd.min.js create mode 100644 doc/Chart.html create mode 100644 doc/Options.html create mode 100644 doc/bb.html create mode 100644 doc/billboard.js.html create mode 100644 doc/index.html create mode 100644 doc/scripts/linenumber.js create mode 100644 doc/scripts/prettify/Apache-License-2.0.txt create mode 100644 doc/scripts/prettify/lang-css.js create mode 100644 doc/scripts/prettify/prettify.js create mode 100644 doc/styles/jsdoc.css create mode 100644 doc/styles/prettify.css diff --git a/dist/billboard.css b/dist/billboard.css new file mode 100644 index 000000000..50b6b813e --- /dev/null +++ b/dist/billboard.css @@ -0,0 +1,171 @@ +/*! + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + * + * billboard.js, JavaScript chart library + * http://naver.github.io/billboard.js/ + * + * @version 1.0.0 + */ +/*-- Chart --*/ +.bb svg { + font: 10px sans-serif; + -webkit-tap-highlight-color: transparent; } + +.bb path, .bb line { + fill: none; + stroke: #000; } + +.bb text { + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; } + +.bb-legend-item-tile, +.bb-xgrid-focus, +.bb-ygrid, +.bb-event-rect, +.bb-bars path { + shape-rendering: crispEdges; } + +.bb-chart-arc path { + stroke: #fff; } + +.bb-chart-arc text { + fill: #fff; + font-size: 13px; } + +/*-- Axis --*/ +/*-- Grid --*/ +.bb-grid line { + stroke: #aaa; } + +.bb-grid text { + fill: #aaa; } + +.bb-xgrid, .bb-ygrid { + stroke-dasharray: 3 3; } + +/*-- Text on Chart --*/ +.bb-text.bb-empty { + fill: #808080; + font-size: 2em; } + +/*-- Line --*/ +.bb-line { + stroke-width: 1px; } + +/*-- Point --*/ +.bb-circle._expanded_ { + stroke-width: 1px; + stroke: white; } + +.bb-selected-circle { + fill: white; + stroke-width: 2px; } + +/*-- Bar --*/ +.bb-bar { + stroke-width: 0; } + .bb-bar._expanded_ { + fill-opacity: 0.75; } + +/*-- Focus --*/ +.bb-target.bb-focused { + opacity: 1; } + +.bb-target.bb-focused path.bb-line, .bb-target.bb-focused path.bb-step { + stroke-width: 2px; } + +.bb-target.bb-defocused { + opacity: 0.3 !important; } + +/*-- Region --*/ +.bb-region { + fill: steelblue; + fill-opacity: .1; } + +/*-- Brush --*/ +.bb-brush .extent { + fill-opacity: .1; } + +/*-- Select - Drag --*/ +/*-- Legend --*/ +.bb-legend-item { + font-size: 12px; } + +.bb-legend-item-hidden { + opacity: 0.15; } + +.bb-legend-background { + opacity: 0.75; + fill: white; + stroke: lightgray; + stroke-width: 1; } + +/*-- Title --*/ +.bb-title { + font: 14px sans-serif; } + +/*-- Tooltip --*/ +.bb-tooltip-container { + z-index: 10; } + +.bb-tooltip { + border-collapse: collapse; + border-spacing: 0; + background-color: #fff; + empty-cells: show; + opacity: 0.9; + -webkit-box-shadow: 7px 7px 12px -9px #777777; + -moz-box-shadow: 7px 7px 12px -9px #777777; + box-shadow: 7px 7px 12px -9px #777777; } + .bb-tooltip tr { + border: 1px solid #CCC; } + .bb-tooltip th { + background-color: #aaa; + font-size: 14px; + padding: 2px 5px; + text-align: left; + color: #FFF; } + .bb-tooltip td { + font-size: 13px; + padding: 3px 6px; + background-color: #fff; + border-left: 1px dotted #999; } + .bb-tooltip td > span { + display: inline-block; + width: 10px; + height: 10px; + margin-right: 6px; } + .bb-tooltip td.value { + text-align: right; } + +/*-- Area --*/ +.bb-area { + stroke-width: 0; + opacity: 0.2; } + +/*-- Arc --*/ +.bb-chart-arcs-title { + dominant-baseline: middle; + font-size: 1.3em; } + +.bb-chart-arcs .bb-chart-arcs-background { + fill: #e0e0e0; + stroke: none; } + +.bb-chart-arcs .bb-chart-arcs-gauge-unit { + fill: #000; + font-size: 16px; } + +.bb-chart-arcs .bb-chart-arcs-gauge-max { + fill: #777; } + +.bb-chart-arcs .bb-chart-arcs-gauge-min { + fill: #777; } + +.bb-chart-arc .bb-gauge-value { + fill: #000; } + +/*# sourceMappingURL=billboard.css.map*/ \ No newline at end of file diff --git a/dist/billboard.css.map b/dist/billboard.css.map new file mode 100644 index 000000000..200c7ecb9 --- /dev/null +++ b/dist/billboard.css.map @@ -0,0 +1 @@ +{"version":3,"file":"billboard.css","sources":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","sourceRoot":""} \ No newline at end of file diff --git a/dist/billboard.js b/dist/billboard.js new file mode 100644 index 000000000..9531d9095 --- /dev/null +++ b/dist/billboard.js @@ -0,0 +1,9993 @@ +/*! + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + * + * billboard.js, JavaScript chart library + * http://naver.github.io/billboard.js/ + * + * @version 1.0.0 + */ +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(require("d3")); + else if(typeof define === 'function' && define.amd) + define(["d3"], factory); + else { + var a = typeof exports === 'object' ? factory(require("d3")) : factory(root["d3"]); + for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i]; + } +})(this, function(__WEBPACK_EXTERNAL_MODULE_2__) { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // identity function for calling harmony imports with the correct context +/******/ __webpack_require__.i = function(value) { return value; }; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { +/******/ configurable: false, +/******/ enumerable: true, +/******/ get: getter +/******/ }); +/******/ } +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = 59); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +exports.__esModule = !0; +exports.isObject = exports.isArray = exports.merge = exports.getRectSegList = exports.removeEvent = exports.addEvent = exports.extend = exports.brushEmpty = exports.getBrushSelection = exports.isEmpty = exports.diffDomain = exports.getPathBox = exports.sanitise = exports.hasValue = exports.isString = exports.getOption = exports.asHalfPixel = exports.isFunction = exports.ceil10 = exports.notEmpty = exports.isUndefined = exports.isDefined = exports.isValue = undefined; + +var _typeof2 = __webpack_require__(5), + _typeof3 = _interopRequireDefault(_typeof2), + _d = __webpack_require__(2), + _classes = __webpack_require__(3), + _classes2 = _interopRequireDefault(_classes); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +var isValue = function (v) { + return v || v === 0; +}, + isFunction = function (o) { + return typeof o === "function"; +}, + isString = function (o) { + return typeof o === "string"; +}, + isUndefined = function (v) { + return typeof v === "undefined"; +}, + isDefined = function (v) { + return typeof v !== "undefined"; +}, + ceil10 = function (v) { + return Math.ceil(v / 10) * 10; +}, + asHalfPixel = function (n) { + return Math.ceil(n) + 0.5; +}, + diffDomain = function (d) { + return d[1] - d[0]; +}, + isEmpty = function (o) { + return typeof o === "undefined" || o === null || isString(o) && o.length === 0 || (typeof o === "undefined" ? "undefined" : (0, _typeof3.default)(o)) === "object" && Object.keys(o).length === 0; +}, + notEmpty = function (o) { + return !isEmpty(o); +}, + getOption = function (options, key, defaultValue) { + return isDefined(options[key]) ? options[key] : defaultValue; +}, + hasValue = function (dict, value) { + var found = !1; + + return Object.keys(dict).forEach(function (key) { + return dict[key] === value && (found = !0); + }), found; +}, + sanitise = function (str) { + return typeof str === "string" ? str.replace(//g, ">") : str; +}, + getRectSegList = function (path) { + /* + * seg1 ---------- seg2 + * | | + * | | + * | | + * seg0 ---------- seg3 + * */ + var bbox = path.getBBox(), + list = []; + + // seg0 + + + return list.push({ + x: bbox.x, + y: bbox.y + bbox.height + }), list.push({ + x: bbox.x, + y: bbox.y + }), list.push({ + x: bbox.x + bbox.width, + y: bbox.y + }), list.push({ + x: bbox.x + bbox.width, + y: bbox.y + bbox.height + }), list; +}, + getPathBox = function (path) { + var box = path.getBoundingClientRect(), + items = getRectSegList(path), + minX = items[0].x, + minY = Math.min(items[0].y, items[1].y); + + + return { + x: minX, + y: minY, + width: box.width, + height: box.height + }; +}, + getBrushSelection = function () { + var selection = null, + event = _d.event; + + // check from event + + + return event && event.constructor.name === "BrushEvent" ? selection = event.selection : this.context && (selection = this.context.select("." + _classes2.default.brush).node()) && (selection = (0, _d.brushSelection)(selection)), selection; +}, + brushEmpty = function () { + var selection = this.getBrushSelection(); + + return !selection || selection[0] === selection[1]; +}; + +// substitution of SVGPathSeg API polyfill + + +// return brush selection array + + +function extend() { + var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, + source = arguments[1], + p = void 0; + + + for (p in source) target[p] = source[p]; + return target; +} + +var SUPPORT_ADDEVENTLISTENER = !!("addEventListener" in document), + SUPPORT_PASSIVE = function () { + var supportsPassiveOption = !1; + + try { + SUPPORT_ADDEVENTLISTENER && Object.defineProperty && document.addEventListener("test", null, Object.defineProperty({}, "passive", { + get: function get() { + supportsPassiveOption = !0; + } + })); + } catch (e) {} + return supportsPassiveOption; +}(); + + +function addEvent(element, type, handler, eventListenerOptions) { + if (SUPPORT_ADDEVENTLISTENER) { + var options = eventListenerOptions || !1; + + (typeof eventListenerOptions === "undefined" ? "undefined" : (0, _typeof3.default)(eventListenerOptions)) === "object" && (options = !!SUPPORT_PASSIVE && eventListenerOptions), element.addEventListener(type, handler, options); + } else element.attachEvent ? element.attachEvent("on" + type, handler) : element["on" + type] = handler; +} + +function removeEvent(element, type, handler) { + element.removeEventListener ? element.removeEventListener(type, handler, !1) : element.detachEvent ? element.detachEvent("on" + type, handler) : element["on" + type] = null; +} + +/** + * Check if is array + * @param arr * + * @returns {Boolean} + * @private + */ +var isArray = function (arr) { + return arr && arr.constructor === Array; +}, + isObject = function (obj) { + return obj && !obj.nodeType && (typeof obj === "undefined" ? "undefined" : (0, _typeof3.default)(obj)) === "object" && !isArray(obj); +}, + merge = function (target) { + for (var _len = arguments.length, objectN = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) objectN[_key - 1] = arguments[_key]; + + if (!objectN.length || objectN.length === 1 && !objectN[0]) return target; + + var source = objectN.shift(); + + return isObject(target) && isObject(source) && Object.keys(source).forEach(function (key) { + var value = source[key]; + + isObject(value) ? (!target[key] && (target[key] = {}), target[key] = merge(target[key], value)) : target[key] = isArray(value) ? value.concat() : value; + }), extend.apply(undefined, [target].concat(objectN)); +}; + +/** + * Check if is object + * @param {Object} obj + * @returns {Boolean} + * @private + */ + + +/** + * Merge object returning new object + * @param {Object} target + * @param {Object} objectN + * @returns {Object} merged target object + * @private + * @example + * var target = { a: 1 }; + * utils.extend(target, { b: 2, c: 3 }); + * target; // { a: 1, b: 2, c: 3 }; + */ +exports.isValue = isValue; +exports.isDefined = isDefined; +exports.isUndefined = isUndefined; +exports.notEmpty = notEmpty; +exports.ceil10 = ceil10; +exports.isFunction = isFunction; +exports.asHalfPixel = asHalfPixel; +exports.getOption = getOption; +exports.isString = isString; +exports.hasValue = hasValue; +exports.sanitise = sanitise; +exports.getPathBox = getPathBox; +exports.diffDomain = diffDomain; +exports.isEmpty = isEmpty; +exports.getBrushSelection = getBrushSelection; +exports.brushEmpty = brushEmpty; +exports.extend = extend; +exports.addEvent = addEvent; +exports.removeEvent = removeEvent; +exports.getRectSegList = getRectSegList; +exports.merge = merge; +exports.isArray = isArray; +exports.isObject = isObject; + +/***/ }), +/* 1 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +exports.__esModule = !0; + +var _classCallCheck2 = __webpack_require__(6), + _classCallCheck3 = _interopRequireDefault(_classCallCheck2), + _d = __webpack_require__(2), + _Axis = __webpack_require__(7), + _Axis2 = _interopRequireDefault(_Axis), + _classes = __webpack_require__(3), + _classes2 = _interopRequireDefault(_classes), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Internal chart class. + * - Note: Instantiated internally, not exposed for public. + * @class ChartInternal + * @ignore + * @private +*/ +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +var ChartInternal = function () { + function ChartInternal(api) { + (0, _classCallCheck3.default)(this, ChartInternal); + + var $$ = this; + + $$.api = api, $$.config = $$.getOptions(), $$.data = {}, $$.cache = {}, $$.axes = {}; + } + + return ChartInternal.prototype.beforeInit = function beforeInit() { + // can do something + }, ChartInternal.prototype.afterInit = function afterInit() { + // can do something + }, ChartInternal.prototype.init = function init() { + var $$ = this, + config = $$.config; + + + if ($$.initParams(), config.data_url) $$.convertUrlToData(config.data_url, config.data_mimeType, config.data_headers, config.data_keys, $$.initWithData);else if (config.data_json) $$.initWithData($$.convertJsonToData(config.data_json, config.data_keys));else if (config.data_rows) $$.initWithData($$.convertRowsToData(config.data_rows));else if (config.data_columns) $$.initWithData($$.convertColumnsToData(config.data_columns));else throw Error("url or json or rows or columns is required."); + }, ChartInternal.prototype.initParams = function initParams() { + var $$ = this, + config = $$.config; + $$.clipId = "bb-" + +new Date() + "-clip", $$.clipIdForXAxis = $$.clipId + "-xaxis", $$.clipIdForYAxis = $$.clipId + "-yaxis", $$.clipIdForGrid = $$.clipId + "-grid", $$.clipIdForSubchart = $$.clipId + "-subchart", $$.clipPath = $$.getClipPath($$.clipId), $$.clipPathForXAxis = $$.getClipPath($$.clipIdForXAxis), $$.clipPathForYAxis = $$.getClipPath($$.clipIdForYAxis), $$.clipPathForGrid = $$.getClipPath($$.clipIdForGrid), $$.clipPathForSubchart = $$.getClipPath($$.clipIdForSubchart), $$.dragStart = null, $$.dragging = !1, $$.flowing = !1, $$.cancelClick = !1, $$.mouseover = !1, $$.transiting = !1, $$.color = $$.generateColor(), $$.levelColor = $$.generateLevelColor(), $$.dataTimeFormat = config.data_xLocaltime ? _d.timeParse : _d.utcParse, $$.axisTimeFormat = config.axis_x_localtime ? _d.timeFormat : _d.utcFormat, $$.defaultAxisTimeFormat = function (d) { + var specifier = d.getMilliseconds() && ".%L" || d.getSeconds() && ".:%S" || d.getMinutes() && "%I:%M" || d.getHours() && "%I %p" || d.getDay() && d.getDate() !== 1 && "%-m/%-d" || d.getDate() !== 1 && "%b %d" || d.getMonth() && "%-m/%-d" || "%Y/%-m/%-d"; + + return $$.axisTimeFormat(specifier)(d); + }, $$.hiddenTargetIds = [], $$.hiddenLegendIds = [], $$.focusedTargetIds = [], $$.defocusedTargetIds = [], $$.xOrient = config.axis_rotated ? "left" : "bottom", $$.yOrient = config.axis_rotated ? config.axis_y_inner ? "top" : "bottom" : config.axis_y_inner ? "right" : "left", $$.y2Orient = config.axis_rotated ? config.axis_y2_inner ? "bottom" : "top" : config.axis_y2_inner ? "left" : "right", $$.subXOrient = config.axis_rotated ? "left" : "bottom", $$.isLegendRight = config.legend_position === "right", $$.isLegendInset = config.legend_position === "inset", $$.isLegendTop = config.legend_inset_anchor === "top-left" || config.legend_inset_anchor === "top-right", $$.isLegendLeft = config.legend_inset_anchor === "top-left" || config.legend_inset_anchor === "bottom-left", $$.legendStep = 0, $$.legendItemWidth = 0, $$.legendItemHeight = 0, $$.currentMaxTickWidths = { + x: 0, + y: 0, + y2: 0 + }, $$.rotated_padding_left = 30, $$.rotated_padding_right = config.axis_rotated && !config.axis_x_show ? 0 : 30, $$.rotated_padding_top = 5, $$.withoutFadeIn = {}, $$.intervalForObserveInserted = undefined, $$.inputType = $$.convertInputType(), $$.axes.subx = (0, _d.selectAll)([]); + }, ChartInternal.prototype.initWithData = function initWithData(data) { + var $$ = this, + config = $$.config, + binding = !0; + $$.axis = new _Axis2.default($$), $$.initPie && $$.initPie(), $$.initBrush && $$.initBrush(), $$.initZoom && $$.initZoom(), $$.selectChart = config.bindto ? typeof config.bindto.node === "function" ? config.bindto : (0, _d.select)(config.bindto) : (0, _d.selectAll)([]), $$.selectChart.empty() && ($$.selectChart = (0, _d.select)(document.createElement("div")).style("opacity", "0"), $$.observeInserted($$.selectChart), binding = !1), $$.selectChart.html("").classed("bb", !0), $$.data.xs = {}, $$.data.targets = $$.convertDataToTargets(data), config.data_filter && ($$.data.targets = $$.data.targets.filter(config.data_filter)), config.data_hide && $$.addHiddenTargetIds(config.data_hide === !0 ? $$.mapToIds($$.data.targets) : config.data_hide), config.legend_hide && $$.addHiddenLegendIds(config.legend_hide === !0 ? $$.mapToIds($$.data.targets) : config.legend_hide), $$.hasType("gauge") && (config.legend_show = !1), $$.updateSizes(), $$.updateScales(), $$.x.domain((0, _d.extent)($$.getXDomain($$.data.targets))), $$.y.domain($$.getYDomain($$.data.targets, "y")), $$.y2.domain($$.getYDomain($$.data.targets, "y2")), $$.subX.domain($$.x.domain()), $$.subY.domain($$.y.domain()), $$.subY2.domain($$.y2.domain()), $$.orgXDomain = $$.x.domain(); + + + // -- Basic Elements -- + + var isTouch = $$.inputType === "touch"; + + // Define svg + $$.svg = $$.selectChart.append("svg").style("overflow", "hidden").on(isTouch ? "touchstart" : "mouseenter", function () { + return config.onover.call($$); + }).on(isTouch ? "touchend" : "mouseleave", function () { + return config.onout.call($$); + }), $$.config.svg_classname && $$.svg.attr("class", $$.config.svg_classname); + + + // Define defs + var defs = $$.svg.append("defs"); + + $$.clipChart = $$.appendClip(defs, $$.clipId), $$.clipXAxis = $$.appendClip(defs, $$.clipIdForXAxis), $$.clipYAxis = $$.appendClip(defs, $$.clipIdForYAxis), $$.clipGrid = $$.appendClip(defs, $$.clipIdForGrid), $$.clipSubchart = $$.appendClip(defs, $$.clipIdForSubchart), $$.updateSvgSize(); + + + // Set initialized scales to brush and zoom + // if ($$.brush) { $$.brush.scale($$.subX); } + // if (config.zoom_enabled) { $$.zoom.scale($$.x); } + + // Define regions + var main = $$.svg.append("g").attr("transform", $$.getTranslate("main")); + + $$.main = main, config.subchart_show && $$.initSubchart && $$.initSubchart(), $$.initTooltip && $$.initTooltip(), $$.initLegend && $$.initLegend(), $$.initTitle && $$.initTitle(), main.append("text").attr("class", _classes2.default.text + " " + _classes2.default.empty).attr("text-anchor", "middle" // horizontal centering of text at x position in all browsers. + ).attr("dominant-baseline", "middle"), $$.initRegion(), $$.initGrid(), main.append("g").attr("clip-path", $$.clipPath).attr("class", _classes2.default.chart), config.grid_lines_front && $$.initGridLines(), $$.initEventRect(), $$.initChartElements(), main.insert("rect", config.zoom_privileged ? null : "g." + _classes2.default.regions).attr("class", _classes2.default.zoomRect).attr("width", $$.width).attr("height", $$.height).style("opacity", "0").on("dblclick.zoom", null), config.axis_x_extent && $$.brush.scale($$.getDefaultExtent()), $$.axis.init(), $$.updateTargets($$.data.targets), binding && ($$.updateDimension(), $$.config.oninit.call($$), $$.redraw({ + withTransition: !1, + withTransform: !0, + withUpdateXDomain: !0, + withUpdateOrgXDomain: !0, + withTransitionForAxis: !1 + })), $$.bindResize(), $$.api.element = $$.selectChart.node(); + }, ChartInternal.prototype.initChartElements = function initChartElements() { + this.initBar && this.initBar(), this.initLine && this.initLine(), this.initArc && this.initArc(), this.initGauge && this.initGauge(), this.initText && this.initText(); + }, ChartInternal.prototype.smoothLines = function smoothLines(el, type) { + type === "grid" && el.each(function () { + var g = (0, _d.select)(this), + x1 = g.attr("x1"), + x2 = g.attr("x2"), + y1 = g.attr("y1"), + y2 = g.attr("y2"); + g.attr({ + "x1": Math.ceil(x1), + "x2": Math.ceil(x2), + "y1": Math.ceil(y1), + "y2": Math.ceil(y2) + }); + }); + }, ChartInternal.prototype.updateSizes = function updateSizes() { + var $$ = this, + config = $$.config, + legendHeight = $$.legend ? $$.getLegendHeight() : 0, + legendWidth = $$.legend ? $$.getLegendWidth() : 0, + legendHeightForBottom = $$.isLegendRight || $$.isLegendInset ? 0 : legendHeight, + hasArc = $$.hasArcType(), + xAxisHeight = config.axis_rotated || hasArc ? 0 : $$.getHorizontalAxisHeight("x"), + subchartHeight = config.subchart_show && !hasArc ? config.subchart_size_height + xAxisHeight : 0; + $$.currentWidth = $$.getCurrentWidth(), $$.currentHeight = $$.getCurrentHeight(), $$.margin = config.axis_rotated ? { + top: $$.getHorizontalAxisHeight("y2") + $$.getCurrentPaddingTop(), + right: hasArc ? 0 : $$.getCurrentPaddingRight(), + bottom: $$.getHorizontalAxisHeight("y") + legendHeightForBottom + $$.getCurrentPaddingBottom(), + left: subchartHeight + (hasArc ? 0 : $$.getCurrentPaddingLeft()) + } : { + top: 4 + $$.getCurrentPaddingTop(), // for top tick text + right: hasArc ? 0 : $$.getCurrentPaddingRight(), + bottom: xAxisHeight + subchartHeight + legendHeightForBottom + $$.getCurrentPaddingBottom(), + left: hasArc ? 0 : $$.getCurrentPaddingLeft() + }, $$.margin2 = config.axis_rotated ? { + top: $$.margin.top, + right: NaN, + bottom: 20 + legendHeightForBottom, + left: $$.rotated_padding_left + } : { + top: $$.currentHeight - subchartHeight - legendHeightForBottom, + right: NaN, + bottom: xAxisHeight + legendHeightForBottom, + left: $$.margin.left + }, $$.margin3 = { + top: 0, + right: NaN, + bottom: 0, + left: 0 + }, $$.updateSizeForLegend && $$.updateSizeForLegend(legendHeight, legendWidth), $$.width = $$.currentWidth - $$.margin.left - $$.margin.right, $$.height = $$.currentHeight - $$.margin.top - $$.margin.bottom, $$.width < 0 && ($$.width = 0), $$.height < 0 && ($$.height = 0), $$.width2 = config.axis_rotated ? $$.margin.left - $$.rotated_padding_left - $$.rotated_padding_right : $$.width, $$.height2 = config.axis_rotated ? $$.height : $$.currentHeight - $$.margin2.top - $$.margin2.bottom, $$.width2 < 0 && ($$.width2 = 0), $$.height2 < 0 && ($$.height2 = 0), $$.arcWidth = $$.width - ($$.isLegendRight ? legendWidth + 10 : 0), $$.arcHeight = $$.height - ($$.isLegendRight ? 0 : 10), $$.hasType("gauge") && !config.gauge_fullCircle && ($$.arcHeight += $$.height - $$.getGaugeLabelHeight()), $$.updateRadius && $$.updateRadius(), $$.isLegendRight && hasArc && ($$.margin3.left = $$.arcWidth / 2 + $$.radiusExpanded * 1.1); + }, ChartInternal.prototype.updateTargets = function updateTargets(targets) { + var $$ = this; + + // -- Main -- + + // -- Text -- // + $$.updateTargetsForText(targets), $$.updateTargetsForBar(targets), $$.updateTargetsForLine(targets), $$.hasArcType() && $$.updateTargetsForArc && $$.updateTargetsForArc(targets), $$.updateTargetsForSubchart && $$.updateTargetsForSubchart(targets), $$.showTargets(); + }, ChartInternal.prototype.showTargets = function showTargets() { + var $$ = this; + + $$.svg.selectAll("." + _classes2.default.target).filter(function (d) { + return $$.isTargetToShow(d.id); + }).transition().duration($$.config.transition_duration).style("opacity", "1"); + }, ChartInternal.prototype.redraw = function redraw() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, + transitionsValue = arguments[1], + $$ = this, + main = $$.main, + config = $$.config, + areaIndices = $$.getShapeIndices($$.isAreaType), + barIndices = $$.getShapeIndices($$.isBarType), + lineIndices = $$.getShapeIndices($$.isLineType), + waitForDraw = void 0, + flow = void 0, + hideAxis = $$.hasArcType(), + targetsToShow = $$.filterTargetsToShow($$.data.targets), + xv = $$.xv.bind($$), + tickValues = void 0, + intervalForCulling = void 0, + xDomainForZoom = void 0, + withY = (0, _util.getOption)(options, "withY", !0), + withSubchart = (0, _util.getOption)(options, "withSubchart", !0), + withTransition = (0, _util.getOption)(options, "withTransition", !0), + withTransform = (0, _util.getOption)(options, "withTransform", !1), + withUpdateXDomain = (0, _util.getOption)(options, "withUpdateXDomain", !1), + withUpdateOrgXDomain = (0, _util.getOption)(options, "withUpdateOrgXDomain", !1), + withTrimXDomain = (0, _util.getOption)(options, "withTrimXDomain", !0), + withUpdateXAxis = (0, _util.getOption)(options, "withUpdateXAxis", withUpdateXDomain), + withLegend = (0, _util.getOption)(options, "withLegend", !1), + withEventRect = (0, _util.getOption)(options, "withEventRect", !0), + withDimension = (0, _util.getOption)(options, "withDimension", !0), + withTransitionForExit = (0, _util.getOption)(options, "withTransitionForExit", withTransition), + withTransitionForAxis = (0, _util.getOption)(options, "withTransitionForAxis", withTransition), + duration = withTransition ? config.transition_duration : 0, + durationForExit = withTransitionForExit ? duration : 0, + durationForAxis = withTransitionForAxis ? duration : 0, + transitions = transitionsValue || $$.axis.generateTransitions(durationForAxis); + + + // show/hide if manual culling needed + if ($$.inputType === "touch" && $$.hideTooltip(), withLegend && config.legend_show ? $$.updateLegend($$.mapToIds($$.data.targets), options, transitions) : withDimension && $$.updateDimension(!0), $$.isCategorized() && targetsToShow.length === 0 && $$.x.domain([0, $$.axes.x.selectAll(".tick").size()]), targetsToShow.length ? ($$.updateXDomain(targetsToShow, withUpdateXDomain, withUpdateOrgXDomain, withTrimXDomain), !config.axis_x_tick_values && (tickValues = $$.axis.updateXAxisTickValues(targetsToShow))) : ($$.xAxis.tickValues([]), $$.subXAxis.tickValues([])), config.zoom_rescale && !options.flow && (xDomainForZoom = $$.x.orgDomain()), $$.y.domain($$.getYDomain(targetsToShow, "y", xDomainForZoom)), $$.y2.domain($$.getYDomain(targetsToShow, "y2", xDomainForZoom)), !config.axis_y_tick_values && config.axis_y_tick_count && $$.yAxis.tickValues($$.axis.generateTickValues($$.y.domain(), config.axis_y_tick_count, $$.isTimeSeriesY())), !config.axis_y2_tick_values && config.axis_y2_tick_count && $$.y2Axis.tickValues($$.axis.generateTickValues($$.y2.domain(), config.axis_y2_tick_count)), $$.axis.redraw(transitions, hideAxis), $$.axis.updateLabels(withTransition), (withUpdateXDomain || withUpdateXAxis) && targetsToShow.length) if (config.axis_x_tick_culling && tickValues) { + for (var _i = 1; _i < tickValues.length; _i++) if (tickValues.length / _i < config.axis_x_tick_culling_max) { + intervalForCulling = _i; + + break; + } + + $$.svg.selectAll("." + _classes2.default.axisX + " .tick text").each(function (e) { + var index = tickValues.indexOf(e); + + index >= 0 && (0, _d.select)(this).style("display", index % intervalForCulling ? "none" : "block"); + }); + } else $$.svg.selectAll("." + _classes2.default.axisX + " .tick text").style("display", "block"); + + // setup drawer - MEMO: these must be called after axis updated + var drawArea = $$.generateDrawArea ? $$.generateDrawArea(areaIndices, !1) : undefined, + drawBar = $$.generateDrawBar ? $$.generateDrawBar(barIndices) : undefined, + drawLine = $$.generateDrawLine ? $$.generateDrawLine(lineIndices, !1) : undefined, + xForText = $$.generateXYForText(areaIndices, barIndices, lineIndices, !0), + yForText = $$.generateXYForText(areaIndices, barIndices, lineIndices, !1); + + withY && ($$.subY.domain($$.getYDomain(targetsToShow, "y")), $$.subY2.domain($$.getYDomain(targetsToShow, "y2"))), $$.updateXgridFocus(), main.select("text." + _classes2.default.text + "." + _classes2.default.empty).attr("x", $$.width / 2).attr("y", $$.height / 2).text(config.data_empty_label_text).transition().style("opacity", targetsToShow.length ? 0 : 1), $$.updateGrid(duration), $$.updateRegion(duration), $$.updateBar(durationForExit), $$.updateLine(durationForExit), $$.updateArea(durationForExit), $$.updateCircle(), $$.hasDataLabel() && $$.updateText(durationForExit), $$.redrawTitle && $$.redrawTitle(), $$.redrawArc && $$.redrawArc(duration, durationForExit, withTransform), config.subchart_show && $$.redrawSubchart && $$.redrawSubchart(withSubchart, transitions, duration, durationForExit, areaIndices, barIndices, lineIndices), main.selectAll("." + _classes2.default.selectedCircles).filter($$.isBarType.bind($$)).selectAll("circle").remove(), config.interaction_enabled && !options.flow && withEventRect && ($$.redrawEventRect(), $$.updateZoom && $$.updateZoom()), $$.updateCircleY(); + + + // generate circle x/y functions depending on updated params + var cx = ($$.config.axis_rotated ? $$.circleY : $$.circleX).bind($$), + cy = ($$.config.axis_rotated ? $$.circleX : $$.circleY).bind($$); + options.flow && (flow = $$.generateFlow({ + targets: targetsToShow, + flow: options.flow, + duration: options.flow.duration, + drawBar: drawBar, + drawLine: drawLine, + drawArea: drawArea, + cx: cx, + cy: cy, + xv: xv, + xForText: xForText, + yForText: yForText + })), (duration || flow) && $$.isTabVisible() ? (0, _d.transition)().duration(duration).each(function () { + waitForDraw = $$.generateWait(), [$$.redrawBar(drawBar, !0), $$.redrawLine(drawLine, !0), $$.redrawArea(drawArea, !0), $$.redrawCircle(cx, cy, !0, flow), $$.redrawText(xForText, yForText, options.flow, !0), $$.redrawRegion(!0), $$.redrawGrid(!0)].reduce(function (acc, t1) { + return t1.forEach(function (t2) { + acc.push(t2); + }), acc; + }, []).forEach(function (t) { + waitForDraw.add(t); + }); + }).call(waitForDraw, function () { + flow && flow(), config.onrendered && config.onrendered.call($$); + }) : ($$.redrawBar(drawBar), $$.redrawLine(drawLine), $$.redrawArea(drawArea), $$.redrawCircle(cx, cy), $$.redrawText(xForText, yForText, options.flow), $$.redrawRegion(), $$.redrawGrid(), config.onrendered && config.onrendered.call($$)), $$.mapToIds($$.data.targets).forEach(function (id) { + $$.withoutFadeIn[id] = !0; + }); + }, ChartInternal.prototype.updateAndRedraw = function updateAndRedraw() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, + $$ = this, + config = $$.config, + transitions = void 0; + options.withTransition = (0, _util.getOption)(options, "withTransition", !0), options.withTransform = (0, _util.getOption)(options, "withTransform", !1), options.withLegend = (0, _util.getOption)(options, "withLegend", !1), options.withUpdateXDomain = !0, options.withUpdateOrgXDomain = !0, options.withTransitionForExit = !1, options.withTransitionForTransform = (0, _util.getOption)(options, "withTransitionForTransform", options.withTransition), $$.updateSizes(), options.withLegend && config.legend_show || (transitions = $$.axis.generateTransitions(options.withTransitionForAxis ? config.transition_duration : 0), $$.updateScales(), $$.updateSvgSize(), $$.transformAll(options.withTransitionForTransform, transitions)), $$.redraw(options, transitions); + }, ChartInternal.prototype.redrawWithoutRescale = function redrawWithoutRescale() { + this.redraw({ + withY: !1, + withSubchart: !1, + withEventRect: !1, + withTransitionForAxis: !1 + }); + }, ChartInternal.prototype.isTimeSeries = function isTimeSeries() { + return this.config.axis_x_type === "timeseries"; + }, ChartInternal.prototype.isCategorized = function isCategorized() { + return this.config.axis_x_type.indexOf("categor") >= 0; + }, ChartInternal.prototype.isCustomX = function isCustomX() { + var $$ = this, + config = $$.config; + + + return !$$.isTimeSeries() && (config.data_x || (0, _util.notEmpty)(config.data_xs)); + }, ChartInternal.prototype.isTimeSeriesY = function isTimeSeriesY() { + return this.config.axis_y_type === "timeseries"; + }, ChartInternal.prototype.getTranslate = function getTranslate(target) { + var $$ = this, + config = $$.config, + x = void 0, + y = void 0; + + + return target === "main" ? (x = (0, _util.asHalfPixel)($$.margin.left), y = (0, _util.asHalfPixel)($$.margin.top)) : target === "context" ? (x = (0, _util.asHalfPixel)($$.margin2.left), y = (0, _util.asHalfPixel)($$.margin2.top)) : target === "legend" ? (x = $$.margin3.left, y = $$.margin3.top) : target === "x" ? (x = 0, y = config.axis_rotated ? 0 : $$.height) : target === "y" ? (x = 0, y = config.axis_rotated ? $$.height : 0) : target === "y2" ? (x = config.axis_rotated ? 0 : $$.width, y = config.axis_rotated ? 1 : 0) : target === "subx" ? (x = 0, y = config.axis_rotated ? 0 : $$.height2) : target === "arc" && (x = $$.arcWidth / 2, y = $$.arcHeight / 2), "translate(" + x + ", " + y + ")"; + }, ChartInternal.prototype.initialOpacity = function initialOpacity(d) { + return d.value !== null && this.withoutFadeIn[d.id] ? "1" : "0"; + }, ChartInternal.prototype.initialOpacityForCircle = function initialOpacityForCircle(d) { + return d.value !== null && this.withoutFadeIn[d.id] ? this.opacityForCircle(d) : "0"; + }, ChartInternal.prototype.opacityForCircle = function opacityForCircle(d) { + var opacity = this.config.point_show ? "1" : "0"; + + return (0, _util.isValue)(d.value) ? this.isScatterType(d) ? "0.5" : opacity : "0"; + }, ChartInternal.prototype.opacityForText = function opacityForText() { + return this.hasDataLabel() ? "1" : "0"; + }, ChartInternal.prototype.xx = function xx(d) { + return this.config.zoom_enabled && this.zoomScale ? d ? this.zoomScale(d.x) : null : d ? this.x(d.x) : null; + }, ChartInternal.prototype.xv = function xv(d) { + var $$ = this, + value = d.value; + + + return $$.isTimeSeries() ? value = $$.parseDate(d.value) : $$.isCategorized() && typeof d.value === "string" && (value = $$.config.axis_x_categories.indexOf(d.value)), Math.ceil($$.x(value)); + }, ChartInternal.prototype.yv = function yv(d) { + var $$ = this, + yScale = d.axis && d.axis === "y2" ? $$.y2 : $$.y; + + + return Math.ceil(yScale(d.value)); + }, ChartInternal.prototype.subxx = function subxx(d) { + return d ? this.subX(d.x) : null; + }, ChartInternal.prototype.transformMain = function transformMain(withTransition, transitions) { + var $$ = this, + xAxis = void 0, + yAxis = void 0, + y2Axis = void 0; + transitions && transitions.axisX ? xAxis = transitions.axisX : (xAxis = $$.main.select("." + _classes2.default.axisX), withTransition && (xAxis = xAxis.transition())), transitions && transitions.axisY ? yAxis = transitions.axisY : (yAxis = $$.main.select("." + _classes2.default.axisY), withTransition && (yAxis = yAxis.transition())), transitions && transitions.axisY2 ? y2Axis = transitions.axisY2 : (y2Axis = $$.main.select("." + _classes2.default.axisY2), withTransition && (y2Axis = y2Axis.transition())), (withTransition ? $$.main.transition() : $$.main).attr("transform", $$.getTranslate("main")), xAxis.attr("transform", $$.getTranslate("x")), yAxis.attr("transform", $$.getTranslate("y")), y2Axis.attr("transform", $$.getTranslate("y2")), $$.main.select("." + _classes2.default.chartArcs).attr("transform", $$.getTranslate("arc")); + }, ChartInternal.prototype.transformAll = function transformAll(withTransition, transitions) { + var $$ = this; + + $$.transformMain(withTransition, transitions), $$.config.subchart_show && $$.transformContext(withTransition, transitions), $$.legend && $$.transformLegend(withTransition); + }, ChartInternal.prototype.updateSvgSize = function updateSvgSize() { + var $$ = this, + brush = $$.svg.select("." + _classes2.default.brush + " .overlay"), + brushHeight = brush.size() ? brush.attr("height") : 0; + $$.svg.attr("width", $$.currentWidth).attr("height", $$.currentHeight), $$.svg.selectAll(["#" + $$.clipId, "#" + $$.clipIdForGrid]).select("rect").attr("width", $$.width).attr("height", $$.height), $$.svg.select("#" + $$.clipIdForXAxis).select("rect").attr("x", $$.getXAxisClipX.bind($$)).attr("y", $$.getXAxisClipY.bind($$)).attr("width", $$.getXAxisClipWidth.bind($$)).attr("height", $$.getXAxisClipHeight.bind($$)), $$.svg.select("#" + $$.clipIdForYAxis).select("rect").attr("x", $$.getYAxisClipX.bind($$)).attr("y", $$.getYAxisClipY.bind($$)).attr("width", $$.getYAxisClipWidth.bind($$)).attr("height", $$.getYAxisClipHeight.bind($$)), $$.svg.select("#" + $$.clipIdForSubchart).select("rect").attr("width", $$.width).attr("height", brushHeight), $$.svg.select("." + _classes2.default.zoomRect).attr("width", $$.width).attr("height", $$.height), $$.selectChart.style("max-height", $$.currentHeight + "px"), $$.brush && $$.brush.scale($$.subX, brushHeight); + }, ChartInternal.prototype.updateDimension = function updateDimension(withoutAxis) { + var $$ = this; + + withoutAxis || ($$.config.axis_rotated ? ($$.axes.x.call($$.xAxis), $$.axes.subx.call($$.subXAxis)) : ($$.axes.y.call($$.yAxis), $$.axes.y2.call($$.y2Axis))), $$.updateSizes(), $$.updateScales(withoutAxis), $$.updateSvgSize(), $$.transformAll(!1); + }, ChartInternal.prototype.observeInserted = function observeInserted(selection) { + var $$ = this; + + if (typeof MutationObserver === "undefined") return void (console && console.error && console.error("MutationObserver not defined.")); + + var observer = new MutationObserver(function (mutations) { + mutations.forEach(function (mutation) { + mutation.type === "childList" && mutation.previousSibling && (observer.disconnect(), $$.intervalForObserveInserted = window.setInterval(function () { + selection.node().parentNode && (window.clearInterval($$.intervalForObserveInserted), $$.updateDimension(), $$.brush && $$.brush.update(), $$.config.oninit.call($$), $$.redraw({ + withTransform: !0, + withUpdateXDomain: !0, + withUpdateOrgXDomain: !0, + withTransition: !1, + withTransitionForTransform: !1, + withLegend: !0 + }), selection.transition().style("opacity", "1")); + }, 10)); + }); + }); + + observer.observe(selection.node(), { + attributes: !0, + childList: !0, + characterData: !0 + }); + }, ChartInternal.prototype.bindResize = function bindResize() { + var $$ = this, + config = $$.config; + $$.resizeFunction = $$.generateResize(), $$.resizeFunction.add(function () { + config.onresize.call($$); + }), config.resize_auto && $$.resizeFunction.add(function () { + $$.resizeTimeout !== undefined && window.clearTimeout($$.resizeTimeout), $$.resizeTimeout = window.setTimeout(function () { + delete $$.resizeTimeout, $$.api.flush(); + }, 100); + }), $$.resizeFunction.add(function () { + config.onresized.call($$); + }), (0, _util.addEvent)(window, "resize", $$.resizeFunction); + }, ChartInternal.prototype.generateResize = function generateResize() { + + function callResizeFunctions() { + resizeFunctions.forEach(function (f) { + return f(); + }); + } + + var resizeFunctions = []; + + return callResizeFunctions.add = function (f) { + resizeFunctions.push(f); + }, callResizeFunctions.remove = function (f) { + for (var i = 0; i < resizeFunctions.length; i++) if (resizeFunctions[i] === f) { + resizeFunctions.splice(i, 1); + + break; + } + }, callResizeFunctions; + }, ChartInternal.prototype.endall = function endall(transition, callback) { + var n = 0; + + transition.each(function () { + return ++n; + }).on("end", function () { + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) args[_key] = arguments[_key]; + + --n || callback.apply.apply(callback, [this].concat(args)); + }); + }, ChartInternal.prototype.generateWait = function generateWait() { + var transitionsToWait = [], + f = function (transition, callback) { + + function loop() { + var done = 0; + + transitionsToWait.forEach(function (t) { + if (t.empty()) return void (done += 1); + + try { + t.transition(); + } catch (e) { + done += 1; + } + }), done === transitionsToWait.length ? (clearTimeout(timer), callback && callback()) : timer = setTimeout(loop, 20); + } + + var timer = void 0;loop(); + }; + + + return f.add = function (transition) { + Array.isArray(transition) ? transitionsToWait = [].concat(transitionsToWait, transition) : transitionsToWait.push(transition); + }, f; + }, ChartInternal.prototype.parseDate = function parseDate(date) { + var $$ = this, + parsedDate = void 0; + + + return date instanceof Date ? parsedDate = date : typeof date === "string" ? parsedDate = $$.dataTimeFormat($$.config.data_xFormat)(date) : typeof date === "number" && !isNaN(date) && (parsedDate = new Date(+date)), (!parsedDate || isNaN(+parsedDate)) && console && console.error && console.error("Failed to parse x '" + date + "' to Date object"), parsedDate; + }, ChartInternal.prototype.isTabVisible = function isTabVisible() { + var hidden = void 0; + + return typeof document.hidden === "undefined" ? typeof document.mozHidden === "undefined" ? typeof document.msHidden === "undefined" ? typeof document.webkitHidden !== "undefined" && (hidden = "webkitHidden") : hidden = "msHidden" : hidden = "mozHidden" : hidden = "hidden", !document[hidden]; + }, ChartInternal.prototype.convertInputType = function convertInputType() { + var $$ = this, + config = $$.config, + hasMouse = !!config.interaction_inputType_mouse && !!("onmouseover" in window), + hasTouch = void 0; + + + return config.interaction_inputType_touch ? (hasTouch = "ontouchstart" in window || window.DocumentTouch && document instanceof window.DocumentTouch, /PhantomJS/.test(window.navigator.userAgent) && (hasTouch = !1)) : hasTouch = !1, hasTouch && "touch" || hasMouse && "mouse" || null; + }, ChartInternal; +}(); + +exports.default = ChartInternal; +module.exports = exports["default"]; + +/***/ }), +/* 2 */ +/***/ (function(module, exports) { + +module.exports = __WEBPACK_EXTERNAL_MODULE_2__; + +/***/ }), +/* 3 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +exports.__esModule = !0; +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +var CLASS = { + target: "bb-target", + chart: "bb-chart", + chartLine: "bb-chart-line", + chartLines: "bb-chart-lines", + chartBar: "bb-chart-bar", + chartBars: "bb-chart-bars", + chartText: "bb-chart-text", + chartTexts: "bb-chart-texts", + chartArc: "bb-chart-arc", + chartArcs: "bb-chart-arcs", + chartArcsTitle: "bb-chart-arcs-title", + chartArcsBackground: "bb-chart-arcs-background", + chartArcsGaugeUnit: "bb-chart-arcs-gauge-unit", + chartArcsGaugeMax: "bb-chart-arcs-gauge-max", + chartArcsGaugeMin: "bb-chart-arcs-gauge-min", + selectedCircle: "bb-selected-circle", + selectedCircles: "bb-selected-circles", + eventRect: "bb-event-rect", + eventRects: "bb-event-rects", + eventRectsSingle: "bb-event-rects-single", + eventRectsMultiple: "bb-event-rects-multiple", + zoomRect: "bb-zoom-rect", + brush: "bb-brush", + focused: "bb-focused", + defocused: "bb-defocused", + region: "bb-region", + regions: "bb-regions", + title: "bb-title", + tooltipContainer: "bb-tooltip-container", + tooltip: "bb-tooltip", + tooltipName: "bb-tooltip-name", + shape: "bb-shape", + shapes: "bb-shapes", + line: "bb-line", + lines: "bb-lines", + bar: "bb-bar", + bars: "bb-bars", + circle: "bb-circle", + circles: "bb-circles", + arc: "bb-arc", + arcs: "bb-arcs", + area: "bb-area", + areas: "bb-areas", + empty: "bb-empty", + text: "bb-text", + texts: "bb-texts", + gaugeValue: "bb-gauge-value", + grid: "bb-grid", + gridLines: "bb-grid-lines", + xgrid: "bb-xgrid", + xgrids: "bb-xgrids", + xgridLine: "bb-xgrid-line", + xgridLines: "bb-xgrid-lines", + xgridFocus: "bb-xgrid-focus", + ygrid: "bb-ygrid", + ygrids: "bb-ygrids", + ygridLine: "bb-ygrid-line", + ygridLines: "bb-ygrid-lines", + axis: "bb-axis", + axisX: "bb-axis-x", + axisXLabel: "bb-axis-x-label", + axisY: "bb-axis-y", + axisYLabel: "bb-axis-y-label", + axisY2: "bb-axis-y2", + axisY2Label: "bb-axis-y2-label", + legendBackground: "bb-legend-background", + legendItem: "bb-legend-item", + legendItemEvent: "bb-legend-item-event", + legendItemTile: "bb-legend-item-tile", + legendItemHidden: "bb-legend-item-hidden", + legendItemFocused: "bb-legend-item-focused", + dragarea: "bb-dragarea", + EXPANDED: "_expanded_", + SELECTED: "_selected_", + INCLUDED: "_included_" +}; + +exports.default = CLASS; +module.exports = exports["default"]; + +/***/ }), +/* 4 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +exports.__esModule = !0; + +var _classCallCheck2 = __webpack_require__(6), + _classCallCheck3 = _interopRequireDefault(_classCallCheck2), + _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Main chart class. + * - Note: Instantiated via `bb.generate()`. + * @class Chart + * @example + * var chart = bb.generate({ + * data: { + * columns: [ + * ["x", "2015-11-02", "2015-12-01", "2016-01-01", "2016-02-01", "2016-03-01"], + * ["count1", 11, 8, 7, 6, 5 ], + * ["count2", 9, 3, 6, 2, 8 ] + * ]} + * } + * @see {@link bb.generate} for the initialization. +*/ +var Chart = function Chart(config) { + (0, _classCallCheck3.default)(this, Chart); + + var $$ = new _ChartInternal2.default(this); + + this.internal = $$, $$.loadConfig(config), $$.beforeInit(config), $$.init(), $$.afterInit(config), function bindThis(fn, target, argThis) { + Object.keys(fn).forEach(function (key) { + target[key] = fn[key].bind(argThis), Object.keys(fn[key]).length && bindThis(fn[key], target[key], argThis); + }); + }(Chart.prototype, this, this); +}; /** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + * @license MIT + * @ignore + */ + + +exports.default = Chart; +module.exports = exports["default"]; + +/***/ }), +/* 5 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +exports.__esModule = true; + +function _typeof(obj) { return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj; } + +exports.default = function (obj) { + return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj === "undefined" ? "undefined" : _typeof(obj); +}; + +/***/ }), +/* 6 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +exports.__esModule = true; + +exports.default = function (instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +}; + +/***/ }), +/* 7 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +exports.__esModule = !0; + +var _typeof2 = __webpack_require__(5), + _typeof3 = _interopRequireDefault(_typeof2), + _classCallCheck2 = __webpack_require__(6), + _classCallCheck3 = _interopRequireDefault(_classCallCheck2), + _d = __webpack_require__(2), + _util = __webpack_require__(0), + _bb = __webpack_require__(8), + _bb2 = _interopRequireDefault(_bb), + _classes = __webpack_require__(3), + _classes2 = _interopRequireDefault(_classes); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +var Axis = function () { + function Axis(owner) { + (0, _classCallCheck3.default)(this, Axis), this.owner = owner; + } + + return Axis.prototype.init = function init() { + var $$ = this.owner, + config = $$.config, + main = $$.main; + $$.axes.x = main.append("g").attr("class", _classes2.default.axis + " " + _classes2.default.axisX).attr("clip-path", $$.clipPathForXAxis).attr("transform", $$.getTranslate("x")).style("visibility", config.axis_x_show ? "visible" : "hidden"), $$.axes.x.append("text").attr("class", _classes2.default.axisXLabel).attr("transform", config.axis_rotated ? "rotate(-90)" : "").style("text-anchor", this.textAnchorForXAxisLabel.bind(this)), $$.axes.y = main.append("g").attr("class", _classes2.default.axis + " " + _classes2.default.axisY).attr("clip-path", config.axis_y_inner ? "" : $$.clipPathForYAxis).attr("transform", $$.getTranslate("y")).style("visibility", config.axis_y_show ? "visible" : "hidden"), $$.axes.y.append("text").attr("class", _classes2.default.axisYLabel).attr("transform", config.axis_rotated ? "" : "rotate(-90)").style("text-anchor", this.textAnchorForYAxisLabel.bind(this)), $$.axes.y2 = main.append("g").attr("class", _classes2.default.axis + " " + _classes2.default.axisY2 + // clip-path? + ).attr("transform", $$.getTranslate("y2")).style("visibility", config.axis_y2_show ? "visible" : "hidden"), $$.axes.y2.append("text").attr("class", _classes2.default.axisY2Label).attr("transform", config.axis_rotated ? "" : "rotate(-90)").style("text-anchor", this.textAnchorForY2AxisLabel.bind(this)); + }, Axis.prototype.getXAxis = function getXAxis(scale, orient, tickFormat, tickValues, withOuterTick, withoutTransition, withoutRotateTickText) { + var $$ = this.owner, + config = $$.config, + axisParams = { + isCategory: $$.isCategorized(), + withOuterTick: withOuterTick, + tickMultiline: config.axis_x_tick_multiline, + tickWidth: config.axis_x_tick_width, + tickTextRotate: withoutRotateTickText ? 0 : config.axis_x_tick_rotate, + withoutTransition: withoutTransition + }, + axis = (0, _bb2.default)(axisParams).scale(scale).orient(orient), + newTickValues = tickValues; + + + return $$.isTimeSeries() && tickValues && typeof tickValues !== "function" && (newTickValues = tickValues.map(function (v) { + return $$.parseDate(v); + })), axis.tickFormat(tickFormat).tickValues(newTickValues), $$.isCategorized() && (axis.tickCentered(config.axis_x_tick_centered), (0, _util.isEmpty)(config.axis_x_tick_culling) && (config.axis_x_tick_culling = !1)), axis; + }, Axis.prototype.updateXAxisTickValues = function updateXAxisTickValues(targets, axis) { + var $$ = this.owner, + config = $$.config, + tickValues = void 0; + + return (config.axis_x_tick_fit || config.axis_x_tick_count) && (tickValues = this.generateTickValues($$.mapTargetsToUniqueXs(targets), config.axis_x_tick_count, $$.isTimeSeries())), axis ? axis.tickValues(tickValues) : ($$.xAxis.tickValues(tickValues), $$.subXAxis.tickValues(tickValues)), tickValues; + }, Axis.prototype.getYAxis = function getYAxis(scale, orient, tickFormat, tickValues, withOuterTick, withoutTransition, withoutRotateTickText) { + var $$ = this.owner, + config = $$.config, + axisParams = { + withOuterTick: withOuterTick, + withoutTransition: withoutTransition, + tickTextRotate: withoutRotateTickText ? 0 : config.axis_y_tick_rotate + }, + axis = (0, _bb2.default)(axisParams).scale(scale).orient(orient).tickFormat(tickFormat); + + return $$.isTimeSeriesY() ? axis.ticks(config.axis_y_tick_time_value) : axis.tickValues(tickValues), axis; + }, Axis.prototype.getId = function getId(id) { + var config = this.owner.config; + + return id in config.data_axes ? config.data_axes[id] : "y"; + }, Axis.prototype.getXAxisTickFormat = function getXAxisTickFormat() { + var $$ = this.owner, + config = $$.config, + format = void 0; + + + return format = $$.isTimeSeries() ? $$.defaultAxisTimeFormat : $$.isCategorized() ? $$.categoryName : function (v) { + return v < 0 ? v.toFixed(0) : v; + }, config.axis_x_tick_format && ((0, _util.isFunction)(config.axis_x_tick_format) ? format = config.axis_x_tick_format : $$.isTimeSeries() && (format = function (date) { + return date ? $$.axisTimeFormat(config.axis_x_tick_format)(date) : ""; + })), (0, _util.isFunction)(format) ? function (v) { + return format.call($$, v); + } : format; + }, Axis.prototype.getTickValues = function getTickValues(tickValues, axis) { + var values = void 0; + + return values = tickValues ? tickValues : axis ? axis.tickValues() : undefined, values; + }, Axis.prototype.getXAxisTickValues = function getXAxisTickValues() { + return this.getTickValues(this.owner.config.axis_x_tick_values, this.owner.xAxis); + }, Axis.prototype.getYAxisTickValues = function getYAxisTickValues() { + return this.getTickValues(this.owner.config.axis_y_tick_values, this.owner.yAxis); + }, Axis.prototype.getY2AxisTickValues = function getY2AxisTickValues() { + return this.getTickValues(this.owner.config.axis_y2_tick_values, this.owner.y2Axis); + }, Axis.prototype.getLabelOptionByAxisId = function getLabelOptionByAxisId(axisId) { + var $$ = this.owner, + config = $$.config, + option = void 0; + + return axisId === "y" ? option = config.axis_y_label : axisId === "y2" ? option = config.axis_y2_label : axisId === "x" && (option = config.axis_x_label), option; + }, Axis.prototype.getLabelText = function getLabelText(axisId) { + var option = this.getLabelOptionByAxisId(axisId), + text = void 0; + + return text = (0, _util.isString)(option) ? option : option ? option.text : null, text; + }, Axis.prototype.setLabelText = function setLabelText(axisId, text) { + var $$ = this.owner, + config = $$.config, + option = this.getLabelOptionByAxisId(axisId); + (0, _util.isString)(option) ? axisId === "y" ? config.axis_y_label = text : axisId === "y2" ? config.axis_y2_label = text : axisId === "x" && (config.axis_x_label = text) : option && (option.text = text); + }, Axis.prototype.getLabelPosition = function getLabelPosition(axisId, defaultPosition) { + var option = this.getLabelOptionByAxisId(axisId), + position = (typeof option === "undefined" ? "undefined" : (0, _typeof3.default)(option)) === "object" && option.position ? option.position : defaultPosition; + + + return { + isInner: !!~position.indexOf("inner"), + isOuter: !!~position.indexOf("outer"), + isLeft: !!~position.indexOf("left"), + isCenter: !!~position.indexOf("center"), + isRight: !!~position.indexOf("right"), + isTop: !!~position.indexOf("top"), + isMiddle: !!~position.indexOf("middle"), + isBottom: !!~position.indexOf("bottom") + }; + }, Axis.prototype.getXAxisLabelPosition = function getXAxisLabelPosition() { + return this.getLabelPosition("x", this.owner.config.axis_rotated ? "inner-top" : "inner-right"); + }, Axis.prototype.getYAxisLabelPosition = function getYAxisLabelPosition() { + return this.getLabelPosition("y", this.owner.config.axis_rotated ? "inner-right" : "inner-top"); + }, Axis.prototype.getY2AxisLabelPosition = function getY2AxisLabelPosition() { + return this.getLabelPosition("y2", this.owner.config.axis_rotated ? "inner-right" : "inner-top"); + }, Axis.prototype.getLabelPositionById = function getLabelPositionById(id) { + var label = void 0; + + return label = id === "y2" ? this.getY2AxisLabelPosition() : id === "y" ? this.getYAxisLabelPosition() : this.getXAxisLabelPosition(), label; + }, Axis.prototype.textForXAxisLabel = function textForXAxisLabel() { + return this.getLabelText("x"); + }, Axis.prototype.textForYAxisLabel = function textForYAxisLabel() { + return this.getLabelText("y"); + }, Axis.prototype.textForY2AxisLabel = function textForY2AxisLabel() { + return this.getLabelText("y2"); + }, Axis.prototype.xForAxisLabel = function xForAxisLabel(forHorizontal, position) { + var $$ = this.owner, + x = void 0; + + return x = forHorizontal ? position.isLeft ? 0 : position.isCenter ? $$.width / 2 : $$.width : position.isBottom ? -$$.height : position.isMiddle ? -$$.height / 2 : 0, x; + }, Axis.prototype.dxForAxisLabel = function dxForAxisLabel(forHorizontal, position) { + var dx = void 0; + + return dx = forHorizontal ? position.isLeft ? "0.5em" : position.isRight ? "-0.5em" : "0" : position.isTop ? "-0.5em" : position.isBottom ? "0.5em" : "0", dx; + }, Axis.prototype.textAnchorForAxisLabel = function textAnchorForAxisLabel(forHorizontal, position) { + var anchor = void 0; + + return anchor = forHorizontal ? position.isLeft ? "start" : position.isCenter ? "middle" : "end" : position.isBottom ? "start" : position.isMiddle ? "middle" : "end", anchor; + }, Axis.prototype.xForXAxisLabel = function xForXAxisLabel() { + return this.xForAxisLabel(!this.owner.config.axis_rotated, this.getXAxisLabelPosition()); + }, Axis.prototype.xForYAxisLabel = function xForYAxisLabel() { + return this.xForAxisLabel(this.owner.config.axis_rotated, this.getYAxisLabelPosition()); + }, Axis.prototype.xForY2AxisLabel = function xForY2AxisLabel() { + return this.xForAxisLabel(this.owner.config.axis_rotated, this.getY2AxisLabelPosition()); + }, Axis.prototype.dxForXAxisLabel = function dxForXAxisLabel() { + return this.dxForAxisLabel(!this.owner.config.axis_rotated, this.getXAxisLabelPosition()); + }, Axis.prototype.dxForYAxisLabel = function dxForYAxisLabel() { + return this.dxForAxisLabel(this.owner.config.axis_rotated, this.getYAxisLabelPosition()); + }, Axis.prototype.dxForY2AxisLabel = function dxForY2AxisLabel() { + return this.dxForAxisLabel(this.owner.config.axis_rotated, this.getY2AxisLabelPosition()); + }, Axis.prototype.dyForXAxisLabel = function dyForXAxisLabel() { + var $$ = this.owner, + config = $$.config, + position = this.getXAxisLabelPosition(); + return config.axis_rotated ? position.isInner ? "1.2em" : -25 - this.getMaxTickWidth("x") : position.isInner ? "-0.5em" : config.axis_x_height ? config.axis_x_height - 10 : "3em"; + }, Axis.prototype.dyForYAxisLabel = function dyForYAxisLabel() { + var $$ = this.owner, + position = this.getYAxisLabelPosition(); + return $$.config.axis_rotated ? position.isInner ? "-0.5em" : "3em" : position.isInner ? "1.2em" : -10 - ($$.config.axis_y_inner ? 0 : this.getMaxTickWidth("y") + 10); + }, Axis.prototype.dyForY2AxisLabel = function dyForY2AxisLabel() { + var $$ = this.owner, + position = this.getY2AxisLabelPosition(); + return $$.config.axis_rotated ? position.isInner ? "1.2em" : "-2.2em" : position.isInner ? "-0.5em" : 15 + ($$.config.axis_y2_inner ? 0 : this.getMaxTickWidth("y2") + 15); + }, Axis.prototype.textAnchorForXAxisLabel = function textAnchorForXAxisLabel() { + var $$ = this.owner; + + return this.textAnchorForAxisLabel(!$$.config.axis_rotated, this.getXAxisLabelPosition()); + }, Axis.prototype.textAnchorForYAxisLabel = function textAnchorForYAxisLabel() { + var $$ = this.owner; + + return this.textAnchorForAxisLabel($$.config.axis_rotated, this.getYAxisLabelPosition()); + }, Axis.prototype.textAnchorForY2AxisLabel = function textAnchorForY2AxisLabel() { + var $$ = this.owner; + + return this.textAnchorForAxisLabel($$.config.axis_rotated, this.getY2AxisLabelPosition()); + }, Axis.prototype.getMaxTickWidth = function getMaxTickWidth(id, withoutRecompute) { + var $$ = this.owner, + config = $$.config, + maxWidth = 0, + dummy = void 0, + svg = void 0; + + + if (withoutRecompute && $$.currentMaxTickWidths[id]) return $$.currentMaxTickWidths[id]; + + if ($$.svg) { + var targetsToShow = $$.filterTargetsToShow($$.data.targets), + scale = void 0, + axis = void 0; + id === "y" ? (scale = $$.y.copy().domain($$.getYDomain(targetsToShow, "y")), axis = this.getYAxis(scale, $$.yOrient, config.axis_y_tick_format, $$.yAxisTickValues, !1, !0, !0)) : id === "y2" ? (scale = $$.y2.copy().domain($$.getYDomain(targetsToShow, "y2")), axis = this.getYAxis(scale, $$.y2Orient, config.axis_y2_tick_format, $$.y2AxisTickValues, !1, !0, !0)) : (scale = $$.x.copy().domain($$.getXDomain(targetsToShow)), axis = this.getXAxis(scale, $$.xOrient, $$.xAxisTickFormat, $$.xAxisTickValues, !1, !0, !0), this.updateXAxisTickValues(targetsToShow, axis)), dummy = (0, _d.select)("body").append("div").classed("bb", !0), svg = dummy.append("svg").style("visibility", "hidden").style("position", "fixed").style("top", "0px").style("left", "0px"), svg.append("g").call(axis).each(function () { + (0, _d.select)(this).selectAll("text").each(function () { + var box = this.getBoundingClientRect(); + + maxWidth < box.width && (maxWidth = box.width); + }), dummy.remove(); + }); + } + + return $$.currentMaxTickWidths[id] = maxWidth <= 0 ? $$.currentMaxTickWidths[id] : maxWidth, $$.currentMaxTickWidths[id]; + }, Axis.prototype.updateLabels = function updateLabels(withTransition) { + var $$ = this.owner, + axisXLabel = $$.main.select("." + _classes2.default.axisX + " ." + _classes2.default.axisXLabel), + axisYLabel = $$.main.select("." + _classes2.default.axisY + " ." + _classes2.default.axisYLabel), + axisY2Label = $$.main.select("." + _classes2.default.axisY2 + " ." + _classes2.default.axisY2Label); + (withTransition ? axisXLabel.transition() : axisXLabel).attr("x", this.xForXAxisLabel.bind(this)).attr("dx", this.dxForXAxisLabel.bind(this)).attr("dy", this.dyForXAxisLabel.bind(this)).text(this.textForXAxisLabel.bind(this)), (withTransition ? axisYLabel.transition() : axisYLabel).attr("x", this.xForYAxisLabel.bind(this)).attr("dx", this.dxForYAxisLabel.bind(this)).attr("dy", this.dyForYAxisLabel.bind(this)).text(this.textForYAxisLabel.bind(this)), (withTransition ? axisY2Label.transition() : axisY2Label).attr("x", this.xForY2AxisLabel.bind(this)).attr("dx", this.dxForY2AxisLabel.bind(this)).attr("dy", this.dyForY2AxisLabel.bind(this)).text(this.textForY2AxisLabel.bind(this)); + }, Axis.prototype.getPadding = function getPadding(padding, key, defaultValue, domainLength) { + var p = typeof padding === "number" ? padding : padding[key]; + + // assume padding is pixels if unit is not specified + return (0, _util.isValue)(p) ? padding.unit === "ratio" ? padding[key] * domainLength : this.convertPixelsToAxisPadding(p, domainLength) : defaultValue; + }, Axis.prototype.convertPixelsToAxisPadding = function convertPixelsToAxisPadding(pixels, domainLength) { + var $$ = this.owner, + length = $$.config.axis_rotated ? $$.width : $$.height; + + + return domainLength * (pixels / length); + }, Axis.prototype.generateTickValues = function generateTickValues(values, tickCount, forTimeSeries) { + var tickValues = values, + start = void 0, + end = void 0, + count = void 0, + interval = void 0, + i = void 0, + tickValue = void 0; + + + if (tickCount) { + var targetCount = (0, _util.isFunction)(tickCount) ? tickCount() : tickCount; + + // compute ticks according to tickCount + if (targetCount === 1) tickValues = [values[0]];else if (targetCount === 2) tickValues = [values[0], values[values.length - 1]];else if (targetCount > 2) { + + for (count = targetCount - 2, start = values[0], end = values[values.length - 1], interval = (end - start) / (count + 1), tickValues = [start], i = 0; i < count; i++) tickValue = +start + interval * (i + 1), tickValues.push(forTimeSeries ? new Date(tickValue) : tickValue); + tickValues.push(end); + } + } + + return forTimeSeries || (tickValues = tickValues.sort(function (a, b) { + return a - b; + })), tickValues; + }, Axis.prototype.generateTransitions = function generateTransitions(duration) { + var $$ = this.owner, + axes = $$.axes; + + + return { + axisX: duration ? axes.x.transition().duration(duration) : axes.x, + axisY: duration ? axes.y.transition().duration(duration) : axes.y, + axisY2: duration ? axes.y2.transition().duration(duration) : axes.y2, + axisSubX: duration ? axes.subx.transition().duration(duration) : axes.subx + }; + }, Axis.prototype.redraw = function redraw(transitions, isHidden) { + var $$ = this.owner; + + $$.axes.x.style("opacity", isHidden ? "0" : "1"), $$.axes.y.style("opacity", isHidden ? "0" : "1"), $$.axes.y2.style("opacity", isHidden ? "0" : "1"), $$.axes.subx.style("opacity", isHidden ? "0" : "1"), transitions.axisX.call($$.xAxis), transitions.axisY.call($$.yAxis), transitions.axisY2.call($$.y2Axis), transitions.axisSubX.call($$.subXAxis); + }, Axis; +}(); + +exports.default = Axis; +module.exports = exports["default"]; + +/***/ }), +/* 8 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +exports.__esModule = !0; + +var _typeof2 = __webpack_require__(5), + _typeof3 = _interopRequireDefault(_typeof2); + +exports.default = function () { + + function axisX(selection, x) { + selection.attr("transform", function (d) { + return "translate(" + Math.ceil(x(d) + tickOffset) + ", 0)"; + }); + } + + function axisY(selection, y) { + selection.attr("transform", function (d) { + return "translate(0," + Math.ceil(y(d)) + ")"; + }); + } + + function scaleExtent(domain) { + var start = domain[0], + stop = domain[domain.length - 1]; + + + return start < stop ? [start, stop] : [stop, start]; + } + + function generateTicks(scale) { + var ticks = []; + + if (scale.ticks) return scale.ticks.apply(scale, tickArguments ? Array.prototype.slice.call(tickArguments) : []).map(function (v) { + return ( + // round the tick value if is number + /(string|number)/.test(typeof v === "undefined" ? "undefined" : (0, _typeof3.default)(v)) && !isNaN(v) ? Math.round(v * 10) / 10 : v + ); + }); + + for (var domain = scale.domain(), i = Math.ceil(domain[0]); i < domain[1]; i++) ticks.push(i); + + return ticks.length > 0 && ticks[0] > 0 && ticks.unshift(ticks[0] - (ticks[1] - ticks[0])), ticks; + } + + function copyScale() { + var newScale = scale.copy(); + + if (params.isCategory || !newScale.domain().length) { + var domain = scale.domain(); + + newScale.domain([domain[0], domain[1] - 1]); + } + + return newScale; + } + + function textFormatted(v) { + var formatted = tickFormat ? tickFormat(v) : v; + + return typeof formatted === "undefined" ? "" : formatted; + } + + function getSizeFor1Char(tick) { + if (tickTextCharSize) return tickTextCharSize; + var size = { + h: 11.5, + w: 5.5 + }; + + return tick.select("text").text(textFormatted).each(function (d) { + var box = this.getBoundingClientRect(), + text = textFormatted(d), + h = box.height, + w = text ? box.width / text.length : undefined; + h && w && (size.h = h, size.w = w); + }).text(""), tickTextCharSize = size, size; + } + + function transitionise(selection) { + return params.withoutTransition ? selection : selection.transition(transition); + } + + function axis(g) { + g.each(function () { + + // this should be called only when category axis + function splitTickText(d, maxWidthValue) { + + function split(splitted, text) { + spaceIndex = undefined; + + for (var i = 1; i < text.length; i++) + + // if text width gets over tick width, split by space index or crrent index + if (text.charAt(i) === " " && (spaceIndex = i), subtext = text.substr(0, i + 1), textWidth = sizeFor1Char.w * subtext.length, maxWidth < textWidth) return split(splitted.concat(text.substr(0, spaceIndex || i)), text.slice(spaceIndex ? spaceIndex + 1 : i)); + + return splitted.concat(text); + } + + var tickText = textFormatted(d), + maxWidth = maxWidthValue, + subtext = void 0, + spaceIndex = void 0, + textWidth = void 0; + return Object.prototype.toString.call(tickText) === "[object Array]" ? tickText : ((!maxWidth || maxWidth <= 0) && (maxWidth = isVertical ? 95 : params.isCategory ? Math.ceil(scale1(ticks[1]) - scale1(ticks[0])) - 12 : 110), split([], tickText + "")); + } + + function tspanDy(d, i) { + var dy = sizeFor1Char.h; + + return i === 0 && (dy = orient === "left" || orient === "right" ? -((counts[d.index] - 1) * (sizeFor1Char.h / 2) - 3) : ".71em"), dy; + } + + var g = (0, _d.select)(this); + + axis.g = g; + + + var scale0 = this.__chart__ || scale, + scale1 = copyScale(); + this.__chart__ = scale1; + + + // count of tick data in array + var ticks = tickValues || generateTicks(scale1), + tick = g.selectAll(".tick").data(ticks, scale1), + tickEnter = tick.enter().insert("g", ".domain").attr("class", "tick").style("opacity", "1"), + tickExit = tick.exit().remove(); + + // update selection + + + // enter selection + + + // MEMO: No exit transition. The reason is this transition affects max tick width calculation because old tick will be included in the ticks. + tick = tickEnter.merge(tick); + + + var tickUpdate = transitionise(tick).style("opacity", "1"), + tickTransform = void 0, + tickX = void 0, + tickY = void 0, + range = scale.rangeExtent ? scale.rangeExtent() : scaleExtent(scale.range()), + path = g.selectAll(".domain").data([0]), + pathUpdate = path.enter().append("path").attr("class", "domain").merge(transitionise(path)); + + // update selection - data join + + + // enter + update selection + tickEnter.append("line"), tickEnter.append("text"); + + + var lineEnter = tickEnter.select("line"), + lineUpdate = tickUpdate.select("line"), + textEnter = tickEnter.select("text"), + textUpdate = tickUpdate.select("text"); + params.isCategory ? (tickOffset = Math.ceil((scale1(1) - scale1(0)) / 2), tickX = tickCentered ? 0 : tickOffset, tickY = tickCentered ? tickOffset : 0) : (tickX = 0, tickOffset = tickX); + + + var tspan = void 0, + sizeFor1Char = getSizeFor1Char(g.select(".tick")), + counts = [], + tickLength = Math.max(innerTickSize, 0) + tickPadding, + isVertical = orient === "left" || orient === "right", + text = tick.select("text");tspan = text.selectAll("tspan").data(function (d, i) { + var splitted = params.tickMultiline ? splitTickText(d, params.tickWidth) : [].concat(textFormatted(d)); + + return counts[i] = splitted.length, splitted.map(function (s) { + return { + index: i, + splitted: s + }; + }); + }), tspan.exit().remove(), tspan = tspan.enter().append("tspan").merge(tspan).text(function (d) { + return d.splitted; + }); + + + var rotate = params.tickTextRotate; + + if (orient === "bottom" ? (tickTransform = axisX, lineEnter.attr("y2", innerTickSize), textEnter.attr("y", tickLength), lineUpdate.attr("x1", tickX).attr("x2", tickX).attr("y2", function (d) { + var tickPosition = scale(d) + (tickCentered ? 0 : tickOffset); + + return range[0] < tickPosition && tickPosition < range[1] ? innerTickSize : 0; + }), textUpdate.attr("x", 0).attr("y", function (r) { + return r ? 11.5 - 2.5 * (r / 15) * (r > 0 ? 1 : -1) : tickLength; + }(rotate)).style("text-anchor", function (r) { + return r ? r > 0 ? "start" : "end" : "middle"; + }(rotate)).attr("transform", function (r) { + return r ? "rotate(" + r + ")" : ""; + }(rotate)), tspan.attr("x", 0).attr("dy", tspanDy).attr("dx", function (r) { + return r ? 8 * Math.sin(Math.PI * (r / 180)) : 0; + }(rotate)), pathUpdate.attr("d", "M" + range[0] + "," + outerTickSize + "V0H" + range[1] + "V" + outerTickSize)) : orient === "top" ? (tickTransform = axisX, lineEnter.attr("y2", -innerTickSize), textEnter.attr("y", -tickLength), lineUpdate.attr("x2", 0).attr("y2", -innerTickSize), textUpdate.attr("x", 0).attr("y", -tickLength), text.style("text-anchor", "middle"), tspan.attr("x", 0).attr("dy", "0em"), pathUpdate.attr("d", "M" + range[0] + "," + -outerTickSize + "V0H" + range[1] + "V" + -outerTickSize)) : orient === "left" ? (tickTransform = axisY, lineEnter.attr("x2", -innerTickSize), textEnter.attr("x", -tickLength), lineUpdate.attr("x2", -innerTickSize).attr("y1", tickY).attr("y2", tickY), textUpdate.attr("x", -tickLength).attr("y", tickOffset), text.style("text-anchor", "end"), tspan.attr("x", -tickLength).attr("dy", tspanDy), pathUpdate.attr("d", "M" + -outerTickSize + "," + range[0] + "H0V" + range[1] + "H" + -outerTickSize)) : orient === "right" ? (tickTransform = axisY, lineEnter.attr("x2", innerTickSize), textEnter.attr("x", tickLength), lineUpdate.attr("x2", innerTickSize).attr("y2", 0), textUpdate.attr("x", tickLength).attr("y", 0), text.style("text-anchor", "start"), tspan.attr("x", tickLength).attr("dy", tspanDy), pathUpdate.attr("d", "M" + outerTickSize + "," + range[0] + "H0V" + range[1] + "H" + outerTickSize)) : void 0, scale1.bandwidth) { + var x = scale1, + dx = x.bandwidth() / 2; + scale0 = function scale0(d) { + return x(d) + dx; + }, scale1 = scale0; + } else scale0.bandwidth ? scale0 = scale1 : tickExit.call(tickTransform, scale1); + + tickEnter.call(tickTransform, scale0), tickUpdate.call(tickTransform, scale1); + }); + } + + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, + scale = (0, _d.scaleLinear)(), + orient = "bottom", + innerTickSize = 6, + outerTickSize = params.withOuterTick ? 6 : 0, + tickPadding = 3, + tickValues = null, + tickFormat = void 0, + tickArguments = void 0, + tickOffset = 0, + tickCulling = !0, + tickCentered = void 0, + transition = void 0; + + + return axis.scale = function (x) { + return arguments.length ? (scale = x, axis) : scale; + }, axis.orient = function (x) { + return arguments.length ? (orient = x in { + top: 1, + right: 1, + bottom: 1, + left: 1 + } ? x + "" : "bottom", axis) : orient; + }, axis.tickFormat = function (format) { + return arguments.length ? (tickFormat = format, axis) : tickFormat; + }, axis.tickCentered = function (isCentered) { + return arguments.length ? (tickCentered = isCentered, axis) : tickCentered; + }, axis.tickOffset = function () { + return tickOffset; + }, axis.tickInterval = function () { + var interval = void 0; + + if (params.isCategory) interval = tickOffset * 2;else { + var length = axis.g.select("path.domain").node().getTotalLength() - outerTickSize * 2; + + interval = length / axis.g.selectAll("line").size(); + } + + return interval === Infinity ? 0 : interval; + }, axis.ticks = function () { + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) args[_key] = arguments[_key]; + + return args.length ? (tickArguments = Array.prototype.slice.call(args), axis) : tickArguments; + }, axis.tickCulling = function (culling) { + return arguments.length ? (tickCulling = culling, axis) : tickCulling; + }, axis.tickValues = function (x) { + if (typeof x === "function") tickValues = function tickValues() { + return x(scale.domain()); + };else { + if (!arguments.length) return tickValues; + + tickValues = x; + } + + return this; + }, axis.setTransition = function (t) { + return transition = t, this; + }, axis; +}; + +var _d = __webpack_require__(2); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +// Features: +// 1. category axis +// 2. ceil values of translate/x/y to int for half pixel antialiasing +// 3. multiline tick text +var tickTextCharSize = void 0; /** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +module.exports = exports["default"]; + +/***/ }), +/* 9 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _typeof2 = __webpack_require__(5), + _typeof3 = _interopRequireDefault(_typeof2), + _Chart = __webpack_require__(4), + _Chart2 = _interopRequireDefault(_Chart), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Set the min/max value + * @param $$ + * @param type + * @param value + * @return {undefined} + */ +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +var setMinMax = function ($$, type, value) { + var config = $$.config, + axisY = "axis_y_" + type, + axisY2 = "axis_y2_" + type; + + + return typeof value !== "undefined" && ((typeof value === "undefined" ? "undefined" : (0, _typeof3.default)(value)) === "object" ? ((0, _util.isValue)(value.x) && (config["axis_x_" + type] = value.x), (0, _util.isValue)(value.y) && (config[axisY] = value.y), (0, _util.isValue)(value.y2) && (config[axisY2] = value.y2)) : (config[axisY] = value, config[axisY2] = value), $$.redraw({ + withUpdateOrgXDomain: !0, + withUpdateXDomain: !0 + })), undefined; +}, + getMinMax = function ($$, type) { + var config = $$.config; + + + return { + x: config["axis_x_" + type], + y: config["axis_y_" + type], + y2: config["axis_y2_" + type] + }; +}, + axis = function () {}; + +/** + * Get the min/max value + * @param $$ + * @param type + * @return {{x, y, y2}} + */ + + +/** + * Define axis + */ + + +/** + * Get and set axis labels. + * @method axis:labels + * @instance + * @memberof Chart + * @param {Object} labels specified axis' label to be updated. + * @example + * // Update axis' label + * chart.axis.labels({ + * x: "New X Axis Label", + * y: "New Y Axis Label" + * }); + */ +axis.labels = function (labels) { + var $$ = this.internal; + + arguments.length && (Object.keys(labels).forEach(function (axisId) { + $$.axis.setLabelText(axisId, labels[axisId]); + }), $$.axis.updateLabels()); +}, axis.min = function (min) { + return arguments.length ? setMinMax(this.internal, "min", min) : getMinMax(this.internal, "min"); +}, axis.max = function (max) { + return arguments.length ? setMinMax(this.internal, "max", max) : getMinMax(this.internal, "max"); +}, axis.range = function (range) { + if (arguments.length) (0, _util.isDefined)(range.max) && this.axis.max(range.max), (0, _util.isDefined)(range.min) && this.axis.min(range.min);else return { + max: this.axis.max(), + min: this.axis.min() + }; + + return undefined; +}, (0, _util.extend)(_Chart2.default.prototype, { axis: axis }); + +/***/ }), +/* 10 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _Chart = __webpack_require__(4), + _Chart2 = _interopRequireDefault(_Chart), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +(0, _util.extend)(_Chart2.default.prototype, { + /** + * Set specified category name on category axis. + * @method category + * @instance + * @memberof Chart + * @param {Number} i index of category to be changed + * @param {String} category category value to be changed + * @example + * chart.category(2, "Category 3"); + */ + category: function category(i, _category) { + var $$ = this.internal, + config = $$.config; + + + return arguments.length > 1 && (config.axis_x_categories[i] = _category, $$.redraw()), config.axis_x_categories[i]; + }, + + + /** + * Set category names on category axis. + * @method categories + * @instance + * @memberof Chart + * @param {Array} categories This must be an array that includes category names in string. If category names are included in the date by data.x option, this is not required. + * @example + * chart.categories([ + * "Category 1", "Category 2", ... + * ]); + */ + categories: function categories(_categories) { + var $$ = this.internal, + config = $$.config; + return arguments.length ? (config.axis_x_categories = _categories, $$.redraw(), config.axis_x_categories) : config.axis_x_categories; + } +}); + +/***/ }), +/* 11 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _Chart = __webpack_require__(4), + _Chart2 = _interopRequireDefault(_Chart), + _browser = __webpack_require__(60), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +(0, _util.extend)(_Chart2.default.prototype, { + /** + * Resize the chart. + * @method resize + * @instance + * @memberof Chart + * @param {Object} size This argument should include width and height in pixels. + * @example + * // Resize to 640x480 + * chart.resize({ + * width: 640, + * height: 480 + * }); + */ + resize: function resize(size) { + var config = this.internal.config; + + config.size_width = size ? size.width : null, config.size_height = size ? size.height : null, this.flush(); + }, + + + /** + * Force to redraw. + * @method flush + * @instance + * @memberof Chart + * @example + * chart.flush(); + */ + flush: function flush() { + this.internal.updateAndRedraw({ + withLegend: !0, + withTransition: !1, + withTransitionForTransform: !1 + }); + }, + + + /** + * Reset the chart object and remove element and events completely. + * @method destroy + * @instance + * @memberof Chart + * @example + * chart.destroy(); + */ + destroy: function destroy() { + var $$ = this.internal; + + return _browser.window.clearInterval($$.intervalForObserveInserted), $$.resizeTimeout !== undefined && _browser.window.clearTimeout($$.resizeTimeout), (0, _util.removeEvent)(_browser.window, "resize", $$.resizeFunction), $$.selectChart.classed("bb", !1).html(""), Object.keys($$).forEach(function (key) { + $$[key] = null; + }), null; + } +}); /** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ + +/***/ }), +/* 12 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _Chart = __webpack_require__(4), + _Chart2 = _interopRequireDefault(_Chart), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +(0, _util.extend)(_Chart2.default.prototype, { + /** + * Get the color + * @method color + * @instance + * @memberof Chart + * @param {String} id id to get the color + * @example + * chart.color("data1"); + */ + color: function color(id) { + var $$ = this.internal; + + return $$.color(id); // more patterns + } +}); + +/***/ }), +/* 13 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _Chart = __webpack_require__(4), + _Chart2 = _interopRequireDefault(_Chart), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Get data loaded in the chart. + * @method data + * @instance + * @memberof Chart + * @param {String|Array} targetIds If this argument is given, this API returns the specified target data. If this argument is not given, all of data will be returned. + * @example + * // Get only data1 data + * chart.data("data1"); + * + * // Get data1 and data2 data + * chart.data(["data1", "data2"]); + * + * // Get all data + * chart.data(); + */ +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +var data = function (targetIds) { + var targets = this.internal.data.targets; + + return typeof targetIds === "undefined" ? targets : targets.filter(function (t) { + return [].concat(targetIds).indexOf(t.id) >= 0; + }); +}; + +/** + * Get data shown in the chart. + * @method data:shown + * @instance + * @memberof Chart + * @param {String|Array} targetIds If this argument is given, this API filters the data with specified target ids. If this argument is not given, all shown data will be returned. + * @example + * // Get shown data by filtering to include only data1 data + * chart.data.shown("data1"); + * + * // Get shown data by filtering to include data1 and data2 data + * chart.data.shown(["data1", "data2"]); + * + * // Get all shown data + * chart.data.shown(); + */ +data.shown = function (targetIds) { + return this.internal.filterTargetsToShow(this.data(targetIds)); +}, data.values = function (targetId) { + var values = null; + + if (targetId) { + var targets = this.data(targetId); + + targets && targets[0] && (values = targets[0].values.map(function (d) { + return d.value; + })); + } + + return values; +}, data.names = function (names) { + + return this.internal.clearLegendItemTextBoxCache(), this.internal.updateDataAttributes("names", names); +}, data.colors = function (colors) { + return this.internal.updateDataAttributes("colors", colors); +}, data.axes = function (axes) { + return this.internal.updateDataAttributes("axes", axes); +}, (0, _util.extend)(_Chart2.default.prototype, { data: data }); + +/***/ }), +/* 14 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _d = __webpack_require__(2), + _Chart = __webpack_require__(4), + _Chart2 = _interopRequireDefault(_Chart), + _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _util = __webpack_require__(0), + _classes = __webpack_require__(3), + _classes2 = _interopRequireDefault(_classes); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +(0, _util.extend)(_Chart2.default.prototype, { + /** + * Flow data to the chart.

+ * By this API, you can append new data points to the chart. + * @method flow + * @instance + * @memberof Chart + * @param {Object} args + * - If json, rows and columns given, the data will be loaded. If data that has the same target id is given, the chart will be appended. Otherwise, new target will be added. One of these is required when calling. If json specified, keys is required as well as data.json + * - If to is given, the lower x edge will move to that point. If not given, the lower x edge will move by the number of given data points. + * - If length is given, the lower x edge will move by the number of this argument. + * - If duration is given, the duration of the transition will be specified value. If not given, transition.duration will be used as default. + * - If done is given, the specified function will be called when flow ends. + * @example + * // 2 data points will be apprended to the tail and popped from the head. + * // After that, 4 data points will be appended and no data points will be poppoed. + * chart.flow({ + * columns: [ + * ["x", "2013-01-11", "2013-01-21"], + * ["data1", 500, 200], + * ["data2", 100, 300], + * ["data3", 200, 120] + * ], + * done: function () { + * chart.flow({ + * columns: [ + * ["x", "2013-02-11", "2013-02-12", "2013-02-13", "2013-02-14"], + * ["data1", 200, 300, 100, 250], + * ["data2", 100, 90, 40, 120], + * ["data3", 100, 100, 300, 500] + * ], + * length: 0 + * }); + * } + * }); + */ + flow: function flow(args) { + var $$ = this.internal, + notfoundIds = [], + orgDataCount = $$.getMaxDataCount(), + data = void 0, + domain = void 0, + length = 0, + tail = 0, + diff = void 0, + to = void 0; + + + if (args.json) data = $$.convertJsonToData(args.json, args.keys);else if (args.rows) data = $$.convertRowsToData(args.rows);else if (args.columns) data = $$.convertColumnsToData(args.columns);else return; + + var targets = $$.convertDataToTargets(data, !0); + + // Update/Add data + $$.data.targets.forEach(function (t) { + var found = !1, + i = void 0, + j = void 0; + + + for (i = 0; i < targets.length; i++) if (t.id === targets[i].id) { + + for (found = !0, t.values[t.values.length - 1] && (tail = t.values[t.values.length - 1].index + 1), length = targets[i].values.length, j = 0; j < length; j++) targets[i].values[j].index = tail + j, $$.isTimeSeries() || (targets[i].values[j].x = tail + j); + t.values = t.values.concat(targets[i].values), targets.splice(i, 1); + + break; + } + + found || notfoundIds.push(t.id); + }), $$.data.targets.forEach(function (t) { + var i = void 0, + j = void 0; + + + for (i = 0; i < notfoundIds.length; i++) if (t.id === notfoundIds[i]) for (tail = t.values[t.values.length - 1].index + 1, j = 0; j < length; j++) t.values.push({ + id: t.id, + index: tail + j, + x: $$.isTimeSeries() ? $$.getOtherTargetX(tail + j) : tail + j, + value: null + }); + }), $$.data.targets.length && targets.forEach(function (t) { + var i = void 0, + missing = []; + + + for (i = $$.data.targets[0].values[0].index; i < tail; i++) missing.push({ + id: t.id, + index: i, + x: $$.isTimeSeries() ? $$.getOtherTargetX(i) : i, + value: null + }); + + t.values.forEach(function (v) { + v.index += tail, $$.isTimeSeries() || (v.x += tail); + }), t.values = missing.concat(t.values); + }), $$.data.targets = $$.data.targets.concat(targets); + // add remained + + // check data count because behavior needs to change when it"s only one + // const dataCount = $$.getMaxDataCount(); + var baseTarget = $$.data.targets[0], + baseValue = baseTarget.values[0]; + + + // Update length to flow if needed + (0, _util.isDefined)(args.to) ? (length = 0, to = $$.isTimeSeries() ? $$.parseDate(args.to) : args.to, baseTarget.values.forEach(function (v) { + v.x < to && length++; + })) : (0, _util.isDefined)(args.length) && (length = args.length), orgDataCount ? orgDataCount === 1 && $$.isTimeSeries() && (diff = (baseTarget.values[baseTarget.values.length - 1].x - baseValue.x) / 2, domain = [new Date(+baseValue.x - diff), new Date(+baseValue.x + diff)], $$.updateXDomain(null, !0, !0, !1, domain)) : (diff = $$.isTimeSeries() ? baseTarget.values.length > 1 ? baseTarget.values[baseTarget.values.length - 1].x - baseValue.x : baseValue.x - $$.getXDomain($$.data.targets)[0] : 1, domain = [baseValue.x - diff, baseValue.x], $$.updateXDomain(null, !0, !0, !1, domain)), $$.updateTargets($$.data.targets), $$.redraw({ + flow: { + index: baseValue.index, + length: length, + duration: (0, _util.isValue)(args.duration) ? args.duration : $$.config.transition_duration, + done: args.done, + orgDataCount: orgDataCount + }, + withLegend: !0, + withTransition: orgDataCount > 1, + withTrimXDomain: !1, + withUpdateXAxis: !0 + }); + } +}), (0, _util.extend)(_ChartInternal2.default.prototype, { + /** + * Generate flow + * @memberof ChartInternal + * @private + * @param {Object} args + * @return {Function} + */ + generateFlow: function generateFlow(args) { + var $$ = this, + config = $$.config; + + + return function () { + var targets = args.targets, + flow = args.flow, + drawBar = args.drawBar, + drawLine = args.drawLine, + drawArea = args.drawArea, + cx = args.cx, + cy = args.cy, + xv = args.xv, + xForText = args.xForText, + yForText = args.yForText, + duration = args.duration, + translateX = void 0, + scaleX = 1, + flowIndex = flow.index, + flowLength = flow.length, + flowStart = $$.getValueOnIndex($$.data.targets[0].values, flowIndex), + flowEnd = $$.getValueOnIndex($$.data.targets[0].values, flowIndex + flowLength), + orgDomain = $$.x.domain(), + durationForFlow = flow.duration || duration, + done = flow.done || function () {}, + wait = $$.generateWait(), + xgrid = $$.xgrid || (0, _d.selectAll)([]), + xgridLines = $$.xgridLines || (0, _d.selectAll)([]), + mainRegion = $$.mainRegion || (0, _d.selectAll)([]), + mainText = $$.mainText || (0, _d.selectAll)([]), + mainBar = $$.mainBar || (0, _d.selectAll)([]), + mainLine = $$.mainLine || (0, _d.selectAll)([]), + mainArea = $$.mainArea || (0, _d.selectAll)([]), + mainCircle = $$.mainCircle || (0, _d.selectAll)([]); + + + // set flag + $$.flowing = !0, $$.data.targets.forEach(function (d) { + d.values.splice(0, flowLength); + }); + + + // update x domain to generate axis elements for flow + var domain = $$.updateXDomain(targets, !0, !0); + + // update elements related to x scale + $$.updateXGrid && $$.updateXGrid(!0), flow.orgDataCount ? flow.orgDataCount === 1 || (flowStart && flowStart.x) === (flowEnd && flowEnd.x) ? translateX = $$.x(orgDomain[0]) - $$.x(domain[0]) : $$.isTimeSeries() ? translateX = $$.x(orgDomain[0]) - $$.x(domain[0]) : translateX = $$.x(flowStart.x) - $$.x(flowEnd.x) : $$.data.targets[0].values.length === 1 ? $$.isTimeSeries() ? (flowStart = $$.getValueOnIndex($$.data.targets[0].values, 0), flowEnd = $$.getValueOnIndex($$.data.targets[0].values, $$.data.targets[0].values.length - 1), translateX = $$.x(flowStart.x) - $$.x(flowEnd.x)) : translateX = (0, _util.diffDomain)(domain) / 2 : translateX = $$.x(orgDomain[0]) - $$.x(domain[0]), scaleX = (0, _util.diffDomain)(orgDomain) / (0, _util.diffDomain)(domain); + + var transform = "translate(" + translateX + ",0) scale(" + scaleX + ",1)"; + + $$.hideXGridFocus(); + + + var gt = (0, _d.transition)().ease(_d.easeLinear).duration(durationForFlow); + + wait.add([$$.axes.x.transition(gt).call($$.xAxis.setTransition(gt)), mainBar.transition(gt).attr("transform", transform), mainLine.transition(gt).attr("transform", transform), mainArea.transition(gt).attr("transform", transform), mainCircle.transition(gt).attr("transform", transform), mainText.transition(gt).attr("transform", transform), mainRegion.filter($$.isRegionOnX).transition(gt).attr("transform", transform), xgrid.transition(gt).attr("transform", transform), xgridLines.transition(gt).attr("transform", transform)]), gt.call(wait, function () { + var i = void 0, + shapes = [], + texts = [], + eventRects = []; + + + // remove flowed elements + if (flowLength) { + for (i = 0; i < flowLength; i++) shapes.push("." + _classes2.default.shape + "-" + (flowIndex + i)), texts.push("." + _classes2.default.text + "-" + (flowIndex + i)), eventRects.push("." + _classes2.default.eventRect + "-" + (flowIndex + i)); + + $$.svg.selectAll("." + _classes2.default.shapes).selectAll(shapes).remove(), $$.svg.selectAll("." + _classes2.default.texts).selectAll(texts).remove(), $$.svg.selectAll("." + _classes2.default.eventRects).selectAll(eventRects).remove(), $$.svg.select("." + _classes2.default.xgrid).remove(); + } + + // draw again for removing flowed elements and reverting attr + xgrid.size() && xgrid.attr("transform", null).attr($$.xgridAttr), xgridLines.attr("transform", null), xgridLines.select("line").attr("x1", config.axis_rotated ? 0 : xv).attr("x2", config.axis_rotated ? $$.width : xv), xgridLines.select("text").attr("x", config.axis_rotated ? $$.width : 0).attr("y", xv), mainBar.attr("transform", null).attr("d", drawBar), mainLine.attr("transform", null).attr("d", drawLine), mainArea.attr("transform", null).attr("d", drawArea), mainCircle.attr("transform", null).attr("cx", cx).attr("cy", cy), mainText.attr("transform", null).attr("x", xForText).attr("y", yForText).style("fill-opacity", $$.opacityForText.bind($$)), mainRegion.attr("transform", null), mainRegion.select("rect").filter($$.isRegionOnX).attr("x", $$.regionX.bind($$)).attr("width", $$.regionWidth.bind($$)), config.interaction_enabled && $$.redrawEventRect(), done(), $$.flowing = !1; + }); + }; + } +}); /** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ + +/***/ }), +/* 15 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _d = __webpack_require__(2), + _Chart = __webpack_require__(4), + _Chart2 = _interopRequireDefault(_Chart), + _classes = __webpack_require__(3), + _classes2 = _interopRequireDefault(_classes), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +(0, _util.extend)(_Chart2.default.prototype, { + /** + * This API highlights specified targets and fade out the others.

+ * You can specify multiple targets by giving an array that includes id as String. If no argument is given, all of targets will be highlighted. + * @method focus + * @instance + * @memberof Chart + * @param {String|Array} targetIdsValue Target ids to be highlighted. + * @example + * // data1 will be highlighted and the others will be faded out + * chart.focus("data1"); + * + * // data1 and data2 will be highlighted and the others will be faded out + * chart.focus(["data1", "data2"]); + * + * // all targets will be highlighted + * chart.focus(); + */ + focus: function focus(targetIdsValue) { + var $$ = this.internal, + targetIds = $$.mapToTargetIds(targetIdsValue), + candidates = $$.svg.selectAll($$.selectorTargets(targetIds.filter($$.isTargetToShow, $$))); + this.revert(), this.defocus(), candidates.classed(_classes2.default.focused, !0).classed(_classes2.default.defocused, !1), $$.hasArcType() && $$.expandArc(targetIds), $$.toggleFocusLegend(targetIds, !0), $$.focusedTargetIds = targetIds, $$.defocusedTargetIds = $$.defocusedTargetIds.filter(function (id) { + return targetIds.indexOf(id) < 0; + }); + }, + + + /** + * This API fades out specified targets and reverts the others.

+ * You can specify multiple targets by giving an array that includes id as String. If no argument is given, all of targets will be faded out. + * @method defocus + * @instance + * @memberof Chart + * @param {String|Array} Target ids to be faded out. + * @example + * // data1 will be faded out and the others will be reverted. + * chart.defocus("data1"); + * + * // data1 and data2 will be faded out and the others will be reverted. + * chart.defocus(["data1", "data2"]); + * + * // all targets will be faded out. + * chart.defocus(); + */ + defocus: function defocus(targetIdsValue) { + var $$ = this.internal, + targetIds = $$.mapToTargetIds(targetIdsValue), + candidates = $$.svg.selectAll($$.selectorTargets(targetIds.filter($$.isTargetToShow, $$))); + candidates.classed(_classes2.default.focused, !1).classed(_classes2.default.defocused, !0), $$.hasArcType() && $$.unexpandArc(targetIds), $$.toggleFocusLegend(targetIds, !1), $$.focusedTargetIds = $$.focusedTargetIds.filter(function (id) { + return targetIds.indexOf(id) < 0; + }), $$.defocusedTargetIds = targetIds; + }, + + + /** + * This API reverts specified targets.

+ * You can specify multiple targets by giving an array that includes id as String. If no argument is given, all of targets will be reverted. + * @method revert + * @instance + * @memberof Chart + * @param {String|Array} Target ids to be reverted + * @example + * // data1 will be reverted. + * chart.revert("data1"); + * + * // data1 and data2 will be reverted. + * chart.revert(["data1", "data2"]); + * + * // all targets will be reverted. + * chart.revert(); + */ + revert: function revert(targetIdsValue) { + var $$ = this.internal, + targetIds = $$.mapToTargetIds(targetIdsValue), + candidates = $$.svg.selectAll($$.selectorTargets(targetIds)); + // should be for all targets + + candidates.classed(_classes2.default.focused, !1).classed(_classes2.default.defocused, !1), $$.hasArcType() && $$.unexpandArc(targetIds), $$.config.legend_show && ($$.showLegend(targetIds.filter($$.isLegendToShow.bind($$))), $$.legend.selectAll($$.selectorLegends(targetIds)).filter(function () { + return (0, _d.select)(this).classed(_classes2.default.legendItemFocused); + }).classed(_classes2.default.legendItemFocused, !1)), $$.focusedTargetIds = [], $$.defocusedTargetIds = []; + } +}); + +/***/ }), +/* 16 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _Chart = __webpack_require__(4), + _Chart2 = _interopRequireDefault(_Chart), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Update x grid lines. + * @method xgrids + * @instance + * @memberof Chart + * @param {Array} grids X grid lines will be replaced with this argument. The format of this argument is the same as grid.x.lines. + * @example + * // Show 2 x grid lines + * chart.xgrids([ + * {value: 1, text: "Label 1"}, + * {value: 4, text: "Label 4"} + * ]); + */ +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +var xgrids = function (grids) { + var $$ = this.internal, + config = $$.config; + return grids ? (config.grid_x_lines = grids, $$.redrawWithoutRescale(), config.grid_x_lines) : config.grid_x_lines; +}; + +/** + * Add x grid lines.
+ * This API adds new x grid lines instead of replacing like xgrids. + * @method xgrids:add + * @instance + * @memberof Chart + * @param {Array|Object} grids New x grid lines will be added. The format of this argument is the same as grid.x.lines and it's possible to give an Object if only one line will be added. + * @example + * // Add a new x grid line + * chart.xgrids.add( + * {value: 4, text: "Label 4"} + * ); + * + * // Add new x grid lines + * chart.xgrids.add([ + * {value: 2, text: "Label 2"}, + * {value: 4, text: "Label 4"} + * ]); + */ +xgrids.add = function (grids) { + return this.xgrids(this.internal.config.grid_x_lines.concat(grids || [])); +}, xgrids.remove = function (params) { + this.internal.removeGridLines(params, !0); +}; + + +/** + * Update y grid lines. + * @method ygrids + * @instance + * @memberof Chart + * @param {Array} grids Y grid lines will be replaced with this argument. The format of this argument is the same as grid.y.lines. + * @example + * // Show 2 y grid lines + * chart.ygrids([ + * {value: 100, text: "Label 1"}, + * {value: 400, text: "Label 4"} + * ]); + */ +var ygrids = function (grids) { + var $$ = this.internal, + config = $$.config; + return grids ? (config.grid_y_lines = grids, $$.redrawWithoutRescale(), config.grid_y_lines) : config.grid_y_lines; +}; + +/** + * Add y grid lines.
+ * This API adds new y grid lines instead of replacing like ygrids. + * @method ygrids:add + * @instance + * @memberof Chart + * @param {Array|Object} grids New y grid lines will be added. The format of this argument is the same as grid.y.lines and it's possible to give an Object if only one line will be added. + * @example + * // Add a new x grid line + * chart.ygrids.add( + * {value: 400, text: "Label 4"} + * ); + * + * // Add new x grid lines + * chart.ygrids.add([ + * {value: 200, text: "Label 2"}, + * {value: 400, text: "Label 4"} + * ]); + */ +ygrids.add = function (grids) { + return this.ygrids(this.internal.config.grid_y_lines.concat(grids || [])); +}, ygrids.remove = function (params) { + this.internal.removeGridLines(params, !1); +}, (0, _util.extend)(_Chart2.default.prototype, { + xgrids: xgrids, + ygrids: ygrids +}); + +/***/ }), +/* 17 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _Chart = __webpack_require__(4), + _Chart2 = _interopRequireDefault(_Chart), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +(0, _util.extend)(_Chart2.default.prototype, { + /** + * Update groups for the targets. + * @method groups + * @instance + * @memberof Chart + * @param {Array} groups This argument needs to be an Array that includes one or more Array that includes target ids to be grouped. + * @example + * // data1 and data2 will be a new group. + * chart.groups([ + * ["data1", "data2"] + * ]); + */ + groups: function groups(_groups) { + var $$ = this.internal, + config = $$.config; + return (0, _util.isUndefined)(_groups) ? config.data_groups : (config.data_groups = _groups, $$.redraw(), config.data_groups); + } +}); + +/***/ }), +/* 18 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _Chart = __webpack_require__(4), + _Chart2 = _interopRequireDefault(_Chart), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Define legend + */ +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +var legend = function () {}; + +/** + * Show legend for each target. + * @method legend:show + * @instance + * @memberof Chart + * @param {String|Array} targetIds + * - If targetIds is given, specified target's legend will be shown. + * - If only one target is the candidate, String can be passed. + * - If no argument is given, all of target's legend will be shown. + * @example + * // Show legend for data1. + * chart.legend.show("data1"); + * + * // Show legend for data1 and data2. + * chart.legend.show(["data1", "data2"]); + * + * // Show all legend. + * chart.legend.show(); + */ +legend.show = function (targetIds) { + var $$ = this.internal; + + $$.showLegend($$.mapToTargetIds(targetIds)), $$.updateAndRedraw({ withLegend: !0 }); +}, legend.hide = function (targetIds) { + var $$ = this.internal; + + $$.hideLegend($$.mapToTargetIds(targetIds)), $$.updateAndRedraw({ withLegend: !0 }); +}, (0, _util.extend)(_Chart2.default.prototype, { legend: legend }); + +/***/ }), +/* 19 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _Chart = __webpack_require__(4), + _Chart2 = _interopRequireDefault(_Chart), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +(0, _util.extend)(_Chart2.default.prototype, { + /** + * Load data to the chart.

+ * You can specify multiple targets by giving an array that includes id as String. If no argument is given, all of targets will be toggles. + * - Note: + * unload should be used if some data needs to be unloaded simultaneously. If you call unload API soon after/before load instead of unload param, chart will not be rendered properly because of cancel of animation.
+ * done will be called after data loaded, but it's not after rendering. It's because rendering will finish after some transition and there is some time lag between loading and rendering + * @method load + * @instance + * @memberof Chart + * @param {Object} args + * - If url, json, rows and columns given, the data will be loaded. If data that has the same target id is given, the chart will be updated. Otherwise, new target will be added. + * - If classes given, the classes specifed by data.classes will be updated. classes must be Object that has target id as keys. + * - If categories given, the categories specifed by axis.x.categories or data.x will be updated. categories must be Array. + * - If axes given, the axes specifed by data.axes will be updated. axes must be Object that has target id as keys. + * - If colors given, the colors specifed by data.colors will be updated. colors must be Object that has target id as keys. + * - If type or types given, the type of targets will be updated. type must be String and types must be Object. + * - If unload given, data will be unloaded before loading new data. If true given, all of data will be unloaded. If target ids given as String or Array, specified targets will be unloaded. + * - If done given, the specified function will be called after data loded. + * @example + * // Load data1 and unload data2 and data3 + * chart.load({ + * columns: [ + * ["data1", 100, 200, 150, ...], + * ... + * ], + * unload: ["data2", "data3"] + * }); + */ + load: function load(args) { + var $$ = this.internal, + config = $$.config; + + // update xs if specified + + + // use cache if exists + return args.xs && $$.addXs(args.xs), "names" in args && this.data.names(args.names), "classes" in args && Object.keys(args.classes).forEach(function (id) { + config.data_classes[id] = args.classes[id]; + }), "categories" in args && $$.isCategorized() && (config.axis_x_categories = args.categories), "axes" in args && Object.keys(args.axes).forEach(function (id) { + config.data_axes[id] = args.axes[id]; + }), "colors" in args && Object.keys(args.colors).forEach(function (id) { + config.data_colors[id] = args.colors[id]; + }), "cacheIds" in args && $$.hasCaches(args.cacheIds) ? void $$.load($$.getCaches(args.cacheIds), args.done) : void ("unload" in args ? $$.unload($$.mapToTargetIds(typeof args.unload === "boolean" && args.unload ? null : args.unload), function () { + return $$.loadFromArgs(args); + }) : $$.loadFromArgs(args)); + + // unload if needed + }, + + + /** + * Unload data to the chart.

+ * You can specify multiple targets by giving an array that includes id as String. If no argument is given, all of targets will be toggles. + * - Note: + * If you call load API soon after/before unload, unload param of load should be used. Otherwise chart will not be rendered properly because of cancel of animation.
+ * `done` will be called after data loaded, but it's not after rendering. It's because rendering will finish after some transition and there is some time lag between loading and rendering. + * @method unload + * @instance + * @memberof Chart + * @param {Object} args + * - If ids given, the data that has specified target id will be unloaded. ids should be String or Array. If ids is not specified, all data will be unloaded. + * - If done given, the specified function will be called after data loded. + * @example + * // Unload data2 and data3 + * chart.unload({ + * ids: ["data2", "data3"] + * }); + */ + unload: function unload(argsValue) { + var $$ = this.internal, + args = argsValue || {}; + args instanceof Array ? args = { ids: args } : typeof args === "string" && (args = { ids: [args] }), $$.unload($$.mapToTargetIds(args.ids), function () { + $$.redraw({ + withUpdateOrgXDomain: !0, + withUpdateXDomain: !0, + withLegend: !0 + }), args.done && args.done(); + }); + } +}); + +/***/ }), +/* 20 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _Chart = __webpack_require__(4), + _Chart2 = _interopRequireDefault(_Chart), + _classes = __webpack_require__(3), + _classes2 = _interopRequireDefault(_classes), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Update regions. + * @method regions + * @instance + * @memberof Chart + * @param {Array} regions Regions will be replaced with this argument. The format of this argument is the same as regions. + * @return {Array} regions + * @example + * // Show 2 regions + * chart.regions([ + * {axis: "x", start: 5, class: "regionX"}, + * {axis: "y", end: 50, class: "regionY"} + * ]); + */ +var regions = function (_regions) { + var $$ = this.internal, + config = $$.config; + return _regions ? (config.regions = _regions, $$.redrawWithoutRescale(), config.regions) : config.regions; +}; + +/** + * Add new region.

+ * This API adds new region instead of replacing like regions. + * @method regions:add + * @instance + * @memberof Chart + * @param {Array|Object} regions New region will be added. The format of this argument is the same as regions and it's possible to give an Object if only one region will be added. + * @return {Array} regions + * @example + * // Add a new region + * chart.regions.add( + * {axis: "x", start: 5, class: "regionX"} + * ); + * + * // Add new regions + * chart.regions.add([ + * {axis: "x", start: 5, class: "regionX"}, + * {axis: "y", end: 50, class: "regionY"} + *]); + */ +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +regions.add = function (regions) { + var $$ = this.internal, + config = $$.config; + return regions ? (config.regions = config.regions.concat(regions), $$.redrawWithoutRescale(), config.regions) : config.regions; +}, regions.remove = function (optionsValue) { + var $$ = this.internal, + config = $$.config, + options = optionsValue || {}, + duration = $$.getOption(options, "duration", config.transition_duration), + classes = $$.getOption(options, "classes", [_classes2.default.region]), + regions = $$.main.select("." + _classes2.default.regions).selectAll(classes.map(function (c) { + return "." + c; + })); + + + return (duration ? regions.transition().duration(duration) : regions).style("opacity", "0").remove(), config.regions = config.regions.filter(function (region) { + var found = !1; + + return !region.class || (region.class.split(" ").forEach(function (c) { + classes.indexOf(c) >= 0 && (found = !0); + }), !found); + }), config.regions; +}, (0, _util.extend)(_Chart2.default.prototype, { regions: regions }); + +/***/ }), +/* 21 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _d = __webpack_require__(2), + _Chart = __webpack_require__(4), + _Chart2 = _interopRequireDefault(_Chart), + _util = __webpack_require__(0), + _classes = __webpack_require__(3), + _classes2 = _interopRequireDefault(_classes); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +(0, _util.extend)(_Chart2.default.prototype, { + /** + * Get selected data points.

+ * By this API, you can get selected data points information. To use this API, data.selection.enabled needs to be set true. + * @method selected + * @instance + * @memberof Chart + * @param {String} targetId You can filter the result by giving target id that you want to get. If not given, all of data points will be returned. + * @return {Array} dataPoint + * @example + * // all selected data points will be returned. + * chart.selected(); + * + * // all selected data points of data1 will be returned. + * chart.selected("data1"); + */ + selected: function selected(targetId) { + var $$ = this.internal, + dataPoint = []; + + + return $$.main.selectAll("." + (_classes2.default.shapes + $$.getTargetSelectorSuffix(targetId))).selectAll("." + _classes2.default.shape).filter(function () { + return (0, _d.select)(this).classed(_classes2.default.SELECTED); + }).each(function (d) { + return dataPoint.push(d); + }), dataPoint; + }, + + + /** + * Set data points to be selected. + * @method select + * @instance + * @memberof Chart + * @param {String} ids + * @param {Number} indices + * @param {Boolean} resetOther + * @example + * // select from 'data1', indices 2 and unselect others selected + * chart.select("data1", 2, true); + */ + select: function select(ids, indices, resetOther) { + var $$ = this.internal, + config = $$.config; + config.data_selection_enabled && $$.main.selectAll("." + _classes2.default.shapes).selectAll("." + _classes2.default.shape).each(function (d, i) { + var shape = (0, _d.select)(this), + id = d.data ? d.data.id : d.id, + toggle = $$.getToggle(this, d).bind($$), + isTargetId = config.data_selection_grouped || !ids || ids.indexOf(id) >= 0, + isTargetIndex = !indices || indices.indexOf(i) >= 0, + isSelected = shape.classed(_classes2.default.SELECTED); + + + // line/area selection not supported yet + shape.classed(_classes2.default.line) || shape.classed(_classes2.default.area) || (isTargetId && isTargetIndex ? config.data_selection_isselectable(d) && !isSelected && toggle(!0, shape.classed(_classes2.default.SELECTED, !0), d, i) : (0, _util.isDefined)(resetOther) && resetOther && isSelected && toggle(!1, shape.classed(_classes2.default.SELECTED, !1), d, i)); + }); + }, + + + /** + * Set data points to be un-selected. + * @method unselect + * @instance + * @memberof Chart + * @param {String} ids + * @param {Number} indices + * @example + * // unselect from 'data1', indices 2 + * chart.unselect("data1", 2); + */ + unselect: function unselect(ids, indices) { + var $$ = this.internal, + config = $$.config; + config.data_selection_enabled && $$.main.selectAll("." + _classes2.default.shapes).selectAll("." + _classes2.default.shape).each(function (d, i) { + var shape = (0, _d.select)(this), + id = d.data ? d.data.id : d.id, + toggle = $$.getToggle(this, d).bind($$), + isTargetId = config.data_selection_grouped || !ids || ids.indexOf(id) >= 0, + isTargetIndex = !indices || indices.indexOf(i) >= 0, + isSelected = shape.classed(_classes2.default.SELECTED); + + + // line/area selection not supported yet + shape.classed(_classes2.default.line) || shape.classed(_classes2.default.area) || isTargetId && isTargetIndex && config.data_selection_isselectable(d) && isSelected && toggle(!1, shape.classed(_classes2.default.SELECTED, !1), d, i); + }); + } +}); + +/***/ }), +/* 22 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _Chart = __webpack_require__(4), + _Chart2 = _interopRequireDefault(_Chart), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +(0, _util.extend)(_Chart2.default.prototype, { + /** + * Show data points + * @method show + * @instance + * @memberof Chart + * @param {String|Array} targetIdsValue + * @param {Object} options + */ + show: function show(targetIdsValue) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, + $$ = this.internal, + targetIds = $$.mapToTargetIds(targetIdsValue); + $$.removeHiddenTargetIds(targetIds); + + var targets = $$.svg.selectAll($$.selectorTargets(targetIds)); + + targets.transition().style("opacity", "1", "important").call($$.endall, function () { + targets.style("opacity", null).style("opacity", "1"); + }), options.withLegend && $$.showLegend(targetIds), $$.redraw({ + withUpdateOrgXDomain: !0, + withUpdateXDomain: !0, + withLegend: !0 + }); + }, + + + /** + * Hide data points + * @method hide + * @instance + * @memberof Chart + * @param {String|Array} targetIdsValue + * @param {Object} options + */ + hide: function hide(targetIdsValue) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, + $$ = this.internal, + targetIds = $$.mapToTargetIds(targetIdsValue); + $$.addHiddenTargetIds(targetIds); + + var targets = $$.svg.selectAll($$.selectorTargets(targetIds)); + + targets.transition().style("opacity", "0", "important").call($$.endall, function () { + targets.style("opacity", null).style("opacity", "0"); + }), options.withLegend && $$.hideLegend(targetIds), $$.redraw({ + withUpdateOrgXDomain: !0, + withUpdateXDomain: !0, + withLegend: !0 + }); + }, + + + /** + * Toggle data points + * @method toggle + * @instance + * @memberof Chart + * @param {Array} targetIds + * @param {Object} options + */ + toggle: function toggle(targetIds) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, + that = this, + $$ = this.internal; + $$.mapToTargetIds(targetIds).forEach(function (targetId) { + $$.isTargetToShow(targetId) ? that.hide(targetId, options) : that.show(targetId, options); + }); + } +}); + +/***/ }), +/* 23 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _Chart = __webpack_require__(4), + _Chart2 = _interopRequireDefault(_Chart), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Define tooltip + */ +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +var tooltip = function () {}; + +/** + * Show tooltip + * @method tooltip:show + * @instance + * @memberof Chart + * @param {Array} args + */ +tooltip.show = function (args) { + var $$ = this.internal, + index = void 0, + mouse = void 0; + + + // determine mouse position on the chart + args.mouse && (mouse = args.mouse), args.data ? $$.isMultipleX() ? (mouse = [$$.x(args.data.x), $$.getYScale(args.data.id)(args.data.value)], index = null) : index = (0, _util.isValue)(args.data.index) ? args.data.index : $$.getIndexByX(args.data.x) : typeof args.x === "undefined" ? typeof args.index !== "undefined" && (index = args.index) : index = $$.getIndexByX(args.x), $$.dispatchEvent("mouseover", index, mouse), $$.dispatchEvent("mousemove", index, mouse), $$.config.tooltip_onshow.call($$, args.data); +}, tooltip.hide = function () { + this.internal.dispatchEvent("mouseout", 0), this.internal.config.tooltip_onhide.call(this); +}, (0, _util.extend)(_Chart2.default.prototype, { tooltip: tooltip }); + +/***/ }), +/* 24 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _Chart = __webpack_require__(4), + _Chart2 = _interopRequireDefault(_Chart), + _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +(0, _util.extend)(_Chart2.default.prototype, { + /** + * Change the type of the chart. + * @method transform + * @instance + * @memberof Chart + * @param {String} type Specify the type to be transformed. The types listed in data.type can be used. + * @param {String|Array} targetIds Specify targets to be transformed. If not given, all targets will be the candidate. + * @example + * // all targets will be bar chart. + * chart.transform("bar"); + * + * // only data1 will be bar chart. + * chart.transform("bar", "data1"); + * + * // only data1 and data2 will be bar chart. + * chart.transform("bar", ["data1", "data2"]); + */ + transform: function transform(type, targetIds) { + var $$ = this.internal, + options = ["pie", "donut"].indexOf(type) >= 0 ? { withTransform: !0 } : null; + $$.transformTo(targetIds, type, options); + } +}), (0, _util.extend)(_ChartInternal2.default.prototype, { + /** + * Change the type of the chart. + * @private + * @param {String|Array} targetIds + * @param {String} type + * @param {Object} optionsForRedraw + */ + transformTo: function transformTo(targetIds, type, optionsForRedraw) { + var $$ = this, + withTransitionForAxis = !$$.hasArcType(), + options = optionsForRedraw || { withTransitionForAxis: withTransitionForAxis }; + options.withTransitionForTransform = !1, $$.transiting = !1, $$.setTargetType(targetIds, type), $$.updateTargets($$.data.targets), $$.updateAndRedraw(options); + } +}); /** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ + +/***/ }), +/* 25 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _Chart = __webpack_require__(4), + _Chart2 = _interopRequireDefault(_Chart), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +(0, _util.extend)(_Chart2.default.prototype, { + /** + * Get and set x values for the chart. + * @method x + * @instance + * @memberof Chart + * @param {Array} x If x is given, x values of every target will be updated. If no argument is given, current x values will be returned as an Object whose keys are the target ids. + * @return {Object} xs + * @example + * // Get current x values + * chart.x(); + * + * // Update x values for all targets + * chart.x([100, 200, 300, 400, ...]); + */ + x: function x(_x) { + var $$ = this.internal; + + return arguments.length && ($$.updateTargetX($$.data.targets, _x), $$.redraw({ + withUpdateOrgXDomain: !0, + withUpdateXDomain: !0 + })), $$.data.xs; + }, + + + /** + * Get and set x values for the chart. + * @method xs + * @instance + * @memberof Chart + * @param {Array} xs If xs is given, specified target's x values will be updated. If no argument is given, current x values will be returned as an Object whose keys are the target ids. + * @return {Object} xs + * @example + * // Get current x values + * chart.xs(); + * + * // Update x values for all targets + * chart.xs({ + * data1: [10, 20, 30, 40, ...], + * data2: [100, 200, 300, 400, ...] + * }); + */ + xs: function xs(_xs) { + var $$ = this.internal; + + return arguments.length && ($$.updateTargetXs($$.data.targets, _xs), $$.redraw({ + withUpdateOrgXDomain: !0, + withUpdateXDomain: !0 + })), $$.data.xs; + } +}); + +/***/ }), +/* 26 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _d = __webpack_require__(2), + _Chart = __webpack_require__(4), + _Chart2 = _interopRequireDefault(_Chart), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Zoom by giving x domain. + * @method zoom + * @instance + * @memberof Chart + * @param {Array} domainValue If domain is given, the chart will be zoomed to the given domain. If no argument is given, the current zoomed domain will be returned. + * @example + * // Zoom to specified domain + * chart.zoom([10, 20]); + * + * // Get the current zoomed domain + * chart.zoom(); + */ +var zoom = function (domainValue) { + var $$ = this.internal, + domain = domainValue, + resultDomain = void 0; + + + if (domain) { + + if ($$.isTimeSeries() && (domain = domain.map(function (x) { + return $$.parseDate(x); + })), $$.config.subchart_show) { + var xScale = $$.zoomScale || $$.x; + + $$.brush.getSelection().call($$.brush.move, [xScale(domain[0]), xScale(domain[1])]), resultDomain = domain; + } else { + var orgDomain = $$.x.orgDomain(), + k = (orgDomain[1] - orgDomain[0]) / (domain[1] - domain[0]), + tx = $$.isTimeSeries() ? 0 - k * $$.x(domain[0].getTime()) : domain[0] - k * $$.x(domain[0]); + $$.zoom.updateTransformScale(_d.zoomIdentity.translate(tx, 0).scale(k)), resultDomain = $$.zoomScale.domain(); + } + + $$.redraw({ + withTransition: !0, + withY: $$.config.zoom_rescale + }), $$.config.zoom_onzoom.call(this, $$.x.orgDomain()); + } else resultDomain = ($$.zoomScale || $$.x).domain(); + return resultDomain; +}; + +/** + * Enable and disable zooming. + * @method zoom:enable + * @instance + * @memberof Chart + * @param {Boolean} enabled If enabled is true, the feature of zooming will be enabled. If false is given, it will be disabled. + * @example + * // Enable zooming + * chart.zoom.enable(true); + */ +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +zoom.enable = function (enabled) { + var $$ = this.internal; + + $$.config.zoom_enabled = enabled, $$.updateAndRedraw(); +}, zoom.max = function (max) { + var $$ = this.internal, + config = $$.config; + + + if (max === 0 || max) config.zoom_x_max = (0, _d.max)([$$.orgXDomain[1], max]);else return config.zoom_x_max; + + return undefined; +}, zoom.min = function (min) { + var $$ = this.internal, + config = $$.config; + + + if (min === 0 || min) config.zoom_x_min = (0, _d.min)([$$.orgXDomain[0], min]);else return config.zoom_x_min; + + return undefined; +}, zoom.range = function (range) { + if (arguments.length) (0, _util.isDefined)(range.max) && this.domain.max(range.max), (0, _util.isDefined)(range.min) && this.domain.min(range.min);else return { + max: this.domain.max(), + min: this.domain.min() + }; + + return undefined; +}, (0, _util.extend)(_Chart2.default.prototype, { + zoom: zoom, + /** + * Unzoom zoomed area + * @method unzoom + * @instance + * @memberof Chart + * @example + * chart.unzoom(); + */ + unzoom: function unzoom() { + var $$ = this.internal; + + $$.config.subchart_show ? $$.brush.getSelection().call($$.brush.move, null) : $$.zoom.updateTransformScale(_d.zoomIdentity), $$.redraw({ + withTransition: !0, + withY: $$.config.zoom_rescale + }); + } +}); + +/***/ }), +/* 27 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _typeof2 = __webpack_require__(5), + _typeof3 = _interopRequireDefault(_typeof2), + _Options = __webpack_require__(58), + _Options2 = _interopRequireDefault(_Options), + _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +(0, _util.extend)(_ChartInternal2.default.prototype, { + getOptions: function getOptions() { + var config = new _Options2.default(); + + return (0, _util.merge)(config.value, this.additionalConfig); + }, + + + additionalConfig: {}, + + loadConfig: function loadConfig(config) { + + function find() { + var key = keys.shift(); + + return key && target && (typeof target === "undefined" ? "undefined" : (0, _typeof3.default)(target)) === "object" && key in target ? (target = target[key], find()) : key ? undefined : target; + } + + var thisConfig = this.config, + target = void 0, + keys = void 0, + read = void 0; + Object.keys(thisConfig).forEach(function (key) { + target = config, keys = key.split("_"), read = find(), (0, _util.isDefined)(read) && (thisConfig[key] = read); + }); + } +}); /** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ + +/***/ }), +/* 28 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _d = __webpack_require__(2), + _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +(0, _util.extend)(_ChartInternal2.default.prototype, { + convertUrlToData: function convertUrlToData(url) { + var _this = this, + mimeType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "csv", + headers = arguments[2], + keys = arguments[3], + done = arguments[4], + type = mimeType, + req = (0, _d.request)(url); + + if (headers) for (var _iterator = Object.keys(headers), _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { + var _ref; + + if (_isArray) { + if (_i >= _iterator.length) break; + _ref = _iterator[_i++]; + } else { + if (_i = _iterator.next(), _i.done) break; + _ref = _i.value; + } + + var header = _ref; + req.header(header, headers[header]); + } + + req.get(function (error, data) { + var d = void 0; + + if (!data) throw new Error(error.responseURL + " " + error.status + " (" + error.statusText + ")"); + + var response = data.response || data.responseText; + + d = type === "json" ? _this.convertJsonToData(JSON.parse(response), keys) : type === "tsv" ? _this.convertTsvToData(response) : _this.convertCsvToData(response), done.call(_this, d); + }); + }, + convertCsvToData: function convertCsvToData(xsv) { + var rows = (0, _d.csvParseRows)(xsv), + d = void 0; + + + return rows.length === 1 ? (d = [{}], rows[0].forEach(function (id) { + d[0][id] = null; + })) : d = (0, _d.csvParse)(xsv), d; + }, + convertTsvToData: function convertTsvToData(xsv) { + var rows = (0, _d.tsvParseRows)(xsv), + d = void 0; + + + return rows.length === 1 ? (d = [{}], rows[0].forEach(function (id) { + d[0][id] = null; + })) : d = (0, _d.tsvParse)(xsv), d; + }, + convertJsonToData: function convertJsonToData(json, keys) { + var _this2 = this, + newRows = [], + targetKeys = void 0, + data = void 0; + + return keys ? (keys.x ? (targetKeys = keys.value.concat(keys.x), this.config.data_x = keys.x) : targetKeys = keys.value, newRows.push(targetKeys), json.forEach(function (o) { + + for (var newRow = [], v = void 0, _iterator2 = targetKeys, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { + var _ref2; + + if (_isArray2) { + if (_i2 >= _iterator2.length) break; + _ref2 = _iterator2[_i2++]; + } else { + if (_i2 = _iterator2.next(), _i2.done) break; + _ref2 = _i2.value; + } + + var key = _ref2; + v = _this2.findValueInJson(o, key), (0, _util.isUndefined)(v) && (v = null), newRow.push(v); + } + newRows.push(newRow); + }), data = this.convertRowsToData(newRows)) : (Object.keys(json).forEach(function (key) { + return newRows.push([key].concat(json[key])); + }), data = this.convertColumnsToData(newRows)), data; + }, + findValueInJson: function findValueInJson(object, path) { + var convertedPath = path.replace(/\[(\w+)\]/g, ".$1"), + pathArray = convertedPath.replace(/^\./, "").split("."), + target = object; // convert indexes to properties (replace [] with .) + // strip a leading dot + + + for (var _iterator3 = pathArray, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { + var _ref3; + + if (_isArray3) { + if (_i3 >= _iterator3.length) break; + _ref3 = _iterator3[_i3++]; + } else { + if (_i3 = _iterator3.next(), _i3.done) break; + _ref3 = _i3.value; + } + + var k = _ref3; + + if (k in target) target = target[k];else { + target = undefined; + + break; + } + } + return target; + }, + convertRowsToData: function convertRowsToData(rows) { + var keys = rows[0], + newRows = [], + newRow = {}, + i = void 0, + j = void 0; + + + for (i = 1; i < rows.length; i++) { + for (newRow = {}, j = 0; j < rows[i].length; j++) { + if ((0, _util.isUndefined)(rows[i][j])) throw new Error("Source data is missing a component at (" + i + ", " + j + ")!"); + newRow[keys[j]] = rows[i][j]; + } + newRows.push(newRow); + } + + return newRows; + }, + convertColumnsToData: function convertColumnsToData(columns) { + var newRows = [], + i = void 0, + j = void 0, + key = void 0; + + + for (i = 0; i < columns.length; i++) for (key = columns[i][0], j = 1; j < columns[i].length; j++) { + if ((0, _util.isUndefined)(newRows[j - 1]) && (newRows[j - 1] = {}), (0, _util.isUndefined)(columns[i][j])) throw new Error("Source data is missing a component at (" + i + ", " + j + ")!"); + newRows[j - 1][key] = columns[i][j]; + } + return newRows; + }, + convertDataToTargets: function convertDataToTargets(data, appendXs) { + var _this3 = this, + $$ = this, + config = $$.config, + ids = (0, _d.keys)(data[0]).filter($$.isNotX, $$), + xs = (0, _d.keys)(data[0]).filter($$.isX, $$); + + ids.forEach(function (id) { + var xKey = _this3.getXKey(id); + + _this3.isCustomX() || _this3.isTimeSeries() ? xs.indexOf(xKey) >= 0 ? _this3.data.xs[id] = (appendXs && $$.data.xs[id] ? $$.data.xs[id] : []).concat(data.map(function (d) { + return d[xKey]; + }).filter(_util.isValue).map(function (rawX, i) { + return $$.generateTargetX(rawX, id, i); + })) : config.data_x ? _this3.data.xs[id] = _this3.getOtherTargetXs() : (0, _util.notEmpty)(config.data_xs) && ($$.data.xs[id] = $$.getXValuesOfXKey(xKey, $$.data.targets)) : $$.data.xs[id] = data.map(function (d, i) { + return i; + }); + }), ids.forEach(function (id) { + if (!$$.data.xs[id]) throw new Error("x is not defined for id = \"" + id + "\"."); + }); + + + // convert to target + var targets = ids.map(function (id, index) { + var convertedId = config.data_idConverter(id); + + return { + id: convertedId, + id_org: id, + values: data.map(function (d, i) { + var xKey = $$.getXKey(id), + rawX = d[xKey], + value = d[id] === null || isNaN(d[id]) ? null : +d[id], + x = void 0; + + // use x as categories if custom x and categorized + + return $$.isCustomX() && $$.isCategorized() && index === 0 && !(0, _util.isUndefined)(rawX) ? (index === 0 && i === 0 && (config.axis_x_categories = []), x = config.axis_x_categories.indexOf(rawX), x === -1 && (x = config.axis_x_categories.length, config.axis_x_categories.push(rawX))) : x = $$.generateTargetX(rawX, id, i), ((0, _util.isUndefined)(d[id]) || $$.data.xs[id].length <= i) && (x = undefined), { x: x, value: value, id: convertedId }; + }).filter(function (v) { + return (0, _util.isDefined)(v.x); + }) + }; + }); + + // finish targets + + + return targets.forEach(function (t) { + var i = void 0; + + // sort values by its x + config.data_xSort && (t.values = t.values.sort(function (v1, v2) { + var x1 = v1.x || v1.x === 0 ? v1.x : Infinity, + x2 = v2.x || v2.x === 0 ? v2.x : Infinity; + + + return x1 - x2; + })), i = 0, t.values.forEach(function (v) { + v.index = i++; + }), $$.data.xs[t.id].sort(function (v1, v2) { + return v1 - v2; + }); + }), $$.hasNegativeValue = $$.hasNegativeValueInTargets(targets), $$.hasPositiveValue = $$.hasPositiveValueInTargets(targets), config.data_type && $$.setTargetType($$.mapToIds(targets).filter(function (id) { + return !(id in config.data_types); + }), config.data_type), targets.forEach(function (d) { + $$.addCache(d.id_org, d); + }), targets; + } +}); /** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ + +/***/ }), +/* 29 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _typeof2 = __webpack_require__(5), + _typeof3 = _interopRequireDefault(_typeof2), + _d = __webpack_require__(2), + _classes = __webpack_require__(3), + _classes2 = _interopRequireDefault(_classes), + _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +(0, _util.extend)(_ChartInternal2.default.prototype, { + isX: function isX(key) { + var $$ = this, + config = $$.config, + dataKey = config.data_x && key === config.data_x, + existValue = (0, _util.notEmpty)(config.data_xs) && (0, _util.hasValue)(config.data_xs, key); + + + return dataKey || existValue; + }, + isNotX: function isNotX(key) { + return !this.isX(key); + }, + getXKey: function getXKey(id) { + var $$ = this, + config = $$.config; + + + return config.data_x ? config.data_x : (0, _util.notEmpty)(config.data_xs) ? config.data_xs[id] : null; + }, + getXValuesOfXKey: function getXValuesOfXKey(key, targets) { + var $$ = this, + ids = targets && (0, _util.notEmpty)(targets) ? $$.mapToIds(targets) : [], + xValues = void 0; + + return ids.forEach(function (id) { + $$.getXKey(id) === key && (xValues = $$.data.xs[id]); + }), xValues; + }, + getIndexByX: function getIndexByX(x) { + var $$ = this, + data = $$.filterByX($$.data.targets, x); + + + return data.length ? data[0].index : null; + }, + getXValue: function getXValue(id, i) { + var $$ = this; + + return id in $$.data.xs && $$.data.xs[id] && (0, _util.isValue)($$.data.xs[id][i]) ? $$.data.xs[id][i] : i; + }, + getOtherTargetXs: function getOtherTargetXs() { + var $$ = this, + idsForX = Object.keys($$.data.xs); + + + return idsForX.length ? $$.data.xs[idsForX[0]] : null; + }, + getOtherTargetX: function getOtherTargetX(index) { + var xs = this.getOtherTargetXs(); + + return xs && index < xs.length ? xs[index] : null; + }, + addXs: function addXs(xs) { + var $$ = this; + + Object.keys(xs).forEach(function (id) { + $$.config.data_xs[id] = xs[id]; + }); + }, + hasMultipleX: function hasMultipleX(xs) { + // https://github.com/d3/d3-collection + return (0, _d.set)(Object.keys(xs).map(function (id) { + return xs[id]; + })).size() > 1; + }, + isMultipleX: function isMultipleX() { + return (0, _util.notEmpty)(this.config.data_xs) || !this.config.data_xSort || this.hasType("scatter"); + }, + addName: function addName(data) { + var $$ = this, + name = void 0; + + return data && (name = $$.config.data_names[data.id], data.name = name === undefined ? data.id : name), data; + }, + getValueOnIndex: function getValueOnIndex(values, index) { + var valueOnIndex = values.filter(function (v) { + return v.index === index; + }); + + return valueOnIndex.length ? valueOnIndex[0] : null; + }, + updateTargetX: function updateTargetX(targets, x) { + var $$ = this; + + targets.forEach(function (t) { + t.values.forEach(function (v, i) { + v.x = $$.generateTargetX(x[i], t.id, i); + }), $$.data.xs[t.id] = x; + }); + }, + updateTargetXs: function updateTargetXs(targets, xs) { + var $$ = this; + + targets.forEach(function (t) { + xs[t.id] && $$.updateTargetX([t], xs[t.id]); + }); + }, + generateTargetX: function generateTargetX(rawX, id, index) { + var $$ = this, + x = void 0; + + return x = $$.isTimeSeries() ? rawX ? $$.parseDate(rawX) : $$.parseDate($$.getXValue(id, index)) : $$.isCustomX() && !$$.isCategorized() ? (0, _util.isValue)(rawX) ? +rawX : $$.getXValue(id, index) : index, x; + }, + cloneTarget: function cloneTarget(target) { + return { + id: target.id, + id_org: target.id_org, + values: target.values.map(function (d) { + return { x: d.x, value: d.value, id: d.id }; + }) + }; + }, + updateXs: function updateXs() { + var $$ = this; + + $$.data.targets.length && ($$.xs = [], $$.data.targets[0].values.forEach(function (v) { + $$.xs[v.index] = v.x; + })); + }, + getPrevX: function getPrevX(i) { + var x = this.xs[i - 1]; + + return typeof x === "undefined" ? null : x; + }, + getNextX: function getNextX(i) { + var x = this.xs[i + 1]; + + return typeof x === "undefined" ? null : x; + }, + getMaxDataCount: function getMaxDataCount() { + var $$ = this; + + return (0, _d.max)($$.data.targets, function (t) { + return t.values.length; + }); + }, + getMaxDataCountTarget: function getMaxDataCountTarget(targets) { + var length = targets.length, + max = 0, + maxTarget = void 0; + + return length > 1 ? targets.forEach(function (t) { + t.values.length > max && (maxTarget = t, max = t.values.length); + }) : maxTarget = length ? targets[0] : null, maxTarget; + }, + getEdgeX: function getEdgeX(targets) { + return targets.length ? [(0, _d.min)(targets, function (t) { + return t.values[0].x; + }), (0, _d.max)(targets, function (t) { + return t.values[t.values.length - 1].x; + })] : [0, 0]; + }, + mapToIds: function mapToIds(targets) { + return targets.map(function (d) { + return d.id; + }); + }, + mapToTargetIds: function mapToTargetIds(ids) { + var $$ = this; + + return ids ? [].concat(ids) : $$.mapToIds($$.data.targets); + }, + hasTarget: function hasTarget(targets, id) { + var ids = this.mapToIds(targets), + i = void 0; + + + for (i = 0; i < ids.length; i++) if (ids[i] === id) return !0; + return !1; + }, + isTargetToShow: function isTargetToShow(targetId) { + return this.hiddenTargetIds.indexOf(targetId) < 0; + }, + isLegendToShow: function isLegendToShow(targetId) { + return this.hiddenLegendIds.indexOf(targetId) < 0; + }, + filterTargetsToShow: function filterTargetsToShow(targets) { + var $$ = this; + + return targets.filter(function (t) { + return $$.isTargetToShow(t.id); + }); + }, + mapTargetsToUniqueXs: function mapTargetsToUniqueXs(targets) { + var $$ = this, + xs = (0, _d.set)((0, _d.merge)(targets.map(function (t) { + return t.values.map(function (v) { + return +v.x; + }); + }))).values(); + + return xs = $$.isTimeSeries() ? xs.map(function (x) { + return new Date(+x); + }) : xs.map(function (x) { + return +x; + }), xs.sort(function (a, b) { + return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; + }); + }, + addHiddenTargetIds: function addHiddenTargetIds(targetIds) { + this.hiddenTargetIds = this.hiddenTargetIds.concat(targetIds); + }, + removeHiddenTargetIds: function removeHiddenTargetIds(targetIds) { + this.hiddenTargetIds = this.hiddenTargetIds.filter(function (id) { + return targetIds.indexOf(id) < 0; + }); + }, + addHiddenLegendIds: function addHiddenLegendIds(targetIds) { + this.hiddenLegendIds = this.hiddenLegendIds.concat(targetIds); + }, + removeHiddenLegendIds: function removeHiddenLegendIds(targetIds) { + this.hiddenLegendIds = this.hiddenLegendIds.filter(function (id) { + return targetIds.indexOf(id) < 0; + }); + }, + getValuesAsIdKeyed: function getValuesAsIdKeyed(targets) { + var ys = {}; + + return targets.forEach(function (t) { + ys[t.id] = [], t.values.forEach(function (v) { + ys[t.id].push(v.value); + }); + }), ys; + }, + checkValueInTargets: function checkValueInTargets(targets, checker) { + var ids = Object.keys(targets), + i = void 0, + j = void 0, + values = void 0; + + + for (i = 0; i < ids.length; i++) for (values = targets[ids[i]].values, j = 0; j < values.length; j++) if (checker(values[j].value)) return !0; + return !1; + }, + hasNegativeValueInTargets: function hasNegativeValueInTargets(targets) { + return this.checkValueInTargets(targets, function (v) { + return v < 0; + }); + }, + hasPositiveValueInTargets: function hasPositiveValueInTargets(targets) { + return this.checkValueInTargets(targets, function (v) { + return v > 0; + }); + }, + isOrderDesc: function isOrderDesc() { + var config = this.config; + + return typeof config.data_order === "string" && config.data_order.toLowerCase() === "desc"; + }, + isOrderAsc: function isOrderAsc() { + var config = this.config; + + return typeof config.data_order === "string" && config.data_order.toLowerCase() === "asc"; + }, + orderTargets: function orderTargets(targets) { + var $$ = this, + config = $$.config, + orderAsc = $$.isOrderAsc(), + orderDesc = $$.isOrderDesc(); + // TODO: accept name array for order + return orderAsc || orderDesc ? targets.sort(function (t1, t2) { + var reducer = function (p, c) { + return p + Math.abs(c.value); + }, + t1Sum = t1.values.reduce(reducer, 0), + t2Sum = t2.values.reduce(reducer, 0); + + + return orderAsc ? t2Sum - t1Sum : t1Sum - t2Sum; + }) : (0, _util.isFunction)(config.data_order) && targets.sort(config.data_order), targets; + }, + filterByX: function filterByX(targets, x) { + return (0, _d.merge)(targets.map(function (t) { + return t.values; + })).filter(function (v) { + return v.x - x === 0; + }); + }, + filterRemoveNull: function filterRemoveNull(data) { + return data.filter(function (d) { + return (0, _util.isValue)(d.value); + }); + }, + filterByXDomain: function filterByXDomain(targets, xDomain) { + return targets.map(function (t) { + return { + id: t.id, + id_org: t.id_org, + values: t.values.filter(function (v) { + return xDomain[0] <= v.x && v.x <= xDomain[1]; + }) + }; + }); + }, + hasDataLabel: function hasDataLabel() { + var config = this.config; + + if (typeof config.data_labels === "boolean" && config.data_labels) return !0; + return (0, _typeof3.default)(config.data_labels) === "object" && (0, _util.notEmpty)(config.data_labels); + }, + getDataLabelLength: function getDataLabelLength(min, max, key) { + var $$ = this, + lengths = [0, 0]; + + return $$.selectChart.select("svg").selectAll(".dummy").data([min, max]).enter().append("text").text(function (d) { + return $$.dataLabelFormat(d.id)(d); + }).each(function (d, i) { + lengths[i] = this.getBoundingClientRect()[key] * 1.3; + }).remove(), lengths; + }, + isNoneArc: function isNoneArc(d) { + return this.hasTarget(this.data.targets, d.id); + }, + isArc: function isArc(d) { + return "data" in d && this.hasTarget(this.data.targets, d.data.id); + }, + findSameXOfValues: function findSameXOfValues(values, index) { + var targetX = values[index].x, + sames = [], + i = void 0; + + + for (i = index - 1; i >= 0 && !(targetX !== values[i].x); i--) sames.push(values[i]); + for (i = index; i < values.length && !(targetX !== values[i].x); i++) sames.push(values[i]); + return sames; + }, + findClosestFromTargets: function findClosestFromTargets(targets, pos) { + var $$ = this, + candidates = targets.map(function (target) { + return $$.findClosest(target.values, pos); + }); + // map to array of closest points of each target + + // decide closest point and return + return $$.findClosest(candidates, pos); + }, + findClosest: function findClosest(values, pos) { + var $$ = this, + minDist = $$.config.point_sensitivity, + closest = void 0; + + // find mouseovering bar + + + return values.filter(function (v) { + return v && $$.isBarType(v.id); + }).forEach(function (v) { + var shape = $$.main.select().node("." + _classes2.default.bars + $$.getTargetSelectorSuffix(v.id) + "." + _classes2.default.bar + "-" + v.index); + + !closest && $$.isWithinBar(shape) && (closest = v); + }), values.filter(function (v) { + return v && !$$.isBarType(v.id); + }).forEach(function (v) { + var d = $$.dist(v, pos); + + d < minDist && (minDist = d, closest = v); + }), closest; + }, + dist: function dist(data, pos) { + var $$ = this, + config = $$.config, + xIndex = config.axis_rotated ? 1 : 0, + yIndex = config.axis_rotated ? 0 : 1, + y = $$.circleY(data, data.index), + x = $$.x(data.x); + + + return Math.sqrt(Math.pow(x - pos[xIndex], 2) + Math.pow(y - pos[yIndex], 2)); + }, + convertValuesToStep: function convertValuesToStep(values) { + var converted = [].concat(values), + i = void 0; + + + if (!this.isCategorized()) return values; + + for (i = values.length + 1; i > 0; i--) converted[i] = converted[i - 1]; + + return converted[0] = { + x: converted[0].x - 1, + value: converted[0].value, + id: converted[0].id + }, converted[values.length + 1] = { + x: converted[values.length].x + 1, + value: converted[values.length].value, + id: converted[values.length].id + }, converted; + }, + updateDataAttributes: function updateDataAttributes(name, attrs) { + var $$ = this, + config = $$.config, + current = config["data_" + name]; + return typeof attrs === "undefined" ? current : (Object.keys(attrs).forEach(function (id) { + current[id] = attrs[id]; + }), $$.redraw({ withLegend: !0 }), current); + } +}); + +/***/ }), +/* 30 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _classes = __webpack_require__(3), + _classes2 = _interopRequireDefault(_classes), + _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +(0, _util.extend)(_ChartInternal2.default.prototype, { + load: function load(rawTargets, args) { + var $$ = this, + targets = rawTargets; + targets && (args.filter && (targets = targets.filter(args.filter)), (args.type || args.types) && targets.forEach(function (t) { + var type = args.types && args.types[t.id] ? args.types[t.id] : args.type; + + $$.setTargetType(t.id, type); + }), $$.data.targets.forEach(function (d) { + for (var i = 0; i < targets.length; i++) if (d.id === targets[i].id) { + d.values = targets[i].values, targets.splice(i, 1); + + break; + } + }), $$.data.targets = $$.data.targets.concat(targets)), $$.updateTargets($$.data.targets), $$.redraw({ withUpdateOrgXDomain: !0, withUpdateXDomain: !0, withLegend: !0 }), args.done && args.done(); + }, + loadFromArgs: function loadFromArgs(args) { + var $$ = this; + + args.data ? $$.load($$.convertDataToTargets(args.data), args) : args.url ? $$.convertUrlToData(args.url, args.mimeType, args.headers, args.keys, function (data) { + $$.load($$.convertDataToTargets(data), args); + }) : args.json ? $$.load($$.convertDataToTargets($$.convertJsonToData(args.json, args.keys)), args) : args.rows ? $$.load($$.convertDataToTargets($$.convertRowsToData(args.rows)), args) : args.columns ? $$.load($$.convertDataToTargets($$.convertColumnsToData(args.columns)), args) : $$.load(null, args); + }, + unload: function unload(rawTargetIds, customDoneCb) { + var $$ = this, + done = customDoneCb, + targetIds = rawTargetIds; + + + // If no target, call done and return + return done || (done = function () {}), targetIds = targetIds.filter(function (id) { + return $$.hasTarget($$.data.targets, id); + }), targetIds && targetIds.length !== 0 ? void ($$.svg.selectAll(targetIds.map(function (id) { + return $$.selectorTarget(id); + })).transition().style("opacity", "0").remove().call($$.endall, done), targetIds.forEach(function (id) { + $$.withoutFadeIn[id] = !1, $$.legend && $$.legend.selectAll("." + _classes2.default.legendItem + $$.getTargetSelectorSuffix(id)).remove(), $$.data.targets = $$.data.targets.filter(function (t) { + return t.id !== id; + }); + })) : void done(); + } +}); /** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ + +/***/ }), +/* 31 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _d = __webpack_require__(2), + _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _classes = __webpack_require__(3), + _classes2 = _interopRequireDefault(_classes), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +(0, _util.extend)(_ChartInternal2.default.prototype, { + /** + * Called when dragging. + * Data points can be selected. + * @private + * @param {Object} mouse Object + */ + drag: function drag(mouse) { + var $$ = this, + config = $$.config, + main = $$.main; + // do nothing if not selectable + // skip when single selection because drag is used for multiple selection + + if (!$$.hasArcType() && config.data_selection_enabled && (!config.zoom_enabled || $$.zoom.altDomain) && config.data_selection_multiple) { + var sx = $$.dragStart[0], + sy = $$.dragStart[1], + mx = mouse[0], + my = mouse[1], + minX = Math.min(sx, mx), + maxX = Math.max(sx, mx), + minY = config.data_selection_grouped ? $$.margin.top : Math.min(sy, my), + maxY = config.data_selection_grouped ? $$.height : Math.max(sy, my); + main.select("." + _classes2.default.dragarea).attr("x", minX).attr("y", minY).attr("width", maxX - minX).attr("height", maxY - minY), main.selectAll("." + _classes2.default.shapes).selectAll("." + _classes2.default.shape).filter(function (d) { + return config.data_selection_isselectable(d); + }).each(function (d, i) { + var shape = (0, _d.select)(this), + isSelected = shape.classed(_classes2.default.SELECTED), + isIncluded = shape.classed(_classes2.default.INCLUDED), + _x = void 0, + _y = void 0, + _w = void 0, + _h = void 0, + toggle = void 0, + isWithin = !1, + box = void 0; + + + if (shape.classed(_classes2.default.circle)) _x = shape.attr("cx") * 1, _y = shape.attr("cy") * 1, toggle = $$.togglePoint, isWithin = minX < _x && _x < maxX && minY < _y && _y < maxY;else if (shape.classed(_classes2.default.bar)) box = (0, _util.getPathBox)(this), _x = box.x, _y = box.y, _w = box.width, _h = box.height, toggle = $$.togglePath, isWithin = !(maxX < _x || _x + _w < minX) && !(maxY < _y || _y + _h < minY);else + // line/area selection not supported yet + return; + isWithin ^ isIncluded && (shape.classed(_classes2.default.INCLUDED, !isIncluded), shape.classed(_classes2.default.SELECTED, !isSelected), toggle.call($$, !isSelected, shape, d, i)); + }); + } // skip if zoomable because of conflict drag dehavior + }, + + + /** + * Called when the drag starts. + * Adds and Shows the drag area. + * @private + * @param {Object} mouse Object + */ + dragstart: function dragstart(mouse) { + var $$ = this, + config = $$.config; + // do nothing if not selectable + $$.hasArcType() || !config.data_selection_enabled || ($$.dragStart = mouse, $$.main.select("." + _classes2.default.chart).append("rect").attr("class", _classes2.default.dragarea).style("opacity", "0.1"), $$.dragging = !0); + }, + + + /** + * Called when the drag finishes. + * Removes the drag area. + * @private + */ + dragend: function dragend() { + var $$ = this, + config = $$.config; + // do nothing if not selectable + $$.hasArcType() || !config.data_selection_enabled || ($$.main.select("." + _classes2.default.dragarea).transition().duration(100).style("opacity", "0").remove(), $$.main.selectAll("." + _classes2.default.shape).classed(_classes2.default.INCLUDED, !1), $$.dragging = !1); + } +}); // interpolate + +/***/ }), +/* 32 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _d = __webpack_require__(2), + _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _classes = __webpack_require__(3), + _classes2 = _interopRequireDefault(_classes), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +(0, _util.extend)(_ChartInternal2.default.prototype, { + /** + * Initialize the area that detects the event. + * Add a container for the zone that detects the event. + * @private + */ + initEventRect: function initEventRect() { + var $$ = this; + + $$.main.select("." + _classes2.default.chart).append("g").attr("class", _classes2.default.eventRects).style("fill-opacity", "0"); + }, + + + /** + * Redraws the area that detects the event. + * @private + */ + redrawEventRect: function redrawEventRect() { + var $$ = this, + config = $$.config, + isMultipleX = $$.isMultipleX(), + eventRects = $$.main.select("." + _classes2.default.eventRects).style("cursor", config.zoom_enabled ? config.axis_rotated ? "ns-resize" : "ew-resize" : null).classed(_classes2.default.eventRectsMultiple, isMultipleX).classed(_classes2.default.eventRectsSingle, !isMultipleX), + eventRectUpdate = void 0, + maxDataCountTarget = void 0; + + // rects for mouseover + + + // clear old rects + + + if (eventRects.selectAll("." + _classes2.default.eventRect).remove(), $$.eventRect = eventRects.selectAll("." + _classes2.default.eventRect), isMultipleX ? (eventRectUpdate = $$.eventRect.data([0]), eventRectUpdate = $$.generateEventRectsForMultipleXs(eventRectUpdate.enter() // enter : only one rect will be added + ).merge(eventRectUpdate), $$.updateEventRect(eventRectUpdate)) : (maxDataCountTarget = $$.getMaxDataCountTarget($$.data.targets), eventRects.datum(maxDataCountTarget ? maxDataCountTarget.values : []), $$.eventRect = eventRects.selectAll("." + _classes2.default.eventRect), eventRectUpdate = $$.eventRect.data(function (d) { + return d; + }), eventRectUpdate.exit().remove(), eventRectUpdate = $$.generateEventRectsForSingleX(eventRectUpdate.enter()).merge(eventRectUpdate), $$.updateEventRect(eventRectUpdate)), $$.inputType === "touch" && !$$.hasArcType()) { + var getEventRect = function () { + var touch = _d.event.changedTouches[0]; + + return (0, _d.select)(document.elementFromPoint(touch.clientX, touch.clientY)); + }, + getIndex = function (eventRect) { + var index = eventRect && eventRect.attr("class") && eventRect.attr("class").replace(new RegExp("(" + _classes2.default.eventRect + "-?|s)", "g"), "") * 1; + + return (isNaN(index) || index === null) && (index = -1), index; + }, + startClientY = void 0, + selectRect = function (context) { + var eventType = _d.event.type, + touch = _d.event.changedTouches[0], + axisRotated = $$.config.axis_rotated, + currentClientY = touch.clientY; + + // If movement is less than 5px, scrolling outside the chart is prevented from working. + + + if (eventType === "touchstart") startClientY = currentClientY, axisRotated && _d.event.preventDefault();else if (eventType === "touchmove" && startClientY) { + var moveY = Math.abs(startClientY - currentClientY); + + !axisRotated && moveY < 5 && _d.event.preventDefault(); + } + + if (isMultipleX) $$.selectRectForMultipleXs(context);else { + var eventRect = getEventRect(), + index = getIndex(eventRect); + index === -1 ? $$.unselectRect() : $$.selectRectForSingle(context, eventRect, index); + } + }, + touchHandler = function () { + var eventRect = getEventRect(); + + if (eventRect.classed(_classes2.default.eventRect)) { + if ($$.dragging || $$.flowing || $$.hasArcType()) return; + + selectRect(this); + } else $$.unselectRect(); + }; + + $$.svg.on("touchstart", touchHandler).on("touchmove", touchHandler).on("touchend", function () { + var eventRect = getEventRect(); + + if (eventRect.classed(_classes2.default.eventRect)) { + if ($$.hasArcType() || !$$.toggleShape || $$.cancelClick) return void ($$.cancelClick && ($$.cancelClick = !1)); + + // Call event handler + var index = getIndex(eventRect); + + isMultipleX || index === -1 || $$.main.selectAll("." + _classes2.default.shape + "-" + index).each(function (d2) { + return config.data_onout.call($$.api, d2); + }); + } + }); + } + }, + + + /** + * Updates the location and size of the eventRect. + * @private + * @param {Object} D3.select(CLASS.eventRects) object. + */ + updateEventRect: function updateEventRect(eventRectUpdate) { + var $$ = this, + config = $$.config, + eventRectData = eventRectUpdate || $$.eventRect.data(), + x = void 0, + y = void 0, + w = void 0, + h = void 0; // set update selection if null + + + if ($$.isMultipleX()) x = 0, y = 0, w = $$.width, h = $$.height;else { + var rectW = void 0, + rectX = void 0; + + + if (($$.isCustomX() || $$.isTimeSeries()) && !$$.isCategorized()) $$.updateXs(), rectW = function (d) { + var prevX = $$.getPrevX(d.index), + nextX = $$.getNextX(d.index); + + + // if there this is a single data point make the eventRect full width (or height) + return prevX === null && nextX === null ? config.axis_rotated ? $$.height : $$.width : (prevX === null && (prevX = $$.x.domain()[0]), nextX === null && (nextX = $$.x.domain()[1]), Math.max(0, ($$.x(nextX) - $$.x(prevX)) / 2)); + }, rectX = function (d) { + var nextX = $$.getNextX(d.index), + thisX = $$.data.xs[d.id][d.index], + prevX = $$.getPrevX(d.index); + + + // if there this is a single data point position the eventRect at 0 + return prevX === null && nextX === null ? 0 : (prevX === null && (prevX = $$.x.domain()[0]), ($$.x(thisX) + $$.x(prevX)) / 2); + };else { + var edgs = $$.getEdgeX($$.data.targets); + + rectW = ($$.x(edgs[1]) - $$.x(edgs[0])) / $$.getMaxDataCount(), rectX = function (d) { + return $$.x(d.x) - rectW / 2; + }; + } + + x = config.axis_rotated ? 0 : rectX, y = config.axis_rotated ? rectX : 0, w = config.axis_rotated ? $$.width : rectW, h = config.axis_rotated ? rectW : $$.height; + } + + eventRectData.attr("class", $$.classEvent.bind($$)).attr("x", x).attr("y", y).attr("width", w).attr("height", h); + }, + selectRectForSingle: function selectRectForSingle(context, eventRect, index) { + var $$ = this, + config = $$.config, + selectedData = $$.filterTargetsToShow($$.data.targets).map(function (t) { + return $$.addName($$.getValueOnIndex(t.values, index)); + }); + // Show tooltip + config.tooltip_grouped && ($$.showTooltip(selectedData, context), $$.showXGridFocus(selectedData), !config.data_selection_enabled || config.data_selection_grouped) || $$.main.selectAll("." + _classes2.default.shape + "-" + index).each(function () { + (0, _d.select)(this).classed(_classes2.default.EXPANDED, !0), config.data_selection_enabled && eventRect.style("cursor", config.data_selection_grouped ? "pointer" : null), config.tooltip_grouped || ($$.hideXGridFocus(), $$.hideTooltip(), !config.data_selection_grouped && ($$.unexpandCircles(index), $$.unexpandBars(index))); + }).filter(function (d) { + return $$.isWithinShape(this, d); + }).each(function (d) { + config.data_selection_enabled && (config.data_selection_grouped || config.data_selection_isselectable(d)) && eventRect.style("cursor", "pointer"), config.tooltip_grouped || ($$.showTooltip([d], this), $$.showXGridFocus([d]), config.point_focus_expand_enabled && $$.expandCircles(index, d.id, !0), $$.expandBars(index, d.id, !0)); + }); + }, + selectRectForMultipleXs: function selectRectForMultipleXs(context) { + var $$ = this, + config = $$.config, + targetsToShow = $$.filterTargetsToShow($$.data.targets); + + // show tooltip when cursor is close to some point + if (!$$.dragging && !$$.hasArcType(targetsToShow)) { + + var mouse = (0, _d.mouse)($$.main.select("." + _classes2.default.eventRects + " ." + _classes2.default.eventRect).node()), + closest = $$.findClosestFromTargets(targetsToShow, mouse), + sameXData = void 0; + + + if ($$.mouseover && (!closest || closest.id !== $$.mouseover.id) && (config.data_onout.call($$.api, $$.mouseover), $$.mouseover = undefined), !closest) return void $$.unselectRect(); + + sameXData = $$.isScatterType(closest) || !config.tooltip_grouped ? [closest] : $$.filterByX(targetsToShow, closest.x); + var selectedData = sameXData.map(function (d) { + return $$.addName(d); + }); + + $$.showTooltip(selectedData, context), config.point_focus_expand_enabled && $$.expandCircles(closest.index, closest.id, !0), $$.expandBars(closest.index, closest.id, !0), $$.showXGridFocus(selectedData), ($$.isBarType(closest.id) || $$.dist(closest, mouse) < config.point_sensitivity) && ($$.svg.select("" + _classes2.default.eventRect).style("cursor", "pointer"), !$$.mouseover && (config.data_onover.call($$.api, closest), $$.mouseover = closest)); + } // do nothing when dragging + }, + + + /** + * Unselect EventRect. + * @private + */ + unselectRect: function unselectRect() { + var $$ = this; + + $$.svg.select("." + _classes2.default.eventRect).style("cursor", null), $$.hideXGridFocus(), $$.hideTooltip(), $$.unexpandCircles(), $$.unexpandBars(); + }, + + + /** + * Create eventRect for each data on the x-axis. + * Register touch and drag events. + * @private + * @param {Object} D3.select(CLASS.eventRects) object. + * @returns {Object} D3.select(CLASS.eventRects) object. + */ + generateEventRectsForSingleX: function generateEventRectsForSingleX(eventRectEnter) { + var $$ = this, + config = $$.config, + isMouse = $$.inputType === "mouse"; + + + return eventRectEnter.append("rect").attr("class", $$.classEvent.bind($$)).style("cursor", config.data_selection_enabled && config.data_selection_grouped ? "pointer" : null).on(isMouse ? "mouseover" : undefined, function (d) { + if (!($$.dragging || $$.flowing || $$.hasArcType())) { + // do nothing while dragging/flowing + + var index = d.index; + + // Expand shapes for selection + config.point_focus_expand_enabled && $$.expandCircles(index, null, !0), $$.expandBars(index, null, !0), index !== -1 && $$.main.selectAll("." + _classes2.default.shape + "-" + index).each(function (d2) { + return config.data_onover.call($$.api, d2); + }); + } + }).on(isMouse ? "mousemove" : undefined, function (d) { + if (!($$.dragging || $$.flowing || $$.hasArcType())) { + // do nothing while dragging/flowing + + var index = d.index, + eventRect = $$.svg.select("." + _classes2.default.eventRect + "-" + index); + $$.isStepType(d) && $$.config.line_step_type === "step-after" && (0, _d.mouse)(this)[0] < $$.x($$.getXValue(d.id, index)) && (index -= 1), index === -1 ? $$.unselectRect() : $$.selectRectForSingle(this, eventRect, index); + } + }).on(isMouse ? "mouseout" : undefined, function (d) { + if ($$.config && !$$.hasArcType()) { + // chart is destroyed + + var index = d.index; + + $$.unselectRect(), $$.main.selectAll("." + _classes2.default.shape + "-" + index).each(function (d2) { + return config.data_onout.call($$.api, d2); + }); + } + }).on(isMouse ? "click" : undefined, function (d) { + if ($$.hasArcType() || !$$.toggleShape || $$.cancelClick) return void ($$.cancelClick && ($$.cancelClick = !1)); + + var index = d.index; + + $$.main.selectAll("." + _classes2.default.shape + "-" + index).each(function (d2) { + (config.data_selection_grouped || $$.isWithinShape(this, d2)) && ($$.toggleShape(this, d2, index), $$.config.data_onclick.call($$.api, d2, this)); + }); + }).call(config.data_selection_draggable && $$.drag ? (0, _d.drag)().origin(Object).on("drag", function () { + $$.drag((0, _d.mouse)(this)); + }).on("dragstart", function () { + $$.dragstart((0, _d.mouse)(this)); + }).on("dragend", function () { + $$.dragend(); + }) : function () {}); + }, + + + /** + * Create an eventRect, + * Register touch and drag events. + * @private + * @param {Object} D3.select(CLASS.eventRects) object. + * @returns {Object} D3.select(CLASS.eventRects) object. + */ + generateEventRectsForMultipleXs: function generateEventRectsForMultipleXs(eventRectEnter) { + var $$ = this, + config = $$.config, + isMouse = $$.inputType === "mouse"; + + + return eventRectEnter.append("rect").attr("x", 0).attr("y", 0).attr("width", $$.width).attr("height", $$.height).attr("class", _classes2.default.eventRect).on(isMouse ? "mouseover" : undefined, function () { + $$.selectRectForMultipleXs(this); + }).on(isMouse ? "mouseout" : undefined, function () { + !$$.config || $$.hasArcType() || $$.unselectRect(); // chart is destroyed + }).on(isMouse ? "mousemove" : undefined, function () { + $$.selectRectForMultipleXs(this); + }).on(isMouse ? "click" : undefined, function () { + var _this = this, + targetsToShow = $$.filterTargetsToShow($$.data.targets); + + // select if selection enabled + if (!$$.hasArcType(targetsToShow)) { + + var mouse = (0, _d.mouse)(this), + closest = $$.findClosestFromTargets(targetsToShow, mouse); + !closest || ($$.isBarType(closest.id) || $$.dist(closest, mouse) < config.point_sensitivity) && $$.main.selectAll("." + _classes2.default.shapes + $$.getTargetSelectorSuffix(closest.id)).selectAll("." + _classes2.default.shape + "-" + closest.index).each(function () { + (config.data_selection_grouped || $$.isWithinShape(_this, closest)) && ($$.toggleShape(_this, closest, closest.index), $$.config.data_onclick.call($$.api, closest, _this)); + }); + } + }).call(config.data_selection_draggable && $$.drag ? (0, _d.drag)().origin(Object).on("drag", function () { + $$.drag((0, _d.mouse)(this)); + }).on("dragstart", function () { + $$.dragstart((0, _d.mouse)(this)); + }).on("dragend", function () { + $$.dragend(); + }) : function () {}); + }, + + + /** + * Dispatch an event. + * @private + * @param {String} type event type + * @param {Number} index Index of eventRect + * @param {Object} mouse Object + */ + dispatchEvent: function dispatchEvent(type, index, mouse) { + var $$ = this, + selector = $$.isMultipleX() ? "." + _classes2.default.eventRect : _classes2.default.eventRect + "-" + index, + eventRect = $$.main.select(selector).node(), + box = eventRect.getBoundingClientRect(), + x = box.left + (mouse ? mouse[0] : 0), + y = box.top + (mouse ? mouse[1] : 0), + event = document.createEvent("MouseEvents").initMouseEvent(type, !0, !0, window, 0, x, y, x, y, !1, !1, !1, !1, 0, null); + eventRect.dispatchEvent(event); + } +}); + +/***/ }), +/* 33 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _d = __webpack_require__(2), + _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _classes = __webpack_require__(3), + _classes2 = _interopRequireDefault(_classes), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +(0, _util.extend)(_ChartInternal2.default.prototype, { + /** + * Initialize the brush. + * @private + */ + initBrush: function initBrush() { + var $$ = this; + + // set the brush + $$.brush = $$.config.axis_rotated ? (0, _d.brushY)() : (0, _d.brushX)(); + + + // set "brush" event + var brushHandler = function () { + $$.redrawForBrush(); + }; + + $$.brush.on("start", function () { + $$.inputType === "touch" && $$.hideTooltip(), brushHandler(); + }).on("brush", brushHandler), $$.brush.update = function () { + var extent = this.extent()(); + + return extent[1].filter(function (v) { + return isNaN(v); + }).length === 0 && $$.context && $$.context.select("." + _classes2.default.brush).call(this), this; + }, $$.brush.scale = function (scale, height) { + var overlay = $$.svg.select(".bb-brush .overlay"), + extent = [[0, 0]]; + scale.range ? extent.push([scale.range()[1], (height || !overlay.empty()) && ~~overlay.attr("height") || 60]) : scale.constructor === Array && extent.push(scale), $$.config.axis_rotated && extent.reverse(), this.extent($$.config.axis_x_extent || extent), this.update(); + }, $$.brush.getSelection = function () { + return $$.context ? $$.context.select("." + _classes2.default.brush) : (0, _d.select)([]); + }; + }, + + + /** + * Initialize the subchart. + * @private + */ + initSubchart: function initSubchart() { + var $$ = this, + config = $$.config, + visibility = config.subchart_show ? "visible" : "hidden"; + $$.context = $$.svg.append("g").attr("transform", $$.getTranslate("context")); + + + var context = $$.context; + + context.style("visibility", visibility), context.append("g").attr("clip-path", $$.clipPathForSubchart).attr("class", _classes2.default.chart), context.select("." + _classes2.default.chart).append("g").attr("class", _classes2.default.chartBars), context.select("." + _classes2.default.chart).append("g").attr("class", _classes2.default.chartLines), context.append("g").attr("clip-path", $$.clipPath).attr("class", _classes2.default.brush).call($$.brush), $$.axes.subx = context.append("g").attr("class", _classes2.default.axisX).attr("transform", $$.getTranslate("subx")).attr("clip-path", config.axis_rotated ? "" : $$.clipPathForXAxis).style("visibility", config.subchart_axis_x_show ? visibility : "hidden"); + }, + + + /** + * Update sub chart + * @private + * @param {Object} $$.data.targets + */ + updateTargetsForSubchart: function updateTargetsForSubchart(targets) { + var $$ = this, + context = $$.context, + config = $$.config, + classChartBar = $$.classChartBar.bind($$), + classBars = $$.classBars.bind($$), + classChartLine = $$.classChartLine.bind($$), + classLines = $$.classLines.bind($$), + classAreas = $$.classAreas.bind($$); + + + if (config.subchart_show) { + // -- Bar --// + var contextBarUpdate = context.select("." + _classes2.default.chartBars).selectAll("." + _classes2.default.chartBar).data(targets).attr("class", classChartBar), + contextBarEnter = contextBarUpdate.enter().append("g").style("opacity", "0").attr("class", classChartBar).merge(contextBarUpdate); + + + // Bars for each data + contextBarEnter.append("g").attr("class", classBars); + + + // -- Line --// + var contextLineUpdate = context.select("." + _classes2.default.chartLines).selectAll("." + _classes2.default.chartLine).data(targets).attr("class", classChartLine), + contextLineEnter = contextLineUpdate.enter().append("g").style("opacity", "0").attr("class", classChartLine).merge(contextLineUpdate); + + + // Lines for each data + contextLineEnter.append("g").attr("class", classLines), contextLineEnter.append("g").attr("class", classAreas), context.selectAll("." + _classes2.default.brush + " rect").attr(config.axis_rotated ? "width" : "height", config.axis_rotated ? $$.width2 : $$.height2); + } + }, + + + /** + * Update the bar of the sub chart + * @private + * @param {Object} durationForExit + */ + updateBarForSubchart: function updateBarForSubchart(durationForExit) { + var $$ = this; + + $$.contextBar = $$.context.selectAll("." + _classes2.default.bars).selectAll("." + _classes2.default.bar).data($$.barData.bind($$)), $$.contextBar.exit().transition().duration(durationForExit).style("opacity", "0").remove(), $$.contextBar = $$.contextBar.enter().append("path").attr("class", $$.classBar.bind($$)).style("stroke", "none").style("fill", $$.color).merge($$.contextBar).style("opacity", $$.initialOpacity.bind($$)); + }, + + + /** + * Redraw the bar of the subchart + * @private + * @param {String} path in subchart bar + * @param {Boolean} whether or not to transition. + * @param {Number} transition duration + */ + redrawBarForSubchart: function redrawBarForSubchart(drawBarOnSub, withTransition, duration) { + var contextBar = void 0; + + contextBar = withTransition ? this.contextBar.transition(Math.random().toString()).duration(duration) : this.contextBar, contextBar.attr("d", drawBarOnSub).style("opacity", "1"); + }, + + + /** + * Update the line of the sub chart + * @private + * @param {Number} Fade-out transition duration + */ + updateLineForSubchart: function updateLineForSubchart(durationForExit) { + var $$ = this; + + $$.contextLine = $$.context.selectAll("." + _classes2.default.lines).selectAll("." + _classes2.default.line).data($$.lineData.bind($$)), $$.contextLine.exit().transition().duration(durationForExit).style("opacity", "0").remove(), $$.contextLine = $$.contextLine.enter().append("path").attr("class", $$.classLine.bind($$)).style("stroke", $$.color).merge($$.contextLine).style("opacity", $$.initialOpacity.bind($$)); + }, + + + /** + * Redraw the line of the subchart + * @private + * @param {String} path in subchart line + * @param {Boolean} whether or not to transition + * @param {Number} transition duration + */ + redrawLineForSubchart: function redrawLineForSubchart(drawLineOnSub, withTransition, duration) { + var contextLine = void 0; + + contextLine = withTransition ? this.contextLine.transition(Math.random().toString()).duration(duration) : this.contextLine, contextLine.attr("d", drawLineOnSub).style("opacity", "1"); + }, + + + /** + * Update the area of the sub chart + * @private + * @param {Number} Fade-out transition duration + */ + updateAreaForSubchart: function updateAreaForSubchart(durationForExit) { + var $$ = this; + + $$.contextArea = $$.context.selectAll("." + _classes2.default.areas).selectAll("." + _classes2.default.area).data($$.lineData.bind($$)), $$.contextArea.exit().transition().duration(durationForExit).style("opacity", "0").remove(), $$.contextArea = $$.contextArea.enter().append("path").attr("class", $$.classArea.bind($$)).style("fill", $$.color).style("opacity", function () { + return $$.orgAreaOpacity = (0, _d.select)(this).style("opacity"), "0"; + }).merge($$.contextArea).style("opacity", "0"); + }, + + /** + * Redraw the area of the subchart + * @private + * @param {String} path in subchart line + * @param {Boolean} whether or not to transition + * @param {Number} transition duration + */ + redrawAreaForSubchart: function redrawAreaForSubchart(drawAreaOnSub, withTransition, duration) { + var contextArea = void 0; + + contextArea = withTransition ? this.contextArea.transition(Math.random().toString()).duration(duration) : this.contextArea, contextArea.attr("d", drawAreaOnSub).style("fill", this.color).style("opacity", this.orgAreaOpacity); + }, + + + /** + * Redraw subchart. + * @private + * @param {Boolean} whether or not to show subchart + * @param Do not use. + * @param {Number} transition duration + * @param Do not use. + * @param {Object} area Indices + * @param {Object} bar Indices + * @param {Object} line Indices + */ + redrawSubchart: function redrawSubchart(withSubchart, transitions, duration, durationForExit, areaIndices, barIndices, lineIndices) { + var $$ = this, + config = $$.config; + + + // subchart + if ($$.context.style("visibility", config.subchart_show ? "visible" : "hidden"), config.subchart_show && (_d.event && _d.event.type === "zoom" && $$.brush.update(), withSubchart)) { + $$.brushEmpty() || $$.brush.update(); + + + // setup drawer - MEMO: this must be called after axis updated + var drawAreaOnSub = $$.generateDrawArea(areaIndices, !0), + drawBarOnSub = $$.generateDrawBar(barIndices, !0), + drawLineOnSub = $$.generateDrawLine(lineIndices, !0); + $$.updateBarForSubchart(duration), $$.updateLineForSubchart(duration), $$.updateAreaForSubchart(duration), $$.redrawBarForSubchart(drawBarOnSub, duration, duration), $$.redrawLineForSubchart(drawLineOnSub, duration, duration), $$.redrawAreaForSubchart(drawAreaOnSub, duration, duration); + } + }, + + /** + * Redraw the brush. + * @private + */ + redrawForBrush: function redrawForBrush() { + var $$ = this, + x = $$.x; + $$.redraw({ + withTransition: !1, + withY: $$.config.zoom_rescale, + withSubchart: !1, + withUpdateXDomain: !0, + withDimension: !1 + }), $$.config.subchart_onbrush.call($$.api, x.orgDomain()); + }, + + + /** + * Transform context + * @private + * @param {Boolean} indicates transition is enabled + * @param {Object} The return value of the generateTransitions method of Axis. + */ + transformContext: function transformContext(withTransition, transitions) { + var $$ = this, + subXAxis = void 0; + transitions && transitions.axisSubX ? subXAxis = transitions.axisSubX : (subXAxis = $$.context.select("." + _classes2.default.axisX), withTransition && (subXAxis = subXAxis.transition())), $$.context.attr("transform", $$.getTranslate("context")), subXAxis.attr("transform", $$.getTranslate("subx")); + }, + + + /** + * Get default extent + * @private + * @returns {Array} default extent + */ + getDefaultExtent: function getDefaultExtent() { + var $$ = this, + config = $$.config, + extent = (0, _util.isFunction)(config.axis_x_extent) ? config.axis_x_extent($$.getXDomain($$.data.targets)) : config.axis_x_extent; + + + return $$.isTimeSeries() && (extent = [$$.parseDate(extent[0]), $$.parseDate(extent[1])]), extent; + } +}); + +/***/ }), +/* 34 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _d = __webpack_require__(2), + _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _classes = __webpack_require__(3), + _classes2 = _interopRequireDefault(_classes), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +(0, _util.extend)(_ChartInternal2.default.prototype, { + /** + * Initialize zoom. + * @private + */ + initZoom: function initZoom() { + var $$ = this, + config = $$.config, + startEvent = void 0; + $$.zoomScale = null, $$.zoom = (0, _d.zoom)().duration(0).on("start", function () { + startEvent = _d.event.sourceEvent, $$.zoom.altDomain = _d.event.sourceEvent.altKey ? $$.x.orgDomain() : null, config.zoom_onzoomstart.call($$.api, _d.event.sourceEvent); + }).on("zoom", function () { + $$.redrawForZoom.call($$); + }).on("end", function () { + var event = _d.event.sourceEvent; + + // if click, do nothing. otherwise, click interaction will be canceled. + event && startEvent.clientX === event.clientX && startEvent.clientY === event.clientY || ($$.redrawEventRect(), $$.updateZoom(), config.zoom_onzoomend.call($$.api, $$.x.orgDomain())); + }), $$.zoom.orgScaleExtent = function () { + var extent = config.zoom_extent ? config.zoom_extent : [1, 10]; + + return [extent[0], Math.max($$.getMaxDataCount() / extent[1], extent[1])]; + }, $$.zoom.updateScaleExtent = function () { + var ratio = (0, _util.diffDomain)($$.x.orgDomain()) / (0, _util.diffDomain)($$.getZoomDomain()), + extent = this.orgScaleExtent(); + + return this.scaleExtent([extent[0] * ratio, extent[1] * ratio]), this; + }, $$.zoom.updateTransformScale = function (transform) { + var newScale = transform.rescaleX($$.x); + + newScale.domain($$.trimXDomain(newScale.domain())), $$.zoomScale = newScale, $$.xAxis.scale($$.zoomScale), $$.main.select("." + _classes2.default.eventRects).node().__zoom = transform; + }; + }, + + + /** + * Get zoom domain + * @private + * @returns {Array} zoom domain + */ + getZoomDomain: function getZoomDomain() { + var $$ = this, + config = $$.config, + min = (0, _d.min)([$$.orgXDomain[0], config.zoom_x_min]), + max = (0, _d.max)([$$.orgXDomain[1], config.zoom_x_max]); + + + return [min, max]; + }, + + + /** + * Update zoom + * @private + */ + updateZoom: function updateZoom() { + var $$ = this, + z = $$.config.zoom_enabled ? $$.zoom : function () {}; + + + // bind zoom module + // $$.main.select(`.${CLASS.zoomRect}`) + // .call(z) + // .on("dblclick.zoom", null); + + $$.main.select("." + _classes2.default.eventRects).call(z).on("dblclick.zoom", null); + }, + + + /** + * Redraw the zoom. + * @private + */ + redrawForZoom: function redrawForZoom() { + var $$ = this, + config = $$.config; + + + if (config.zoom_enabled) { + var zoom = $$.zoom, + x = $$.x, + event = _d.event, + transform = event.transform; + return $$.zoom.updateTransformScale(transform), $$.filterTargetsToShow($$.data.targets).length === 0 ? void 0 : event.sourceEvent.type === "mousemove" && zoom.altDomain ? (x.domain(zoom.altDomain), void transform.scale($$.zoomScale).updateScaleExtent()) : void ($$.isCategorized() && x.orgDomain()[0] === $$.orgXDomain[0] && x.domain([$$.orgXDomain[0] - 1e-10, x.orgDomain()[1]]), $$.redraw({ + withTransition: !1, + withY: config.zoom_rescale, + withSubchart: !1, + withEventRect: !1, + withDimension: !1 + }), event.sourceEvent.type === "mousemove" && ($$.cancelClick = !0), config.zoom_onzoom.call($$.api, x.orgDomain())); + } + } +}); + +/***/ }), +/* 35 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _d = __webpack_require__(2), + _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _classes = __webpack_require__(3), + _classes2 = _interopRequireDefault(_classes), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +(0, _util.extend)(_ChartInternal2.default.prototype, { + initPie: function initPie() { + var $$ = this, + config = $$.config; + $$.pie = (0, _d.pie)().padAngle(config[config.data_type + "_padAngle"] || 0).value(function (d) { + return d.values.reduce(function (a, b) { + return a + b.value; + }, 0); + }), config.data_order || $$.pie.sort(null); + }, + updateRadius: function updateRadius() { + var $$ = this, + config = $$.config, + w = config.gauge_width || config.donut_width; + $$.radiusExpanded = Math.min($$.arcWidth, $$.arcHeight) / 2, $$.radius = $$.radiusExpanded * 0.95, $$.innerRadiusRatio = w ? ($$.radius - w) / $$.radius : 0.6, $$.innerRadius = $$.hasType("donut") || $$.hasType("gauge") ? $$.radius * $$.innerRadiusRatio : 0; + }, + updateArc: function updateArc() { + var $$ = this; + + $$.svgArc = $$.getSvgArc(), $$.svgArcExpanded = $$.getSvgArcExpanded(), $$.svgArcExpandedSub = $$.getSvgArcExpanded(0.98); + }, + updateAngle: function updateAngle(dValue) { + var $$ = this, + config = $$.config, + d = dValue, + found = !1, + index = 0, + gMin = void 0, + gMax = void 0, + gTic = void 0, + gValue = void 0; + return config ? ($$.pie($$.filterTargetsToShow($$.data.targets)).forEach(function (t) { + found || t.data.id !== d.data.id || (found = !0, d = t, d.index = index), index++; + }), isNaN(d.startAngle) && (d.startAngle = 0), isNaN(d.endAngle) && (d.endAngle = d.startAngle), $$.isGaugeType(d.data) && (gMin = config.gauge_min, gMax = config.gauge_max, gTic = Math.PI * (config.gauge_fullCircle ? 2 : 1) / (gMax - gMin), gValue = d.value < gMin ? 0 : d.value < gMax ? d.value - gMin : gMax - gMin, d.startAngle = config.gauge_startingAngle, d.endAngle = d.startAngle + gTic * gValue), found ? d : null) : null; + }, + getSvgArc: function getSvgArc() { + var $$ = this, + arc = (0, _d.arc)().outerRadius($$.radius).innerRadius($$.innerRadius), + newArc = function (d, withoutUpdate) { + if (withoutUpdate) return arc(d); // for interpolate + + var updated = $$.updateAngle(d); + + return updated ? arc(updated) : "M 0 0"; + }; + + // TODO: extends all function + + + return newArc.centroid = arc.centroid, newArc; + }, + getSvgArcExpanded: function getSvgArcExpanded(rate) { + var $$ = this, + arc = (0, _d.arc)().outerRadius($$.radiusExpanded * (rate || 1)).innerRadius($$.innerRadius); + + + return function (d) { + var updated = $$.updateAngle(d); + + return updated ? arc(updated) : "M 0 0"; + }; + }, + getArc: function getArc(d, withoutUpdate, force) { + return force || this.isArcType(d.data) ? this.svgArc(d, withoutUpdate) : "M 0 0"; + }, + transformForArcLabel: function transformForArcLabel(d) { + var $$ = this, + config = $$.config, + updated = $$.updateAngle(d), + c = void 0, + x = void 0, + y = void 0, + h = void 0, + ratio = void 0, + translate = ""; + + return updated && !$$.hasType("gauge") && (c = this.svgArc.centroid(updated), x = isNaN(c[0]) ? 0 : c[0], y = isNaN(c[1]) ? 0 : c[1], h = Math.sqrt(x * x + y * y), ratio = $$.hasType("donut") && config.donut_label_ratio ? (0, _util.isFunction)(config.donut_label_ratio) ? config.donut_label_ratio(d, $$.radius, h) : config.donut_label_ratio : $$.hasType("pie") && config.pie_label_ratio ? (0, _util.isFunction)(config.pie_label_ratio) ? config.pie_label_ratio(d, $$.radius, h) : config.pie_label_ratio : $$.radius && (h ? (36 / $$.radius > 0.375 ? 1.175 - 36 / $$.radius : 0.8) * $$.radius / h : 0), translate = "translate(" + x * ratio + "," + y * ratio + ")"), translate; + }, + getArcRatio: function getArcRatio(d) { + var $$ = this, + config = $$.config, + whole = Math.PI * ($$.hasType("gauge") && !config.gauge_fullCircle ? 1 : 2); + + + return d ? (d.endAngle - d.startAngle) / whole : null; + }, + convertToArcData: function convertToArcData(d) { + return this.addName({ + id: d.data.id, + value: d.value, + ratio: this.getArcRatio(d), + index: d.index + }); + }, + textForArcLabel: function textForArcLabel(d) { + var $$ = this; + + if (!$$.shouldShowArcLabel()) return ""; + var updated = $$.updateAngle(d), + value = updated ? updated.value : null, + ratio = $$.getArcRatio(updated), + id = d.data.id; + + + if (!$$.hasType("gauge") && !$$.meetsArcLabelThreshold(ratio)) return ""; + var format = $$.getArcLabelFormat(); + + return format ? format(value, ratio, id) : $$.defaultArcValueFormat(value, ratio); + }, + textForGaugeMinMax: function textForGaugeMinMax(value, isMax) { + var format = this.getGaugeLabelExtents(); + + return format ? format(value, isMax) : value; + }, + expandArc: function expandArc(targetIds) { + var $$ = this, + interval = void 0; + + + // MEMO: avoid to cancel transition + if ($$.transiting) return void (interval = window.setInterval(function () { + $$.transiting || (window.clearInterval(interval), $$.legend.selectAll(".bb-legend-item-focused").size() > 0 && $$.expandArc(targetIds)); + }, 10)); + + var newTargetIds = $$.mapToTargetIds(targetIds); + + $$.svg.selectAll($$.selectorTargets(newTargetIds, "." + _classes2.default.chartArc)).each(function (d) { + $$.shouldExpand(d.data.id) && (0, _d.select)(this).selectAll("path").transition().duration($$.expandDuration(d.data.id)).attr("d", $$.svgArcExpanded).transition().duration($$.expandDuration(d.data.id) * 2).attr("d", $$.svgArcExpandedSub).each(function (v) { + $$.isDonutType(v.data); + }); + }); + }, + unexpandArc: function unexpandArc(targetIds) { + var $$ = this; + + if (!$$.transiting) { + + var newTargetIds = $$.mapToTargetIds(targetIds); + + $$.svg.selectAll($$.selectorTargets(newTargetIds, "." + _classes2.default.chartArc)).selectAll("path").transition().duration(function (d) { + return $$.expandDuration(d.data.id); + }).attr("d", $$.svgArc), $$.svg.selectAll("" + _classes2.default.arc).style("opacity", "1"); + } + }, + expandDuration: function expandDuration(id) { + var $$ = this, + config = $$.config; + return $$.isDonutType(id) ? config.donut_expand_duration : $$.isGaugeType(id) ? config.gauge_expand_duration : $$.isPieType(id) ? config.pie_expand_duration : 50; + }, + shouldExpand: function shouldExpand(id) { + var $$ = this, + config = $$.config; + + + return $$.isDonutType(id) && config.donut_expand || $$.isGaugeType(id) && config.gauge_expand || $$.isPieType(id) && config.pie_expand; + }, + shouldShowArcLabel: function shouldShowArcLabel() { + var $$ = this, + config = $$.config, + shouldShow = !0; + + // when gauge, always true + return $$.hasType("donut") ? shouldShow = config.donut_label_show : $$.hasType("pie") && (shouldShow = config.pie_label_show), shouldShow; + }, + meetsArcLabelThreshold: function meetsArcLabelThreshold(ratio) { + var $$ = this, + config = $$.config, + threshold = $$.hasType("donut") ? config.donut_label_threshold : config.pie_label_threshold; + + + return ratio >= threshold; + }, + getArcLabelFormat: function getArcLabelFormat() { + var $$ = this, + config = $$.config, + format = config.pie_label_format; + + return $$.hasType("gauge") ? format = config.gauge_label_format : $$.hasType("donut") && (format = config.donut_label_format), format; + }, + getGaugeLabelExtents: function getGaugeLabelExtents() { + var config = this.config; + + return config.gauge_label_extents; + }, + getArcTitle: function getArcTitle() { + var $$ = this; + + return $$.hasType("donut") ? $$.config.donut_title : ""; + }, + updateTargetsForArc: function updateTargetsForArc(targets) { + var $$ = this, + main = $$.main, + classChartArc = $$.classChartArc.bind($$), + classArcs = $$.classArcs.bind($$), + classFocus = $$.classFocus.bind($$), + mainPieUpdate = main.select("." + _classes2.default.chartArcs).selectAll("." + _classes2.default.chartArc).data($$.pie(targets)).attr("class", function (d) { + return classChartArc(d) + classFocus(d.data); + }), + mainPieEnter = mainPieUpdate.enter().append("g").attr("class", classChartArc); + mainPieEnter.append("g").attr("class", classArcs).merge(mainPieUpdate), mainPieEnter.append("text").attr("dy", $$.hasType("gauge") ? "-.1em" : ".35em").style("opacity", "0").style("text-anchor", "middle").style("pointer-events", "none"); + }, + initArc: function initArc() { + var $$ = this; + + $$.arcs = $$.main.select("." + _classes2.default.chart).append("g").attr("class", _classes2.default.chartArcs).attr("transform", $$.getTranslate("arc")), $$.arcs.append("text").attr("class", _classes2.default.chartArcsTitle).style("text-anchor", "middle").text($$.getArcTitle()); + }, + redrawArc: function redrawArc(duration, durationForExit, withTransform) { + + function selectArc(_this, arcData, id) { + $$.expandArc(id), $$.api.focus(id), $$.toggleFocusLegend(id, !0), $$.showTooltip([arcData], _this); + } + + function unselectArc(arcData) { + var id = arcData && arcData.id || undefined; + + $$.unexpandArc(id), $$.api.revert(), $$.revertLegend(), $$.hideTooltip(); + } + + var $$ = this, + config = $$.config, + main = $$.main, + isTouch = $$.inputType === "touch", + isMouse = $$.inputType === "mouse", + mainArc = main.selectAll("." + _classes2.default.arcs).selectAll("." + _classes2.default.arc).data($$.arcData.bind($$)); + + + if (mainArc.exit().transition().duration(durationForExit).style("opacity", "0").remove(), mainArc = mainArc.enter().append("path").attr("class", $$.classArc.bind($$)).style("fill", function (d) { + return $$.color(d.data); + }).style("cursor", function (d) { + return config.interaction_enabled && (config.data_selection_isselectable(d) ? "pointer" : null); + }).style("opacity", "0").each(function (d) { + $$.isGaugeType(d.data) && (d.startAngle = config.gauge_startingAngle, d.endAngle = config.gauge_startingAngle), this._current = d; + }).merge(mainArc), mainArc.attr("transform", function (d) { + return !$$.isGaugeType(d.data) && withTransform ? "scale(0)" : ""; + }).style("opacity", function (d) { + return d === this._current ? "0" : "1"; + }).on(isMouse ? "mouseover" : undefined, config.interaction_enabled ? function (d) { + if (!$$.transiting) // skip while transiting + { + + var updated = $$.updateAngle(d), + arcData = updated ? $$.convertToArcData(updated) : null, + id = arcData && arcData.id || undefined; + selectArc(this, arcData, id), $$.config.data_onover(arcData, this); + } + } : null).on(isMouse ? "mouseout" : undefined, config.interaction_enabled ? function (d) { + if (!$$.transiting) // skip while transiting + { + var updated = $$.updateAngle(d), + arcData = updated ? $$.convertToArcData(updated) : null; + unselectArc(), $$.config.data_onout(arcData, this); + } + } : null).on(isMouse ? "mousemove" : undefined, config.interaction_enabled ? function (d) { + var updated = $$.updateAngle(d), + arcData = updated ? $$.convertToArcData(updated) : null; + $$.showTooltip([arcData], this); + } : null).on(isMouse ? "click" : undefined, config.interaction_enabled ? function (d, i) { + var updated = $$.updateAngle(d), + arcData = void 0; + updated && (arcData = $$.convertToArcData(updated), $$.toggleShape && $$.toggleShape(this, arcData, i), $$.config.data_onclick.call($$.api, arcData, this)); + } : null).each(function () { + $$.transiting = !0; + }).transition().duration(duration).attrTween("d", function (d) { + var updated = $$.updateAngle(d); + + if (!updated) return function () { + return "M 0 0"; + }; + + isNaN(this._current.startAngle) && (this._current.startAngle = 0), isNaN(this._current.endAngle) && (this._current.endAngle = this._current.startAngle); + + + var interpolate = (0, _d.interpolate)(this._current, updated); + + return this._current = interpolate(0), function (t) { + var interpolated = interpolate(t); + + // data.id will be updated by interporator + return interpolated.data = d.data, $$.getArc(interpolated, !0); + }; + }).attr("transform", withTransform ? "scale(1)" : "").style("fill", function (d) { + return $$.levelColor ? $$.levelColor(d.data.values[0].value) : $$.color(d.data.id); + } + // Where gauge reading color would receive customization. + ).style("opacity", "1").call($$.endall, function () { + $$.transiting = !1; + }), isTouch && config.interaction_enabled && $$.hasArcType()) { + var getEventArc = function () { + var touch = _d.event.changedTouches[0], + eventArc = (0, _d.select)(document.elementFromPoint(touch.clientX, touch.clientY)); + + + return eventArc; + }; + + $$.svg.on("touchstart", function () { + if (!$$.transiting) // skip while transiting + { + + var eventArc = getEventArc(), + datum = eventArc.datum(), + updated = datum && datum.data && datum.data.id ? $$.updateAngle(datum) : null, + arcData = updated ? $$.convertToArcData(updated) : null, + id = arcData && arcData.id || undefined; + id === undefined ? unselectArc() : selectArc(this, arcData, id), $$.config.data_onover(arcData, this); + } + }).on("touchend", function () { + if (!$$.transiting) // skip while transiting + { + var eventArc = getEventArc(), + datum = eventArc.datum(), + updated = datum && datum.data && datum.data.id ? $$.updateAngle(datum) : null, + arcData = updated ? $$.convertToArcData(updated) : null, + id = arcData && arcData.id || undefined; + id === undefined ? unselectArc() : selectArc(this, arcData, id), $$.config.data_onout(arcData, this); + } + }).on("touchmove", function () { + var eventArc = getEventArc(), + datum = eventArc.datum(), + updated = datum && datum.data && datum.data.id ? $$.updateAngle(datum) : null, + arcData = updated ? $$.convertToArcData(updated) : null, + id = arcData && arcData.id || undefined; + id === undefined ? unselectArc() : selectArc(this, arcData, id); + }); + } + + main.selectAll("." + _classes2.default.chartArc).select("text").style("opacity", "0").attr("class", function (d) { + return $$.isGaugeType(d.data) ? _classes2.default.gaugeValue : ""; + }).text($$.textForArcLabel.bind($$)).attr("transform", $$.transformForArcLabel.bind($$)).style("font-size", function (d) { + return $$.isGaugeType(d.data) ? Math.round($$.radius / 5) + "px" : ""; + }).transition().duration(duration).style("opacity", function (d) { + return $$.isTargetToShow(d.data.id) && $$.isArcType(d.data) ? "1" : "0"; + }), main.select("." + _classes2.default.chartArcsTitle).style("opacity", $$.hasType("donut") || $$.hasType("gauge") ? "1" : "0"), $$.hasType("gauge") && ($$.arcs.select("." + _classes2.default.chartArcsBackground).attr("d", function () { + var d = { + data: [{ value: config.gauge_max }], + startAngle: config.gauge_startingAngle, + endAngle: -1 * config.gauge_startingAngle + }; + + return $$.getArc(d, !0, !0); + }), $$.arcs.select("." + _classes2.default.chartArcsGaugeUnit).attr("dy", ".75em").text(config.gauge_label_show ? config.gauge_units : ""), $$.arcs.select("." + _classes2.default.chartArcsGaugeMin).attr("dx", -1 * ($$.innerRadius + ($$.radius - $$.innerRadius) / (config.gauge_fullCircle ? 1 : 2)) + "px").attr("dy", "1.2em").text(config.gauge_label_show ? $$.textForGaugeMinMax(config.gauge_min, !1) : ""), $$.arcs.select("." + _classes2.default.chartArcsGaugeMax).attr("dx", $$.innerRadius + ($$.radius - $$.innerRadius) / (config.gauge_fullCircle ? 1 : 2) + "px").attr("dy", "1.2em").text(config.gauge_label_show ? $$.textForGaugeMinMax(config.gauge_max, !0) : "")); + }, + initGauge: function initGauge() { + var arcs = this.arcs; + + this.hasType("gauge") && (arcs.append("path").attr("class", _classes2.default.chartArcsBackground), arcs.append("text").attr("class", _classes2.default.chartArcsGaugeUnit).style("text-anchor", "middle").style("pointer-events", "none"), arcs.append("text").attr("class", _classes2.default.chartArcsGaugeMin).style("text-anchor", "middle").style("pointer-events", "none"), arcs.append("text").attr("class", _classes2.default.chartArcsGaugeMax).style("text-anchor", "middle").style("pointer-events", "none")); + }, + getGaugeLabelHeight: function getGaugeLabelHeight() { + return this.config.gauge_label_show ? 20 : 0; + } +}); + +/***/ }), +/* 36 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +(0, _util.extend)(_ChartInternal2.default.prototype, { + hasCaches: function hasCaches(ids) { + for (var i = 0; i < ids.length; i++) if (!(ids[i] in this.cache)) return !1; + + return !0; + }, + addCache: function addCache(id, target) { + this.cache[id] = this.cloneTarget(target); + }, + getCaches: function getCaches(ids) { + var targets = []; + + for (var i = 0; i < ids.length; i++) ids[i] in this.cache && targets.push(this.cloneTarget(this.cache[ids[i]])); + return targets; + } +}); + +/***/ }), +/* 37 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +(0, _util.extend)(_ChartInternal2.default.prototype, { + /** + * Category Name + * @private + * @param {Number} index + * @returns {String} gategory Name + */ + categoryName: function categoryName(i) { + var config = this.config; + + return i < config.axis_x_categories.length ? config.axis_x_categories[i] : i; + } +}); + +/***/ }), +/* 38 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _classes = __webpack_require__(3), + _classes2 = _interopRequireDefault(_classes), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +(0, _util.extend)(_ChartInternal2.default.prototype, { + CLASS: _classes2.default, + + generateClass: function generateClass(prefix, targetId) { + return " " + prefix + " " + (prefix + this.getTargetSelectorSuffix(targetId)); + }, + classText: function classText(d) { + return this.generateClass(_classes2.default.text, d.index); + }, + classTexts: function classTexts(d) { + return this.generateClass(_classes2.default.texts, d.id); + }, + classShape: function classShape(d) { + return this.generateClass(_classes2.default.shape, d.index); + }, + classShapes: function classShapes(d) { + return this.generateClass(_classes2.default.shapes, d.id); + }, + classLine: function classLine(d) { + return this.classShape(d) + this.generateClass(_classes2.default.line, d.id); + }, + classLines: function classLines(d) { + return this.classShapes(d) + this.generateClass(_classes2.default.lines, d.id); + }, + classCircle: function classCircle(d) { + return this.classShape(d) + this.generateClass(_classes2.default.circle, d.index); + }, + classCircles: function classCircles(d) { + return this.classShapes(d) + this.generateClass(_classes2.default.circles, d.id); + }, + classBar: function classBar(d) { + return this.classShape(d) + this.generateClass(_classes2.default.bar, d.index); + }, + classBars: function classBars(d) { + return this.classShapes(d) + this.generateClass(_classes2.default.bars, d.id); + }, + classArc: function classArc(d) { + return this.classShape(d.data) + this.generateClass(_classes2.default.arc, d.data.id); + }, + classArcs: function classArcs(d) { + return this.classShapes(d.data) + this.generateClass(_classes2.default.arcs, d.data.id); + }, + classArea: function classArea(d) { + return this.classShape(d) + this.generateClass(_classes2.default.area, d.id); + }, + classAreas: function classAreas(d) { + return this.classShapes(d) + this.generateClass(_classes2.default.areas, d.id); + }, + classRegion: function classRegion(d, i) { + return this.generateClass(_classes2.default.region, i) + " " + ("class" in d ? d.class : ""); + }, + classEvent: function classEvent(d) { + return this.generateClass(_classes2.default.eventRect, d.index); + }, + classTarget: function classTarget(id) { + var additionalClassSuffix = this.config.data_classes[id], + additionalClass = ""; + + + return additionalClassSuffix && (additionalClass = " " + _classes2.default.target + "-" + additionalClassSuffix), this.generateClass(_classes2.default.target, id) + additionalClass; + }, + classFocus: function classFocus(d) { + return this.classFocused(d) + this.classDefocused(d); + }, + classFocused: function classFocused(d) { + return " " + (this.focusedTargetIds.indexOf(d.id) >= 0 ? _classes2.default.focused : ""); + }, + classDefocused: function classDefocused(d) { + return " " + (this.defocusedTargetIds.indexOf(d.id) >= 0 ? _classes2.default.defocused : ""); + }, + classChartText: function classChartText(d) { + return _classes2.default.chartText + this.classTarget(d.id); + }, + classChartLine: function classChartLine(d) { + return _classes2.default.chartLine + this.classTarget(d.id); + }, + classChartBar: function classChartBar(d) { + return _classes2.default.chartBar + this.classTarget(d.id); + }, + classChartArc: function classChartArc(d) { + return _classes2.default.chartArc + this.classTarget(d.data.id); + }, + getTargetSelectorSuffix: function getTargetSelectorSuffix(targetId) { + return targetId || targetId === 0 ? ("-" + targetId).replace(/[\s?!@#$%^&*()_=+,.<>'":;\[\]\/|~`{}\\]/g, "-") : ""; + }, + selectorTarget: function selectorTarget(id, prefix) { + return (prefix || "") + "." + (_classes2.default.target + this.getTargetSelectorSuffix(id)); + }, + selectorTargets: function selectorTargets(idsValue, prefix) { + var $$ = this, + ids = idsValue || []; + + + return ids.length ? ids.map(function (id) { + return $$.selectorTarget(id, prefix); + }) : null; + }, + selectorLegend: function selectorLegend(id) { + return "." + (_classes2.default.legendItem + this.getTargetSelectorSuffix(id)); + }, + selectorLegends: function selectorLegends(ids) { + var $$ = this; + + return ids && ids.length ? ids.map(function (id) { + return $$.selectorLegend(id); + }) : null; + } +}); /** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ + +/***/ }), +/* 39 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +(0, _util.extend)(_ChartInternal2.default.prototype, { + getClipPath: function getClipPath(id) { + var isIE9 = window.navigator.appVersion.toLowerCase().indexOf("msie 9.") >= 0; + + return "url(" + (isIE9 ? "" : document.URL.split("#")[0]) + "#" + id + ")"; + }, + appendClip: function appendClip(parent, id) { + return parent.append("clipPath").attr("id", id).append("rect"); + }, + getAxisClipX: function getAxisClipX(forHorizontal) { + // axis line width + padding for left + var left = Math.max(30, this.margin.left); + + return forHorizontal ? -(1 + left) : -(left - 1); + }, + getAxisClipY: function getAxisClipY(forHorizontal) { + return forHorizontal ? -20 : -this.margin.top; + }, + getXAxisClipX: function getXAxisClipX() { + var $$ = this; + + return $$.getAxisClipX(!$$.config.axis_rotated); + }, + getXAxisClipY: function getXAxisClipY() { + var $$ = this; + + return $$.getAxisClipY(!$$.config.axis_rotated); + }, + getYAxisClipX: function getYAxisClipX() { + var $$ = this; + + return $$.config.axis_y_inner ? -1 : $$.getAxisClipX($$.config.axis_rotated); + }, + getYAxisClipY: function getYAxisClipY() { + var $$ = this; + + return $$.getAxisClipY($$.config.axis_rotated); + }, + getAxisClipWidth: function getAxisClipWidth(forHorizontal) { + var $$ = this, + left = Math.max(30, $$.margin.left), + right = Math.max(30, $$.margin.right); + + + // width + axis line width + padding for left/right + return forHorizontal ? $$.width + 2 + left + right : $$.margin.left + 20; + }, + getAxisClipHeight: function getAxisClipHeight(forHorizontal) { + // less than 20 is not enough to show the axis label 'outer' without legend + return (forHorizontal ? this.margin.bottom : this.margin.top + this.height) + 20; + }, + getXAxisClipWidth: function getXAxisClipWidth() { + var $$ = this; + + return $$.getAxisClipWidth(!$$.config.axis_rotated); + }, + getXAxisClipHeight: function getXAxisClipHeight() { + var $$ = this; + + return $$.getAxisClipHeight(!$$.config.axis_rotated); + }, + getYAxisClipWidth: function getYAxisClipWidth() { + var $$ = this; + + return $$.getAxisClipWidth($$.config.axis_rotated) + ($$.config.axis_y_inner ? 20 : 0); + }, + getYAxisClipHeight: function getYAxisClipHeight() { + var $$ = this; + + return $$.getAxisClipHeight($$.config.axis_rotated); + } +}); + +/***/ }), +/* 40 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _d = __webpack_require__(2), + _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +(0, _util.extend)(_ChartInternal2.default.prototype, { + generateColor: function generateColor() { + var $$ = this, + config = $$.config, + colors = config.data_colors, + callback = config.data_color, + ids = [], + pattern = (0, _util.notEmpty)(config.color_pattern) ? config.color_pattern : (0, _d.scaleOrdinal)(_d.schemeCategory10).range(); + + + return function (d) { + var id = d.id || d.data && d.data.id || d, + color = void 0; + + // if callback function is provided + + + return colors[id] instanceof Function ? color = colors[id](d) : colors[id] ? color = colors[id] : (ids.indexOf(id) < 0 && ids.push(id), color = pattern[ids.indexOf(id) % pattern.length], colors[id] = color), callback instanceof Function ? callback(color, d) : color; + }; + }, + generateLevelColor: function generateLevelColor() { + var $$ = this, + config = $$.config, + colors = config.color_pattern, + threshold = config.color_threshold, + asValue = threshold.unit === "value", + max = threshold.max || 100, + values = threshold.values && threshold.values.length ? threshold.values : []; + + + return (0, _util.notEmpty)(threshold) ? function (value) { + var color = colors[colors.length - 1]; + + for (var v, i = 0; i < values.length; i++) if (v = asValue ? value : value * 100 / max, v < values[i]) { + color = colors[i]; + + break; + } + + return color; + } : null; + } +}); /** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ + +/***/ }), +/* 41 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _typeof2 = __webpack_require__(5), + _typeof3 = _interopRequireDefault(_typeof2), + _d = __webpack_require__(2), + _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +// selection +(0, _util.extend)(_ChartInternal2.default.prototype, { + getYDomainMin: function getYDomainMin(targets) { + var $$ = this, + config = $$.config, + ids = $$.mapToIds(targets), + ys = $$.getValuesAsIdKeyed(targets), + j = void 0, + k = void 0, + baseId = void 0, + idsInGroup = void 0, + id = void 0, + hasNegativeValue = void 0; + + + if (config.data_groups.length > 0) for (hasNegativeValue = $$.hasNegativeValueInTargets(targets), j = 0; j < config.data_groups.length; j++) if (idsInGroup = config.data_groups[j].filter(function (v) { + return ids.indexOf(v) >= 0; + }), idsInGroup.length !== 0) + + // Compute min + for (baseId = idsInGroup[0], hasNegativeValue && ys[baseId] && ys[baseId].forEach(function (v, i) { + ys[baseId][i] = v < 0 ? v : 0; + }), k = 1; k < idsInGroup.length; k++) (id = idsInGroup[k], !!ys[id]) && ys[id].forEach(function (v, i) { + $$.axis.getId(id) === $$.axis.getId(baseId) && ys[baseId] && !(hasNegativeValue && +v > 0) && (ys[baseId][i] += +v); + }); + return (0, _d.min)(Object.keys(ys).map(function (key) { + return (0, _d.min)(ys[key]); + })); + }, + getYDomainMax: function getYDomainMax(targets) { + var $$ = this, + config = $$.config, + ids = $$.mapToIds(targets), + ys = $$.getValuesAsIdKeyed(targets), + j = void 0, + k = void 0, + baseId = void 0, + idsInGroup = void 0, + id = void 0, + hasPositiveValue = void 0; + + + if (config.data_groups.length > 0) for (hasPositiveValue = $$.hasPositiveValueInTargets(targets), j = 0; j < config.data_groups.length; j++) if (idsInGroup = config.data_groups[j].filter(function (v) { + return ids.indexOf(v) >= 0; + }), idsInGroup.length !== 0) + // Compute max + for (baseId = idsInGroup[0], hasPositiveValue && ys[baseId] && ys[baseId].forEach(function (v, i) { + ys[baseId][i] = v > 0 ? v : 0; + }), k = 1; k < idsInGroup.length; k++) (id = idsInGroup[k], !!ys[id]) && ys[id].forEach(function (v, i) { + $$.axis.getId(id) === $$.axis.getId(baseId) && ys[baseId] && !(hasPositiveValue && +v < 0) && (ys[baseId][i] += +v); + }); + return (0, _d.max)(Object.keys(ys).map(function (key) { + return (0, _d.max)(ys[key]); + })); + }, + getYDomain: function getYDomain(targets, axisId, xDomain) { + var $$ = this, + config = $$.config, + targetsByAxisId = targets.filter(function (t) { + return $$.axis.getId(t.id) === axisId; + }), + yTargets = xDomain ? $$.filterByXDomain(targetsByAxisId, xDomain) : targetsByAxisId, + yMin = axisId === "y2" ? config.axis_y2_min : config.axis_y_min, + yMax = axisId === "y2" ? config.axis_y2_max : config.axis_y_max, + yDomainMin = $$.getYDomainMin(yTargets), + yDomainMax = $$.getYDomainMax(yTargets), + center = axisId === "y2" ? config.axis_y2_center : config.axis_y_center, + isZeroBased = $$.hasType("bar", yTargets) && config.bar_zerobased || $$.hasType("area", yTargets) && config.area_zerobased, + isInverted = axisId === "y2" ? config.axis_y2_inverted : config.axis_y_inverted, + showHorizontalDataLabel = $$.hasDataLabel() && config.axis_rotated, + showVerticalDataLabel = $$.hasDataLabel() && !config.axis_rotated, + lengths = void 0; + + // MEMO: avoid inverting domain unexpectedly + + + if (yDomainMin = (0, _util.isValue)(yMin) ? yMin : (0, _util.isValue)(yMax) ? yDomainMin < yMax ? yDomainMin : yMax - 10 : yDomainMin, yDomainMax = (0, _util.isValue)(yMax) ? yMax : (0, _util.isValue)(yMin) ? yMin < yDomainMax ? yDomainMax : yMin + 10 : yDomainMax, yTargets.length === 0) // use current domain if target of axisId is none + return axisId === "y2" ? $$.y2.domain() : $$.y.domain(); + + isNaN(yDomainMin) && (yDomainMin = 0), isNaN(yDomainMax) && (yDomainMax = yDomainMin), yDomainMin === yDomainMax && (yDomainMin < 0 ? yDomainMax = 0 : yDomainMin = 0); + + + var isAllPositive = yDomainMin >= 0 && yDomainMax >= 0, + isAllNegative = yDomainMin <= 0 && yDomainMax <= 0; + ((0, _util.isValue)(yMin) && isAllPositive || (0, _util.isValue)(yMax) && isAllNegative) && (isZeroBased = !1), isZeroBased && (isAllPositive && (yDomainMin = 0), isAllNegative && (yDomainMax = 0)); + + + var domainLength = Math.abs(yDomainMax - yDomainMin), + paddingTop = domainLength * 0.1, + paddingBottom = domainLength * 0.1; + + + if (typeof center !== "undefined") { + var yDomainAbs = Math.max(Math.abs(yDomainMin), Math.abs(yDomainMax)); + + yDomainMax = center + yDomainAbs, yDomainMin = center - yDomainAbs; + } + + // add padding for data label + if (showHorizontalDataLabel) { + lengths = $$.getDataLabelLength(yDomainMin, yDomainMax, "width"); + + var diff = (0, _util.diffDomain)($$.y.range()), + ratio = [lengths[0] / diff, lengths[1] / diff]; + paddingTop += domainLength * (ratio[1] / (1 - ratio[0] - ratio[1])), paddingBottom += domainLength * (ratio[0] / (1 - ratio[0] - ratio[1])); + } else showVerticalDataLabel && (lengths = $$.getDataLabelLength(yDomainMin, yDomainMax, "height"), paddingTop += $$.axis.convertPixelsToAxisPadding(lengths[1], domainLength), paddingBottom += $$.axis.convertPixelsToAxisPadding(lengths[0], domainLength)); + + axisId === "y" && (0, _util.notEmpty)(config.axis_y_padding) && (paddingTop = $$.axis.getPadding(config.axis_y_padding, "top", paddingTop, domainLength), paddingBottom = $$.axis.getPadding(config.axis_y_padding, "bottom", paddingBottom, domainLength)), axisId === "y2" && (0, _util.notEmpty)(config.axis_y2_padding) && (paddingTop = $$.axis.getPadding(config.axis_y2_padding, "top", paddingTop, domainLength), paddingBottom = $$.axis.getPadding(config.axis_y2_padding, "bottom", paddingBottom, domainLength)), isZeroBased && (isAllPositive && (paddingBottom = yDomainMin), isAllNegative && (paddingTop = -yDomainMax)); + + + var domain = [yDomainMin - paddingBottom, yDomainMax + paddingTop]; + + return isInverted ? domain.reverse() : domain; + }, + getXDomainMin: function getXDomainMin(targets) { + var $$ = this, + config = $$.config; + + + return (0, _util.isDefined)(config.axis_x_min) ? $$.isTimeSeries() ? this.parseDate(config.axis_x_min) : config.axis_x_min : (0, _d.min)(targets, function (t) { + return (0, _d.min)(t.values, function (v) { + return v.x; + }); + }); + }, + getXDomainMax: function getXDomainMax(targets) { + var $$ = this, + config = $$.config; + + + return (0, _util.isDefined)(config.axis_x_max) ? $$.isTimeSeries() ? this.parseDate(config.axis_x_max) : config.axis_x_max : (0, _d.max)(targets, function (t) { + return (0, _d.max)(t.values, function (v) { + return v.x; + }); + }); + }, + getXDomainPadding: function getXDomainPadding(domain) { + var $$ = this, + config = $$.config, + diff = domain[1] - domain[0], + maxDataCount = void 0, + padding = void 0, + paddingLeft = void 0, + paddingRight = void 0; + + return $$.isCategorized() ? padding = 0 : $$.hasType("bar") ? (maxDataCount = $$.getMaxDataCount(), padding = maxDataCount > 1 ? diff / (maxDataCount - 1) / 2 : 0.5) : padding = diff * 0.01, (0, _typeof3.default)(config.axis_x_padding) === "object" && (0, _util.notEmpty)(config.axis_x_padding) ? (paddingLeft = (0, _util.isValue)(config.axis_x_padding.left) ? config.axis_x_padding.left : padding, paddingRight = (0, _util.isValue)(config.axis_x_padding.right) ? config.axis_x_padding.right : padding) : typeof config.axis_x_padding === "number" ? (paddingLeft = config.axis_x_padding, paddingRight = config.axis_x_padding) : (paddingLeft = padding, paddingRight = padding), { left: paddingLeft, right: paddingRight }; + }, + getXDomain: function getXDomain(targets) { + var $$ = this, + xDomain = [$$.getXDomainMin(targets), $$.getXDomainMax(targets)], + firstX = xDomain[0], + lastX = xDomain[1], + padding = $$.getXDomainPadding(xDomain), + min = 0, + max = 0; + // show center of x domain if min and max are the same + + return firstX - lastX !== 0 || $$.isCategorized() || ($$.isTimeSeries() ? (firstX = new Date(firstX.getTime() * 0.5), lastX = new Date(lastX.getTime() * 1.5)) : (firstX = firstX === 0 ? 1 : firstX * 0.5, lastX = lastX === 0 ? -1 : lastX * 1.5)), (firstX || firstX === 0) && (min = $$.isTimeSeries() ? new Date(firstX.getTime() - padding.left) : firstX - padding.left), (lastX || lastX === 0) && (max = $$.isTimeSeries() ? new Date(lastX.getTime() + padding.right) : lastX + padding.right), [min, max]; + }, + updateXDomain: function updateXDomain(targets, withUpdateXDomain, withUpdateOrgXDomain, withTrim, domain) { + var $$ = this, + config = $$.config; + + + if (withUpdateOrgXDomain && ($$.x.domain(domain || (0, _d.extent)($$.getXDomain(targets))), $$.orgXDomain = $$.x.domain(), config.zoom_enabled && $$.zoom.updateScaleExtent(), $$.subX.domain($$.x.domain()), $$.brush && $$.brush.scale($$.subX)), withUpdateXDomain) { + var domainValue = domain || !$$.brush || $$.brushEmpty() ? $$.orgXDomain : $$.getBrushSelection().map(function (v) { + return $$.subX.invert(v); + }); + + $$.x.domain(domainValue), config.zoom_enabled && $$.zoom.updateScaleExtent(); + } + + // Trim domain when too big by zoom mousemove event + + + return withTrim && $$.x.domain($$.trimXDomain($$.x.orgDomain())), $$.x.domain(); + }, + trimXDomain: function trimXDomain(domain) { + var zoomDomain = this.getZoomDomain(), + min = zoomDomain[0], + max = zoomDomain[1]; + + + return domain[0] <= min && (domain[1] = +domain[1] + (min - domain[0]), domain[0] = min), max <= domain[1] && (domain[0] = +domain[0] - (domain[1] - max), domain[1] = max), domain; + } +}); /** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ + +/***/ }), +/* 42 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _typeof2 = __webpack_require__(5), + _typeof3 = _interopRequireDefault(_typeof2), + _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +var getFormat = function ($$, typeValue, v) { + var config = $$.config, + type = "axis_" + typeValue + "_tick_format", + format = config[type] ? config[type] : $$.defaultValueFormat; + + + return format(v); +}; + +(0, _util.extend)(_ChartInternal2.default.prototype, { + getYFormat: function getYFormat(forArc) { + var $$ = this, + formatForY = $$.yFormat, + formatForY2 = $$.y2Format; + + + return forArc && !$$.hasType("gauge") && (formatForY = $$.defaultArcValueFormat, formatForY2 = $$.defaultArcValueFormat), function (v, ratio, id) { + var format = $$.axis.getId(id) === "y2" ? formatForY2 : formatForY; + + return format.call($$, v, ratio); + }; + }, + yFormat: function yFormat(v) { + return getFormat(this, "y", v); + }, + y2Format: function y2Format(v) { + return getFormat(this, "y2", v); + }, + defaultValueFormat: function defaultValueFormat(v) { + return (0, _util.isValue)(v) ? +v : ""; + }, + defaultArcValueFormat: function defaultArcValueFormat(v, ratio) { + return (ratio * 100).toFixed(1) + "%"; + }, + dataLabelFormat: function dataLabelFormat(targetId) { + var $$ = this, + dataLabels = $$.config.data_labels, + defaultFormat = function (v) { + return (0, _util.isValue)(v) ? +v : ""; + }, + format = void 0; + + // find format according to axis id + + + return format = typeof dataLabels.format === "function" ? dataLabels.format : (0, _typeof3.default)(dataLabels.format) === "object" ? dataLabels.format[targetId] ? dataLabels.format[targetId] === !0 ? defaultFormat : dataLabels.format[targetId] : function () { + return ""; + } : defaultFormat, format; + } +}); + +/***/ }), +/* 43 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _d = __webpack_require__(2), + _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _classes = __webpack_require__(3), + _classes2 = _interopRequireDefault(_classes), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +(0, _util.extend)(_ChartInternal2.default.prototype, { + initGrid: function initGrid() { + var $$ = this, + config = $$.config; + $$.grid = $$.main.append("g").attr("clip-path", $$.clipPathForGrid).attr("class", _classes2.default.grid), config.grid_x_show && $$.grid.append("g").attr("class", _classes2.default.xgrids), config.grid_y_show && $$.grid.append("g").attr("class", _classes2.default.ygrids), config.grid_focus_show && $$.grid.append("g").attr("class", _classes2.default.xgridFocus).append("line").attr("class", _classes2.default.xgridFocus), $$.xgrid = (0, _d.selectAll)([]), config.grid_lines_front || $$.initGridLines(); + }, + initGridLines: function initGridLines() { + var $$ = this; + + $$.gridLines = $$.main.append("g").attr("clip-path", $$.clipPathForGrid).attr("class", _classes2.default.grid + " " + _classes2.default.gridLines), $$.gridLines.append("g").attr("class", _classes2.default.xgridLines), $$.gridLines.append("g").attr("class", _classes2.default.ygridLines), $$.xgridLines = (0, _d.selectAll)([]); + }, + updateXGrid: function updateXGrid(withoutUpdate) { + var $$ = this, + config = $$.config, + xgridData = $$.generateGridData(config.grid_x_type, $$.x), + tickOffset = $$.isCategorized() ? $$.xAxis.tickOffset() : 0; + $$.xgridAttr = config.axis_rotated ? { + "x1": 0, + "x2": $$.width, + "y1": function y1(d) { + return $$.x(d) - tickOffset; + }, + "y2": function y2(d) { + return $$.x(d) - tickOffset; + } + } : { + "x1": function x1(d) { + return $$.x(d) + tickOffset; + }, + "x2": function x2(d) { + return $$.x(d) + tickOffset; + }, + "y1": 0, + "y2": $$.height + }, $$.xgrid = $$.main.select("." + _classes2.default.xgrids).selectAll("." + _classes2.default.xgrid).data(xgridData), $$.xgrid.exit().remove(), $$.xgrid = $$.xgrid.enter().append("line").attr("class", _classes2.default.xgrid).merge($$.xgrid), withoutUpdate || $$.xgrid.each(function () { + var grid = (0, _d.select)(this); + + Object.keys($$.xgridAttr).forEach(function (id) { + grid.attr(id, $$.xgridAttr[id]).style("opacity", function () { + return grid.attr(config.axis_rotated ? "y1" : "x1") === (config.axis_rotated ? $$.height : 0) ? "0" : "1"; + }); + }); + }); + }, + updateYGrid: function updateYGrid() { + var $$ = this, + config = $$.config, + gridValues = $$.yAxis.tickValues() || $$.y.ticks(config.grid_y_ticks); + $$.ygrid = $$.main.select("." + _classes2.default.ygrids).selectAll("." + _classes2.default.ygrid).data(gridValues), $$.ygrid.exit().remove(), $$.ygrid = $$.ygrid.enter().append("line").attr("class", _classes2.default.ygrid).merge($$.ygrid), $$.ygrid.attr("x1", config.axis_rotated ? $$.y : 0).attr("x2", config.axis_rotated ? $$.y : $$.width).attr("y1", config.axis_rotated ? 0 : $$.y).attr("y2", config.axis_rotated ? $$.height : $$.y), $$.smoothLines($$.ygrid, "grid"); + }, + gridTextAnchor: function gridTextAnchor(d) { + return d.position ? d.position : "end"; + }, + gridTextDx: function gridTextDx(d) { + return d.position === "start" ? 4 : d.position === "middle" ? 0 : -4; + }, + xGridTextX: function xGridTextX(d) { + return d.position === "start" ? -this.height : d.position === "middle" ? -this.height / 2 : 0; + }, + yGridTextX: function yGridTextX(d) { + return d.position === "start" ? 0 : d.position === "middle" ? this.width / 2 : this.width; + }, + updateGrid: function updateGrid(duration) { + var $$ = this, + main = $$.main, + config = $$.config; + + + // hide if arc type + $$.grid.style("visibility", $$.hasArcType() ? "hidden" : "visible"), main.select("line." + _classes2.default.xgridFocus).style("visibility", "hidden"), config.grid_x_show && $$.updateXGrid(), $$.xgridLines = main.select("." + _classes2.default.xgridLines).selectAll("." + _classes2.default.xgridLine).data(config.grid_x_lines), $$.xgridLines.exit().transition().duration(duration).style("opacity", "0").remove(); + + + // enter + var xgridLine = $$.xgridLines.enter().append("g").attr("class", function (d) { + return _classes2.default.xgridLine + (d.class ? " " + d.class : ""); + }); + + xgridLine.append("line").style("opacity", "0"), xgridLine.append("text").attr("text-anchor", $$.gridTextAnchor).attr("transform", config.axis_rotated ? "" : "rotate(-90)").attr("dx", $$.gridTextDx).attr("dy", -5).style("opacity", "0"), $$.xgridLines = xgridLine.merge($$.xgridLines), config.grid_y_show && $$.updateYGrid(), $$.ygridLines = main.select("." + _classes2.default.ygridLines).selectAll("." + _classes2.default.ygridLine).data(config.grid_y_lines), $$.ygridLines.exit().transition().duration(duration).style("opacity", "0").remove(); + + + // enter + var ygridLine = $$.ygridLines.enter().append("g").attr("class", function (d) { + return _classes2.default.ygridLine + (d.class ? " " + d.class : ""); + }); + + ygridLine.append("line").style("opacity", "0"), ygridLine.append("text").attr("text-anchor", $$.gridTextAnchor).attr("transform", config.axis_rotated ? "rotate(-90)" : "").attr("dx", $$.gridTextDx).attr("dy", -5).style("opacity", "0"), $$.ygridLines = ygridLine.merge($$.ygridLines); + + + // update + var yv = $$.yv.bind($$); + + $$.ygridLines.select("line").transition().duration(duration).attr("x1", config.axis_rotated ? yv : 0).attr("x2", config.axis_rotated ? yv : $$.width).attr("y1", config.axis_rotated ? 0 : yv).attr("y2", config.axis_rotated ? $$.height : yv).transition().style("opacity", "1"), $$.ygridLines.select("text").transition().duration(duration).attr("x", config.axis_rotated ? $$.xGridTextX.bind($$) : $$.yGridTextX.bind($$)).attr("y", yv).text(function (d) { + return d.text; + }).transition().style("opacity", "1"); + }, + redrawGrid: function redrawGrid(withTransition) { + var $$ = this, + rotated = $$.config.axis_rotated, + xv = $$.xv.bind($$), + lines = $$.xgridLines.select("line"), + texts = $$.xgridLines.select("text"); + + + return lines = (withTransition ? lines.transition() : lines).attr("x1", rotated ? 0 : xv).attr("x2", rotated ? $$.width : xv).attr("y1", rotated ? xv : 0).attr("y2", rotated ? xv : $$.height), texts = (withTransition ? texts.transition() : texts).attr("x", rotated ? $$.yGridTextX.bind($$) : $$.xGridTextX.bind($$)).attr("y", xv).text(function (d) { + return d.text; + }), [(withTransition ? lines.transition() : lines).style("opacity", "1"), (withTransition ? texts.transition() : texts).style("opacity", "1")]; + }, + showXGridFocus: function showXGridFocus(selectedData) { + var $$ = this, + config = $$.config, + dataToShow = selectedData.filter(function (d) { + return d && (0, _util.isValue)(d.value); + }), + focusEl = $$.main.selectAll("line." + _classes2.default.xgridFocus), + xx = $$.xx.bind($$); + !config.tooltip_show || $$.hasType("scatter") || $$.hasArcType() || (focusEl.style("visibility", "visible").data([dataToShow[0]]).attr(config.axis_rotated ? "y1" : "x1", xx).attr(config.axis_rotated ? "y2" : "x2", xx), $$.smoothLines(focusEl, "grid")); + + // Hide when scatter plot exists + }, + hideXGridFocus: function hideXGridFocus() { + this.main.select("line." + _classes2.default.xgridFocus).style("visibility", "hidden"); + }, + updateXgridFocus: function updateXgridFocus() { + var $$ = this, + config = $$.config; + $$.main.select("line." + _classes2.default.xgridFocus).attr("x1", config.axis_rotated ? 0 : -10).attr("x2", config.axis_rotated ? $$.width : -10).attr("y1", config.axis_rotated ? -10 : 0).attr("y2", config.axis_rotated ? -10 : $$.height); + }, + generateGridData: function generateGridData(type, scale) { + var $$ = this, + tickNum = $$.main.select("." + _classes2.default.axisX).selectAll(".tick").size(), + gridData = []; + + + if (type === "year") { + var xDomain = $$.getXDomain(), + firstYear = xDomain[0].getFullYear(), + lastYear = xDomain[1].getFullYear(); + + + for (var i = firstYear; i <= lastYear; i++) gridData.push(new Date(i + "-01-01 00:00:00")); + } else gridData = scale.ticks(10), gridData.length > tickNum && (gridData = gridData.filter(function (d) { + return (d + "").indexOf(".") < 0; + })); + return gridData; + }, + getGridFilterToRemove: function getGridFilterToRemove(params) { + return params ? function (line) { + var found = !1; + + return [].concat(params).forEach(function (param) { + ("value" in param && line.value === param.value || "class" in param && line.class === param.class) && (found = !0); + }), found; + } : function () { + return !0; + }; + }, + removeGridLines: function removeGridLines(params, forX) { + var $$ = this, + config = $$.config, + toRemove = $$.getGridFilterToRemove(params), + toShow = function (line) { + return !toRemove(line); + }, + classLines = forX ? _classes2.default.xgridLines : _classes2.default.ygridLines, + classLine = forX ? _classes2.default.xgridLine : _classes2.default.ygridLine; + $$.main.select("." + classLines).selectAll("." + classLine).filter(toRemove).transition().duration(config.transition_duration).style("opacity", "0").remove(), forX ? config.grid_x_lines = config.grid_x_lines.filter(toShow) : config.grid_y_lines = config.grid_y_lines.filter(toShow); + } +}); + +/***/ }), +/* 44 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _d = __webpack_require__(2), + _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _classes = __webpack_require__(3), + _classes2 = _interopRequireDefault(_classes), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +(0, _util.extend)(_ChartInternal2.default.prototype, { + /** + * Initialize the legend. + * @private + */ + initLegend: function initLegend() { + var $$ = this; + + return $$.legendItemTextBox = {}, $$.legendHasRendered = !1, $$.legend = $$.svg.append("g").attr("transform", $$.getTranslate("legend")), $$.config.legend_show ? void $$.updateLegendWithDefaults() : ($$.legend.style("visibility", "hidden"), void ($$.hiddenLegendIds = $$.mapToIds($$.data.targets))); + // MEMO: call here to update legend box and tranlate for all + // MEMO: translate will be upated by this, so transform not needed in updateLegend() + }, + + + /** + * Update the legend to its default value. + * @private + */ + updateLegendWithDefaults: function updateLegendWithDefaults() { + var $$ = this; + + $$.updateLegend($$.mapToIds($$.data.targets), { + withTransform: !1, + withTransitionForTransform: !1, + withTransition: !1 + }); + }, + + + /** + * Update the size of the legend. + * @private + * @param {Number} height + * @param {Number} width + */ + updateSizeForLegend: function updateSizeForLegend(legendHeight, legendWidth) { + var $$ = this, + config = $$.config, + insetLegendPosition = { + top: $$.isLegendTop ? $$.getCurrentPaddingTop() + config.legend_inset_y + 5.5 : $$.currentHeight - legendHeight - $$.getCurrentPaddingBottom() - config.legend_inset_y, + left: $$.isLegendLeft ? $$.getCurrentPaddingLeft() + config.legend_inset_x + 0.5 : $$.currentWidth - legendWidth - $$.getCurrentPaddingRight() - config.legend_inset_x + 0.5 + }; + $$.margin3 = { + top: $$.isLegendRight ? 0 : $$.isLegendInset ? insetLegendPosition.top : $$.currentHeight - legendHeight, + right: NaN, + bottom: 0, + left: $$.isLegendRight ? $$.currentWidth - legendWidth : $$.isLegendInset ? insetLegendPosition.left : 0 + }; + }, + + /** + * Transform Legend + * @private + * @param {Boolean} whether or not to transition. + */ + transformLegend: function transformLegend(withTransition) { + var $$ = this; + + (withTransition ? $$.legend.transition() : $$.legend).attr("transform", $$.getTranslate("legend")); + }, + + + /** + * Update the legend step + * @private + * @param {Number} step + */ + updateLegendStep: function updateLegendStep(step) { + this.legendStep = step; + }, + + + /** + * Update legend item width + * @private + * @param {Number} width + */ + updateLegendItemWidth: function updateLegendItemWidth(w) { + this.legendItemWidth = w; + }, + + + /** + * Update legend item height + * @private + * @param {Number} height + */ + updateLegendItemHeight: function updateLegendItemHeight(h) { + this.legendItemHeight = h; + }, + + + /** + * Get the width of the legend + * @private + * @param {Number} width + */ + getLegendWidth: function getLegendWidth() { + var $$ = this; + + return $$.config.legend_show ? $$.isLegendRight || $$.isLegendInset ? $$.legendItemWidth * ($$.legendStep + 1) : $$.currentWidth : 0; + }, + + /** + * Get the height of the legend + * @private + * @param {Number} height + */ + getLegendHeight: function getLegendHeight() { + var $$ = this, + h = 0; + + return $$.config.legend_show && ($$.isLegendRight ? h = $$.currentHeight : h = Math.max(20, $$.legendItemHeight) * ($$.legendStep + 1)), h; + }, + + /** + * Get the opacity of the legend + * @private + * @param {Object} d3.Select + * @returns {Number} opacity + */ + opacityForLegend: function opacityForLegend(legendItem) { + return legendItem.classed(_classes2.default.legendItemHidden) ? null : "1"; + }, + + + /** + * Get the opacity of the legend that is unfocused + * @private + * @param {Object} legendItem, d3.Select + * @returns {Number} opacity + */ + opacityForUnfocusedLegend: function opacityForUnfocusedLegend(legendItem) { + return legendItem.classed(_classes2.default.legendItemHidden) ? null : "0.3"; + }, + + /** + * Toggles the focus of the legend + * @private + * @param {Array} ID's of target + * @param {Boolean} whether or not to focus. + */ + toggleFocusLegend: function toggleFocusLegend(targetIds, focus) { + var $$ = this, + targetIdz = $$.mapToTargetIds(targetIds); + $$.legend.selectAll("." + _classes2.default.legendItem).filter(function (id) { + return targetIdz.indexOf(id) >= 0; + }).classed(_classes2.default.legendItemFocused, focus).transition().duration(100).style("opacity", function () { + var opacity = focus ? $$.opacityForLegend : $$.opacityForUnfocusedLegend; + + return opacity.call($$, (0, _d.select)(this)); + }); + }, + + /** + * Revert the legend to its default state + * @private + */ + revertLegend: function revertLegend() { + var $$ = this; + + $$.legend.selectAll("." + _classes2.default.legendItem).classed(_classes2.default.legendItemFocused, !1).transition().duration(100).style("opacity", function () { + return $$.opacityForLegend((0, _d.select)(this)); + }); + }, + + /** + * Shows the legend + * @private + * @param {Array} ID's of target + */ + showLegend: function showLegend(targetIds) { + var $$ = this, + config = $$.config; + config.legend_show || (config.legend_show = !0, $$.legend.style("visibility", "visible"), !$$.legendHasRendered && $$.updateLegendWithDefaults()), $$.removeHiddenLegendIds(targetIds), $$.legend.selectAll($$.selectorLegends(targetIds)).style("visibility", "visible").transition().style("opacity", function () { + return $$.opacityForLegend((0, _d.select)(this)); + }); + }, + + /** + * Hide the legend + * @private + * @param {Array} ID's of target + */ + hideLegend: function hideLegend(targetIds) { + var $$ = this, + config = $$.config; + config.legend_show && (0, _util.isEmpty)(targetIds) && (config.legend_show = !1, $$.legend.style("visibility", "hidden")), $$.addHiddenLegendIds(targetIds), $$.legend.selectAll($$.selectorLegends(targetIds)).style("opacity", "0").style("visibility", "hidden"); + }, + + /** + * Clear the LegendItemTextBox cache. + * @private + */ + clearLegendItemTextBoxCache: function clearLegendItemTextBoxCache() { + this.legendItemTextBox = {}; + }, + + /** + * Update the legend + * @private + * @param {Array} ID's of target + * @param {Object} withTransform : Whether to use the transform property / withTransitionForTransform: Whether transition is used when using the transform property / withTransition : whether or not to transition. + * @param {Object} the return value of the generateTransitions + */ + updateLegend: function updateLegend(targetIds, options, transitions) { + var $$ = this, + config = $$.config, + posMin = 10, + tileWidth = config.legend_item_tile_width + 5, + isTouch = $$.inputType === "touch", + maxWidth = 0, + maxHeight = 0, + xForLegend = void 0, + yForLegend = void 0, + totalLength = 0, + offsets = {}, + widths = {}, + heights = {}, + margins = [0], + steps = {}, + step = 0, + background = void 0, + targetIdz = targetIds.filter(function (id) { + return !(0, _util.isDefined)(config.data_names[id]) || config.data_names[id] !== null; + }), + optionz = options || {}, + withTransition = (0, _util.getOption)(optionz, "withTransition", !0), + withTransitionForTransform = (0, _util.getOption)(optionz, "withTransitionForTransform", !0), + getTextBox = function (textElement, id) { + return $$.legendItemTextBox[id] || ($$.legendItemTextBox[id] = $$.getTextRect(textElement.textContent, _classes2.default.legendItem, textElement)), $$.legendItemTextBox[id]; + }, + updatePositions = function (textElement, id, index) { + var isLast = index === targetIdz.length - 1, + box = getTextBox(textElement, id), + itemWidth = box.width + tileWidth + (isLast && !($$.isLegendRight || $$.isLegendInset) ? 0 : 10) + config.legend_padding, + itemHeight = box.height + 4, + itemLength = $$.isLegendRight || $$.isLegendInset ? itemHeight : itemWidth, + areaLength = $$.isLegendRight || $$.isLegendInset ? $$.getLegendHeight() : $$.getLegendWidth(), + margin = void 0, + updateValues = function (id2, withoutStep) { + withoutStep || (margin = (areaLength - totalLength - itemLength) / 2, margin < posMin && (margin = (areaLength - itemLength) / 2, totalLength = 0, step++)), steps[id2] = step, margins[step] = $$.isLegendInset ? 10 : margin, offsets[id2] = totalLength, totalLength += itemLength; + }; + + // MEMO: care about condifion of step, totalLength + + + if (index === 0 && (totalLength = 0, step = 0, maxWidth = 0, maxHeight = 0), config.legend_show && !$$.isLegendToShow(id)) return widths[id] = 0, heights[id] = 0, steps[id] = 0, void (offsets[id] = 0); + + widths[id] = itemWidth, heights[id] = itemHeight, (!maxWidth || itemWidth >= maxWidth) && (maxWidth = itemWidth), (!maxHeight || itemHeight >= maxHeight) && (maxHeight = itemHeight); + + + var maxLength = $$.isLegendRight || $$.isLegendInset ? maxHeight : maxWidth; + + config.legend_equally ? (Object.keys(widths).forEach(function (id2) { + return widths[id2] = maxWidth; + }), Object.keys(heights).forEach(function (id2) { + return heights[id2] = maxHeight; + }), margin = (areaLength - maxLength * targetIdz.length) / 2, margin < posMin ? (totalLength = 0, step = 0, targetIdz.forEach(function (id2) { + return updateValues(id2); + })) : updateValues(id, !0)) : updateValues(id); + }; + // Skip elements when their name is set to null + $$.isLegendInset && (step = config.legend_inset_step ? config.legend_inset_step : targetIdz.length, $$.updateLegendStep(step)), $$.isLegendRight ? (xForLegend = function (id) { + return maxWidth * steps[id]; + }, yForLegend = function (id) { + return margins[steps[id]] + offsets[id]; + }) : $$.isLegendInset ? (xForLegend = function (id) { + return maxWidth * steps[id] + 10; + }, yForLegend = function (id) { + return margins[steps[id]] + offsets[id]; + }) : (xForLegend = function (id) { + return margins[steps[id]] + offsets[id]; + }, yForLegend = function (id) { + return maxHeight * steps[id]; + }); + + + var xForLegendText = function (id, i) { + return xForLegend(id, i) + 4 + config.legend_item_tile_width; + }, + yForLegendText = function (id, i) { + return yForLegend(id, i) + 9; + }, + xForLegendRect = function (id, i) { + return xForLegend(id, i); + }, + yForLegendRect = function (id, i) { + return yForLegend(id, i) - 5; + }, + x1ForLegendTile = function (id, i) { + return xForLegend(id, i) - 2; + }, + x2ForLegendTile = function (id, i) { + return xForLegend(id, i) - 2 + config.legend_item_tile_width; + }, + yForLegendTile = function (id, i) { + return yForLegend(id, i) + 4; + }, + l = $$.legend.selectAll("." + _classes2.default.legendItem).data(targetIdz).enter().append("g").attr("class", function (id) { + return $$.generateClass(_classes2.default.legendItem, id); + }).style("visibility", function (id) { + return $$.isLegendToShow(id) ? "visible" : "hidden"; + }).style("cursor", "pointer").on(isTouch ? "touchstart" : "click", function (id) { + config.legend_item_onclick ? config.legend_item_onclick.call($$, id) : _d.event.altKey ? ($$.api.hide(), $$.api.show(id)) : ($$.api.toggle(id), $$.isTargetToShow(id) ? $$.api.focus(id) : $$.api.revert()), isTouch && $$.hideTooltip(); + }).on(isTouch ? undefined : "mouseover", function (id) { + config.legend_item_onover ? config.legend_item_onover.call($$, id) : ((0, _d.select)(this).classed(_classes2.default.legendItemFocused, !0), !$$.transiting && $$.isTargetToShow(id) && $$.api.focus(id)); + }).on(isTouch ? "touchend" : "mouseout", function (id) { + config.legend_item_onout ? config.legend_item_onout.call($$, id) : ((0, _d.select)(this).classed(_classes2.default.legendItemFocused, !1), $$.api.revert()); + }); + + // Define g for legend area + l.append("text").text(function (id) { + return (0, _util.isDefined)(config.data_names[id]) ? config.data_names[id] : id; + }).each(function (id, i) { + updatePositions(this, id, i); + }).style("pointer-events", "none").attr("x", $$.isLegendRight || $$.isLegendInset ? xForLegendText : -200).attr("y", $$.isLegendRight || $$.isLegendInset ? -200 : yForLegendText), l.append("rect").attr("class", _classes2.default.legendItemEvent).style("fill-opacity", "0").attr("x", $$.isLegendRight || $$.isLegendInset ? xForLegendRect : -200).attr("y", $$.isLegendRight || $$.isLegendInset ? -200 : yForLegendRect), l.append("line").attr("class", _classes2.default.legendItemTile).style("stroke", $$.color).style("pointer-events", "none").attr("x1", $$.isLegendRight || $$.isLegendInset ? x1ForLegendTile : -200).attr("y1", $$.isLegendRight || $$.isLegendInset ? -200 : yForLegendTile).attr("x2", $$.isLegendRight || $$.isLegendInset ? x2ForLegendTile : -200).attr("y2", $$.isLegendRight || $$.isLegendInset ? -200 : yForLegendTile).attr("stroke-width", config.legend_item_tile_height), background = $$.legend.select("." + _classes2.default.legendBackground + " rect"), $$.isLegendInset && maxWidth > 0 && background.size() === 0 && (background = $$.legend.insert("g", "." + _classes2.default.legendItem).attr("class", _classes2.default.legendBackground).append("rect")); + + + var texts = $$.legend.selectAll("text").data(targetIdz).text(function (id) { + return (0, _util.isDefined)(config.data_names[id]) ? config.data_names[id] : id; + } // MEMO: needed for update + ).each(function (id, i) { + updatePositions(this, id, i); + }); + + (withTransition ? texts.transition() : texts).attr("x", xForLegendText).attr("y", yForLegendText); + + + var rects = $$.legend.selectAll("rect." + _classes2.default.legendItemEvent).data(targetIdz); + + (withTransition ? rects.transition() : rects).attr("width", function (id) { + return widths[id]; + }).attr("height", function (id) { + return heights[id]; + }).attr("x", xForLegendRect).attr("y", yForLegendRect); + + + var tiles = $$.legend.selectAll("line." + _classes2.default.legendItemTile).data(targetIdz); + + (withTransition ? tiles.transition() : tiles).style("stroke", $$.color).attr("x1", x1ForLegendTile).attr("y1", yForLegendTile).attr("x2", x2ForLegendTile).attr("y2", yForLegendTile), background && (withTransition ? background.transition() : background).attr("height", $$.getLegendHeight() - 12).attr("width", maxWidth * (step + 1) + 10), $$.legend.selectAll("." + _classes2.default.legendItem).classed(_classes2.default.legendItemHidden, function (id) { + return !$$.isTargetToShow(id); + }), $$.updateLegendItemWidth(maxWidth), $$.updateLegendItemHeight(maxHeight), $$.updateLegendStep(step), $$.updateSizes(), $$.updateScales(), $$.updateSvgSize(), $$.transformAll(withTransitionForTransform, transitions), $$.legendHasRendered = !0; + } +}); + +/***/ }), +/* 45 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _d = __webpack_require__(2), + _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _classes = __webpack_require__(3), + _classes2 = _interopRequireDefault(_classes), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +(0, _util.extend)(_ChartInternal2.default.prototype, { + initRegion: function initRegion() { + var $$ = this; + + $$.region = $$.main.append("g").attr("clip-path", $$.clipPath).attr("class", _classes2.default.regions); + }, + updateRegion: function updateRegion(duration) { + var $$ = this, + config = $$.config; + + + // hide if arc type + $$.region.style("visibility", $$.hasArcType() ? "hidden" : "visible"), $$.mainRegion = $$.main.select("." + _classes2.default.regions).selectAll("." + _classes2.default.region).data(config.regions), $$.mainRegion.exit().transition().duration(duration).style("opacity", "0").remove(), $$.mainRegion = $$.mainRegion.enter().append("g").merge($$.mainRegion).attr("class", $$.classRegion.bind($$)), $$.mainRegion.append("rect").style("fill-opacity", "0"); + }, + redrawRegion: function redrawRegion(withTransition) { + var $$ = this, + x = $$.regionX.bind($$), + y = $$.regionY.bind($$), + w = $$.regionWidth.bind($$), + h = $$.regionHeight.bind($$), + regions = $$.mainRegion.select("rect"); + + + return regions = (withTransition ? regions.transition() : regions).attr("x", x).attr("y", y).attr("width", w).attr("height", h), [(withTransition ? regions.transition() : regions).style("fill-opacity", function (d) { + return (0, _util.isValue)(d.opacity) ? d.opacity : "0.1"; + }).on("end", function () { + (0, _d.select)(this.parentNode).selectAll("rect:not([x])").remove(); + })]; + }, + regionX: function regionX(d) { + var $$ = this, + config = $$.config, + yScale = d.axis === "y" ? $$.y : $$.y2, + xPos = void 0; + + + return xPos = d.axis === "y" || d.axis === "y2" ? config.axis_rotated ? "start" in d ? yScale(d.start) : 0 : 0 : config.axis_rotated ? 0 : "start" in d ? $$.x($$.isTimeSeries() ? $$.parseDate(d.start) : d.start) : 0, xPos; + }, + regionY: function regionY(d) { + var $$ = this, + config = $$.config, + yScale = d.axis === "y" ? $$.y : $$.y2, + yPos = void 0; + + + return yPos = d.axis === "y" || d.axis === "y2" ? config.axis_rotated ? 0 : "end" in d ? yScale(d.end) : 0 : config.axis_rotated ? "start" in d ? $$.x($$.isTimeSeries() ? $$.parseDate(d.start) : d.start) : 0 : 0, yPos; + }, + regionWidth: function regionWidth(d) { + var $$ = this, + config = $$.config, + yScale = d.axis === "y" ? $$.y : $$.y2, + start = $$.regionX(d), + end = void 0; + + + return end = d.axis === "y" || d.axis === "y2" ? config.axis_rotated ? "end" in d ? yScale(d.end) : $$.width : $$.width : config.axis_rotated ? $$.width : "end" in d ? $$.x($$.isTimeSeries() ? $$.parseDate(d.end) : d.end) : $$.width, end < start ? 0 : end - start; + }, + regionHeight: function regionHeight(d) { + var $$ = this, + config = $$.config, + start = this.regionY(d), + end = void 0, + yScale = d.axis === "y" ? $$.y : $$.y2; + + + return end = d.axis === "y" || d.axis === "y2" ? config.axis_rotated ? $$.height : "start" in d ? yScale(d.start) : $$.height : config.axis_rotated ? "end" in d ? $$.x($$.isTimeSeries() ? $$.parseDate(d.end) : d.end) : $$.height : $$.height, end < start ? 0 : end - start; + }, + isRegionOnX: function isRegionOnX(d) { + return !d.axis || d.axis === "x"; + } +}); // selection + +/***/ }), +/* 46 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _d = __webpack_require__(2), + _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +(0, _util.extend)(_ChartInternal2.default.prototype, { + getScale: function getScale(min, max, forTimeseries) { + return (forTimeseries ? (0, _d.scaleTime)() : (0, _d.scaleLinear)()).range([min, max]); + }, + getX: function getX(min, max, domain, offsetValue) { + var $$ = this, + scale = $$.getScale(min, max, $$.isTimeSeries()), + _scale = domain ? scale.domain(domain) : scale, + key = void 0, + offset = void 0; + + // Define customized scale if categorized axis + + + // define functions + for (key in $$.isCategorized() ? (offset = offsetValue || function () { + return 0; + }, scale = function (d, raw) { + var v = _scale(d) + offset(d); + + return raw ? v : Math.ceil(v); + }) : scale = function (d, raw) { + var v = _scale(d); + + return raw ? v : Math.ceil(v); + }, _scale) scale[key] = _scale[key]; + + return scale.orgDomain = function () { + return _scale.domain(); + }, $$.isCategorized() && (scale.domain = function (domainValue) { + var domain = domainValue; + + return arguments.length ? (_scale.domain(domain), scale) : (domain = this.orgDomain(), [domain[0], domain[1] + 1]); + }), scale; + }, + getY: function getY(min, max, domain) { + var scale = this.getScale(min, max, this.isTimeSeriesY()); + + return domain && scale.domain(domain), scale; + }, + getYScale: function getYScale(id) { + return this.axis.getId(id) === "y2" ? this.y2 : this.y; + }, + getSubYScale: function getSubYScale(id) { + return this.axis.getId(id) === "y2" ? this.subY2 : this.subY; + }, + + + /** + * Update scale + * @private + * @param {Boolean} withoutTransitionAtInit - param is given at the init rendering + */ + updateScales: function updateScales(withoutTransitionAtInit) { + var $$ = this, + config = $$.config, + forInit = !$$.x; + + + // update edges + $$.xMin = config.axis_rotated ? 1 : 0, $$.xMax = config.axis_rotated ? $$.height : $$.width, $$.yMin = config.axis_rotated ? 0 : $$.height, $$.yMax = config.axis_rotated ? $$.width : 1, $$.subXMin = $$.xMin, $$.subXMax = $$.xMax, $$.subYMin = config.axis_rotated ? 0 : $$.height2, $$.subYMax = config.axis_rotated ? $$.width2 : 1, $$.x = $$.getX($$.xMin, $$.xMax, forInit ? undefined : $$.x.orgDomain(), function () { + return $$.xAxis.tickOffset(); + }), $$.y = $$.getY($$.yMin, $$.yMax, forInit ? config.axis_y_default : $$.y.domain()), $$.y2 = $$.getY($$.yMin, $$.yMax, forInit ? config.axis_y2_default : $$.y2.domain()), $$.subX = $$.getX($$.xMin, $$.xMax, $$.orgXDomain, function (d) { + return d % 1 ? 0 : $$.subXAxis.tickOffset(); + }), $$.subY = $$.getY($$.subYMin, $$.subYMax, forInit ? config.axis_y_default : $$.subY.domain()), $$.subY2 = $$.getY($$.subYMin, $$.subYMax, forInit ? config.axis_y2_default : $$.subY2.domain()), $$.xAxisTickFormat = $$.axis.getXAxisTickFormat(), $$.xAxisTickValues = $$.axis.getXAxisTickValues(), $$.yAxisTickValues = $$.axis.getYAxisTickValues(), $$.y2AxisTickValues = $$.axis.getY2AxisTickValues(), $$.xAxis = $$.axis.getXAxis($$.x, $$.xOrient, $$.xAxisTickFormat, $$.xAxisTickValues, config.axis_x_tick_outer, withoutTransitionAtInit), $$.subXAxis = $$.axis.getXAxis($$.subX, $$.subXOrient, $$.xAxisTickFormat, $$.xAxisTickValues, config.axis_x_tick_outer), $$.yAxis = $$.axis.getYAxis($$.y, $$.yOrient, config.axis_y_tick_format, $$.yAxisTickValues, config.axis_y_tick_outer), $$.y2Axis = $$.axis.getYAxis($$.y2, $$.y2Orient, config.axis_y2_tick_format, $$.y2AxisTickValues, config.axis_y2_tick_outer), $$.updateArc && $$.updateArc(); + } +}); /** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ + +/***/ }), +/* 47 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _d = __webpack_require__(2), + _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _classes = __webpack_require__(3), + _classes2 = _interopRequireDefault(_classes), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +(0, _util.extend)(_ChartInternal2.default.prototype, { + /** + * Select a point + * @private + * @param {Object} target point + * @param {Object} data + * @param {Number} index + */ + selectPoint: function selectPoint(target, d, i) { + var $$ = this, + config = $$.config, + cx = (config.axis_rotated ? $$.circleY : $$.circleX).bind($$), + cy = (config.axis_rotated ? $$.circleX : $$.circleY).bind($$), + r = $$.pointSelectR.bind($$); + config.data_onselected.call($$.api, d, target.node()), $$.main.select("." + _classes2.default.selectedCircles + $$.getTargetSelectorSuffix(d.id)).selectAll("." + _classes2.default.selectedCircle + "-" + i).data([d]).enter().append("circle").attr("class", function () { + return $$.generateClass(_classes2.default.selectedCircle, i); + }).attr("cx", cx).attr("cy", cy).attr("stroke", function () { + return $$.color(d); + }).attr("r", function (d2) { + return $$.pointSelectR(d2) * 1.4; + }).transition().duration(100).attr("r", r); + }, + + + /** + * Unelect a point + * @private + * @param {Object} target point + * @param {Object} data + * @param {Number} index + */ + unselectPoint: function unselectPoint(target, d, i) { + var $$ = this; + + $$.config.data_onunselected.call($$.api, d, target.node()), $$.main.select("." + _classes2.default.selectedCircles + $$.getTargetSelectorSuffix(d.id)).selectAll("." + _classes2.default.selectedCircle + "-" + i).transition().duration(100).attr("r", 0).remove(); + }, + + + /** + * Toggles the selection of points + * @private + * @param {Boolean} whether or not to select. + * @param {Object} target point + * @param {Object} data + * @param {Number} index + */ + togglePoint: function togglePoint(selected, target, d, i) { + selected ? this.selectPoint(target, d, i) : this.unselectPoint(target, d, i); + }, + + + /** + * Select a path + * @private + * @param {Object} target path + * @param {Object} data + */ + selectPath: function selectPath(target, d) { + var $$ = this; + + $$.config.data_onselected.call($$, d, target.node()), $$.config.interaction_brighten && target.transition().duration(100).style("fill", function () { + return (0, _d.rgb)($$.color(d)).brighter(0.75); + }); + }, + + + /** + * Unelect a path + * @private + * @param {Object} target path + * @param {Object} data + */ + unselectPath: function unselectPath(target, d) { + var $$ = this; + + $$.config.data_onunselected.call($$, d, target.node()), $$.config.interaction_brighten && target.transition().duration(100).style("fill", function () { + return $$.color(d); + }); + }, + + + /** + * Toggles the selection of lines + * @private + * @param {Boolean} whether or not to select. + * @param {Object} target shape + * @param {Object} data + * @param {Number} index + */ + togglePath: function togglePath(selected, target, d, i) { + selected ? this.selectPath(target, d, i) : this.unselectPath(target, d, i); + }, + + + /** + * Returns the toggle method of the target + * @private + * @param {Object} target shape + * @param {Object} data + * @returns {Function} toggle method + */ + getToggle: function getToggle(that, d) { + var $$ = this, + toggle = void 0; + + return that.nodeName === "circle" ? $$.isStepType(d) ? toggle = function () {} : toggle = $$.togglePoint : that.nodeName === "path" && (toggle = $$.togglePath), toggle; + }, + + + /** + * Toggles the selection of shapes + * @private + * @param {Object} target shape + * @param {Object} data + * @param {Number} index + */ + toggleShape: function toggleShape(that, d, i) { + var _this = this, + $$ = this, + config = $$.config, + shape = (0, _d.select)(that), + isSelected = shape.classed(_classes2.default.SELECTED), + toggle = $$.getToggle(that, d).bind($$); + + if (config.data_selection_enabled && config.data_selection_isselectable(d)) { + if (!config.data_selection_multiple) { + var selecter = "." + _classes2.default.shapes; + + config.data_selection_grouped && (selecter = "." + selecter + $$.getTargetSelectorSuffix(d.id)), $$.main.selectAll(selecter).selectAll("." + _classes2.default.shape).each(function (d, i) { + var shape = (0, _d.select)(_this); + + shape.classed(_classes2.default.SELECTED) && toggle(!1, shape.classed(_classes2.default.SELECTED, !1), d, i); + }); + } + shape.classed(_classes2.default.SELECTED, !isSelected), toggle(!isSelected, shape, d, i); + } + } +}); + +/***/ }), +/* 48 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _d = __webpack_require__(2), + _classes = __webpack_require__(3), + _classes2 = _interopRequireDefault(_classes), + _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +(0, _util.extend)(_ChartInternal2.default.prototype, { + initBar: function initBar() { + var $$ = this; + + $$.main.select("." + _classes2.default.chart).append("g").attr("class", _classes2.default.chartBars); + }, + updateTargetsForBar: function updateTargetsForBar(targets) { + var $$ = this, + config = $$.config, + classChartBar = $$.classChartBar.bind($$), + classBars = $$.classBars.bind($$), + classFocus = $$.classFocus.bind($$), + mainBarUpdate = $$.main.select("." + _classes2.default.chartBars).selectAll("." + _classes2.default.chartBar).data(targets).attr("class", function (d) { + return classChartBar(d) + classFocus(d); + }), + mainBarEnter = mainBarUpdate.enter().append("g").attr("class", classChartBar).style("opacity", "0").style("pointer-events", "none"); + + + // Bars for each data + mainBarEnter.append("g").attr("class", classBars).style("cursor", function (d) { + return config.data_selection_isselectable(d) ? "pointer" : null; + }); + }, + updateBar: function updateBar(durationForExit) { + var $$ = this, + barData = $$.barData.bind($$), + classBar = $$.classBar.bind($$), + initialOpacity = $$.initialOpacity.bind($$), + color = function (d) { + return $$.color(d.id); + }; + $$.mainBar = $$.main.selectAll("." + _classes2.default.bars).selectAll("." + _classes2.default.bar).data(barData), $$.mainBar.exit().transition().duration(durationForExit).style("opacity", "0").remove(), $$.mainBar = $$.mainBar.enter().append("path").attr("class", classBar).style("stroke", color).style("fill", color).merge($$.mainBar).style("opacity", initialOpacity); + }, + redrawBar: function redrawBar(drawBar, withTransition) { + return [(withTransition ? this.mainBar.transition(Math.random().toString()) : this.mainBar).attr("d", drawBar).style("fill", this.color).style("opacity", "1")]; + }, + getBarW: function getBarW(axis, barTargetsNum) { + var $$ = this, + config = $$.config, + w = typeof config.bar_width === "number" ? config.bar_width : barTargetsNum ? axis.tickInterval() * config.bar_width_ratio / barTargetsNum : 0; + + + return config.bar_width_max && w > config.bar_width_max ? config.bar_width_max : w; + }, + getBars: function getBars(i, id) { + var $$ = this, + suffix = (0, _util.isValue)(i) ? "-" + i : ""; + + + return (id ? $$.main.selectAll("." + _classes2.default.bars + $$.getTargetSelectorSuffix(id)) : $$.main).selectAll("." + _classes2.default.bar + suffix); + }, + expandBars: function expandBars(i, id, reset) { + var $$ = this; + + reset && $$.unexpandBars(), $$.getBars(i, id).classed(_classes2.default.EXPANDED, !0); + }, + unexpandBars: function unexpandBars(i) { + var $$ = this; + + $$.getBars(i).classed(_classes2.default.EXPANDED, !1); + }, + generateDrawBar: function generateDrawBar(barIndices, isSub) { + var $$ = this, + config = $$.config, + getPoints = $$.generateGetBarPoints(barIndices, isSub); + + + return function (d, i) { + // 4 points that make a bar + var points = getPoints(d, i), + indexX = config.axis_rotated ? 1 : 0, + indexY = config.axis_rotated ? 0 : 1, + path = "M " + points[0][indexX] + "," + points[0][indexY] + "\n\t\t\tL " + points[1][indexX] + "," + points[1][indexY] + "\n\t\t\tL " + points[2][indexX] + "," + points[2][indexY] + "\n\t\t\tL " + points[3][indexX] + "," + points[3][indexY] + " z"; + + // switch points if axis is rotated, not applicable for sub chart + + + return path; + }; + }, + generateGetBarPoints: function generateGetBarPoints(barIndices, isSub) { + var $$ = this, + axis = isSub ? $$.subXAxis : $$.xAxis, + barTargetsNum = barIndices.__max__ + 1, + barW = $$.getBarW(axis, barTargetsNum), + barX = $$.getShapeX(barW, barTargetsNum, barIndices, !!isSub), + barY = $$.getShapeY(!!isSub), + barOffset = $$.getShapeOffset($$.isBarType, barIndices, !!isSub), + yScale = isSub ? $$.getSubYScale : $$.getYScale; + + + return function (d, i) { + var y0 = yScale.call($$, d.id)(0), + offset = barOffset(d, i) || y0, + posX = barX(d), + posY = barY(d); // offset is for stacked bar chart + + + // fix posY not to overflow opposite quadrant + + // 4 points that make a bar + return $$.config.axis_rotated && (d.value > 0 && posY < y0 || d.value < 0 && y0 < posY) && (posY = y0), [[posX, offset], [posX, posY - (y0 - offset)], [posX + barW, posY - (y0 - offset)], [posX + barW, offset]]; + }; + }, + isWithinBar: function isWithinBar(that) { + var mouse = (0, _d.mouse)(that), + list = (0, _util.getRectSegList)(that), + box = that.getBBox(), + seg0 = list[0], + seg1 = list[1], + x = Math.min(seg0.x, seg1.x), + y = Math.min(seg0.y, seg1.y), + w = box.width, + h = box.height, + offset = 2, + isIn = x - offset < mouse[0] && mouse[0] < x + w + offset && y - offset < mouse[1] && mouse[1] < y + h + offset; + + + return isIn; + } +}); + +/***/ }), +/* 49 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _d = __webpack_require__(2), + _classes = __webpack_require__(3), + _classes2 = _interopRequireDefault(_classes), + _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +(0, _util.extend)(_ChartInternal2.default.prototype, { + getShapeIndices: function getShapeIndices(typeFilter) { + var $$ = this, + config = $$.config, + indices = {}, + i = 0, + j = void 0, + k = void 0; + + return $$.filterTargetsToShow($$.data.targets.filter(typeFilter, $$)).forEach(function (d) { + for (j = 0; j < config.data_groups.length; j++) if (!(config.data_groups[j].indexOf(d.id) < 0)) for (k = 0; k < config.data_groups[j].length; k++) if (config.data_groups[j][k] in indices) { + indices[d.id] = indices[config.data_groups[j][k]]; + + break; + } + (0, _util.isUndefined)(indices[d.id]) && (indices[d.id] = i++); + }), indices.__max__ = i - 1, indices; + }, + getShapeX: function getShapeX(offset, targetsNum, indices, isSub) { + var $$ = this, + scale = isSub ? $$.subX : $$.x; + + + return function (d) { + var index = d.id in indices ? indices[d.id] : 0; + + return d.x || d.x === 0 ? scale(d.x) - offset * (targetsNum / 2 - index) : 0; + }; + }, + getShapeY: function getShapeY(isSub) { + var $$ = this; + + return function (d) { + var scale = isSub ? $$.getSubYScale(d.id) : $$.getYScale(d.id); + + return scale(d.value); + }; + }, + getShapeOffset: function getShapeOffset(typeFilter, indices, isSub) { + var $$ = this, + targets = $$.orderTargets($$.filterTargetsToShow($$.data.targets.filter(typeFilter, $$))), + targetIds = targets.map(function (t) { + return t.id; + }); + + + return function (d, idx) { + var scale = isSub ? $$.getSubYScale(d.id) : $$.getYScale(d.id), + y0 = scale(0), + offset = y0, + i = idx; + + return targets.forEach(function (t) { + var values = $$.isStepType(d) ? $$.convertValuesToStep(t.values) : t.values; + + t.id === d.id || indices[t.id] !== indices[d.id] || targetIds.indexOf(t.id) < targetIds.indexOf(d.id) && ((typeof values[i] === "undefined" || +values[i].x !== +d.x) && (i = -1, values.forEach(function (v, j) { + v.x === d.x && (i = j); + })), i in values && values[i].value * d.value >= 0 && (offset += scale(values[i].value) - y0)); + }), offset; + }; + }, + isWithinShape: function isWithinShape(that, d) { + var $$ = this, + shape = (0, _d.select)(that), + isWithin = void 0; + + return $$.isTargetToShow(d.id) ? that.nodeName === "circle" ? isWithin = $$.isStepType(d) ? $$.isWithinStep(that, $$.getYScale(d.id)(d.value)) : $$.isWithinCircle(that, $$.pointSelectR(d) * 1.5) : that.nodeName === "path" && (isWithin = !shape.classed(_classes2.default.bar) || $$.isWithinBar(that)) : isWithin = !1, isWithin; + }, + getInterpolate: function getInterpolate(d) { + var $$ = this, + interpolation = $$.getInterpolateType(d); + + + return { + "basis": _d.curveBasis, + "basis-closed": _d.curveBasisClosed, + "basis-open": _d.curveBasisOpen, + "bundle": _d.curveBundle, + "cardinal": _d.curveCardinal, + "cardinal-closed": _d.curveCardinalClosed, + "cardinal-open": _d.curveCardinalOpen, + "catmull-rom": _d.curveCatmullRom, + "catmull-rom-closed": _d.curveCatmullRomClosed, + "catmull-rom-open": _d.curveCatmullRomOpen, + "monotone-x": _d.curveMonotoneX, + "monotone-y": _d.curveMonotoneY, + "natural": _d.curveNatural, + "linear-closed": _d.curveLinearClosed, + "linear": _d.curveLinear, + "step": _d.curveStep + }[interpolation]; + }, + getInterpolateType: function getInterpolateType(d) { + var $$ = this, + interpolation = $$.isInterpolationType($$.config.spline_interpolation_type) ? $$.config.spline_interpolation_type : "cardinal"; + + return interpolation = $$.isSplineType(d) ? interpolation : $$.isStepType(d) ? $$.config.line_step_type : "linear", interpolation; + } +}); + +/***/ }), +/* 50 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _d = __webpack_require__(2), + _classes = __webpack_require__(3), + _classes2 = _interopRequireDefault(_classes), + _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +(0, _util.extend)(_ChartInternal2.default.prototype, { + initLine: function initLine() { + var $$ = this; + + $$.main.select("." + _classes2.default.chart).append("g").attr("class", _classes2.default.chartLines); + }, + updateTargetsForLine: function updateTargetsForLine(targets) { + var $$ = this, + config = $$.config, + classChartLine = $$.classChartLine.bind($$), + classLines = $$.classLines.bind($$), + classAreas = $$.classAreas.bind($$), + classCircles = $$.classCircles.bind($$), + classFocus = $$.classFocus.bind($$), + mainLineUpdate = $$.main.select("." + _classes2.default.chartLines).selectAll("." + _classes2.default.chartLine).data(targets).attr("class", function (d) { + return classChartLine(d) + classFocus(d); + }), + mainLineEnter = mainLineUpdate.enter().append("g").attr("class", classChartLine).style("opacity", "0").style("pointer-events", "none"); + + + // Lines for each data + mainLineEnter.append("g").attr("class", classLines), mainLineEnter.append("g").attr("class", classAreas), mainLineEnter.append("g").attr("class", function (d) { + return $$.generateClass(_classes2.default.selectedCircles, d.id); + }), mainLineEnter.append("g").attr("class", classCircles).style("cursor", function (d) { + return config.data_selection_isselectable(d) ? "pointer" : null; + }), targets.forEach(function (t) { + $$.main.selectAll("." + _classes2.default.selectedCircles + $$.getTargetSelectorSuffix(t.id)).selectAll("" + _classes2.default.selectedCircle).each(function (d) { + d.value = t.values[d.index].value; + }); + }); + }, + updateLine: function updateLine(durationForExit) { + var $$ = this; + + $$.mainLine = $$.main.selectAll("." + _classes2.default.lines).selectAll("." + _classes2.default.line).data($$.lineData.bind($$)), $$.mainLine.exit().transition().duration(durationForExit).style("opacity", "0").remove(), $$.mainLine = $$.mainLine.enter().append("path").attr("class", $$.classLine.bind($$)).style("stroke", $$.color).merge($$.mainLine).style("opacity", $$.initialOpacity.bind($$)).style("shape-rendering", function (d) { + return $$.isStepType(d) ? "crispEdges" : ""; + }).attr("transform", null); + }, + redrawLine: function redrawLine(drawLine, withTransition) { + return [(withTransition ? this.mainLine.transition(Math.random().toString()) : this.mainLine).attr("d", drawLine).style("stroke", this.color).style("opacity", "1")]; + }, + generateDrawLine: function generateDrawLine(lineIndices, isSub) { + var $$ = this, + config = $$.config, + getPoints = $$.generateGetLinePoints(lineIndices, isSub), + yScaleGetter = isSub ? $$.getSubYScale : $$.getYScale, + xValue = function (d) { + return (isSub ? $$.subxx : $$.xx).call($$, d); + }, + yValue = function (d, i) { + return config.data_groups.length > 0 ? getPoints(d, i)[0][1] : yScaleGetter.call($$, d.id)(d.value); + }, + line = (0, _d.line)(); + + + return line = config.axis_rotated ? line.x(yValue).y(xValue) : line.x(xValue).y(yValue), config.line_connectNull || (line = line.defined(function (d) { + return d.value !== null; + })), function (d) { + var x = isSub ? $$.x : $$.subX, + y = yScaleGetter.call($$, d.id), + values = config.line_connectNull ? $$.filterRemoveNull(d.values) : d.values, + x0 = 0, + y0 = 0, + path = void 0; + + return $$.isLineType(d) ? config.data_regions[d.id] ? path = $$.lineWithRegions(values, x, y, config.data_regions[d.id]) : ($$.isStepType(d) && (values = $$.convertValuesToStep(values)), path = line.curve($$.getInterpolate(d))(values)) : (values[0] && (x0 = x(values[0].x), y0 = y(values[0].value)), path = config.axis_rotated ? "M " + y0 + " " + x0 : "M " + x0 + " " + y0), path || "M 0 0"; + }; + }, + generateGetLinePoints: function generateGetLinePoints(lineIndices, isSub) { + // partial duplication of generateGetBarPoints + var $$ = this, + config = $$.config, + lineTargetsNum = lineIndices.__max__ + 1, + x = $$.getShapeX(0, lineTargetsNum, lineIndices, !!isSub), + y = $$.getShapeY(!!isSub), + lineOffset = $$.getShapeOffset($$.isLineType, lineIndices, !!isSub), + yScale = isSub ? $$.getSubYScale : $$.getYScale; + + + return function (d, i) { + var y0 = yScale.call($$, d.id)(0), + offset = lineOffset(d, i) || y0, + posX = x(d), + posY = y(d); // offset is for stacked area chart + + + // fix posY not to overflow opposite quadrant + + // 1 point that marks the line position + return config.axis_rotated && (d.value > 0 && posY < y0 || d.value < 0 && y0 < posY) && (posY = y0), [[posX, posY - (y0 - offset)], [posX, posY - (y0 - offset)], // needed for compatibility + [posX, posY - (y0 - offset)], // needed for compatibility + [posX, posY - (y0 - offset)] // needed for compatibility + ]; + }; + }, + lineWithRegions: function lineWithRegions(d, x, y, _regions) { + + function isWithinRegions(withinX, withinRegions) { + var idx = void 0; + + for (idx = 0; idx < withinRegions.length; idx++) if (withinRegions[idx].start < withinX && withinX <= withinRegions[idx].end) return !0; + return !1; + } + + // Check start/end of regions + + + // Define svg generator function for region + function generateM(points) { + return "M" + points[0][0] + " " + points[0][1] + " " + points[1][0] + " " + points[1][1]; + } + + var $$ = this, + config = $$.config, + xOffset = $$.isCategorized() ? 0.5 : 0, + regions = [], + i = void 0, + j = void 0, + s = "M", + sWithRegion = void 0, + xp = void 0, + yp = void 0, + dx = void 0, + dy = void 0, + dd = void 0, + diff = void 0, + diffx2 = void 0; + if ((0, _util.isDefined)(_regions)) for (i = 0; i < _regions.length; i++) regions[i] = {}, regions[i].start = (0, _util.isUndefined)(_regions[i].start) ? d[0].x : $$.isTimeSeries() ? $$.parseDate(_regions[i].start) : _regions[i].start, regions[i].end = (0, _util.isUndefined)(_regions[i].end) ? d[d.length - 1].x : $$.isTimeSeries() ? $$.parseDate(_regions[i].end) : _regions[i].end; + + // Set scales + var xValue = config.axis_rotated ? function (dt) { + return y(dt.value); + } : function (dt) { + return x(dt.x); + }, + yValue = config.axis_rotated ? function (dt) { + return x(dt.x); + } : function (dt) { + return y(dt.value); + }; + + // Generate + for (sWithRegion = $$.isTimeSeries() ? function (d0, d1, k, timeseriesDiff) { + var x0 = d0.x.getTime(), + xDiff = d1.x - d0.x, + xv0 = new Date(x0 + xDiff * k), + xv1 = new Date(x0 + xDiff * (k + timeseriesDiff)), + points = void 0; + + return points = config.axis_rotated ? [[y(yp(k)), x(xv0)], [y(yp(k + diff)), x(xv1)]] : [[x(xv0), y(yp(k))], [x(xv1), y(yp(k + diff))]], generateM(points); + } : function (d0, d1, k, otherDiff) { + var points = void 0; + + return points = config.axis_rotated ? [[y(yp(k), !0), x(xp(k))], [y(yp(k + otherDiff), !0), x(xp(k + otherDiff))]] : [[x(xp(k), !0), y(yp(k))], [x(xp(k + otherDiff), !0), y(yp(k + otherDiff))]], generateM(points); + }, i = 0; i < d.length; i++) + // Draw as normal + if ((0, _util.isUndefined)(regions) || !isWithinRegions(d[i].x, regions)) s += " " + xValue(d[i]) + " " + yValue(d[i]);else for (xp = $$.getScale(d[i - 1].x + xOffset, d[i].x + xOffset, $$.isTimeSeries()), yp = $$.getScale(d[i - 1].value, d[i].value), dx = x(d[i].x) - x(d[i - 1].x), dy = y(d[i].value) - y(d[i - 1].value), dd = Math.sqrt(Math.pow(dx, 2) + Math.pow(dy, 2)), diff = 2 / dd, diffx2 = diff * 2, j = diff; j <= 1; j += diffx2) s += sWithRegion(d[i - 1], d[i], j, diff); + + return s; + }, + updateArea: function updateArea(durationForExit) { + var $$ = this; + + $$.mainArea = $$.main.selectAll("." + _classes2.default.areas).selectAll("." + _classes2.default.area).data($$.lineData.bind($$)), $$.mainArea.exit().transition().duration(durationForExit).style("opacity", "0").remove(), $$.mainArea = $$.mainArea.enter().append("path").attr("class", $$.classArea.bind($$)).style("fill", $$.color).style("opacity", function () { + return $$.orgAreaOpacity = (0, _d.select)(this).style("opacity"), "0"; + }).merge($$.mainArea), $$.mainArea.style("opacity", $$.orgAreaOpacity); + }, + redrawArea: function redrawArea(drawArea, withTransition) { + return [(withTransition ? this.mainArea.transition(Math.random().toString()) : this.mainArea).attr("d", drawArea).style("fill", this.color).style("opacity", this.orgAreaOpacity)]; + }, + generateDrawArea: function generateDrawArea(areaIndices, isSub) { + var $$ = this, + config = $$.config, + getPoints = $$.generateGetAreaPoints(areaIndices, isSub), + yScaleGetter = isSub ? $$.getSubYScale : $$.getYScale, + xValue = function (d) { + return (isSub ? $$.subxx : $$.xx).call($$, d); + }, + value0 = function (d, i) { + return config.data_groups.length > 0 ? getPoints(d, i)[0][1] : yScaleGetter.call($$, d.id)($$.getAreaBaseValue(d.id)); + }, + value1 = function (d, i) { + return config.data_groups.length > 0 ? getPoints(d, i)[1][1] : yScaleGetter.call($$, d.id)(d.value); + }, + area = (0, _d.area)(); + + + return area = config.axis_rotated ? area.x0(value0).x1(value1).y(xValue) : area.x(xValue).y0(config.area_above ? 0 : value0).y1(value1), config.line_connectNull || (area = area.defined(function (d) { + return d.value !== null; + })), function (d) { + var values = config.line_connectNull ? $$.filterRemoveNull(d.values) : d.values, + x0 = 0, + y0 = 0, + path = void 0; + + return $$.isAreaType(d) ? ($$.isStepType(d) && (values = $$.convertValuesToStep(values)), path = area.curve($$.getInterpolate(d))(values)) : (values[0] && (x0 = $$.x(values[0].x), y0 = $$.getYScale(d.id)(values[0].value)), path = config.axis_rotated ? "M " + y0 + " " + x0 : "M " + x0 + " " + y0), path || "M 0 0"; + }; + }, + getAreaBaseValue: function getAreaBaseValue() { + return 0; + }, + generateGetAreaPoints: function generateGetAreaPoints(areaIndices, isSub) { + // partial duplication of generateGetBarPoints + var $$ = this, + config = $$.config, + areaTargetsNum = areaIndices.__max__ + 1, + x = $$.getShapeX(0, areaTargetsNum, areaIndices, !!isSub), + y = $$.getShapeY(!!isSub), + areaOffset = $$.getShapeOffset($$.isAreaType, areaIndices, !!isSub), + yScale = isSub ? $$.getSubYScale : $$.getYScale; + + + return function (d, i) { + var y0 = yScale.call($$, d.id)(0), + offset = areaOffset(d, i) || y0, + posX = x(d), + posY = y(d); // offset is for stacked area chart + + + // fix posY not to overflow opposite quadrant + + + // 1 point that marks the area position + return config.axis_rotated && (d.value > 0 && posY < y0 || d.value < 0 && y0 < posY) && (posY = y0), [[posX, offset], [posX, posY - (y0 - offset)], [posX, posY - (y0 - offset)], // needed for compatibility + [posX, offset] // needed for compatibility + ]; + }; + }, + updateCircle: function updateCircle() { + var $$ = this; + + $$.mainCircle = $$.main.selectAll("." + _classes2.default.circles).selectAll("." + _classes2.default.circle).data($$.lineOrScatterData.bind($$)), $$.mainCircle.exit().remove(), $$.mainCircle = $$.mainCircle.enter().append("circle").attr("class", $$.classCircle.bind($$)).attr("r", $$.pointR.bind($$)).style("fill", $$.color).merge($$.mainCircle).style("opacity", $$.initialOpacityForCircle.bind($$)); + }, + redrawCircle: function redrawCircle(cx, cy, withTransition, flow) { + var selectedCircles = this.main.selectAll("." + _classes2.default.selectedCircle), + mainCircles = void 0; + + + if (withTransition) { + var transitionName = Math.random().toString(); + + mainCircles = flow ? this.mainCircle.attr("cx", cx).transition(transitionName).attr("cx", cx).attr("cy", cy).transition(transitionName).style("opacity", this.opacityForCircle.bind(this)).style("fill", this.color) : this.mainCircle.transition(transitionName).attr("cx", cx).attr("cy", cy).transition(transitionName).style("opacity", this.opacityForCircle.bind(this)).style("fill", this.color), selectedCircles = selectedCircles.transition(Math.random().toString()); + } else mainCircles = this.mainCircle.attr("cx", cx).attr("cy", cy).style("opacity", this.opacityForCircle.bind(this)).style("fill", this.color); + + return [mainCircles, selectedCircles.attr("cx", cx).attr("cy", cy)]; + }, + circleX: function circleX(d) { + return this.config.zoom_enabled && this.zoomScale ? d.x || d.x === 0 ? this.zoomScale(d.x) : null : d.x || d.x === 0 ? this.x(d.x) : null; + }, + updateCircleY: function updateCircleY() { + var $$ = this, + lineIndices = void 0, + getPoints = void 0; + $$.config.data_groups.length > 0 ? (lineIndices = $$.getShapeIndices($$.isLineType), getPoints = $$.generateGetLinePoints(lineIndices), $$.circleY = function (d, i) { + return getPoints(d, i)[0][1]; + }) : $$.circleY = function (d) { + return $$.getYScale(d.id)(d.value); + }; + }, + getCircles: function getCircles(i, id) { + var $$ = this, + suffix = (0, _util.isValue)(i) ? "-" + i : ""; + + + return (id ? $$.main.selectAll("." + _classes2.default.circles + $$.getTargetSelectorSuffix(id)) : $$.main).selectAll("." + _classes2.default.circle + suffix); + }, + expandCircles: function expandCircles(i, id, reset) { + var $$ = this, + r = $$.pointExpandedR.bind($$); + reset && $$.unexpandCircles(), $$.getCircles(i, id).classed(_classes2.default.EXPANDED, !0).attr("r", r); + }, + unexpandCircles: function unexpandCircles(i) { + var $$ = this, + r = $$.pointR.bind($$); + $$.getCircles(i).filter(function () { + return (0, _d.select)(this).classed(_classes2.default.EXPANDED); + }).classed(_classes2.default.EXPANDED, !1).attr("r", r); + }, + pointR: function pointR(d) { + var $$ = this, + config = $$.config; + + + return $$.isStepType(d) ? 0 : (0, _util.isFunction)(config.point_r) ? config.point_r(d) : config.point_r; + }, + pointExpandedR: function pointExpandedR(d) { + var $$ = this, + config = $$.config; + + + return config.point_focus_expand_enabled ? config.point_focus_expand_r ? config.point_focus_expand_r : $$.pointR(d) * 1.75 : $$.pointR(d); + }, + pointSelectR: function pointSelectR(d) { + var $$ = this, + config = $$.config; + + + return (0, _util.isFunction)(config.point_select_r) ? config.point_select_r(d) : config.point_select_r ? config.point_select_r : $$.pointR(d) * 4; + }, + isWithinCircle: function isWithinCircle(that, r) { + var mouse = (0, _d.mouse)(that), + d3This = (0, _d.select)(that), + cx = +d3This.attr("cx"), + cy = +d3This.attr("cy"); + + + return Math.sqrt(Math.pow(cx - mouse[0], 2) + Math.pow(cy - mouse[1], 2)) < r; + }, + isWithinStep: function isWithinStep(that, y) { + return Math.abs(y - (0, _d.mouse)(that)[1]) < 30; + } +}); + +/***/ }), +/* 51 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _classes = __webpack_require__(3), + _classes2 = _interopRequireDefault(_classes), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +(0, _util.extend)(_ChartInternal2.default.prototype, { + getCurrentWidth: function getCurrentWidth() { + var $$ = this, + config = $$.config; + + + return config.size_width ? config.size_width : $$.getParentWidth(); + }, + getCurrentHeight: function getCurrentHeight() { + var $$ = this, + config = $$.config, + h = config.size_height ? config.size_height : $$.getParentHeight(); + + + return h > 0 ? h : 320 / ($$.hasType("gauge") && !config.gauge_fullCircle ? 2 : 1); + }, + getCurrentPaddingTop: function getCurrentPaddingTop() { + var $$ = this, + config = $$.config, + padding = (0, _util.isValue)(config.padding_top) ? config.padding_top : 0; + + + return $$.title && $$.title.node() && (padding += $$.getTitlePadding()), padding; + }, + getCurrentPaddingBottom: function getCurrentPaddingBottom() { + var config = this.config; + + return (0, _util.isValue)(config.padding_bottom) ? config.padding_bottom : 0; + }, + getCurrentPaddingLeft: function getCurrentPaddingLeft(withoutRecompute) { + var $$ = this, + config = $$.config, + paddingLeft = void 0; + + + return paddingLeft = (0, _util.isValue)(config.padding_left) ? config.padding_left : config.axis_rotated ? config.axis_x_show ? Math.max((0, _util.ceil10)($$.getAxisWidthByAxisId("x", withoutRecompute)), 40) : 1 : !config.axis_y_show || config.axis_y_inner ? $$.axis.getYAxisLabelPosition().isOuter ? 30 : 1 : (0, _util.ceil10)($$.getAxisWidthByAxisId("y", withoutRecompute)), paddingLeft; + }, + getCurrentPaddingRight: function getCurrentPaddingRight() { + var $$ = this, + config = $$.config, + legendWidthOnRight = $$.isLegendRight ? $$.getLegendWidth() + 20 : 0, + paddingRight = void 0; + + + return paddingRight = (0, _util.isValue)(config.padding_right) ? config.padding_right + 1 : config.axis_rotated ? 10 + legendWidthOnRight : !config.axis_y2_show || config.axis_y2_inner ? 2 + legendWidthOnRight + ($$.axis.getY2AxisLabelPosition().isOuter ? 20 : 0) : (0, _util.ceil10)($$.getAxisWidthByAxisId("y2")) + legendWidthOnRight, paddingRight; + }, + getParentRectValue: function getParentRectValue(key) { + for (var parent = this.selectChart.node(), v = void 0; parent && parent.tagName !== "BODY";) { + try { + v = parent.getBoundingClientRect()[key]; + } catch (e) { + key === "width" && (v = parent.offsetWidth); + } + + if (v) break; + + parent = parent.parentNode; + } + + return v; + }, + getParentWidth: function getParentWidth() { + return this.getParentRectValue("width"); + }, + getParentHeight: function getParentHeight() { + var h = this.selectChart.style("height"); + + return h.indexOf("px") > 0 ? +h.replace("px", "") : 0; + }, + getSvgLeft: function getSvgLeft(withoutRecompute) { + var $$ = this, + config = $$.config, + hasLeftAxisRect = config.axis_rotated || !config.axis_rotated && !config.axis_y_inner, + leftAxisClass = config.axis_rotated ? _classes2.default.axisX : _classes2.default.axisY, + leftAxis = $$.main.select("." + leftAxisClass).node(), + svgRect = leftAxis && hasLeftAxisRect ? leftAxis.getBoundingClientRect() : { right: 0 }, + chartRect = $$.selectChart.node().getBoundingClientRect(), + hasArc = $$.hasArcType(), + svgLeft = svgRect.right - chartRect.left - (hasArc ? 0 : $$.getCurrentPaddingLeft(withoutRecompute)); + + + return svgLeft > 0 ? svgLeft : 0; + }, + getAxisWidthByAxisId: function getAxisWidthByAxisId(id, withoutRecompute) { + var $$ = this, + position = $$.axis.getLabelPositionById(id); + + + return $$.axis.getMaxTickWidth(id, withoutRecompute) + (position.isInner ? 20 : 40); + }, + getHorizontalAxisHeight: function getHorizontalAxisHeight(axisId) { + var $$ = this, + config = $$.config, + h = 30; + + + // Calculate x axis height when tick rotated + return axisId !== "x" || config.axis_x_show ? axisId === "x" && config.axis_x_height ? config.axis_x_height : axisId !== "y" || config.axis_y_show ? axisId !== "y2" || config.axis_y2_show ? (axisId === "x" && !config.axis_rotated && config.axis_x_tick_rotate && (h = 30 + $$.axis.getMaxTickWidth(axisId) * Math.cos(Math.PI * (90 - config.axis_x_tick_rotate) / 180)), axisId === "y" && config.axis_rotated && config.axis_y_tick_rotate && (h = 30 + $$.axis.getMaxTickWidth(axisId) * Math.cos(Math.PI * (90 - config.axis_y_tick_rotate) / 180)), h + ($$.axis.getLabelPositionById(axisId).isInner ? 0 : 10) + (axisId === "y2" ? -10 : 0)) : $$.rotated_padding_top : !config.legend_show || $$.isLegendRight || $$.isLegendInset ? 1 : 10 : 8; + }, + getEventRectWidth: function getEventRectWidth() { + return Math.max(0, this.xAxis.tickInterval()); + } +}); /** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ + +/***/ }), +/* 52 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _d = __webpack_require__(2), + _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _classes = __webpack_require__(3), + _classes2 = _interopRequireDefault(_classes), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +(0, _util.extend)(_ChartInternal2.default.prototype, { + /** + * Initializes the text + * @private + */ + initText: function initText() { + var $$ = this; + + $$.main.select("." + _classes2.default.chart).append("g").attr("class", _classes2.default.chartTexts), $$.mainText = (0, _d.selectAll)([]); + }, + + + /** + * Update chartText + * @private + * @param {Object} $$.data.targets + */ + updateTargetsForText: function updateTargetsForText(targets) { + var $$ = this, + classChartText = $$.classChartText.bind($$), + classTexts = $$.classTexts.bind($$), + classFocus = $$.classFocus.bind($$), + mainTextUpdate = $$.main.select("." + _classes2.default.chartTexts).selectAll("." + _classes2.default.chartText).data(targets).attr("class", function (d) { + return classChartText(d) + classFocus(d); + }), + mainTextEnter = mainTextUpdate.enter().append("g").attr("class", classChartText).style("opacity", "0").style("pointer-events", "none"); + mainTextEnter.append("g").attr("class", classTexts); + }, + + + /** + * Update text + * @private + * @param {Number} Fade-out transition duration + */ + updateText: function updateText(durationForExit) { + var $$ = this, + config = $$.config, + barOrLineData = $$.barOrLineData.bind($$), + classText = $$.classText.bind($$); + $$.mainText = $$.main.selectAll("." + _classes2.default.texts).selectAll("." + _classes2.default.text).data(barOrLineData), $$.mainText.exit().transition().duration(durationForExit).style("fill-opacity", "0").remove(), $$.mainText = $$.mainText.enter().append("text").attr("class", classText).attr("text-anchor", function (d) { + return config.axis_rotated ? d.value < 0 ? "end" : "start" : "middle"; + }).style("stroke", "none").style("fill", function (d) { + return $$.color(d); + }).style("fill-opacity", "0").merge($$.mainText).text(function (d, i, j) { + return $$.dataLabelFormat(d.id)(d.value, d.id, i, j); + }); + }, + + + /** + * Redraw chartText + * @private + * @param {Number} x Attribute + * @param {Number} y Attribute + * @param {Object} options.flow + * @param {Boolean} indicates transition is enabled + * @returns {Object} $$.mainText + */ + redrawText: function redrawText(xForText, yForText, forFlow, withTransition) { + return [(withTransition ? this.mainText.transition() : this.mainText).attr("x", xForText).attr("y", yForText).style("fill", this.color).style("fill-opacity", forFlow ? 0 : this.opacityForText.bind(this))]; + }, + + + /** + * Gets the getBoundingClientRect value of the element + * @private + * @param {String} text + * @param {String} class + * @param {HTMLElement} element + * @returns {Object} value of element.getBoundingClientRect() + */ + getTextRect: function getTextRect(text, cls, element) { + var dummy = (0, _d.select)("body").append("div").classed("bb", !0), + svg = dummy.append("svg").style("visibility", "hidden").style("position", "fixed").style("top", "0px").style("left", "0px"), + font = (0, _d.select)(element).style("font"), + rect = void 0; + + return svg.selectAll(".dummy").data([text]).enter().append("text").classed(cls ? cls : "", !0).style("font", font).text(text).each(function () { + rect = this.getBoundingClientRect(); + }), dummy.remove(), rect; + }, + + + /** + * Gets the x or y coordinate of the text + * @private + * @param {Object} area Indices + * @param {Object} bar Indices + * @param {Object} line Indices + * @param {Boolean} whether or not to x + * @returns {Number} coordinates + */ + generateXYForText: function generateXYForText(areaIndices, barIndices, lineIndices, forX) { + var $$ = this, + getAreaPoints = $$.generateGetAreaPoints(areaIndices, !1), + getBarPoints = $$.generateGetBarPoints(barIndices, !1), + getLinePoints = $$.generateGetLinePoints(lineIndices, !1), + getter = forX ? $$.getXForText : $$.getYForText; + + + return function (d, i) { + var getPoints = $$.isBarType(d) ? getBarPoints : getLinePoints; + + return getPoints = $$.isAreaType(d) ? getAreaPoints : getPoints, getter.call($$, getPoints(d, i), d, this); + }; + }, + + + /** + * Gets the x coordinate of the text + * @private + * @param {Object} points + * @param {Object} data + * @param {HTMLElement} element + * @returns {Number} x coordinate + */ + getXForText: function getXForText(points, d, textElement) { + var $$ = this, + box = textElement.getBoundingClientRect(), + xPos = void 0, + padding = void 0; + + return $$.config.axis_rotated ? (padding = $$.isBarType(d) ? 4 : 6, xPos = points[2][1] + padding * (d.value < 0 ? -1 : 1)) : xPos = $$.hasType("bar") ? (points[2][0] + points[0][0]) / 2 : points[0][0], d.value === null && (xPos > $$.width ? xPos = $$.width - box.width : xPos < 0 && (xPos = 4)), xPos; + }, + + + /** + * Gets the y coordinate of the text + * @private + * @param {Object} points + * @param {Object} data + * @param {HTMLElement} element + * @returns {Number} y coordinate + */ + getYForText: function getYForText(points, d, textElement) { + var $$ = this, + box = textElement.getBoundingClientRect(), + yPos = void 0; + + return $$.config.axis_rotated ? yPos = (points[0][0] + points[2][0] + box.height * 0.6) / 2 : (yPos = points[2][1], d.value < 0 || d.value === 0 && !$$.hasPositiveValue ? (yPos += box.height, $$.isBarType(d) && $$.isSafari() ? yPos -= 3 : !$$.isBarType(d) && $$.isChrome() && (yPos += 3)) : yPos += $$.isBarType(d) ? -3 : -6), d.value !== null || $$.config.axis_rotated || (yPos < box.height ? yPos = box.height : yPos > this.height && (yPos = this.height - 4)), yPos; + } +}); + +/***/ }), +/* 53 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +(0, _util.extend)(_ChartInternal2.default.prototype, { + /** + * Initializes the title + * @private + */ + initTitle: function initTitle() { + var $$ = this; + + $$.title = $$.svg.append("text").text($$.config.title_text).attr("class", $$.CLASS.title); + }, + + + /** + * Redraw title + * @private + */ + redrawTitle: function redrawTitle() { + var $$ = this; + + $$.title.attr("x", $$.xForTitle.bind($$)).attr("y", $$.yForTitle.bind($$)); + }, + + + /** + * Returns the x attribute value of the title + * @private + * @returns {Number} x attribute value + */ + xForTitle: function xForTitle() { + var $$ = this, + config = $$.config, + position = config.title_position || "left", + x = void 0; + + + return x = position.indexOf("right") >= 0 ? $$.currentWidth - $$.getTextRect($$.title.node().textContent, $$.CLASS.title, $$.title.node()).width - config.title_padding.right : position.indexOf("center") >= 0 ? ($$.currentWidth - $$.getTextRect($$.title.node().textContent, $$.CLASS.title, $$.title.node()).width) / 2 : config.title_padding.left, x; + }, + + + /** + * Returns the y attribute value of the title + * @private + * @returns {Number} y attribute value + */ + yForTitle: function yForTitle() { + var $$ = this; + + return $$.config.title_padding.top + $$.getTextRect($$.title.node().textContent, $$.CLASS.title, $$.title.node()).height; + }, + + + /** + * Get title padding + * @private + * @returns {Number} padding value + */ + getTitlePadding: function getTitlePadding() { + var $$ = this; + + return $$.yForTitle() + $$.config.title_padding.bottom; + } +}); + +/***/ }), +/* 54 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _d = __webpack_require__(2), + _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _classes = __webpack_require__(3), + _classes2 = _interopRequireDefault(_classes), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +(0, _util.extend)(_ChartInternal2.default.prototype, { + /** + * Initializes the tooltip + * @private + */ + initTooltip: function initTooltip() { + var $$ = this, + config = $$.config, + i = void 0; + + + // Show tooltip if needed + if ($$.tooltip = $$.selectChart.style("position", "relative").append("div").attr("class", _classes2.default.tooltipContainer).style("position", "absolute").style("pointer-events", "none").style("display", "none"), config.tooltip_init_show) { + if ($$.isTimeSeries() && (0, _util.isString)(config.tooltip_init_x)) { + + for (config.tooltip_init_x = $$.parseDate(config.tooltip_init_x), i = 0; i < $$.data.targets[0].values.length && $$.data.targets[0].values[i].x - config.tooltip_init_x !== 0; i++); + + config.tooltip_init_x = i; + } + + $$.tooltip.html(config.tooltip_contents.call($$, $$.data.targets.map(function (d) { + return $$.addName(d.values[config.tooltip_init_x]); + }), $$.axis.getXAxisTickFormat(), $$.getYFormat($$.hasArcType()), $$.color)), $$.tooltip.style("top", config.tooltip_init_position.top).style("left", config.tooltip_init_position.left).style("display", "block"); + } + }, + + /** + * Returns the tooltip content(HTML string) + * @private + * @param {Object} data + * @param {Function} default title format + * @param {Function} default format for each data value in the tooltip. + * @param {Object} $$.color(generateColor()) + * @returns {string} html + */ + getTooltipContent: function getTooltipContent(d, defaultTitleFormat, defaultValueFormat, color) { + var $$ = this, + config = $$.config, + titleFormat = config.tooltip_format_title || defaultTitleFormat, + nameFormat = config.tooltip_format_name || function (name) { + return name; + }, + valueFormat = config.tooltip_format_value || defaultValueFormat, + orderAsc = $$.isOrderAsc(), + text = void 0, + i = void 0, + title = void 0, + value = void 0, + name = void 0, + bgcolor = void 0; + + + if (config.data_groups.length === 0) d.sort(function (a, b) { + var v1 = a ? a.value : null, + v2 = b ? b.value : null; + + + return orderAsc ? v1 - v2 : v2 - v1; + });else { + var ids = $$.orderTargets($$.data.targets).map(function (i2) { + return i2.id; + }); + + d.sort(function (a, b) { + var v1 = a ? a.value : null, + v2 = b ? b.value : null; + + return v1 > 0 && v2 > 0 && (v1 = a ? ids.indexOf(a.id) : null, v2 = b ? ids.indexOf(b.id) : null), orderAsc ? v1 - v2 : v2 - v1; + }); + } + + for (i = 0; i < d.length; i++) if (d[i] && (d[i].value || d[i].value === 0) && (text || (title = (0, _util.sanitise)(titleFormat ? titleFormat(d[i].x) : d[i].x), text = title || title === 0 ? "" + title + "" : "", text = "" + text), value = (0, _util.sanitise)(valueFormat(d[i].value, d[i].ratio, d[i].id, d[i].index, d)), value !== undefined)) { + // Skip elements when their name is set to null + if (d[i].name === null) continue; + name = (0, _util.sanitise)(nameFormat(d[i].name, d[i].ratio, d[i].id, d[i].index)), bgcolor = $$.levelColor ? $$.levelColor(d[i].value) : color(d[i].id), text += "" + ("") + (""); + } + + return text + "
" + name + "" + value + "
"; + }, + + /** + * Returns the position of the tooltip + * @private + * @param {Object} data + * @param {String} width + * @param {String} hHeight + * @param {HTMLElement} element + * @returns {Object} top, left value + */ + tooltipPosition: function tooltipPosition(dataToShow, tWidth, tHeight, element) { + var $$ = this, + config = $$.config, + forArc = $$.hasArcType(), + isTouch = $$.inputType === "touch", + mouse = (0, _d.mouse)(element), + svgLeft = void 0, + tooltipLeft = void 0, + tooltipRight = void 0, + tooltipTop = void 0, + chartRight = void 0; + + // Determin tooltip position + + + return forArc ? (tooltipLeft = isTouch ? mouse[0] : ($$.width - ($$.isLegendRight ? $$.getLegendWidth() : 0)) / 2 + mouse[0], tooltipTop = isTouch ? mouse[1] + 20 : $$.height / 2 + mouse[1] + 20) : (svgLeft = $$.getSvgLeft(!0), config.axis_rotated ? (tooltipLeft = svgLeft + mouse[0] + 100, tooltipRight = tooltipLeft + tWidth, chartRight = $$.currentWidth - $$.getCurrentPaddingRight(), tooltipTop = $$.x(dataToShow[0].x) + 20) : (tooltipLeft = svgLeft + $$.getCurrentPaddingLeft(!0) + $$.x(dataToShow[0].x) + 20, tooltipRight = tooltipLeft + tWidth, chartRight = svgLeft + $$.currentWidth - $$.getCurrentPaddingRight(), tooltipTop = mouse[1] + 15), tooltipRight > chartRight && (tooltipLeft -= tooltipRight - chartRight + 20), tooltipTop + tHeight > $$.currentHeight && (tooltipTop -= tHeight + 30)), tooltipTop < 0 && (tooltipTop = 0), { + top: tooltipTop, + left: tooltipLeft + }; + }, + + /** + * Show the tooltip + * @private + * @param {Object} data + * @param {HTMLElement} element + */ + showTooltip: function showTooltip(selectedData, element) { + var $$ = this, + config = $$.config, + forArc = $$.hasArcType(), + dataToShow = selectedData.filter(function (d) { + return d && (0, _util.isValue)(d.value); + }), + positionFunction = config.tooltip_position || $$.tooltipPosition; + + + if (dataToShow.length !== 0 && config.tooltip_show) { + $$.tooltip.html(config.tooltip_contents.call($$, selectedData, $$.axis.getXAxisTickFormat(), $$.getYFormat(forArc), $$.color)).style("display", "block"); + + + // Get tooltip dimensions + var tWidth = $$.tooltip.property("offsetWidth"), + tHeight = $$.tooltip.property("offsetHeight"), + position = positionFunction.call(this, dataToShow, tWidth, tHeight, element); + $$.tooltip.style("top", position.top + "px").style("left", position.left + "px"); + } + + // Set tooltip + }, + + /** + * Hide the tooltip + * @private + */ + hideTooltip: function hideTooltip() { + this.tooltip.style("display", "none"); + } +}); + +/***/ }), +/* 55 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +(0, _util.extend)(_ChartInternal2.default.prototype, { + setTargetType: function setTargetType(targetIds, type) { + var $$ = this, + config = $$.config; + $$.mapToTargetIds(targetIds).forEach(function (id) { + $$.withoutFadeIn[id] = type === config.data_types[id], config.data_types[id] = type; + }), targetIds || (config.data_type = type); + }, + hasType: function hasType(type, targetsValue) { + var $$ = this, + types = $$.config.data_types, + targets = targetsValue || $$.data.targets, + has = !1; + + + return targets && targets.length ? targets.forEach(function (target) { + var t = types[target.id]; + + (t && t.indexOf(type) >= 0 || !t && type === "line") && (has = !0); + }) : Object.keys(types).length ? Object.keys(types).forEach(function (id) { + types[id] === type && (has = !0); + }) : has = $$.config.data_type === type, has; + }, + hasArcType: function hasArcType(targets) { + return this.hasType("pie", targets) || this.hasType("donut", targets) || this.hasType("gauge", targets); + }, + isLineType: function isLineType(d) { + var config = this.config, + id = (0, _util.isString)(d) ? d : d.id; + + + return !config.data_types[id] || ["line", "spline", "area", "area-spline", "step", "area-step"].indexOf(config.data_types[id]) >= 0; + }, + isStepType: function isStepType(d) { + var id = (0, _util.isString)(d) ? d : d.id; + + return ["step", "area-step"].indexOf(this.config.data_types[id]) >= 0; + }, + isSplineType: function isSplineType(d) { + var id = (0, _util.isString)(d) ? d : d.id; + + return ["spline", "area-spline"].indexOf(this.config.data_types[id]) >= 0; + }, + isAreaType: function isAreaType(d) { + var id = (0, _util.isString)(d) ? d : d.id; + + return ["area", "area-spline", "area-step"].indexOf(this.config.data_types[id]) >= 0; + }, + isBarType: function isBarType(d) { + var id = (0, _util.isString)(d) ? d : d.id; + + return this.config.data_types[id] === "bar"; + }, + isScatterType: function isScatterType(d) { + var id = (0, _util.isString)(d) ? d : d.id; + + return this.config.data_types[id] === "scatter"; + }, + isPieType: function isPieType(d) { + var id = (0, _util.isString)(d) ? d : d.id; + + return this.config.data_types[id] === "pie"; + }, + isGaugeType: function isGaugeType(d) { + var id = (0, _util.isString)(d) ? d : d.id; + + return this.config.data_types[id] === "gauge"; + }, + isDonutType: function isDonutType(d) { + var id = (0, _util.isString)(d) ? d : d.id; + + return this.config.data_types[id] === "donut"; + }, + isArcType: function isArcType(d) { + return this.isPieType(d) || this.isDonutType(d) || this.isGaugeType(d); + }, + lineData: function lineData(d) { + return this.isLineType(d) ? [d] : []; + }, + arcData: function arcData(d) { + return this.isArcType(d.data) ? [d] : []; + }, + barData: function barData(d) { + return this.isBarType(d) ? d.values : []; + }, + lineOrScatterData: function lineOrScatterData(d) { + return this.isLineType(d) || this.isScatterType(d) ? d.values : []; + }, + barOrLineData: function barOrLineData(d) { + return this.isBarType(d) || this.isLineType(d) ? d.values : []; + }, + + + // https://github.com/d3/d3-shape#curves + isInterpolationType: function isInterpolationType(type) { + return ["basis", "basis-closed", "basis-open", "bundle", "cardinal", "cardinal-closed", "cardinal-open", "catmull-rom", "catmull-rom-closed", "catmull-rom-open", "linear", "linear-closed", "monotone-x", "monotone-y", "natural"].indexOf(type) >= 0; + } +}); + +/***/ }), +/* 56 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +(0, _util.extend)(_ChartInternal2.default.prototype, { + isSafari: function isSafari() { + var ua = window.navigator.userAgent; + + return ua.indexOf("Safari") >= 0 && ua.indexOf("Chrome") < 0; + }, + isChrome: function isChrome() { + return window.navigator.userAgent.indexOf("Chrome") >= 0; + } +}); + +/***/ }), +/* 57 */ +/***/ (function(module, exports) { + +// removed by extract-text-webpack-plugin + +/***/ }), +/* 58 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +exports.__esModule = !0; + +var _classCallCheck2 = __webpack_require__(6), + _classCallCheck3 = _interopRequireDefault(_classCallCheck2); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +/** + * Class to set options on generating chart. + * - It's instantiated internally, not exposed for public. + * @class Options + * @see {@link bb.generate} to use these options on generating the chart + */ +var Options = function Options() { + (0, _classCallCheck3.default)(this, Options), this.value = { + /** + * bindto The CSS selector or the element which the chart will be set to. D3 selection object can be specified. If other chart is set already, it will be replaced with the new one (only one chart can be set in one element).

+ * If this option is not specified, the chart will be generated but not be set. Instead, we can access the element by chart.element and set it by ourselves.
+ * > NOTE: When chart is not binded, bb starts observing if chart.element is binded by MutationObserver. In this case, polyfill is required in IE9 and IE10 becuase they do not support MutationObserver. On the other hand, if chart always will be binded, polyfill will not be required because MutationObserver will never be called. + * @name bindto + * @memberof Options + * @type {String} + * @default #chart + * @example + * bindto: "#myContainer" + * + * // or element + * bindto: document.getElementById("myContainer") + * + * // or D3 selection object + * bindto: d3.select("#myContainer") + */ + bindto: "#chart", + + /** + * Set svg element's class name + * @name svg + * @memberof Options + * @type {Object} + * @property {String} [svg.classname] class name for svg element + * @example + * svg: { + * classname: "test_class" + * } + */ + svg_classname: undefined, + + /** + * The desired size of the chart element. + * If value is not specified, the width of the chart will be calculated by the size of the parent element it's appended to. + * @name size + * @memberof Options + * @type {Object} + * @property {Number} [size.width] width of the chart element + * @property {Number} [size.height] height of the chart element + * @example + * size: { + * width: 640, + * height: 480 + * } + */ + size_width: undefined, + size_height: undefined, + + /** + * The padding of the chart element. + * @name padding + * @memberof Options + * @type {Object} + * @property {Number} [padding.top] padding on the top of chart + * @property {Number} [padding.right] padding on the right of chart + * @property {Number} [padding.bottom] padding on the bottom of chart + * @property {Number} [padding.left] padding on the left of chart + * @example + * padding: { + * top: 20, + * right: 20, + * bottom: 20, + * left: 20 + * } + */ + padding_left: undefined, + padding_right: undefined, + padding_top: undefined, + padding_bottom: undefined, + + /** + * Set chart resize options + * @name resize + * @memberof Options + * @type {Object} + * @property {Boolean} [resize.auto=true] Set chart resize automatically on viewport changes. + * @example + * resize: { + * auto: false + * } + */ + resize_auto: !0, + + /** + * Set zoom options + * @name zoom + * @memberof Options + * @type {Object} + * @property {Boolean} [zoom.enabled=false] Enable zooming. + * @property {Boolean} [zoom.rescale=false] Enable to rescale after zooming.
+ * If true set, y domain will be updated according to the zoomed region. + * @property {Array} [zoom.extent=[1, 10]] Change zoom extent. + * @property {Function} [zoom.onzoom=function(){}] Set callback that is called when the chart is zooming.
+ * Specified function receives the zoomed domain. + * @property {Function} [zoom.onzoomstart=function(){}] Set callback that is called when zooming starts.
+ * Specified function receives the zoom event. + * @property {Function} [zoom.onzoomend=function(){}] Set callback that is called when zooming ends.
+ * Specified function receives the zoomed domain. + * @example + * zoom: { + * enabled: true, + * rescale: true, + * extent: [1, 100] // enable more zooming + * onzoom: function(domain) { ... }, + * onzoomstart: function(event) { ... }, + * onzoomend: function(domain) { ... } + * } + */ + zoom_enabled: !1, + zoom_extent: undefined, + zoom_privileged: !1, + zoom_rescale: !1, + zoom_onzoom: function zoom_onzoom() {}, + zoom_onzoomstart: function zoom_onzoomstart() {}, + zoom_onzoomend: function zoom_onzoomend() {}, + zoom_x_min: undefined, + zoom_x_max: undefined, + + /** + * Interaction options + * @name interaction + * @memberof Options + * @type {Object} + * @property {Boolean} [interaction.enabled=true] Indicate if the chart should have interactions.
+ * If `false` is set, all of interactions (showing/hiding tooltip, selection, mouse events, etc) will be disabled. + * @property {Boolean} [interaction.brighten=true] + * @property {Boolean} [interaction.inputType.mouse=true] enable or disable mouse interaction + * @property {Boolean} [interaction.inputType.touch=true] enable or disable touch interaction + * @example + * interaction: { + * enabled: false, + * inputType: { + * mouse: true, + * touch: false + * } + * } + */ + interaction_brighten: !0, + interaction_enabled: !0, + interaction_inputType_mouse: !0, + interaction_inputType_touch: !0, + + /** + * Set a callback to execute when mouse/touch enters the chart. + * @name onover + * @memberof Options + * @type {Function} + * @default function(){} + * @example + * onover: function() { + * ... + * } + */ + onover: function onover() {}, + + /** + * Set a callback to execute when mouse/touch leaves the chart. + * @name onout + * @memberof Options + * @type {Function} + * @default function(){} + * @example + * onout: function() { + * ... + * } + */ + onout: function onout() {}, + + /** + * Set a callback to execute when user resizes the screen. + * @name onresize + * @memberof Options + * @type {Function} + * @default function(){} + * @example + * onresize: function() { + * ... + * } + */ + onresize: function onresize() {}, + + /** + * SSet a callback to execute when screen resize finished. + * @name onresized + * @memberof Options + * @type {Function} + * @default function(){} + * @example + * onresized: function() { + * ... + * } + */ + onresized: function onresized() {}, + + /** + * Set a callback to execute when the chart is initialized. + * @name oninit + * @memberof Options + * @type {Function} + * @default function(){} + * @example + * oninit: function() { + * ... + * } + */ + oninit: function oninit() {}, + + /** + * Set a callback which is executed when the chart is rendered. Basically, this callback will be called in each time when the chart is redrawed. + * @name onrendered + * @memberof Options + * @type {Function} + * @default function(){} + * @example + * onrendered: function() { + * ... + * } + */ + onrendered: function onrendered() {}, + + /** + * Set duration of transition (in milliseconds) for chart animation.

+ * NOTE:If `0 `or `null` set, transition will be skipped. So, this makes initial rendering faster especially in case you have a lot of data. + * @name transition + * @memberof Options + * @type {Object} + * @property {Number} [transition.duration=350] duration in milliseconds + * @example + * transition: { + * duration: 500 + * } + */ + transition_duration: 350, + + /** + * Specify the key of x values in the data.

+ * We can show the data with non-index x values by this option. This option is required when the type of x axis is timeseries. If this option is set on category axis, the values of the data on the key will be used for category names. + * @name data:x + * @memberof Options + * @type {String} + * @default undefined + * @example + * data: { + * x: "date" + * } + */ + data_x: undefined, + + /** + * Specify the keys of the x values for each data.

+ * This option can be used if we want to show the data that has different x values. + * @name data:xs + * @memberof Options + * @type {Object} + * @default {} + * @example + * data: { + * xs: { + * data1: "x1", + * data2: "x2" + * } + * } + */ + data_xs: {}, + + /** + * Set a format to parse string specifed as x. + * @name data:xFormat + * @memberof Options + * @type {String} + * @default %Y-%m-%d + * @example + * data: { + * xFormat: "%Y-%m-%d %H:%M:%S" + * } + * @see [D3's time specifier](https://npm.runkit.com/d3-time-format) + */ + data_xFormat: "%Y-%m-%d", + + /** + * Set localtime format to parse x axis. + * @name data:xLocaltime + * @memberof Options + * @type {Boolean} + * @default true + * @example + * data: { + * xLocaltime: false + * } + */ + data_xLocaltime: !0, + + /** + * Sort on x axis. + * @name data:xSort + * @memberof Options + * @type {Boolean} + * @default true + * @example + * data: { + * xSort: false + * } + */ + data_xSort: !0, + data_idConverter: function data_idConverter(id) { + return id; + }, + + /** + * Set custom data name. + * @name data:names + * @memberof Options + * @type {Object} + * @default {} + * @example + * data: { + * names: { + * data1: "Data Name 1", + * data2: "Data Name 2" + * } + * } + */ + data_names: {}, + + /** + * Set custom data class.

+ * If this option is specified, the element g for the data has an additional class that has the prefix 'bb-target-' (eg. bb-target-additional-data1-class). + * @name data:classes + * @memberof Options + * @type {Object} + * @default {} + * @example + * data: { + * classes: { + * data1: "additional-data1-class", + * data2: "additional-data2-class" + * } + * } + */ + data_classes: {}, + + /** + * Set groups for the data for stacking. + * @name data:groups + * @memberof Options + * @type {Array} + * @default [] + * @example + * data: { + * groups: [ + * ["data1", "data2"], + * ["data3"] + * ] + * } + */ + data_groups: [], + + /** + * Set y axis the data related to. y and y2 can be used. + * @name data:axes + * @memberof Options + * @type {Object} + * @default {} + * @example + * data: { + * axes: { + * data1: "y", + * data2: "y2" + * } + * } + */ + data_axes: {}, + + /** + * Set chart type at once.

+ * If this option is specified, the type will be applied to every data. This setting can be overwritten by data.types.

+ * Available Values: + * - line + * - spline + * - step + * - area + * - area-spline + * - area-step + * - bar + * - scatter + * - pie + * - donut + * - gauge + * @name data:type + * @memberof Options + * @type {String} + * @default line + * @example + * data: { + * type: "bar" + * } + */ + data_type: undefined, + + /** + * Set chart type for each data.
+ * This setting overwrites data.type setting. + * @name data:types + * @memberof Options + * @type {Object} + * @default {} + * @example + * data: { + * types: { + * data1: "bar", + * data2: "spline" + * } + * } + */ + data_types: {}, + + /** + * Show labels on each data points. + * @name data:labels + * @memberof Options + * @type {Boolean} + * @default false + * @example + * data: { + * labels: true + * } + */ + /** + * Set formatter function for data labels.
+ * The formatter function receives 4 arguments such as v, id, i, j and it must return a string that will be shown as the label. The arguments are:
+ * - `v` is the value of the data point where the label is shown. + * - `id` is the id of the data where the label is shown. + * - `i` is the index of the data point where the label is shown. + * - `j` is the sub index of the data point where the label is shown.

+ * Formatter function can be defined for each data by specifying as an object and D3 formatter function can be set (ex. d3.format('$')) + * @name data:labels:format + * @memberof Options + * @type {Object} + * @default {} + * @example + * data: { + * labels: { + * format: function(v, id, i, j) { ... } + * // it's possible to set for each data + * //format: { + * // data1: function(v, id, i, j) { ... }, + * // ... + * //} + * } + * } + */ + data_labels: {}, + + /** + * This option changes the order of stacking the data and pieces of pie/donut. If `null` specified, it will be the order the data loaded. If function specified, it will be used to sort the data and it will recieve the data as argument.

+ * Available Values: + * - desc + * - asc + * - function(data1, data2) { ... } + * - null + * @name data:order + * @memberof Options + * @type {String|Function} + * @default desc + * @example + * data: { + * lorder: "asc" + * } + */ + data_order: "desc", + + /** + * Define regions for each data.

+ * The values must be an array for each data and it should include an object that has start, end, style. If start is not set, the start will be the first data point. If end is not set, the end will be the last data point.
+ * Currently this option supports only line chart and dashed style. If this option specified, the line will be dashed only in the regions. + * @name data:regions + * @memberof Options + * @type {Object} + * @default {} + * @example + * data: { + * regions: { + * data1: [{ + * "start": 1, + * "end": 2, + * "style": "dashed" + * }, { + * "start":3 + * }], + * ... + * } + * } + */ + data_regions: {}, + + /** + * Set color converter function.

+ * This option should a function and the specified function receives color (e.g. '#ff0000') and d that has data parameters like id, value, index, etc. And it must return a string that represents color (e.g. '#00ff00'). + * @name data:color + * @memberof Options + * @type {Function} + * @default undefined + * @example + * data: { + * color: function(color, d) { ... } + * } + */ + data_color: undefined, + + /** + * Set color for each data. + * @name data:colors + * @memberof Options + * @type {Object} + * @default {} + * @example + * data: { + * colors: { + * data1: "#ff0000", + * ... + * } + * } + */ + data_colors: {}, + + /** + * Hide each data when the chart appears.

+ * If true specified, all of data will be hidden. If multiple ids specified as an array, those will be hidden. + * @name data:hide + * @memberof Options + * @type {Boolean|Array} + * @default false + * @example + * data: { + * // all of data will be hidden + * hide: true + * // specified data will be hidden + * hide: ["data1", ...] + * } + */ + data_hide: !1, + data_filter: undefined, + + /** + * Set data selection enabled.

+ * If this option is set true, we can select the data points and get/set its state of selection by API (e.g. select, unselect, selected). + * @name data:selection:enabled + * @memberof Options + * @type {Boolean} + * @default false + * @example + * data: { + * selection: { + * enabled: true + * } + * } + */ + data_selection_enabled: !1, + + /** + * Set grouped selection enabled.

+ * If this option set true, multiple data points that have same x value will be selected by one selection. + * @name data:selection:grouped + * @memberof Options + * @type {Boolean} + * @default false + * @example + * data: { + * selection: { + * grouped: true + * } + * } + */ + data_selection_grouped: !1, + + /** + * Set a callback for each data point to determine if it's selectable or not.

+ * The callback will receive d as an argument and it has some parameters like id, value, index. This callback should return boolean. + * @name data:selection:isselectable + * @memberof Options + * @type {Function} + * @default function() { return true; } + * @example + * data: { + * selection: { + * isselectable: function(d) { ... } + * } + * } + */ + data_selection_isselectable: function data_selection_isselectable() { + return !0; + }, + + /** + * Set multiple data points selection enabled.

+ * If this option set true, multile data points can have the selected state at the same time. If false set, only one data point can have the selected state and the others will be unselected when the new data point is selected. + * @name data:selection:multiple + * @memberof Options + * @type {Boolean} + * @default true + * @example + * data: { + * selection: { + * multiple: false + * } + * } + */ + data_selection_multiple: !0, + + /** + * Enable to select data points by dragging.

+ * If this option set true, data points can be selected by dragging. + * Note: If this option set true, scrolling on the chart will be disabled because dragging event will handle the event. + * @name data:selection:draggable + * @memberof Options + * @type {Boolean} + * @default false + * @example + * data: { + * selection: { + * draggable: true + * } + * } + */ + data_selection_draggable: !1, + + /** + * Set a callback for click event on each data point.

+ * This callback will be called when each data point clicked and will receive d and element as the arguments. d is the data clicked and element is the element clicked. In this callback, this will be the Chart object. + * @name data:onclick + * @memberof Options + * @type {Function} + * @default function() {} + * @example + * data: { + * onclick: function(d, element) { ... } + * } + */ + data_onclick: function data_onclick() {}, + + /** + * Set a callback for mouse/touch over event on each data point.

+ * This callback will be called when mouse cursor or via touch moves onto each data point and will receive d as the argument. d is the data where mouse cursor moves onto. In this callback, this will be the Chart object. + * @name data:onover + * @memberof Options + * @type {Function} + * @default function() {} + * @example + * data: { + * onover: function(d) { ... } + * } + */ + data_onover: function data_onover() {}, + + /** + * Set a callback for mouse/touch out event on each data point.

+ * This callback will be called when mouse cursor or via touch moves out each data point and will receive d as the argument. d is the data where mouse cursor moves out. In this callback, this will be the Chart object. + * @name data:onout + * @memberof Options + * @type {Function} + * @default function() {} + * @example + * data: { + * onout: function(d) { ... } + * } + */ + data_onout: function data_onout() {}, + + /** + * Set a callback for on data selection. + * @name data:onselected + * @memberof Options + * @type {Function} + * @default function() {} + * @example + * data: { + * onselected: function(d) { ... } + * } + */ + data_onselected: function data_onselected() {}, + + /** + * Set a callback for on data un-selection. + * @name data:onunselected + * @memberof Options + * @type {Function} + * @default function() {} + * @example + * data: { + * onunselected: function(d) { ... } + * } + */ + data_onunselected: function data_onunselected() {}, + data_url: undefined, + data_headers: undefined, + data_json: undefined, + data_rows: undefined, + data_columns: undefined, + data_mimeType: undefined, + data_keys: undefined, + + /** + * Set text displayed when empty data. + * @name data:empty:label:text + * @memberof Options + * @type {String} + * @default "" + * @example + * data: { + * empty: { + * label: { + * text: "No Data" + * } + * } + * } + */ + data_empty_label_text: "", + + /** + * Set subchart options + * @name subchart + * @memberof Options + * @type {Object} + * @property {Boolean} [subchart.show=false] Show sub chart on the bottom of the chart. + * @property {Boolean} [subchart.size.height] Change the height of the subchart. + * @property {Boolean} [subchart.onbrush] Set callback for brush event.
+ * Specified function receives the current zoomed x domain. + * @example + * subchart: { + * show: true, + * size: { + * height: 20 + * }, + * onbrush: function(domain) { ... } + * } + */ + subchart_show: !1, + subchart_size_height: 60, + subchart_axis_x_show: !0, + subchart_onbrush: function subchart_onbrush() {}, + + /** + * Set color of the data values + * @name color + * @memberof Options + * @type {Object} + * @property {Array} [color.pattern] custom color pattern + * @property {Object} [color.threshold] color threshold + * @property {String} [color.threshold.unit] unit + * @property {Array} [color.threshold.value] value + * @property {Array} [color.threshold.max=100] max value + * @example + * color: { + * pattern: ["#1f77b4", "#aec7e8", ...] + * } + */ + color_pattern: [], + color_threshold: {}, + + /** + * Legend options + * @name legend + * @memberof Options + * @type {Object} + * @property {Boolean} [legend.show=true] Show or hide legend. + * @property {Boolean} [legend.hide=false] Hide legend + * If true given, all legend will be hidden. If string or array given, only the legend that has the id will be hidden. + * @property {String} [legend.position=bottom] Change the position of legend.
+ * Available values are: `bottom`, `right` and `inset` are supported. + * @property {Object} [legend.inset={anchor: 'top-left',x: 10,y: 0,step: undefined}] Change inset legend attributes.
+ * This option accepts object that has the keys anchor, x, y and step. + * anchor decides the position of the legend. These anchors are available: + * - top-left + * - top-right + * - bottom-left + * - bottom-right + * x and y set the position of the legend based on the anchor.
+ * step defines the max step the lagend has (e.g. If 2 set and legend has 3 legend item, the legend 2 columns). + * @property {Function} [legend.item.onclick=undefined] Set click event handler to the legend item. + * @property {Function} [legend.item.onover=undefined] Set mouse/touch over event handler to the legend item. + * @property {Function} [legend.item.onout=undefined] Set mouse/touch out event handler to the legend item. + * @example + * legend: { + * show: true, + * hide: true, + * //or hide: "data1" + * //or hide: ["data1", "data2"] + * position: "bottom", // bottom, right, inset + * inset: { + * anchor: "top-right" // top-left, top-right, bottom-left, bottom-right + * x: 20, + * y: 10, + * step: 2 + * }, + * onclick: function(id) { ... }, + * onover: function(id) { ... }, + * onout: function(id) { ... } + * } + */ + legend_show: !0, + legend_hide: !1, + legend_position: "bottom", + legend_inset_anchor: "top-left", + legend_inset_x: 10, + legend_inset_y: 0, + legend_inset_step: undefined, + legend_item_onclick: undefined, + legend_item_onover: undefined, + legend_item_onout: undefined, + legend_equally: !1, + legend_padding: 0, + legend_item_tile_width: 10, + legend_item_tile_height: 10, + + /** + * Switch x and y axis position. + * @name axis:rotated + * @memberof Options + * @type {Boolean} + * @default false + * @example + * axis: { + * rotated: true + * } + */ + axis_rotated: !1, + + /** + * Show or hide x axis. + * @name axis:x:show + * @memberof Options + * @type {Boolean} + * @default true + * @example + * axis: { + * x: { + * show: false + * } + * } + */ + axis_x_show: !0, + + /** + * Set type of x axis.

+ * Available Values: + * -timeseries + * -category + * -indexed + * @name axis:x:type + * @memberof Options + * @type {String} + * @default indexed + * @example + * axis: { + * x: { + * type: "timeseries" + * } + * } + */ + axis_x_type: "indexed", + + /** + * Set how to treat the timezone of x values.
+ * If true, treat x value as localtime. If false, convert to UTC internally. + * @name axis:x:localtime + * @memberof Options + * @type {Boolean} + * @default true + * @example + * axis: { + * x: { + * localtime: false + * } + * } + */ + axis_x_localtime: !0, + + /** + * Set category names on category axis. + * This must be an array that includes category names in string. If category names are included in the date by data.x option, this is not required. + * @name axis:x:categories + * @memberof Options + * @type {Array} + * @default [] + * @example + * axis: { + * x: { + * categories: ["Category 1", "Category 2", ...] + * } + * } + */ + axis_x_categories: [], + + /** + * Centerise ticks on category axis. + * @name axis:x:tick:centered + * @memberof Options + * @type {Array} + * @default false + * @example + * axis: { + * x: { + * tick: { + * centered: true + * } + * } + * } + */ + axis_x_tick_centered: !1, + + /** + * A function to format tick value. Format string is also available for timeseries data. + * @name axis:x:tick:format + * @memberof Options + * @type {Function} + * @default undefined + * @example + * axis: { + * x: { + * tick: { + * format: function(x) { + * return x.getFullYear(); + * } + * } + * } + * } + */ + axis_x_tick_format: undefined, + + /** + * Setting for culling ticks.

+ * If true is set, the ticks will be culled, then only limitted tick text will be shown. This option does not hide the tick lines. If false is set, all of ticks will be shown.

+ * We can change the number of ticks to be shown by axis.x.tick.culling.max. + * @name axis:x:tick:culling + * @memberof Options + * @type {Function} + * @default + * - true for indexed axis and timeseries axis + * - false for category axis + * @example + * axis: { + * x: { + * tick: { + * culling: false + * } + * } + * } + */ + axis_x_tick_culling: {}, + + /** + * The number of tick texts will be adjusted to less than this value. + * @name axis:x:tick:culling:max + * @memberof Options + * @type {Number} + * @default 10 + * @example + * axis: { + * x: { + * tick: { + * culling: { + * max: 5 + * } + * } + * } + * } + */ + axis_x_tick_culling_max: 10, + + /** + * The number of x axis ticks to show.

+ * This option hides tick lines together with tick text. If this option is used on timeseries axis, the ticks position will be determined precisely and not nicely positioned (e.g. it will have rough second value). + * @name axis:x:tick:count + * @memberof Options + * @type {Number} + * @default undefined + * @example + * axis: { + * x: { + * tick: { + * count: 5 + * } + * } + * } + */ + axis_x_tick_count: undefined, + + /** + * Fit x axis ticks.

+ * If true set, the ticks will be positioned nicely. If false set, the ticks will be positioned according to x value of the data points. + * @name axis:x:tick:fit + * @memberof Options + * @type {Boolean} + * @default true + * @example + * axis: { + * x: { + * tick: { + * fit: false + * } + * } + * } + */ + axis_x_tick_fit: !0, + + /** + * Set the x values of ticks manually.

+ * If this option is provided, the position of the ticks will be determined based on those values. This option works with timeseries data and the x values will be parsed accoding to the type of the value and data.xFormat option. + * @name axis:x:tick:values + * @memberof Options + * @type {Array} + * @default null + * @example + * axis: { + * x: { + * tick: { + * values: [1, 2, 4, 8, 16, 32, ...] + * } + * } + * } + */ + axis_x_tick_values: null, + + /** + * Rotate x axis tick text.
+ * If you set negative value, it will rotate to opposite direction. + * @name axis:x:tick:rotate + * @memberof Options + * @type {Number} + * @default 0 + * @example + * axis: { + * x: { + * tick: { + * rotate: 60 + * } + * } + * } + */ + axis_x_tick_rotate: 0, + + /** + * Show x axis outer tick. + * @name axis:x:tick:outer + * @memberof Options + * @type {Boolean} + * @default true + * @example + * axis: { + * x: { + * tick: { + * outer: false + * } + * } + * } + */ + axis_x_tick_outer: !0, + + /** + * Set tick text to be multiline + * @name axis:x:tick:multiline + * @memberof Options + * @type {Boolean} + * @default true + * @example + * axis: { + * x: { + * tick: { + * multiline: false + * } + * } + * } + */ + axis_x_tick_multiline: !0, + + /** + * Set tick width + * @name axis:x:tick:width + * @memberof Options + * @type {Number} + * @default null + * @example + * axis: { + * x: { + * tick: { + * width: 50 + * } + * } + * } + */ + axis_x_tick_width: null, + + /** + * Set max value of x axis range. + * @name axis:x:max + * @memberof Options + * @type {Number} + * @default undefined + * @example + * axis: { + * x: { + * max: 100 + * } + * } + */ + axis_x_max: undefined, + + /** + * Set min value of x axis range. + * @name axis:x:min + * @memberof Options + * @type {Number} + * @default undefined + * @example + * axis: { + * x: { + * min: -100 + * } + * } + */ + axis_x_min: undefined, + + /** + * Set padding for x axis.

+ * If this option is set, the range of x axis will increase/decrease according to the values. If no padding is needed in the ragen of x axis, 0 should be set. On category axis, this option will be ignored. + * @name axis:x:padding + * @memberof Options + * @type {Object} + * @default {} + * @example + * axis: { + * x: { + * padding: { + * left: 0, + * right: 0 + * } + * } + * } + */ + axis_x_padding: {}, + + /** + * Set height of x axis.

+ * The height of x axis can be set manually by this option. If you need more space for x axis, please use this option for that. The unit is pixel. + * @name axis:x:height + * @memberof Options + * @type {Number} + * @default undefined + * @example + * axis: { + * x: { + * height: 20 + * } + * } + */ + axis_x_height: undefined, + + /** + * Set default extent for subchart and zoom. This can be an array or function that returns an array. + * @name axis:x:extent + * @memberof Options + * @type {Array} + * @default undefined + * @example + * axis: { + * x: { + * // [[x0, y0], [x1, y1]], where [x0, y0] is the top-left corner and [x1, y1] is the bottom-right corner + * // https://github.com/d3/d3-brush/blob/master/src/brush.js#L521 + * extent: [[0, 0], [200, 60]] + * } + * } + */ + axis_x_extent: undefined, + + /** + * Set label on x axis.

+ * You can set x axis label and change its position by this option. string and object can be passed and we can change the poisiton by passing object that has position key. Available position differs according to the axis direction (vertical or horizontal). If string set, the position will be the default. + * - If it's horizontal axis: + * - inner-right [default] + * - inner-center + * - inner-left + * - outer-right + * - outer-center + * - outer-left + * - If it's vertical axis: + * - inner-top [default] + * - inner-middle + * - inner-bottom + * - outer-top + * - outer-middle + * - outer-bottom + * @name axis:x:label + * @memberof Options + * @type {String|Object} + * @default undefined + * @example + * axis: { + * x: { + * label: "Your X Axis" + * } + * } + * + * axis: { + * x: { + * label: { + * text: "Your X Axis", + * position: "outer-center" + * } + * } + * } + */ + axis_x_label: {}, + + /** + * Show or hide y axis. + * @name axis:y:show + * @memberof Options + * @type {Boolean} + * @default true + * @example + * axis: { + * y: { + * show: false + * } + * } + */ + axis_y_show: !0, + + /** + * Set type of y axis. + * Available Values: + * -timeseries + * -category + * -indexed + * @name axis:y:type + * @memberof Options + * @type {String} + * @default undefined + * @example + * axis: { + * y: { + * type: "timeseries" + * } + * } + */ + axis_y_type: undefined, + + /** + * Set max value of y axis. + * Note: Padding will be added based on this value, so if you don't need the padding, please set axis.y.padding to disable it (e.g. axis.y.padding = 0). + * @name axis:y:max + * @memberof Options + * @type {Number} + * @default undefined + * @example + * axis: { + * y: { + * max: 1000 + * } + * } + */ + axis_y_max: undefined, + + /** + * Set min value of y axis. + * Note: Padding will be added based on this value, so if you don't need the padding, please set axis.y.padding to disable it (e.g. axis.y.padding = 0). + * @name axis:y:min + * @memberof Options + * @type {Number} + * @default undefined + * @example + * axis: { + * y: { + * min: 1000 + * } + * } + */ + axis_y_min: undefined, + + /** + * Change the direction of y axis.

+ * If true set, the direction will be from the top to the bottom. + * @name axis:y:inverted + * @memberof Options + * @type {Boolean} + * @default false + * @example + * axis: { + * y: { + * inverted: true + * } + * } + */ + axis_y_inverted: !1, + + /** + * Set center value of y axis. + * @name axis:y:center + * @memberof Options + * @type {Number} + * @default undefined + * @example + * axis: { + * y: { + * center: 0 + * } + * } + */ + axis_y_center: undefined, + + /** + * Show y axis inside of the chart. + * @name axis:y:inner + * @memberof Options + * @type {Boolean} + * @default false + * @example + * axis: { + * y: { + * inner: true + * } + * } + */ + axis_y_inner: !1, + + /** + * Set label on y axis.

+ * You can set y axis label and change its position by this option. This option works in the same way as axis.x.label. + * @name axis:y:label + * @memberof Options + * @type {String|Object} + * @default {} + * @example + * axis: { + * y: { + * label: "Your Y Axis" + * } + * } + * + * axis: { + * y: { + * label: { + * text: "Your Y Axis", + * position: "outer-middle" + * } + * } + * } + */ + axis_y_label: {}, + + /** + * Set formatter for y axis tick text.

+ * This option accepts d3.format object as well as a function you define. + * @name axis:y:format + * @memberof Options + * @type {Function} + * @default undefined + * @example + * axis: { + * x: { + * tick: { + * format: function(x) { + * return x.getFullYear(); + * } + * } + * } + * } + */ + axis_y_tick_format: undefined, + + /** + * Show y axis outer tick. + * @name axis:y:tick:outer + * @memberof Options + * @type {Boolean} + * @default true + * @example + * axis: { + * y: { + * tick: { + * outer: false + * } + * } + * } + */ + axis_y_tick_outer: !0, + + /** + * Set y axis tick values manually. + * @name axis:y:tick:values + * @memberof Options + * @type {Array} + * @default null + * @example + * axis: { + * y: { + * tick: { + * values: [100, 1000, 10000] + * } + * } + * } + */ + axis_y_tick_values: null, + axis_y_tick_rotate: 0, + + /** + * Set the number of y axis ticks.

+ * Note: The position of the ticks will be calculated precisely, so the values on the ticks will not be rounded nicely. In the case, axis.y.tick.format or axis.y.tick.values will be helpful. + * @name axis:y:tick:count + * @memberof Options + * @type {Number} + * @default undefined + * @example + * axis: { + * y: { + * tick: { + * count: 5 + * } + * } + * } + */ + axis_y_tick_count: undefined, + + /** + * Set the number of y axis ticks.

+ * Note: The position of the ticks will be calculated precisely, so the values on the ticks will not be rounded nicely. In the case, axis.y.tick.format or axis.y.tick.values will be helpful. + * @name axis:y:tick:time + * @memberof Options + * @private + * @type {Object} + * @property {Function} [time.value] D3's time interval function (https://github.com/d3/d3-time#intervals) + * @example + * axis: { + * y: { + * tick: { + * time: { + * // ticks at 15-minute intervals + * // https://github.com/d3/d3-scale/blob/master/README.md#time_ticks + * value: d3.timeMinute.every(15) + * } + * } + * } + * } + */ + // @TODO: not fully implemented yet + axis_y_tick_time_value: undefined, + + /** + * Set padding for y axis.

+ * You can set padding for y axis to create more space on the edge of the axis. This option accepts object and it can include top and bottom. top, bottom will be treated as pixels. + * @name axis:y:padding + * @memberof Options + * @type {Object} + * @default {} + * @example + * axis: { + * y: { + * padding: { + * top: 0, + * bottom: 0 + * } + * } + * } + */ + axis_y_padding: {}, + + /** + * Set default range of y axis.

+ * This option set the default value for y axis when there is no data on init. + * @name axis:y:default + * @memberof Options + * @type {Array} + * @default undefined + * @example + * axis: { + * y: { + * default: [0, 1000] + * } + * } + */ + axis_y_default: undefined, + + /** + * Show or hide y2 axis. + * @name axis:y2:show + * @memberof Options + * @type {Array} + * @default false + * @example + * axis: { + * y2: { + * show: true + * } + * } + */ + axis_y2_show: !1, + + /** + * Set max value of y2 axis. + * @name axis:y2:max + * @memberof Options + * @type {Number} + * @default undefined + * @example + * axis: { + * y2: { + * max: 1000 + * } + * } + */ + axis_y2_max: undefined, + + /** + * Set min value of y2 axis. + * @name axis:y2:min + * @memberof Options + * @type {Number} + * @default undefined + * @example + * axis: { + * y2: { + * min: -1000 + * } + * } + */ + axis_y2_min: undefined, + + /** + * Change the direction of y2 axis.

+ * If true set, the direction will be from the top to the bottom. + * @name axis:y2:inverted + * @memberof Options + * @type {Boolean} + * @default false + * @example + * axis: { + * y2: { + * inverted: true + * } + * } + */ + axis_y2_inverted: !1, + + /** + * Set center value of y2 axis. + * @name axis:y2:center + * @memberof Options + * @type {Number} + * @default undefined + * @example + * axis: { + * y2: { + * center: 0 + * } + * } + */ + axis_y2_center: undefined, + + /** + * Show y2 axis inside of the chart. + * @name axis:y2:inner + * @memberof Options + * @type {Boolean} + * @default false + * @example + * axis: { + * y2: { + * inner: true + * } + * } + */ + axis_y2_inner: !1, + + /** + * Set label on y2 axis.

+ * You can set y2 axis label and change its position by this option. This option works in the same way as axis.x.label. + * @name axis:y2:label + * @memberof Options + * @type {String|Object} + * @default {} + * @example + * axis: { + * y2: { + * label: "Your Y2 Axis" + * } + * } + * + * axis: { + * y2: { + * label: { + * text: "Your Y2 Axis", + * position: "outer-middle" + * } + * } + * } + */ + axis_y2_label: {}, + + /** + * Set formatter for y2 axis tick text.

+ * This option works in the same way as axis.y.format. + * @name axis:y2:tick:format + * @memberof Options + * @type {Function} + * @default undefined + * @example + * axis: { + * y2: { + * tick: { + * format: d3.format("$,") + * //or format: function(d) { return "$" + d; } + * } + * } + * } + */ + axis_y2_tick_format: undefined, + + /** + * Show or hide y2 axis outer tick. + * @name axis:y2:tick:outer + * @memberof Options + * @type {Boolean} + * @default true + * @example + * axis: { + * y2: { + * tick: { + * outer: false + * } + * } + * } + */ + axis_y2_tick_outer: !0, + + /** + * Set y2 axis tick values manually. + * @name axis:y2:tick:values + * @memberof Options + * @type {Array} + * @default null + * @example + * axis: { + * y2: { + * tick: { + * values: [100, 1000, 10000] + * } + * } + * } + */ + axis_y2_tick_values: null, + + /** + * Set the number of y2 axis ticks. + * Note: This works in the same way as axis.y.tick.count. + * @name axis:y2:tick:count + * @memberof Options + * @type {Number} + * @default undefined + * @example + * axis: { + * y2: { + * tick: { + * count: 5 + * } + * } + * } + */ + axis_y2_tick_count: undefined, + + /** + * Set the number of y2 axis ticks. + * Note: This works in the same way as axis.y.tick.count. + * @name axis:y2:padding + * @memberof Options + * @type {Number} + * @default {} + * @example + * axis: { + * y2: { + * padding: { + * top: 100, + * bottom: 100 + * } + * } + * } + */ + axis_y2_padding: {}, + + /** + * Set default range of y2 axis.

+ * This option set the default value for y2 axis when there is no data on init. + * @name axis:y2:default + * @memberof Options + * @type {Array} + * @default undefined + * @example + * axis: { + * y2: { + * default: [0, 1000] + * } + * } + */ + axis_y2_default: undefined, + + /** + * Set related options + * @name grid + * @memberof Options + * @type {Object} + * @property {Boolean} [x.show=false] Show grids along x axis. + * @property {Boolean} [x.lines=[]] Show additional grid lines along x axis.
+ * This option accepts array including object that has value, text, position and class. text, position and class are optional. For position, start, middle and end (default) are available. + * If x axis is category axis, value can be category name. If x axis is timeseries axis, value can be date string, Date object and unixtime integer. + * @property {Boolean} [y.show=false] Show grids along x axis. + * @property {Boolean} [y.lines=[]] Show additional grid lines along y axis.
+ * This option accepts array including object that has value, text, position and class. + * @property {Boolean} [y.ticks=10] + * @property {Boolean} [focus.show=true] Show grids when focus. + * @property {Boolean} [lines.front=true] + * @default undefined + * @example + * grid: { + * x: { + * show: true, + * lines: [ + * {value: 2, text: "Label on 2"}, + * {value: 5, text: "Label on 5", class: "label-5"} + * {value: 6, text: "Label on 6", position: "start"} + * ] + * }, + * y: { + * show: true, + * lines: [ + * {value: 100, text: "Label on 100"}, + * {value: 200, text: "Label on 200", class: "label-200"} + * {value: 300, text: "Label on 300", position: 'middle'} + * ], + * ticks: 5 + * }, + * focus: { + * show: false + * }, + * lines: { + * front: false + * } + * } + */ + grid_x_show: !1, + grid_x_type: "tick", + grid_x_lines: [], + grid_y_show: !1, + grid_y_lines: [], + grid_y_ticks: 10, + grid_focus_show: !0, + grid_lines_front: !0, + + /** + * Set point options + * @name point + * @memberof Options + * @type {Object} + * @property {Boolean} [point.show=true] Whether to show each point in line. + * @property {Number} [point.r=2.5] The radius size of each point. + * @property {Boolean} [point.focus.expand.enabled=true] Whether to expand each point on focus. + * @property {Boolean} [point.focus.expand.r=point.r*1.75] The radius size of each point on focus. + * @property {Number} [point.select.r=point.r*4] The radius size of each point on selected. + * @example + * point: { + * show: false, + * r: 5, + * focus: { + * expand: { + * enabled: true, + * r: 1 + * } + * }, + * select: { + * r: 3 + * } + * } + */ + point_show: !0, + point_r: 2.5, + point_sensitivity: 10, + point_focus_expand_enabled: !0, + point_focus_expand_r: undefined, + point_select_r: undefined, + + /** + * Set line options + * @name line + * @memberof Options + * @type {Object} + * @property {Boolean} [line.connectNull=false] Set if null data point will be connected or not.
+ * If true set, the region of null data will be connected without any data point. If false set, the region of null data will not be connected and get empty. + * @property {Boolean} [line.step_type=step] Change step type for step chart.
+ * Available values: + * - step + * - step-before + * - step-after + * @example + * line: { + * connectNull: true, + * step: { + * type: "step-after" + * } + * } + */ + line_connectNull: !1, + line_step_type: "step", + + /** + * Set bar options + * @name bar + * @memberof Options + * @type {Object} + * @property {Number} [bar.width] Change the width of bar chart. + * @property {Number} [bar.width.ratio=0.6] Change the width of bar chart by ratio. + * @property {Number} [bar.width.max] + * @property {Boolean} [bar.zerobased=true] Set if min or max value will be 0 on bar chart. + * @example + * bar: { + * width: 10, + * // or + * width: { + * ratio: 0.2, + * max: 200 + * }, + * zerobased: false + * } + */ + bar_width: undefined, + bar_width_ratio: 0.6, + bar_width_max: undefined, + bar_zerobased: !0, + + /** + * Set area options + * @name area + * @memberof Options + * @type {Object} + * @property {Boolean} [area.zerobased=true] Set if min or max value will be 0 on area chart. + * @property {Boolean} [area.above=false] + * @example + * area: { + * zerobased: false, + * above: true + * } + */ + area_zerobased: !0, + area_above: !1, + + /** + * Set pie options + * @name pie + * @memberof Options + * @type {Object} + * @property {Boolean} [pie.label.show=true] Show or hide label on each pie piece. + * @property {Function} [pie.label.format] Set formatter for the label on each pie piece. + * @property {Number} [pie.label.threshold=0.05] Set threshold to show/hide labels. + * @property {Boolean} [pie.expand=true] Enable or disable expanding pie pieces. + * @property {Number} [pie.padAngle=0] Set padding between data. + * @example + * pie: { + * label: { + * show: false, + * format: function(value, ratio, id) { + * return d3.format("$")(value); + * }, + * threshold: 0.1 + * }, + * expand: false, + * padAngle: 0.1 + * } + */ + pie_label_show: !0, + pie_label_format: undefined, + pie_label_threshold: 0.05, + pie_label_ratio: undefined, + pie_expand: {}, + pie_expand_duration: 50, + pie_padAngle: 0, + + /** + * Set gauge options + * @name gauge + * @memberof Options + * @type {Object} + * @property {Boolean} [gauge.fullCircle=false] + * @property {Boolean} [gauge.label.show=true] Show or hide label on gauge. + * @property {Function} [gauge.label.format] Set formatter for the label on gauge. + * @property {Boolean} [gauge.expand=true] Enable or disable expanding gauge. + * @property {Number} [gauge.expand.duration=50] + * @property {Number} [gauge.min=0] Set min value of the gauge. + * @property {Number} [gauge.max=100] Set max value of the gauge. + * @property {Number} [gauge.startingAngle=-1 * Math.PI / 2] + * @property {String} [gauge.units] Set units of the gauge. + * @property {Number} [gauge.width] Set width of gauge chart. + * @example + * gauge: { + * label: { + * show: false, + * format: function(value, ratio) { + * return value; + * } + * }, + * expand: false, + * min: -100, + * max: 200, + * units: "%", + * width: 10 + * } + */ + gauge_fullCircle: !1, + gauge_label_show: !0, + gauge_label_format: undefined, + gauge_min: 0, + gauge_max: 100, + gauge_startingAngle: -1 * Math.PI / 2, + gauge_label_extents: undefined, + gauge_units: undefined, + gauge_width: undefined, + gauge_expand: {}, + gauge_expand_duration: 50, + + /** + * Set donut options + * @name donut + * @memberof Options + * @type {Object} + * @property {Boolean} [donut.label.show=true] Show or hide label on each donut piece. + * @property {Function} [donut.label.format] Set formatter for the label on each donut piece. + * @property {Number} [donut.label.threshold=0.05] Set threshold to show/hide labels. + * @property {Boolean} [donut.expand=true] Enable or disable expanding donut pieces. + * @property {Number} [donut.width] Set width of donut chart. + * @property {String} [donut.title=""] Set title of donut chart. + * @property {Number} [donut.padAngle=0] Set padding between data. + * @example + * donut: { + * label: { + * show: false, + * format: function(value, ratio, id) { + * return d3.format("$")(value); + * }, + * threshold: 0.1 + * }, + * expand: false, + * width: 10, + * title: "Donut Title", + * padAngle: 0.2 + * } + */ + donut_label_show: !0, + donut_label_format: undefined, + donut_label_threshold: 0.05, + donut_label_ratio: undefined, + donut_width: undefined, + donut_title: "", + donut_expand: {}, + donut_expand_duration: 50, + donut_padAngle: 0, + + /** + * Set spline options + * @name spline + * @memberof Options + * @type {Object} + * @property {String} [spline.interpolation.type=cardinal] + * @example + * spline: { + * interpolation: { + * type: "cardinal" + * } + * } + */ + spline_interpolation_type: "cardinal", + + /** + * Show rectangles inside the chart.

+ * This option accepts array including object that has axis, start, end and class. The keys start, end and class are optional. + * axis must be x, y or y2. start and end should be the value where regions start and end. If not specified, the edge values will be used. If timeseries x axis, date string, Date object and unixtime integer can be used. If class is set, the region element will have it as class. + * @name regions + * @memberof Options + * @type {Array} + * @default [] + * @example + * regions: [ + * { + * axis: "x", + * start: 1, + * end: 4, + * class: "region-1-4" + * } + * ] + */ + regions: [], + + /** + * Tooltip options + * @name tooltip + * @memberof Options + * @type {Object} + * @property {Boolean} [tooltip.show=true] Show or hide tooltip.
+ * @property {Boolean} [tooltip.grouped=true] Set if tooltip is grouped or not for the data points. + * @property {Function} [tooltip.format.title] Set format for the title of tooltip.
+ * Specified function receives x of the data point to show. + * @property {Function} [tooltip.format.name] Set format for the name of each data in tooltip.
+ * Specified function receives name, ratio, id and index of the data point to show. ratio will be undefined if the chart is not donut/pie/gauge. + * @property {Function} [tooltip.format.value] Set format for the value of each data in tooltip.
+ * Specified function receives name, ratio, id and index of the data point to show. ratio will be undefined if the chart is not donut/pie/gauge. + * If undefined returned, the row of that value will be skipped. + * @property {function} [tooltip.position] Set custom position for the tooltip.
+ * This option can be used to modify the tooltip position by returning object that has top and left. + * @property {function} [tooltip.contents] Set custom HTML for the tooltip.
+ * Specified function receives data, defaultTitleFormat, defaultValueFormat and color of the data point to show. If tooltip.grouped is true, data includes multiple data points. + * @example + * tooltip: { + * show: true, + * grouped: false, + * format: { + * title: function(x) { return "Data " + x; }, + * name: function(name, ratio, id, index) { return name; }, + * value: function(value, ratio, id, index) { return ratio; } + * }, + * position: function(data, width, height, element) { + * return {top: 0, left: 0} + * }, + * contents: function(d, defaultTitleFormat, defaultValueFormat, color) { + * return ... // formatted html as you want + * } + * } + */ + tooltip_show: !0, + tooltip_grouped: !0, + tooltip_format_title: undefined, + tooltip_format_name: undefined, + tooltip_format_value: undefined, + tooltip_position: undefined, + tooltip_contents: function tooltip_contents(d, defaultTitleFormat, defaultValueFormat, color) { + return this.getTooltipContent ? this.getTooltipContent(d, defaultTitleFormat, defaultValueFormat, color) : ""; + }, + tooltip_init_show: !1, + tooltip_init_x: 0, + tooltip_init_position: { + top: "0px", + left: "50px" + }, + tooltip_onshow: function tooltip_onshow() {}, + tooltip_onhide: function tooltip_onhide() {}, + + /** + * Set title options + * @name title + * @memberof Options + * @type {Object} + * @property {String} [title.text] + * @property {Number} [title.padding.top=0] + * @property {Number} [title.padding.right=0] + * @property {Number} [title.padding.bottom=0] + * @property {Number} [title.padding.left=0] + * @property {String} [title.position=top-center] + * @example + * title: { + * text: "Title Text", + * padding: { + * top: 10, + * right: 10, + * bottom: 10, + * left: 10 + * }, + * position: "top-center" + * } + */ + title_text: undefined, + title_padding: { + top: 0, + right: 0, + bottom: 0, + left: 0 + }, + title_position: "top-center" + }; +}; + +exports.default = Options; +module.exports = exports["default"]; + +/***/ }), +/* 59 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +exports.__esModule = !0; +exports.d3 = exports.bb = undefined; + +var _d = __webpack_require__(2), + d3 = _interopRequireWildcard(_d), + _Chart = __webpack_require__(4), + _Chart2 = _interopRequireDefault(_Chart), + _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _Axis = __webpack_require__(7), + _Axis2 = _interopRequireDefault(_Axis), + _util = __webpack_require__(0), + util = _interopRequireWildcard(_util); + +__webpack_require__(57); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) return obj; var newObj = {}; if (obj != null) for (var key in obj) Object.prototype.hasOwnProperty.call(obj, key) && (newObj[key] = obj[key]); return newObj.default = obj, newObj; } + +/** + * @namespace bb + * @version 1.0.0 + */ +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +var bb = { + /** + * Version information + * @property {String} version version + * @example + * bb.version; // "1.0.0" + * @memberof bb + */ + version: "1.0.0", + /** + * generate charts + * @param {Options} options chart options + * @memberof bb + * @return {Chart} + * @see {@link Options} for different generation options + * @see {@link Chart} for different methods API + * @example + * + *
+ * @example + * // generate chart with options + * var chart = bb.generate({ + * "bindto": "#LineChart" + * "data": { + * "columns": [ + * ["data1", 30, 200, 100, 400, 150, 250], + * ["data2", 50, 20, 10, 40, 15, 25] + * ] + * } + * }); + * + * // call some API + * // ex) get the data of 'data1' + * chart.data("data1"); + */ + generate: function generate(config) { + return new _Chart2.default(config); + }, + + chart: { + fn: _Chart2.default.prototype, + internal: { + fn: _ChartInternal2.default.prototype, + axis: { + fn: _Axis2.default.prototype + } + } + } +}; + +for (var p in util) /^__/.test(p) || (_ChartInternal2.default.prototype[p] = util[p]); + +__webpack_require__(27), __webpack_require__(46), __webpack_require__(41), __webpack_require__(29), __webpack_require__(28), __webpack_require__(30), __webpack_require__(37), __webpack_require__(32), __webpack_require__(51), __webpack_require__(49), __webpack_require__(50), __webpack_require__(48), __webpack_require__(52), __webpack_require__(55), __webpack_require__(43), __webpack_require__(54), __webpack_require__(44), __webpack_require__(53), __webpack_require__(39), __webpack_require__(35), __webpack_require__(45), __webpack_require__(31), __webpack_require__(47), __webpack_require__(33), __webpack_require__(34), __webpack_require__(40), __webpack_require__(42), __webpack_require__(36), __webpack_require__(38), __webpack_require__(15), __webpack_require__(22), __webpack_require__(26), __webpack_require__(19), __webpack_require__(14), __webpack_require__(21), __webpack_require__(24), __webpack_require__(17), __webpack_require__(16), __webpack_require__(20), __webpack_require__(13), __webpack_require__(10), __webpack_require__(12), __webpack_require__(25), __webpack_require__(9), __webpack_require__(18), __webpack_require__(11), __webpack_require__(23), __webpack_require__(8), __webpack_require__(56); +exports.bb = bb; +exports.d3 = d3; + +/***/ }), +/* 60 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +exports.__esModule = !0; +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +/* eslint-disable no-new-func, no-nested-ternary */ +var win = typeof window !== "undefined" && window.Math === Math ? window : typeof self !== "undefined" && self.Math === Math ? self : Function("return this")(); +/* eslint-enable no-new-func, no-nested-ternary */ + +exports.window = win; +var document = exports.document = win.document; + +/***/ }) +/******/ ]); +}); +//# sourceMappingURL=billboard.js.map \ No newline at end of file diff --git a/dist/billboard.js.map b/dist/billboard.js.map new file mode 100644 index 000000000..d98058a71 --- /dev/null +++ b/dist/billboard.js.map @@ -0,0 +1 @@ +{"version":3,"file":"billboard.js","sources":["webpack:///webpack/universalModuleDefinition","webpack:///webpack/bootstrap 0372f6e4fe02fc1a8238","webpack:///src/internals/util.js","webpack:///src/internals/ChartInternal.js","webpack:///external \"d3\"","webpack:///src/config/classes.js","webpack:///src/internals/Chart.js","webpack:///./~/babel-helper-modules/lib/typeof.js","webpack:///./~/babel-helper-modules/lib/classCallCheck.js","webpack:///src/axis/Axis.js","webpack:///src/axis/bb.axis.js","webpack:///src/api/api.axis.js","webpack:///src/api/api.category.js","webpack:///src/api/api.chart.js","webpack:///src/api/api.color.js","webpack:///src/api/api.data.js","webpack:///src/api/api.flow.js","webpack:///src/api/api.focus.js","webpack:///src/api/api.grid.js","webpack:///src/api/api.group.js","webpack:///src/api/api.legend.js","webpack:///src/api/api.load.js","webpack:///src/api/api.region.js","webpack:///src/api/api.selection.js","webpack:///src/api/api.show.js","webpack:///src/api/api.tooltip.js","webpack:///src/api/api.transform.js","webpack:///src/api/api.x.js","webpack:///src/api/api.zoom.js","webpack:///src/config/config.js","webpack:///src/data/data.convert.js","webpack:///src/data/data.js","webpack:///src/data/data.load.js","webpack:///src/interactions/drag.js","webpack:///src/interactions/interaction.js","webpack:///src/interactions/subchart.js","webpack:///src/interactions/zoom.js","webpack:///src/internals/arc.js","webpack:///src/internals/cache.js","webpack:///src/internals/category.js","webpack:///src/internals/class.js","webpack:///src/internals/clip.js","webpack:///src/internals/color.js","webpack:///src/internals/domain.js","webpack:///src/internals/format.js","webpack:///src/internals/grid.js","webpack:///src/internals/legend.js","webpack:///src/internals/region.js","webpack:///src/internals/scale.js","webpack:///src/internals/selection.js","webpack:///src/internals/shape.bar.js","webpack:///src/internals/shape.js","webpack:///src/internals/shape.line.js","webpack:///src/internals/size.js","webpack:///src/internals/text.js","webpack:///src/internals/title.js","webpack:///src/internals/tooltip.js","webpack:///src/internals/type.js","webpack:///src/internals/ua.js","webpack:///./src/scss/main.scss","webpack:///src/config/Options.js","webpack:///src/core.js","webpack:///src/internals/browser.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"d3\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"d3\"], factory);\n\telse {\n\t\tvar a = typeof exports === 'object' ? factory(require(\"d3\")) : factory(root[\"d3\"]);\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(this, function(__WEBPACK_EXTERNAL_MODULE_2__) {\nreturn \n\n\n// WEBPACK FOOTER //\n// webpack/universalModuleDefinition"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// identity function for calling harmony imports with the correct context\n \t__webpack_require__.i = function(value) { return value; };\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 59);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 0372f6e4fe02fc1a8238","/**\r\n * Copyright (c) 2017 NAVER Corp.\r\n * billboard.js project is licensed under the MIT license\r\n */\r\nimport {\r\n\tevent as d3Event,\r\n\tbrushSelection as d3BrushSelection\r\n} from \"d3\";\r\nimport CLASS from \"../config/classes\";\r\n\r\nconst isValue = v => v || v === 0;\r\nconst isFunction = o => typeof o === \"function\";\r\nconst isString = o => typeof o === \"string\";\r\nconst isUndefined = v => typeof v === \"undefined\";\r\nconst isDefined = v => typeof v !== \"undefined\";\r\nconst ceil10 = v => Math.ceil(v / 10) * 10;\r\nconst asHalfPixel = n => Math.ceil(n) + 0.5;\r\nconst diffDomain = d => d[1] - d[0];\r\nconst isEmpty = o => (\r\n\ttypeof o === \"undefined\" || o === null ||\r\n\t\t(isString(o) && o.length === 0) ||\r\n\t\t(typeof o === \"object\" && Object.keys(o).length === 0)\r\n);\r\nconst notEmpty = o => !isEmpty(o);\r\nconst getOption = (options, key, defaultValue) => (\r\n\tisDefined(options[key]) ? options[key] : defaultValue\r\n);\r\nconst hasValue = (dict, value) => {\r\n\tlet found = false;\r\n\r\n\tObject.keys(dict).forEach(key => (dict[key] === value) && (found = true));\r\n\r\n\treturn found;\r\n};\r\nconst sanitise = str => (\r\n\ttypeof str === \"string\" ?\r\n\t\tstr.replace(//g, \">\") : str\r\n);\r\n\r\n// substitution of SVGPathSeg API polyfill\r\nconst getRectSegList = path => {\r\n\t/*\r\n\t * seg1 ---------- seg2\r\n\t * | |\r\n\t * | |\r\n\t * | |\r\n\t * seg0 ---------- seg3\r\n\t * */\r\n\tconst bbox = path.getBBox();\r\n\tconst list = [];\r\n\r\n\t// seg0\r\n\tlist.push({\r\n\t\tx: bbox.x,\r\n\t\ty: bbox.y + bbox.height\r\n\t});\r\n\r\n\t// seg1\r\n\tlist.push({\r\n\t\tx: bbox.x,\r\n\t\ty: bbox.y\r\n\t});\r\n\r\n\t// seg2\r\n\tlist.push({\r\n\t\tx: bbox.x + bbox.width,\r\n\t\ty: bbox.y\r\n\t});\r\n\r\n\t// seg3\r\n\tlist.push({\r\n\t\tx: bbox.x + bbox.width,\r\n\t\ty: bbox.y + bbox.height\r\n\t});\r\n\r\n\treturn list;\r\n};\r\n\r\nconst getPathBox = path => {\r\n\tconst box = path.getBoundingClientRect();\r\n\tconst items = getRectSegList(path);\r\n\tconst minX = items[0].x;\r\n\tconst minY = Math.min(items[0].y, items[1].y);\r\n\r\n\treturn {\r\n\t\tx: minX,\r\n\t\ty: minY,\r\n\t\twidth: box.width,\r\n\t\theight: box.height,\r\n\t};\r\n};\r\n\r\n// return brush selection array\r\nconst getBrushSelection = function() {\r\n\tlet selection = null;\r\n\tconst event = d3Event;\r\n\r\n\t// check from event\r\n\tif (event && event.constructor.name === \"BrushEvent\") {\r\n\t\tselection = event.selection;\r\n\t\t// check from brush area selection\r\n\t} else if (this.context && (selection = this.context.select(`.${CLASS.brush}`).node())) {\r\n\t\tselection = d3BrushSelection(selection);\r\n\t}\r\n\r\n\treturn selection;\r\n};\r\n\r\nconst brushEmpty = function() {\r\n\tconst selection = this.getBrushSelection();\r\n\r\n\tif (selection) {\r\n\t\t// brush selected area\r\n\t\t// two-dimensional: [[x0, y0], [x1, y1]]\r\n\t\t// one-dimensional: [x0, x1] or [y0, y1]\r\n\t\treturn selection[0] === selection[1];\r\n\t}\r\n\r\n\treturn true;\r\n};\r\n\r\nfunction extend(target = {}, source) {\r\n\tlet p;\r\n\r\n\tfor (p in source) {\r\n\t\ttarget[p] = source[p];\r\n\t}\r\n\treturn target;\r\n}\r\n\r\nconst SUPPORT_ADDEVENTLISTENER = !!(\"addEventListener\" in document);\r\nconst SUPPORT_PASSIVE = (() => {\r\n\tlet supportsPassiveOption = false;\r\n\r\n\ttry {\r\n\t\tif (SUPPORT_ADDEVENTLISTENER && Object.defineProperty) {\r\n\t\t\tdocument.addEventListener(\"test\", null, Object.defineProperty({}, \"passive\", {\r\n\t\t\t\tget() {\r\n\t\t\t\t\tsupportsPassiveOption = true;\r\n\t\t\t\t},\r\n\t\t\t}));\r\n\t\t}\r\n\t} catch (e) {}\r\n\treturn supportsPassiveOption;\r\n})();\r\n\r\nfunction addEvent(element, type, handler, eventListenerOptions) {\r\n\tif (SUPPORT_ADDEVENTLISTENER) {\r\n\t\tlet options = eventListenerOptions || false;\r\n\r\n\t\tif (typeof eventListenerOptions === \"object\") {\r\n\t\t\toptions = SUPPORT_PASSIVE ? eventListenerOptions : false;\r\n\t\t}\r\n\t\telement.addEventListener(type, handler, options);\r\n\t} else if (element.attachEvent) {\r\n\t\telement.attachEvent(`on${type}`, handler);\r\n\t} else {\r\n\t\telement[`on${type}`] = handler;\r\n\t}\r\n}\r\n\r\nfunction removeEvent(element, type, handler) {\r\n\tif (element.removeEventListener) {\r\n\t\telement.removeEventListener(type, handler, false);\r\n\t} else if (element.detachEvent) {\r\n\t\telement.detachEvent(`on${type}`, handler);\r\n\t} else {\r\n\t\telement[`on${type}`] = null;\r\n\t}\r\n}\r\n\r\n/**\r\n * Check if is array\r\n * @param arr *\r\n * @returns {Boolean}\r\n * @private\r\n */\r\nconst isArray = arr => arr && arr.constructor === Array;\r\n\r\n/**\r\n * Check if is object\r\n * @param {Object} obj\r\n * @returns {Boolean}\r\n * @private\r\n */\r\nconst isObject = obj => obj && !obj.nodeType && typeof obj === \"object\" && !isArray(obj);\r\n\r\n/**\r\n * Merge object returning new object\r\n * @param {Object} target\r\n * @param {Object} objectN\r\n * @returns {Object} merged target object\r\n * @private\r\n * @example\r\n * var target = { a: 1 };\r\n * utils.extend(target, { b: 2, c: 3 });\r\n * target; // { a: 1, b: 2, c: 3 };\r\n */\r\nconst merge = (target, ...objectN) => {\r\n\tif (!objectN.length || (objectN.length === 1 && !objectN[0])) {\r\n\t\treturn target;\r\n\t}\r\n\r\n\tconst source = objectN.shift();\r\n\r\n\tif (isObject(target) && isObject(source)) {\r\n\t\tObject.keys(source).forEach(key => {\r\n\t\t\tconst value = source[key];\r\n\r\n\t\t\tif (isObject(value)) {\r\n\t\t\t\t!target[key] && (target[key] = {});\r\n\r\n\t\t\t\ttarget[key] = merge(target[key], value);\r\n\t\t\t} else {\r\n\t\t\t\ttarget[key] = isArray(value) ?\r\n\t\t\t\t\tvalue.concat() : value;\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\treturn extend(target, ...objectN);\r\n};\r\n\r\nexport {\r\n\tisValue,\r\n\tisDefined,\r\n\tisUndefined,\r\n\tnotEmpty,\r\n\tceil10,\r\n\tisFunction,\r\n\tasHalfPixel,\r\n\tgetOption,\r\n\tisString,\r\n\thasValue,\r\n\tsanitise,\r\n\tgetPathBox,\r\n\tdiffDomain,\r\n\tisEmpty,\r\n\tgetBrushSelection,\r\n\tbrushEmpty,\r\n\textend,\r\n\taddEvent,\r\n\tremoveEvent,\r\n\tgetRectSegList,\r\n\tmerge,\r\n\tisArray,\r\n\tisObject\r\n};\r\n\n\n\n// WEBPACK FOOTER //\n// src/internals/util.js","/**\r\n * Copyright (c) 2017 NAVER Corp.\r\n * billboard.js project is licensed under the MIT license\r\n */\r\nimport {\r\n\ttimeParse as d3TimeParse,\r\n\ttimeFormat as d3TimeFormat,\r\n\tutcParse as d3UtcParse,\r\n\tutcFormat as d3UtcFormat,\r\n\tselect as d3Select,\r\n\tselectAll as d3SelectAll,\r\n\textent as d3Extent,\r\n\ttransition as d3Transition\r\n} from \"d3\";\r\nimport Axis from \"../axis/Axis\";\r\nimport CLASS from \"../config/classes\";\r\nimport {addEvent, notEmpty, asHalfPixel, isValue, getOption} from \"./util\";\r\n\r\n/**\r\n * Internal chart class.\r\n * - Note: Instantiated internally, not exposed for public.\r\n * @class ChartInternal\r\n * @ignore\r\n * @private\r\n*/\r\nexport default class ChartInternal {\r\n\tconstructor(api) {\r\n\t\tconst $$ = this;\r\n\r\n\t\t$$.api = api;\r\n\t\t$$.config = $$.getOptions();\r\n\t\t$$.data = {};\r\n\t\t$$.cache = {};\r\n\t\t$$.axes = {};\r\n\t}\r\n\r\n\tbeforeInit() {\r\n\t\t// can do something\r\n\t}\r\n\r\n\tafterInit() {\r\n\t\t// can do something\r\n\t}\r\n\r\n\tinit() {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\r\n\t\t$$.initParams();\r\n\r\n\t\tif (config.data_url) {\r\n\t\t\t$$.convertUrlToData(\r\n\t\t\t\tconfig.data_url,\r\n\t\t\t\tconfig.data_mimeType,\r\n\t\t\t\tconfig.data_headers,\r\n\t\t\t\tconfig.data_keys,\r\n\t\t\t\t$$.initWithData\r\n\t\t\t);\r\n\t\t} else if (config.data_json) {\r\n\t\t\t$$.initWithData($$.convertJsonToData(config.data_json, config.data_keys));\r\n\t\t} else if (config.data_rows) {\r\n\t\t\t$$.initWithData($$.convertRowsToData(config.data_rows));\r\n\t\t} else if (config.data_columns) {\r\n\t\t\t$$.initWithData($$.convertColumnsToData(config.data_columns));\r\n\t\t} else {\r\n\t\t\tthrow Error(\"url or json or rows or columns is required.\");\r\n\t\t}\r\n\t}\r\n\r\n\tinitParams() {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\r\n\t\t// MEMO: clipId needs to be unique because it conflicts when multiple charts exist\r\n\t\t$$.clipId = `bb-${+new Date()}-clip`;\r\n\t\t$$.clipIdForXAxis = `${$$.clipId}-xaxis`;\r\n\t\t$$.clipIdForYAxis = `${$$.clipId}-yaxis`;\r\n\t\t$$.clipIdForGrid = `${$$.clipId}-grid`;\r\n\t\t$$.clipIdForSubchart = `${$$.clipId}-subchart`;\r\n\t\t$$.clipPath = $$.getClipPath($$.clipId);\r\n\t\t$$.clipPathForXAxis = $$.getClipPath($$.clipIdForXAxis);\r\n\t\t$$.clipPathForYAxis = $$.getClipPath($$.clipIdForYAxis);\r\n\t\t$$.clipPathForGrid = $$.getClipPath($$.clipIdForGrid);\r\n\t\t$$.clipPathForSubchart = $$.getClipPath($$.clipIdForSubchart);\r\n\t\t$$.dragStart = null;\r\n\t\t$$.dragging = false;\r\n\t\t$$.flowing = false;\r\n\t\t$$.cancelClick = false;\r\n\t\t$$.mouseover = false;\r\n\t\t$$.transiting = false;\r\n\r\n\t\t$$.color = $$.generateColor();\r\n\t\t$$.levelColor = $$.generateLevelColor();\r\n\r\n\t\t$$.dataTimeFormat = config.data_xLocaltime ? d3TimeParse : d3UtcParse;\r\n\t\t$$.axisTimeFormat = config.axis_x_localtime ? d3TimeFormat : d3UtcFormat;\r\n\r\n\t\t$$.defaultAxisTimeFormat = function(d) {\r\n\t\t\tconst specifier = (d.getMilliseconds() && \".%L\") ||\r\n\t\t\t\t(d.getSeconds() && \".:%S\") ||\r\n\t\t\t\t(d.getMinutes() && \"%I:%M\") ||\r\n\t\t\t\t(d.getHours() && \"%I %p\") ||\r\n\t\t\t\t((d.getDay() && d.getDate() !== 1) && \"%-m/%-d\") ||\r\n\t\t\t\t(d.getDate() !== 1 && \"%b %d\") ||\r\n\t\t\t\t(d.getMonth() && \"%-m/%-d\") ||\r\n\t\t\t\t\"%Y/%-m/%-d\";\r\n\r\n\t\t\treturn $$.axisTimeFormat(specifier)(d);\r\n\t\t};\r\n\r\n\t\t$$.hiddenTargetIds = [];\r\n\t\t$$.hiddenLegendIds = [];\r\n\t\t$$.focusedTargetIds = [];\r\n\t\t$$.defocusedTargetIds = [];\r\n\r\n\t\t$$.xOrient = config.axis_rotated ? \"left\" : \"bottom\";\r\n\r\n\t\t$$.yOrient = config.axis_rotated ?\r\n\t\t\t(config.axis_y_inner ? \"top\" : \"bottom\") : (config.axis_y_inner ? \"right\" : \"left\");\r\n\r\n\t\t$$.y2Orient = config.axis_rotated ?\r\n\t\t\t(config.axis_y2_inner ? \"bottom\" : \"top\") : (config.axis_y2_inner ? \"left\" : \"right\");\r\n\r\n\t\t$$.subXOrient = config.axis_rotated ? \"left\" : \"bottom\";\r\n\t\t$$.isLegendRight = config.legend_position === \"right\";\r\n\t\t$$.isLegendInset = config.legend_position === \"inset\";\r\n\r\n\t\t$$.isLegendTop = config.legend_inset_anchor === \"top-left\" ||\r\n\t\t\tconfig.legend_inset_anchor === \"top-right\";\r\n\r\n\t\t$$.isLegendLeft = config.legend_inset_anchor === \"top-left\" ||\r\n\t\t\tconfig.legend_inset_anchor === \"bottom-left\";\r\n\r\n\t\t$$.legendStep = 0;\r\n\t\t$$.legendItemWidth = 0;\r\n\t\t$$.legendItemHeight = 0;\r\n\r\n\t\t$$.currentMaxTickWidths = {\r\n\t\t\tx: 0,\r\n\t\t\ty: 0,\r\n\t\t\ty2: 0\r\n\t\t};\r\n\r\n\t\t$$.rotated_padding_left = 30;\r\n\t\t$$.rotated_padding_right = config.axis_rotated && !config.axis_x_show ? 0 : 30;\r\n\t\t$$.rotated_padding_top = 5;\r\n\r\n\t\t$$.withoutFadeIn = {};\r\n\t\t$$.intervalForObserveInserted = undefined;\r\n\r\n\t\t$$.inputType = $$.convertInputType();\r\n\r\n\t\t$$.axes.subx = d3SelectAll([]); // needs when excluding subchart.js\r\n\t}\r\n\r\n\tinitWithData(data) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tlet binding = true;\r\n\r\n\t\t$$.axis = new Axis($$);\r\n\r\n\t\t$$.initPie && $$.initPie();\r\n\r\n\t\t$$.initBrush && $$.initBrush();\r\n\r\n\t\t$$.initZoom && $$.initZoom();\r\n\r\n\t\tif (!config.bindto) {\r\n\t\t\t$$.selectChart = d3SelectAll([]);\r\n\t\t} else if (typeof config.bindto.node === \"function\") {\r\n\t\t\t$$.selectChart = config.bindto;\r\n\t\t} else {\r\n\t\t\t$$.selectChart = d3Select(config.bindto);\r\n\t\t}\r\n\r\n\t\tif ($$.selectChart.empty()) {\r\n\t\t\t$$.selectChart = d3Select(document.createElement(\"div\")).style(\"opacity\", \"0\");\r\n\t\t\t$$.observeInserted($$.selectChart);\r\n\t\t\tbinding = false;\r\n\t\t}\r\n\r\n\t\t$$.selectChart.html(\"\").classed(\"bb\", true);\r\n\r\n\t\t// Init data as targets\r\n\t\t$$.data.xs = {};\r\n\t\t$$.data.targets = $$.convertDataToTargets(data);\r\n\r\n\t\tif (config.data_filter) {\r\n\t\t\t$$.data.targets = $$.data.targets.filter(config.data_filter);\r\n\t\t}\r\n\r\n\t\t// Set targets to hide if needed\r\n\t\tif (config.data_hide) {\r\n\t\t\t$$.addHiddenTargetIds(\r\n\t\t\t\tconfig.data_hide === true ?\r\n\t\t\t\t\t$$.mapToIds($$.data.targets) : config.data_hide\r\n\t\t\t);\r\n\t\t}\r\n\t\tif (config.legend_hide) {\r\n\t\t\t$$.addHiddenLegendIds(\r\n\t\t\t\tconfig.legend_hide === true ?\r\n\t\t\t\t\t$$.mapToIds($$.data.targets) : config.legend_hide\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t\t// when gauge, hide legend // TODO: fix\r\n\t\tif ($$.hasType(\"gauge\")) {\r\n\t\t\tconfig.legend_show = false;\r\n\t\t}\r\n\r\n\t\t// Init sizes and scales\r\n\t\t$$.updateSizes();\r\n\t\t$$.updateScales();\r\n\r\n\t\t// Set domains for each scale\r\n\t\t$$.x.domain(d3Extent($$.getXDomain($$.data.targets)));\r\n\t\t$$.y.domain($$.getYDomain($$.data.targets, \"y\"));\r\n\t\t$$.y2.domain($$.getYDomain($$.data.targets, \"y2\"));\r\n\t\t$$.subX.domain($$.x.domain());\r\n\t\t$$.subY.domain($$.y.domain());\r\n\t\t$$.subY2.domain($$.y2.domain());\r\n\r\n\t\t// Save original x domain for zoom update\r\n\t\t$$.orgXDomain = $$.x.domain();\r\n\r\n\t\t// -- Basic Elements --\r\n\r\n\t\tconst isTouch = $$.inputType === \"touch\";\r\n\r\n\t\t// Define svg\r\n\t\t$$.svg = $$.selectChart.append(\"svg\")\r\n\t\t\t.style(\"overflow\", \"hidden\")\r\n\t\t\t.on(isTouch ? \"touchstart\" : \"mouseenter\", () => config.onover.call($$))\r\n\t\t\t.on(isTouch ? \"touchend\" : \"mouseleave\", () => config.onout.call($$));\r\n\r\n\t\t$$.config.svg_classname &&\r\n\t\t\t$$.svg.attr(\"class\", $$.config.svg_classname);\r\n\r\n\t\t// Define defs\r\n\t\tconst defs = $$.svg.append(\"defs\");\r\n\r\n\t\t$$.clipChart = $$.appendClip(defs, $$.clipId);\r\n\t\t$$.clipXAxis = $$.appendClip(defs, $$.clipIdForXAxis);\r\n\t\t$$.clipYAxis = $$.appendClip(defs, $$.clipIdForYAxis);\r\n\t\t$$.clipGrid = $$.appendClip(defs, $$.clipIdForGrid);\r\n\t\t$$.clipSubchart = $$.appendClip(defs, $$.clipIdForSubchart);\r\n\r\n\t\t$$.updateSvgSize();\r\n\r\n\t\t// Set initialized scales to brush and zoom\r\n\t\t// if ($$.brush) { $$.brush.scale($$.subX); }\r\n\t\t// if (config.zoom_enabled) { $$.zoom.scale($$.x); }\r\n\r\n\t\t// Define regions\r\n\t\tconst main = $$.svg.append(\"g\").attr(\"transform\", $$.getTranslate(\"main\"));\r\n\r\n\t\t$$.main = main;\r\n\r\n\t\t// initialize subchart when subchart show option is set\r\n\t\tconfig.subchart_show &&\r\n\t\t\t$$.initSubchart &&\r\n\t\t\t\t$$.initSubchart();\r\n\r\n\t\t$$.initTooltip && $$.initTooltip();\r\n\t\t$$.initLegend && $$.initLegend();\r\n\t\t$$.initTitle && $$.initTitle();\r\n\r\n\t\t// -- Main Region --\r\n\r\n\t\t// text when empty\r\n\t\tmain.append(\"text\")\r\n\t\t\t.attr(\"class\", `${CLASS.text} ${CLASS.empty}`)\r\n\t\t\t.attr(\"text-anchor\", \"middle\") // horizontal centering of text at x position in all browsers.\r\n\t\t\t.attr(\"dominant-baseline\", \"middle\"); // vertical centering of text at y position in all browsers, except IE.\r\n\r\n\t\t// Regions\r\n\t\t$$.initRegion();\r\n\r\n\t\t// Grids\r\n\t\t$$.initGrid();\r\n\r\n\t\t// Define g for chart area\r\n\t\tmain.append(\"g\")\r\n\t\t\t.attr(\"clip-path\", $$.clipPath)\r\n\t\t\t.attr(\"class\", CLASS.chart);\r\n\r\n\t\t// Grid lines\r\n\t\tconfig.grid_lines_front && $$.initGridLines();\r\n\r\n\t\t// Cover whole with rects for events\r\n\t\t$$.initEventRect();\r\n\r\n\t\t// Define g for chart\r\n\t\t$$.initChartElements();\r\n\r\n\t\t// if zoom privileged, insert rect to forefront\r\n\t\t// TODO: is this needed?\r\n\t\tmain.insert(\"rect\", config.zoom_privileged ? null : `g.${CLASS.regions}`)\r\n\t\t\t.attr(\"class\", CLASS.zoomRect)\r\n\t\t\t.attr(\"width\", $$.width)\r\n\t\t\t.attr(\"height\", $$.height)\r\n\t\t\t.style(\"opacity\", \"0\")\r\n\t\t\t.on(\"dblclick.zoom\", null);\r\n\r\n\t\t// Set default extent if defined\r\n\t\tconfig.axis_x_extent &&\r\n\t\t\t$$.brush.scale($$.getDefaultExtent());\r\n\r\n\t\t// Add Axis\r\n\t\t$$.axis.init();\r\n\r\n\t\t// Set targets\r\n\t\t$$.updateTargets($$.data.targets);\r\n\r\n\t\t// Draw with targets\r\n\t\tif (binding) {\r\n\t\t\t$$.updateDimension();\r\n\t\t\t$$.config.oninit.call($$);\r\n\r\n\t\t\t$$.redraw({\r\n\t\t\t\twithTransition: false,\r\n\t\t\t\twithTransform: true,\r\n\t\t\t\twithUpdateXDomain: true,\r\n\t\t\t\twithUpdateOrgXDomain: true,\r\n\t\t\t\twithTransitionForAxis: false\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// Bind resize event\r\n\t\t$$.bindResize();\r\n\r\n\t\t// export element of the chart\r\n\t\t$$.api.element = $$.selectChart.node();\r\n\t}\r\n\r\n\tinitChartElements() {\r\n\t\tthis.initBar && this.initBar();\r\n\t\tthis.initLine && this.initLine();\r\n\t\tthis.initArc && this.initArc();\r\n\t\tthis.initGauge && this.initGauge();\r\n\t\tthis.initText && this.initText();\r\n\t}\r\n\r\n\tsmoothLines(el, type) {\r\n\t\tif (type === \"grid\") {\r\n\t\t\tel.each(function() {\r\n\t\t\t\tconst g = d3Select(this);\r\n\t\t\t\tconst x1 = g.attr(\"x1\");\r\n\t\t\t\tconst x2 = g.attr(\"x2\");\r\n\t\t\t\tconst y1 = g.attr(\"y1\");\r\n\t\t\t\tconst y2 = g.attr(\"y2\");\r\n\r\n\t\t\t\tg.attr({\r\n\t\t\t\t\t\"x1\": Math.ceil(x1),\r\n\t\t\t\t\t\"x2\": Math.ceil(x2),\r\n\t\t\t\t\t\"y1\": Math.ceil(y1),\r\n\t\t\t\t\t\"y2\": Math.ceil(y2)\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\tupdateSizes() {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tconst legendHeight = $$.legend ? $$.getLegendHeight() : 0;\r\n\t\tconst legendWidth = $$.legend ? $$.getLegendWidth() : 0;\r\n\t\tconst legendHeightForBottom = $$.isLegendRight || $$.isLegendInset ? 0 : legendHeight;\r\n\t\tconst hasArc = $$.hasArcType();\r\n\t\tconst xAxisHeight = config.axis_rotated || hasArc ? 0 : $$.getHorizontalAxisHeight(\"x\");\r\n\t\tconst subchartHeight = config.subchart_show && !hasArc ?\r\n\t\t\t(config.subchart_size_height + xAxisHeight) : 0;\r\n\r\n\t\t$$.currentWidth = $$.getCurrentWidth();\r\n\t\t$$.currentHeight = $$.getCurrentHeight();\r\n\r\n\t\t// for main\r\n\t\t$$.margin = config.axis_rotated ? {\r\n\t\t\ttop: $$.getHorizontalAxisHeight(\"y2\") + $$.getCurrentPaddingTop(),\r\n\t\t\tright: hasArc ? 0 : $$.getCurrentPaddingRight(),\r\n\t\t\tbottom: $$.getHorizontalAxisHeight(\"y\") + legendHeightForBottom + $$.getCurrentPaddingBottom(),\r\n\t\t\tleft: subchartHeight + (hasArc ? 0 : $$.getCurrentPaddingLeft())\r\n\t\t} : {\r\n\t\t\ttop: 4 + $$.getCurrentPaddingTop(), // for top tick text\r\n\t\t\tright: hasArc ? 0 : $$.getCurrentPaddingRight(),\r\n\t\t\tbottom: xAxisHeight + subchartHeight + legendHeightForBottom + $$.getCurrentPaddingBottom(),\r\n\t\t\tleft: hasArc ? 0 : $$.getCurrentPaddingLeft()\r\n\t\t};\r\n\r\n\t\t// for subchart\r\n\t\t$$.margin2 = config.axis_rotated ? {\r\n\t\t\ttop: $$.margin.top,\r\n\t\t\tright: NaN,\r\n\t\t\tbottom: 20 + legendHeightForBottom,\r\n\t\t\tleft: $$.rotated_padding_left\r\n\t\t} : {\r\n\t\t\ttop: $$.currentHeight - subchartHeight - legendHeightForBottom,\r\n\t\t\tright: NaN,\r\n\t\t\tbottom: xAxisHeight + legendHeightForBottom,\r\n\t\t\tleft: $$.margin.left\r\n\t\t};\r\n\r\n\t\t// for legend\r\n\t\t$$.margin3 = {\r\n\t\t\ttop: 0,\r\n\t\t\tright: NaN,\r\n\t\t\tbottom: 0,\r\n\t\t\tleft: 0\r\n\t\t};\r\n\r\n\t\tif ($$.updateSizeForLegend) {\r\n\t\t\t$$.updateSizeForLegend(legendHeight, legendWidth);\r\n\t\t}\r\n\r\n\t\t$$.width = $$.currentWidth - $$.margin.left - $$.margin.right;\r\n\t\t$$.height = $$.currentHeight - $$.margin.top - $$.margin.bottom;\r\n\r\n\t\tif ($$.width < 0) {\r\n\t\t\t$$.width = 0;\r\n\t\t}\r\n\r\n\t\tif ($$.height < 0) {\r\n\t\t\t$$.height = 0;\r\n\t\t}\r\n\r\n\t\t$$.width2 = config.axis_rotated ?\r\n\t\t\t$$.margin.left - $$.rotated_padding_left - $$.rotated_padding_right : $$.width;\r\n\r\n\t\t$$.height2 = config.axis_rotated ?\r\n\t\t\t$$.height : $$.currentHeight - $$.margin2.top - $$.margin2.bottom;\r\n\r\n\t\tif ($$.width2 < 0) { $$.width2 = 0; }\r\n\t\tif ($$.height2 < 0) { $$.height2 = 0; }\r\n\r\n\t\t// for arc\r\n\t\t$$.arcWidth = $$.width - ($$.isLegendRight ? legendWidth + 10 : 0);\r\n\t\t$$.arcHeight = $$.height - ($$.isLegendRight ? 0 : 10);\r\n\r\n\t\tif ($$.hasType(\"gauge\") && !config.gauge_fullCircle) {\r\n\t\t\t$$.arcHeight += $$.height - $$.getGaugeLabelHeight();\r\n\t\t}\r\n\r\n\t\t$$.updateRadius && $$.updateRadius();\r\n\r\n\t\tif ($$.isLegendRight && hasArc) {\r\n\t\t\t$$.margin3.left = $$.arcWidth / 2 + $$.radiusExpanded * 1.1;\r\n\t\t}\r\n\t}\r\n\r\n\tupdateTargets(targets) {\r\n\t\tconst $$ = this;\r\n\r\n\t\t// -- Main --\r\n\r\n\t\t// -- Text -- //\r\n\t\t$$.updateTargetsForText(targets);\r\n\r\n\t\t// -- Bar -- //\r\n\t\t$$.updateTargetsForBar(targets);\r\n\r\n\t\t// -- Line -- //\r\n\t\t$$.updateTargetsForLine(targets);\r\n\r\n\t\t// -- Arc -- //\r\n\t\t$$.hasArcType() && $$.updateTargetsForArc &&\r\n\t\t\t$$.updateTargetsForArc(targets);\r\n\r\n\t\t// -- Sub --\r\n\t\t$$.updateTargetsForSubchart &&\r\n\t\t\t$$.updateTargetsForSubchart(targets);\r\n\r\n\t\t// Fade-in each chart\r\n\t\t$$.showTargets();\r\n\t}\r\n\r\n\tshowTargets() {\r\n\t\tconst $$ = this;\r\n\r\n\t\t$$.svg.selectAll(`.${CLASS.target}`)\r\n\t\t\t.filter(d => $$.isTargetToShow(d.id))\r\n\t\t\t.transition()\r\n\t\t\t.duration($$.config.transition_duration)\r\n\t\t\t.style(\"opacity\", \"1\");\r\n\t}\r\n\r\n\tredraw(options = {}, transitionsValue) {\r\n\t\tconst $$ = this;\r\n\t\tconst main = $$.main;\r\n\t\tconst config = $$.config;\r\n\r\n\t\tconst areaIndices = $$.getShapeIndices($$.isAreaType);\r\n\t\tconst barIndices = $$.getShapeIndices($$.isBarType);\r\n\t\tconst lineIndices = $$.getShapeIndices($$.isLineType);\r\n\r\n\t\tlet waitForDraw;\r\n\t\tlet flow;\r\n\r\n\t\tconst hideAxis = $$.hasArcType();\r\n\t\tconst targetsToShow = $$.filterTargetsToShow($$.data.targets);\r\n\t\tconst xv = $$.xv.bind($$);\r\n\r\n\t\tlet tickValues;\r\n\t\tlet intervalForCulling;\r\n\t\tlet xDomainForZoom;\r\n\r\n\t\tconst withY = getOption(options, \"withY\", true);\r\n\t\tconst withSubchart = getOption(options, \"withSubchart\", true);\r\n\t\tconst withTransition = getOption(options, \"withTransition\", true);\r\n\t\tconst withTransform = getOption(options, \"withTransform\", false);\r\n\t\tconst withUpdateXDomain = getOption(options, \"withUpdateXDomain\", false);\r\n\t\tconst withUpdateOrgXDomain = getOption(options, \"withUpdateOrgXDomain\", false);\r\n\t\tconst withTrimXDomain = getOption(options, \"withTrimXDomain\", true);\r\n\t\tconst withUpdateXAxis = getOption(options, \"withUpdateXAxis\", withUpdateXDomain);\r\n\t\tconst withLegend = getOption(options, \"withLegend\", false);\r\n\t\tconst withEventRect = getOption(options, \"withEventRect\", true);\r\n\t\tconst withDimension = getOption(options, \"withDimension\", true);\r\n\t\tconst withTransitionForExit = getOption(options, \"withTransitionForExit\", withTransition);\r\n\t\tconst withTransitionForAxis = getOption(options, \"withTransitionForAxis\", withTransition);\r\n\r\n\t\tconst duration = withTransition ? config.transition_duration : 0;\r\n\t\tconst durationForExit = withTransitionForExit ? duration : 0;\r\n\t\tconst durationForAxis = withTransitionForAxis ? duration : 0;\r\n\r\n\t\tconst transitions = transitionsValue || $$.axis.generateTransitions(durationForAxis);\r\n\r\n\t\t$$.inputType === \"touch\" && $$.hideTooltip();\r\n\r\n\t\t// update legend and transform each g\r\n\t\tif (withLegend && config.legend_show) {\r\n\t\t\t$$.updateLegend($$.mapToIds($$.data.targets), options, transitions);\r\n\t\t} else if (withDimension) {\r\n\t\t\t// need to update dimension (e.g. axis.y.tick.values) because y tick values should change\r\n\t\t\t// no need to update axis in it because they will be updated in redraw()\r\n\t\t\t$$.updateDimension(true);\r\n\t\t}\r\n\r\n\t\t// MEMO: needed for grids calculation\r\n\t\tif ($$.isCategorized() && targetsToShow.length === 0) {\r\n\t\t\t$$.x.domain([0, $$.axes.x.selectAll(\".tick\").size()]);\r\n\t\t}\r\n\r\n\t\tif (targetsToShow.length) {\r\n\t\t\t$$.updateXDomain(targetsToShow, withUpdateXDomain, withUpdateOrgXDomain, withTrimXDomain);\r\n\t\t\tif (!config.axis_x_tick_values) {\r\n\t\t\t\ttickValues = $$.axis.updateXAxisTickValues(targetsToShow);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\t$$.xAxis.tickValues([]);\r\n\t\t\t$$.subXAxis.tickValues([]);\r\n\t\t}\r\n\r\n\t\tif (config.zoom_rescale && !options.flow) {\r\n\t\t\txDomainForZoom = $$.x.orgDomain();\r\n\t\t}\r\n\r\n\t\t$$.y.domain($$.getYDomain(targetsToShow, \"y\", xDomainForZoom));\r\n\t\t$$.y2.domain($$.getYDomain(targetsToShow, \"y2\", xDomainForZoom));\r\n\r\n\t\tif (!config.axis_y_tick_values && config.axis_y_tick_count) {\r\n\t\t\t$$.yAxis.tickValues(\r\n\t\t\t\t$$.axis.generateTickValues(\r\n\t\t\t\t\t$$.y.domain(),\r\n\t\t\t\t\tconfig.axis_y_tick_count,\r\n\t\t\t\t\t$$.isTimeSeriesY()\r\n\t\t\t\t)\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t\tif (!config.axis_y2_tick_values && config.axis_y2_tick_count) {\r\n\t\t\t$$.y2Axis.tickValues(\r\n\t\t\t\t$$.axis.generateTickValues(\r\n\t\t\t\t\t$$.y2.domain(),\r\n\t\t\t\t\tconfig.axis_y2_tick_count\r\n\t\t\t\t)\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t\t// axes\r\n\t\t$$.axis.redraw(transitions, hideAxis);\r\n\r\n\t\t// Update axis label\r\n\t\t$$.axis.updateLabels(withTransition);\r\n\r\n\t\t// show/hide if manual culling needed\r\n\t\tif ((withUpdateXDomain || withUpdateXAxis) && targetsToShow.length) {\r\n\t\t\tif (config.axis_x_tick_culling && tickValues) {\r\n\t\t\t\tfor (let i = 1; i < tickValues.length; i++) {\r\n\t\t\t\t\tif (tickValues.length / i < config.axis_x_tick_culling_max) {\r\n\t\t\t\t\t\tintervalForCulling = i;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t$$.svg.selectAll(`.${CLASS.axisX} .tick text`).each(function(e) {\r\n\t\t\t\t\tconst index = tickValues.indexOf(e);\r\n\r\n\t\t\t\t\tindex >= 0 &&\r\n\t\t\t\t\t\td3Select(this)\r\n\t\t\t\t\t\t\t.style(\"display\", index % intervalForCulling ? \"none\" : \"block\");\r\n\t\t\t\t});\r\n\t\t\t} else {\r\n\t\t\t\t$$.svg.selectAll(`.${CLASS.axisX} .tick text`)\r\n\t\t\t\t\t.style(\"display\", \"block\");\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// setup drawer - MEMO: these must be called after axis updated\r\n\t\tconst drawArea = $$.generateDrawArea ?\r\n\t\t\t$$.generateDrawArea(areaIndices, false) : undefined;\r\n\r\n\t\tconst drawBar = $$.generateDrawBar ?\r\n\t\t\t$$.generateDrawBar(barIndices) : undefined;\r\n\r\n\t\tconst drawLine = $$.generateDrawLine ?\r\n\t\t\t$$.generateDrawLine(lineIndices, false) : undefined;\r\n\r\n\t\tconst xForText = $$.generateXYForText(areaIndices, barIndices, lineIndices, true);\r\n\t\tconst yForText = $$.generateXYForText(areaIndices, barIndices, lineIndices, false);\r\n\r\n\t\t// Update sub domain\r\n\t\tif (withY) {\r\n\t\t\t$$.subY.domain($$.getYDomain(targetsToShow, \"y\"));\r\n\t\t\t$$.subY2.domain($$.getYDomain(targetsToShow, \"y2\"));\r\n\t\t}\r\n\r\n\t\t// xgrid focus\r\n\t\t$$.updateXgridFocus();\r\n\r\n\t\t// Data empty label positioning and text.\r\n\t\tmain.select(`text.${CLASS.text}.${CLASS.empty}`)\r\n\t\t\t.attr(\"x\", $$.width / 2)\r\n\t\t\t.attr(\"y\", $$.height / 2)\r\n\t\t\t.text(config.data_empty_label_text)\r\n\t\t\t.transition()\r\n\t\t\t.style(\"opacity\", targetsToShow.length ? 0 : 1);\r\n\r\n\t\t// grid\r\n\t\t$$.updateGrid(duration);\r\n\r\n\t\t// rect for regions\r\n\t\t$$.updateRegion(duration);\r\n\r\n\t\t// bars\r\n\t\t$$.updateBar(durationForExit);\r\n\r\n\t\t// lines, areas and cricles\r\n\t\t$$.updateLine(durationForExit);\r\n\t\t$$.updateArea(durationForExit);\r\n\t\t$$.updateCircle();\r\n\r\n\t\t// text\r\n\t\t$$.hasDataLabel() &&\r\n\t\t\t$$.updateText(durationForExit);\r\n\r\n\t\t// title\r\n\t\t$$.redrawTitle && $$.redrawTitle();\r\n\r\n\t\t// arc\r\n\t\t$$.redrawArc &&\r\n\t\t\t$$.redrawArc(duration, durationForExit, withTransform);\r\n\r\n\t\t// subchart\r\n\t\tconfig.subchart_show &&\r\n\t\t\t$$.redrawSubchart &&\r\n\t\t\t\t$$.redrawSubchart(\r\n\t\t\t\t\twithSubchart,\r\n\t\t\t\t\ttransitions,\r\n\t\t\t\t\tduration,\r\n\t\t\t\t\tdurationForExit,\r\n\t\t\t\t\tareaIndices,\r\n\t\t\t\t\tbarIndices,\r\n\t\t\t\t\tlineIndices\r\n\t\t\t\t);\r\n\r\n\t\t// circles for select\r\n\t\tmain.selectAll(`.${CLASS.selectedCircles}`)\r\n\t\t\t.filter($$.isBarType.bind($$))\r\n\t\t\t.selectAll(\"circle\")\r\n\t\t\t.remove();\r\n\r\n\t\t// event rects will redrawn when flow called\r\n\t\tif (config.interaction_enabled && !options.flow && withEventRect) {\r\n\t\t\t$$.redrawEventRect();\r\n\t\t\t$$.updateZoom && $$.updateZoom();\r\n\t\t}\r\n\r\n\t\t// update circleY based on updated parameters\r\n\t\t$$.updateCircleY();\r\n\r\n\t\t// generate circle x/y functions depending on updated params\r\n\t\tconst cx = ($$.config.axis_rotated ? $$.circleY : $$.circleX).bind($$);\r\n\t\tconst cy = ($$.config.axis_rotated ? $$.circleX : $$.circleY).bind($$);\r\n\r\n\t\tif (options.flow) {\r\n\t\t\tflow = $$.generateFlow({\r\n\t\t\t\ttargets: targetsToShow,\r\n\t\t\t\tflow: options.flow,\r\n\t\t\t\tduration: options.flow.duration,\r\n\t\t\t\tdrawBar: drawBar,\r\n\t\t\t\tdrawLine: drawLine,\r\n\t\t\t\tdrawArea: drawArea,\r\n\t\t\t\tcx: cx,\r\n\t\t\t\tcy: cy,\r\n\t\t\t\txv: xv,\r\n\t\t\t\txForText: xForText,\r\n\t\t\t\tyForText: yForText\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tif ((duration || flow) && $$.isTabVisible()) { // Only use transition if tab visible. See #938.\r\n\t\t\t// transition should be derived from one transition\r\n\t\t\td3Transition().duration(duration)\r\n\t\t\t\t.each(() => {\r\n\t\t\t\t\t// Wait for end of transitions to call flow and onrendered callback\r\n\t\t\t\t\twaitForDraw = $$.generateWait();\r\n\r\n\t\t\t\t\t// redraw and gather transitions\r\n\t\t\t\t\t[\r\n\t\t\t\t\t\t$$.redrawBar(drawBar, true),\r\n\t\t\t\t\t\t$$.redrawLine(drawLine, true),\r\n\t\t\t\t\t\t$$.redrawArea(drawArea, true),\r\n\t\t\t\t\t\t$$.redrawCircle(cx, cy, true, flow),\r\n\t\t\t\t\t\t$$.redrawText(xForText, yForText, options.flow, true),\r\n\t\t\t\t\t\t$$.redrawRegion(true),\r\n\t\t\t\t\t\t$$.redrawGrid(true)\r\n\t\t\t\t\t].reduce((acc, t1) => {\r\n\t\t\t\t\t\tt1.forEach(t2 => {\r\n\t\t\t\t\t\t\tacc.push(t2);\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\treturn acc;\r\n\t\t\t\t\t}, []).forEach(t => {\r\n\t\t\t\t\t\twaitForDraw.add(t);\r\n\t\t\t\t\t});\r\n\t\t\t\t})\r\n\t\t\t\t.call(waitForDraw, () => {\r\n\t\t\t\t\tflow && flow();\r\n\t\t\t\t\tconfig.onrendered && config.onrendered.call($$);\r\n\t\t\t\t});\r\n\t\t} else {\r\n\t\t\t$$.redrawBar(drawBar);\r\n\t\t\t$$.redrawLine(drawLine);\r\n\t\t\t$$.redrawArea(drawArea);\r\n\t\t\t$$.redrawCircle(cx, cy);\r\n\t\t\t$$.redrawText(xForText, yForText, options.flow);\r\n\t\t\t$$.redrawRegion();\r\n\t\t\t$$.redrawGrid();\r\n\r\n\t\t\tconfig.onrendered &&\r\n\t\t\t\tconfig.onrendered.call($$);\r\n\t\t}\r\n\r\n\t\t// update fadein condition\r\n\t\t$$.mapToIds($$.data.targets).forEach(id => {\r\n\t\t\t$$.withoutFadeIn[id] = true;\r\n\t\t});\r\n\t}\r\n\r\n\tupdateAndRedraw(options = {}) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tlet transitions;\r\n\r\n\t\t// same with redraw\r\n\t\toptions.withTransition = getOption(options, \"withTransition\", true);\r\n\t\toptions.withTransform = getOption(options, \"withTransform\", false);\r\n\t\toptions.withLegend = getOption(options, \"withLegend\", false);\r\n\r\n\t\t// NOT same with redraw\r\n\t\toptions.withUpdateXDomain = true;\r\n\t\toptions.withUpdateOrgXDomain = true;\r\n\t\toptions.withTransitionForExit = false;\r\n\t\toptions.withTransitionForTransform = getOption(options, \"withTransitionForTransform\", options.withTransition);\r\n\r\n\t\t// MEMO: this needs to be called before updateLegend and it means this ALWAYS needs to be called)\r\n\t\t$$.updateSizes();\r\n\r\n\t\t// MEMO: called in updateLegend in redraw if withLegend\r\n\t\tif (!(options.withLegend && config.legend_show)) {\r\n\t\t\ttransitions = $$.axis.generateTransitions(\r\n\t\t\t\toptions.withTransitionForAxis ? config.transition_duration : 0\r\n\t\t\t);\r\n\r\n\t\t\t// Update scales\r\n\t\t\t$$.updateScales();\r\n\t\t\t$$.updateSvgSize();\r\n\r\n\t\t\t// Update g positions\r\n\t\t\t$$.transformAll(options.withTransitionForTransform, transitions);\r\n\t\t}\r\n\r\n\t\t// Draw with new sizes & scales\r\n\t\t$$.redraw(options, transitions);\r\n\t}\r\n\r\n\tredrawWithoutRescale() {\r\n\t\tthis.redraw({\r\n\t\t\twithY: false,\r\n\t\t\twithSubchart: false,\r\n\t\t\twithEventRect: false,\r\n\t\t\twithTransitionForAxis: false\r\n\t\t});\r\n\t}\r\n\r\n\tisTimeSeries() {\r\n\t\treturn this.config.axis_x_type === \"timeseries\";\r\n\t}\r\n\r\n\tisCategorized() {\r\n\t\treturn this.config.axis_x_type.indexOf(\"categor\") >= 0;\r\n\t}\r\n\r\n\tisCustomX() {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\r\n\t\treturn !$$.isTimeSeries() && (config.data_x || notEmpty(config.data_xs));\r\n\t}\r\n\r\n\tisTimeSeriesY() {\r\n\t\treturn this.config.axis_y_type === \"timeseries\";\r\n\t}\r\n\r\n\tgetTranslate(target) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\r\n\t\tlet x;\r\n\t\tlet y;\r\n\r\n\t\tif (target === \"main\") {\r\n\t\t\tx = asHalfPixel($$.margin.left);\r\n\t\t\ty = asHalfPixel($$.margin.top);\r\n\t\t} else if (target === \"context\") {\r\n\t\t\tx = asHalfPixel($$.margin2.left);\r\n\t\t\ty = asHalfPixel($$.margin2.top);\r\n\t\t} else if (target === \"legend\") {\r\n\t\t\tx = $$.margin3.left;\r\n\t\t\ty = $$.margin3.top;\r\n\t\t} else if (target === \"x\") {\r\n\t\t\tx = 0;\r\n\t\t\ty = config.axis_rotated ? 0 : $$.height;\r\n\t\t} else if (target === \"y\") {\r\n\t\t\tx = 0;\r\n\t\t\ty = config.axis_rotated ? $$.height : 0;\r\n\t\t} else if (target === \"y2\") {\r\n\t\t\tx = config.axis_rotated ? 0 : $$.width;\r\n\t\t\ty = config.axis_rotated ? 1 : 0;\r\n\t\t} else if (target === \"subx\") {\r\n\t\t\tx = 0;\r\n\t\t\ty = config.axis_rotated ? 0 : $$.height2;\r\n\t\t} else if (target === \"arc\") {\r\n\t\t\tx = $$.arcWidth / 2;\r\n\t\t\ty = $$.arcHeight / 2;\r\n\t\t}\r\n\r\n\t\treturn `translate(${x}, ${y})`;\r\n\t}\r\n\r\n\tinitialOpacity(d) {\r\n\t\treturn d.value !== null &&\r\n\t\t\tthis.withoutFadeIn[d.id] ? \"1\" : \"0\";\r\n\t}\r\n\r\n\tinitialOpacityForCircle(d) {\r\n\t\treturn d.value !== null &&\r\n\t\t\tthis.withoutFadeIn[d.id] ? this.opacityForCircle(d) : \"0\";\r\n\t}\r\n\r\n\topacityForCircle(d) {\r\n\t\tconst opacity = this.config.point_show ? \"1\" : \"0\";\r\n\r\n\t\treturn isValue(d.value) ? (this.isScatterType(d) ? \"0.5\" : opacity) : \"0\";\r\n\t}\r\n\r\n\topacityForText() {\r\n\t\treturn this.hasDataLabel() ? \"1\" : \"0\";\r\n\t}\r\n\r\n\txx(d) {\r\n\t\tif (this.config.zoom_enabled && this.zoomScale) {\r\n\t\t\treturn d ? this.zoomScale(d.x) : null;\r\n\t\t} else {\r\n\t\t\treturn d ? this.x(d.x) : null;\r\n\t\t}\r\n\t}\r\n\r\n\txv(d) {\r\n\t\tconst $$ = this;\r\n\t\tlet value = d.value;\r\n\r\n\t\tif ($$.isTimeSeries()) {\r\n\t\t\tvalue = $$.parseDate(d.value);\r\n\t\t} else if ($$.isCategorized() && typeof d.value === \"string\") {\r\n\t\t\tvalue = $$.config.axis_x_categories.indexOf(d.value);\r\n\t\t}\r\n\r\n\t\treturn Math.ceil($$.x(value));\r\n\t}\r\n\r\n\tyv(d) {\r\n\t\tconst $$ = this;\r\n\t\tconst yScale = d.axis && d.axis === \"y2\" ? $$.y2 : $$.y;\r\n\r\n\t\treturn Math.ceil(yScale(d.value));\r\n\t}\r\n\r\n\tsubxx(d) {\r\n\t\treturn d ? this.subX(d.x) : null;\r\n\t}\r\n\r\n\ttransformMain(withTransition, transitions) {\r\n\t\tconst $$ = this;\r\n\t\tlet xAxis;\r\n\t\tlet yAxis;\r\n\t\tlet y2Axis;\r\n\r\n\t\tif (transitions && transitions.axisX) {\r\n\t\t\txAxis = transitions.axisX;\r\n\t\t} else {\r\n\t\t\txAxis = $$.main.select(`.${CLASS.axisX}`);\r\n\r\n\t\t\tif (withTransition) {\r\n\t\t\t\txAxis = xAxis.transition();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (transitions && transitions.axisY) {\r\n\t\t\tyAxis = transitions.axisY;\r\n\t\t} else {\r\n\t\t\tyAxis = $$.main.select(`.${CLASS.axisY}`);\r\n\r\n\t\t\tif (withTransition) {\r\n\t\t\t\tyAxis = yAxis.transition();\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (transitions && transitions.axisY2) {\r\n\t\t\ty2Axis = transitions.axisY2;\r\n\t\t} else {\r\n\t\t\ty2Axis = $$.main.select(`.${CLASS.axisY2}`);\r\n\r\n\t\t\tif (withTransition) {\r\n\t\t\t\ty2Axis = y2Axis.transition();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t(withTransition ? $$.main.transition() : $$.main)\r\n\t\t\t.attr(\"transform\", $$.getTranslate(\"main\"));\r\n\r\n\t\txAxis.attr(\"transform\", $$.getTranslate(\"x\"));\r\n\t\tyAxis.attr(\"transform\", $$.getTranslate(\"y\"));\r\n\t\ty2Axis.attr(\"transform\", $$.getTranslate(\"y2\"));\r\n\r\n\t\t$$.main.select(`.${CLASS.chartArcs}`)\r\n\t\t\t.attr(\"transform\", $$.getTranslate(\"arc\"));\r\n\t}\r\n\r\n\ttransformAll(withTransition, transitions) {\r\n\t\tconst $$ = this;\r\n\r\n\t\t$$.transformMain(withTransition, transitions);\r\n\r\n\t\t$$.config.subchart_show &&\r\n\t\t\t$$.transformContext(withTransition, transitions);\r\n\r\n\t\t$$.legend &&\r\n\t\t\t$$.transformLegend(withTransition);\r\n\t}\r\n\r\n\tupdateSvgSize() {\r\n\t\tconst $$ = this;\r\n\t\tconst brush = $$.svg.select(`.${CLASS.brush} .overlay`);\r\n\t\tconst brushHeight = brush.size() ? brush.attr(\"height\") : 0;\r\n\r\n\t\t$$.svg\r\n\t\t\t.attr(\"width\", $$.currentWidth)\r\n\t\t\t.attr(\"height\", $$.currentHeight);\r\n\r\n\t\t$$.svg.selectAll([`#${$$.clipId}`, `#${$$.clipIdForGrid}`])\r\n\t\t\t.select(\"rect\")\r\n\t\t\t.attr(\"width\", $$.width)\r\n\t\t\t.attr(\"height\", $$.height);\r\n\r\n\t\t$$.svg.select(`#${$$.clipIdForXAxis}`)\r\n\t\t\t.select(\"rect\")\r\n\t\t\t.attr(\"x\", $$.getXAxisClipX.bind($$))\r\n\t\t\t.attr(\"y\", $$.getXAxisClipY.bind($$))\r\n\t\t\t.attr(\"width\", $$.getXAxisClipWidth.bind($$))\r\n\t\t\t.attr(\"height\", $$.getXAxisClipHeight.bind($$));\r\n\r\n\t\t$$.svg.select(`#${$$.clipIdForYAxis}`)\r\n\t\t\t.select(\"rect\")\r\n\t\t\t.attr(\"x\", $$.getYAxisClipX.bind($$))\r\n\t\t\t.attr(\"y\", $$.getYAxisClipY.bind($$))\r\n\t\t\t.attr(\"width\", $$.getYAxisClipWidth.bind($$))\r\n\t\t\t.attr(\"height\", $$.getYAxisClipHeight.bind($$));\r\n\r\n\t\t$$.svg.select(`#${$$.clipIdForSubchart}`)\r\n\t\t\t.select(\"rect\")\r\n\t\t\t.attr(\"width\", $$.width)\r\n\t\t\t.attr(\"height\", brushHeight);\r\n\r\n\t\t$$.svg.select(`.${CLASS.zoomRect}`)\r\n\t\t\t.attr(\"width\", $$.width)\r\n\t\t\t.attr(\"height\", $$.height);\r\n\r\n\t\t// MEMO: parent div\"s height will be bigger than svg when \r\n\t\t$$.selectChart.style(\"max-height\", `${$$.currentHeight}px`);\r\n\r\n\t\t$$.brush && $$.brush.scale($$.subX, brushHeight);\r\n\t}\r\n\r\n\tupdateDimension(withoutAxis) {\r\n\t\tconst $$ = this;\r\n\r\n\t\tif (!withoutAxis) {\r\n\t\t\tif ($$.config.axis_rotated) {\r\n\t\t\t\t$$.axes.x.call($$.xAxis);\r\n\t\t\t\t$$.axes.subx.call($$.subXAxis);\r\n\t\t\t} else {\r\n\t\t\t\t$$.axes.y.call($$.yAxis);\r\n\t\t\t\t$$.axes.y2.call($$.y2Axis);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t$$.updateSizes();\r\n\r\n\t\t// pass 'withoutAxis' param to not animate at the init rendering\r\n\t\t$$.updateScales(withoutAxis);\r\n\r\n\t\t$$.updateSvgSize();\r\n\t\t$$.transformAll(false);\r\n\t}\r\n\r\n\tobserveInserted(selection) {\r\n\t\tconst $$ = this;\r\n\r\n\t\tif (typeof MutationObserver === \"undefined\") {\r\n\t\t\tconsole && console.error &&\r\n\t\t\t\tconsole.error(\"MutationObserver not defined.\");\r\n\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst observer = new MutationObserver(mutations => {\r\n\t\t\tmutations.forEach(mutation => {\r\n\t\t\t\tif (mutation.type === \"childList\" && mutation.previousSibling) {\r\n\t\t\t\t\tobserver.disconnect();\r\n\r\n\t\t\t\t\t// need to wait for completion of load because size calculation requires the actual sizes determined after that completion\r\n\t\t\t\t\t$$.intervalForObserveInserted = window.setInterval(() => {\r\n\t\t\t\t\t\t// parentNode will NOT be null when completed\r\n\t\t\t\t\t\tif (selection.node().parentNode) {\r\n\t\t\t\t\t\t\twindow.clearInterval($$.intervalForObserveInserted);\r\n\t\t\t\t\t\t\t$$.updateDimension();\r\n\r\n\t\t\t\t\t\t\t$$.brush && $$.brush.update();\r\n\t\t\t\t\t\t\t$$.config.oninit.call($$);\r\n\r\n\t\t\t\t\t\t\t$$.redraw({\r\n\t\t\t\t\t\t\t\twithTransform: true,\r\n\t\t\t\t\t\t\t\twithUpdateXDomain: true,\r\n\t\t\t\t\t\t\t\twithUpdateOrgXDomain: true,\r\n\t\t\t\t\t\t\t\twithTransition: false,\r\n\t\t\t\t\t\t\t\twithTransitionForTransform: false,\r\n\t\t\t\t\t\t\t\twithLegend: true\r\n\t\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\t\tselection.transition().style(\"opacity\", \"1\");\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}, 10);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t});\r\n\r\n\t\tobserver.observe(selection.node(), {\r\n\t\t\tattributes: true,\r\n\t\t\tchildList: true,\r\n\t\t\tcharacterData: true\r\n\t\t});\r\n\t}\r\n\r\n\tbindResize() {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\r\n\t\t$$.resizeFunction = $$.generateResize();\r\n\r\n\t\t$$.resizeFunction.add(() => {\r\n\t\t\tconfig.onresize.call($$);\r\n\t\t});\r\n\r\n\t\tif (config.resize_auto) {\r\n\t\t\t$$.resizeFunction.add(() => {\r\n\t\t\t\tif ($$.resizeTimeout !== undefined) {\r\n\t\t\t\t\twindow.clearTimeout($$.resizeTimeout);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t$$.resizeTimeout = window.setTimeout(() => {\r\n\t\t\t\t\tdelete $$.resizeTimeout;\r\n\t\t\t\t\t$$.api.flush();\r\n\t\t\t\t}, 100);\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t$$.resizeFunction.add(() => {\r\n\t\t\tconfig.onresized.call($$);\r\n\t\t});\r\n\r\n\t\taddEvent(window, \"resize\", $$.resizeFunction);\r\n\r\n\t\t// if (window.attachEvent) {\r\n\t\t// \twindow.attachEvent(\"onresize\", $$.resizeFunction);\r\n\t\t// } else if (window.addEventListener) {\r\n\t\t// \twindow.addEventListener(\"resize\", $$.resizeFunction, false);\r\n\t\t// } else {\r\n\t\t// \t// fallback to this, if this is a very old browser\r\n\t\t// \tlet wrapper = window.onresize;\r\n\t\t// \tif (!wrapper) {\r\n\t\t// \t\t// create a wrapper that will call all charts\r\n\t\t// \t\twrapper = $$.generateResize();\r\n\t\t// \t} else if (!wrapper.add || !wrapper.remove) {\r\n\t\t// \t\t// there is already a handler registered, make sure we call it too\r\n\t\t// \t\twrapper = $$.generateResize();\r\n\t\t// \t\twrapper.add(window.onresize);\r\n\t\t// \t}\r\n\t\t// \t// add this graph to the wrapper, we will be removed if the user calls destroy\r\n\t\t// \twrapper.add($$.resizeFunction);\r\n\t\t// \twindow.onresize = wrapper;\r\n\t\t// }\r\n\t}\r\n\r\n\tgenerateResize() {\r\n\t\tconst resizeFunctions = [];\r\n\r\n\t\tfunction callResizeFunctions() {\r\n\t\t\tresizeFunctions.forEach(f => f());\r\n\t\t}\r\n\r\n\t\tcallResizeFunctions.add = function(f) {\r\n\t\t\tresizeFunctions.push(f);\r\n\t\t};\r\n\r\n\t\tcallResizeFunctions.remove = function(f) {\r\n\t\t\tfor (let i = 0; i < resizeFunctions.length; i++) {\r\n\t\t\t\tif (resizeFunctions[i] === f) {\r\n\t\t\t\t\tresizeFunctions.splice(i, 1);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\treturn callResizeFunctions;\r\n\t}\r\n\r\n\tendall(transition, callback) {\r\n\t\tlet n = 0;\r\n\r\n\t\ttransition\r\n\t\t\t.each(() => ++n)\r\n\t\t\t.on(\"end\", function(...args) {\r\n\t\t\t\t!--n && callback.apply(this, ...args);\r\n\t\t\t});\r\n\t}\r\n\r\n\tgenerateWait() {\r\n\t\tlet transitionsToWait = [];\r\n\t\tconst f = function(transition, callback) {\r\n\t\t\tlet timer;\r\n\r\n\t\t\tfunction loop() {\r\n\t\t\t\tlet done = 0;\r\n\r\n\t\t\t\ttransitionsToWait.forEach(t => {\r\n\t\t\t\t\tif (t.empty()) {\r\n\t\t\t\t\t\tdone += 1;\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\tt.transition();\r\n\t\t\t\t\t} catch (e) {\r\n\t\t\t\t\t\tdone += 1;\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\r\n\t\t\t\tif (done === transitionsToWait.length) {\r\n\t\t\t\t\tclearTimeout(timer);\r\n\t\t\t\t\tcallback && callback();\r\n\t\t\t\t} else {\r\n\t\t\t\t\ttimer = setTimeout(loop, 20);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tloop();\r\n\t\t};\r\n\r\n\t\tf.add = function(transition) {\r\n\t\t\tif (Array.isArray(transition)) {\r\n\t\t\t\ttransitionsToWait = [...transitionsToWait, ...transition];\r\n\t\t\t} else {\r\n\t\t\t\ttransitionsToWait.push(transition);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\treturn f;\r\n\t}\r\n\r\n\tparseDate(date) {\r\n\t\tconst $$ = this;\r\n\t\tlet parsedDate;\r\n\r\n\t\tif (date instanceof Date) {\r\n\t\t\tparsedDate = date;\r\n\t\t} else if (typeof date === \"string\") {\r\n\t\t\tparsedDate = $$.dataTimeFormat($$.config.data_xFormat)(date);\r\n\t\t} else if (typeof date === \"number\" && !isNaN(date)) {\r\n\t\t\tparsedDate = new Date(+date);\r\n\t\t}\r\n\t\tif (!parsedDate || isNaN(+parsedDate)) {\r\n\t\t\tconsole && console.error &&\r\n\t\t\t\tconsole.error(`Failed to parse x '${date}' to Date object`);\r\n\t\t}\r\n\r\n\t\treturn parsedDate;\r\n\t}\r\n\r\n\tisTabVisible() {\r\n\t\tlet hidden;\r\n\r\n\t\tif (typeof document.hidden !== \"undefined\") { // Opera 12.10 and Firefox 18 and later support\r\n\t\t\thidden = \"hidden\";\r\n\t\t} else if (typeof document.mozHidden !== \"undefined\") {\r\n\t\t\thidden = \"mozHidden\";\r\n\t\t} else if (typeof document.msHidden !== \"undefined\") {\r\n\t\t\thidden = \"msHidden\";\r\n\t\t} else if (typeof document.webkitHidden !== \"undefined\") {\r\n\t\t\thidden = \"webkitHidden\";\r\n\t\t}\r\n\r\n\t\treturn !document[hidden];\r\n\t}\r\n\r\n\tconvertInputType() {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tconst hasMouse = config.interaction_inputType_mouse ? !!(\"onmouseover\" in window) : false;\r\n\t\tlet hasTouch;\r\n\r\n\t\tif (config.interaction_inputType_touch) {\r\n\t\t\t// Ref: https://github.com/Modernizr/Modernizr/blob/master/feature-detects/touchevents.js\r\n\t\t\thasTouch = (\"ontouchstart\" in window) || (window.DocumentTouch && document instanceof window.DocumentTouch);\r\n\r\n\t\t\t// https://github.com/ariya/phantomjs/issues/10375\r\n\t\t\tif (/PhantomJS/.test(window.navigator.userAgent)) {\r\n\t\t\t\thasTouch = false;\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\thasTouch = false;\r\n\t\t}\r\n\r\n\t\treturn (hasTouch && \"touch\") || (hasMouse && \"mouse\") || null;\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// src/internals/ChartInternal.js","module.exports = __WEBPACK_EXTERNAL_MODULE_2__;\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"d3\"\n// module id = 2\n// module chunks = 0 1","/**\r\n * Copyright (c) 2017 NAVER Corp.\r\n * billboard.js project is licensed under the MIT license\r\n */\r\nconst CLASS = {\r\n\ttarget: \"bb-target\",\r\n\tchart: \"bb-chart\",\r\n\tchartLine: \"bb-chart-line\",\r\n\tchartLines: \"bb-chart-lines\",\r\n\tchartBar: \"bb-chart-bar\",\r\n\tchartBars: \"bb-chart-bars\",\r\n\tchartText: \"bb-chart-text\",\r\n\tchartTexts: \"bb-chart-texts\",\r\n\tchartArc: \"bb-chart-arc\",\r\n\tchartArcs: \"bb-chart-arcs\",\r\n\tchartArcsTitle: \"bb-chart-arcs-title\",\r\n\tchartArcsBackground: \"bb-chart-arcs-background\",\r\n\tchartArcsGaugeUnit: \"bb-chart-arcs-gauge-unit\",\r\n\tchartArcsGaugeMax: \"bb-chart-arcs-gauge-max\",\r\n\tchartArcsGaugeMin: \"bb-chart-arcs-gauge-min\",\r\n\tselectedCircle: \"bb-selected-circle\",\r\n\tselectedCircles: \"bb-selected-circles\",\r\n\teventRect: \"bb-event-rect\",\r\n\teventRects: \"bb-event-rects\",\r\n\teventRectsSingle: \"bb-event-rects-single\",\r\n\teventRectsMultiple: \"bb-event-rects-multiple\",\r\n\tzoomRect: \"bb-zoom-rect\",\r\n\tbrush: \"bb-brush\",\r\n\tfocused: \"bb-focused\",\r\n\tdefocused: \"bb-defocused\",\r\n\tregion: \"bb-region\",\r\n\tregions: \"bb-regions\",\r\n\ttitle: \"bb-title\",\r\n\ttooltipContainer: \"bb-tooltip-container\",\r\n\ttooltip: \"bb-tooltip\",\r\n\ttooltipName: \"bb-tooltip-name\",\r\n\tshape: \"bb-shape\",\r\n\tshapes: \"bb-shapes\",\r\n\tline: \"bb-line\",\r\n\tlines: \"bb-lines\",\r\n\tbar: \"bb-bar\",\r\n\tbars: \"bb-bars\",\r\n\tcircle: \"bb-circle\",\r\n\tcircles: \"bb-circles\",\r\n\tarc: \"bb-arc\",\r\n\tarcs: \"bb-arcs\",\r\n\tarea: \"bb-area\",\r\n\tareas: \"bb-areas\",\r\n\tempty: \"bb-empty\",\r\n\ttext: \"bb-text\",\r\n\ttexts: \"bb-texts\",\r\n\tgaugeValue: \"bb-gauge-value\",\r\n\tgrid: \"bb-grid\",\r\n\tgridLines: \"bb-grid-lines\",\r\n\txgrid: \"bb-xgrid\",\r\n\txgrids: \"bb-xgrids\",\r\n\txgridLine: \"bb-xgrid-line\",\r\n\txgridLines: \"bb-xgrid-lines\",\r\n\txgridFocus: \"bb-xgrid-focus\",\r\n\tygrid: \"bb-ygrid\",\r\n\tygrids: \"bb-ygrids\",\r\n\tygridLine: \"bb-ygrid-line\",\r\n\tygridLines: \"bb-ygrid-lines\",\r\n\taxis: \"bb-axis\",\r\n\taxisX: \"bb-axis-x\",\r\n\taxisXLabel: \"bb-axis-x-label\",\r\n\taxisY: \"bb-axis-y\",\r\n\taxisYLabel: \"bb-axis-y-label\",\r\n\taxisY2: \"bb-axis-y2\",\r\n\taxisY2Label: \"bb-axis-y2-label\",\r\n\tlegendBackground: \"bb-legend-background\",\r\n\tlegendItem: \"bb-legend-item\",\r\n\tlegendItemEvent: \"bb-legend-item-event\",\r\n\tlegendItemTile: \"bb-legend-item-tile\",\r\n\tlegendItemHidden: \"bb-legend-item-hidden\",\r\n\tlegendItemFocused: \"bb-legend-item-focused\",\r\n\tdragarea: \"bb-dragarea\",\r\n\tEXPANDED: \"_expanded_\",\r\n\tSELECTED: \"_selected_\",\r\n\tINCLUDED: \"_included_\"\r\n};\r\n\r\nexport default CLASS;\r\n\n\n\n// WEBPACK FOOTER //\n// src/config/classes.js","/**\r\n * Copyright (c) 2017 NAVER Corp.\r\n * billboard.js project is licensed under the MIT license\r\n * @license MIT\r\n * @ignore\r\n */\r\nimport ChartInternal from \"./ChartInternal\";\r\n\r\n/**\r\n * Main chart class.\r\n * - Note: Instantiated via `bb.generate()`.\r\n * @class Chart\r\n * @example\r\n * var chart = bb.generate({\r\n * data: {\r\n * columns: [\r\n *\t [\"x\", \"2015-11-02\", \"2015-12-01\", \"2016-01-01\", \"2016-02-01\", \"2016-03-01\"],\r\n * \t [\"count1\", 11, 8, 7, 6, 5 ],\r\n *\t [\"count2\", 9, 3, 6, 2, 8 ]\r\n * ]}\r\n * }\r\n * @see {@link bb.generate} for the initialization.\r\n*/\r\nexport default class Chart {\r\n\tconstructor(config) {\r\n\t\tconst $$ = new ChartInternal(this);\r\n\r\n\t\tthis.internal = $$;\r\n\r\n\t\t$$.loadConfig(config);\r\n\t\t$$.beforeInit(config);\r\n\t\t$$.init();\r\n\t\t$$.afterInit(config);\r\n\r\n\t\t// bind \"this\" to nested API\r\n\t\t(function bindThis(fn, target, argThis) {\r\n\t\t\tObject.keys(fn).forEach(key => {\r\n\t\t\t\ttarget[key] = fn[key].bind(argThis);\r\n\r\n\t\t\t\tObject.keys(fn[key]).length &&\r\n\t\t\t\t\tbindThis(fn[key], target[key], argThis);\r\n\t\t\t});\r\n\t\t})(Chart.prototype, this, this);\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// src/internals/Chart.js","\"use strict\";\n\nexports.__esModule = true;\n\nfunction _typeof(obj) { return obj && typeof Symbol !== \"undefined\" && obj.constructor === Symbol ? \"symbol\" : typeof obj; }\n\nexports.default = function (obj) {\n return obj && typeof Symbol !== \"undefined\" && obj.constructor === Symbol ? \"symbol\" : typeof obj === \"undefined\" ? \"undefined\" : _typeof(obj);\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-helper-modules/lib/typeof.js\n// module id = 5\n// module chunks = 0 1","\"use strict\";\n\nexports.__esModule = true;\n\nexports.default = function (instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-helper-modules/lib/classCallCheck.js\n// module id = 6\n// module chunks = 0 1","/**\r\n * Copyright (c) 2017 NAVER Corp.\r\n * billboard.js project is licensed under the MIT license\r\n */\r\nimport {select as d3Select} from \"d3\";\r\nimport {\r\n\tisFunction,\r\n\tisString,\r\n\tisValue,\r\n\tisEmpty\r\n} from \"../internals/util\";\r\nimport bbAxis from \"./bb.axis\";\r\nimport CLASS from \"../config/classes\";\r\n\r\nexport default class Axis {\r\n\tconstructor(owner) {\r\n\t\tthis.owner = owner;\r\n\t}\r\n\r\n\tinit() {\r\n\t\tconst $$ = this.owner;\r\n\t\tconst config = $$.config;\r\n\t\tconst main = $$.main;\r\n\r\n\t\t$$.axes.x = main.append(\"g\")\r\n\t\t\t.attr(\"class\", `${CLASS.axis} ${CLASS.axisX}`)\r\n\t\t\t.attr(\"clip-path\", $$.clipPathForXAxis)\r\n\t\t\t.attr(\"transform\", $$.getTranslate(\"x\"))\r\n\t\t\t.style(\"visibility\", config.axis_x_show ? \"visible\" : \"hidden\");\r\n\r\n\t\t$$.axes.x.append(\"text\")\r\n\t\t\t.attr(\"class\", CLASS.axisXLabel)\r\n\t\t\t.attr(\"transform\", config.axis_rotated ? \"rotate(-90)\" : \"\")\r\n\t\t\t.style(\"text-anchor\", this.textAnchorForXAxisLabel.bind(this));\r\n\r\n\t\t$$.axes.y = main.append(\"g\")\r\n\t\t\t.attr(\"class\", `${CLASS.axis} ${CLASS.axisY}`)\r\n\t\t\t.attr(\"clip-path\", config.axis_y_inner ? \"\" : $$.clipPathForYAxis)\r\n\t\t\t.attr(\"transform\", $$.getTranslate(\"y\"))\r\n\t\t\t.style(\"visibility\", config.axis_y_show ? \"visible\" : \"hidden\");\r\n\r\n\t\t$$.axes.y.append(\"text\")\r\n\t\t\t.attr(\"class\", CLASS.axisYLabel)\r\n\t\t\t.attr(\"transform\", config.axis_rotated ? \"\" : \"rotate(-90)\")\r\n\t\t\t.style(\"text-anchor\", this.textAnchorForYAxisLabel.bind(this));\r\n\r\n\t\t$$.axes.y2 = main.append(\"g\")\r\n\t\t\t.attr(\"class\", `${CLASS.axis} ${CLASS.axisY2}`)\r\n\t\t\t// clip-path?\r\n\t\t\t.attr(\"transform\", $$.getTranslate(\"y2\"))\r\n\t\t\t.style(\"visibility\", config.axis_y2_show ? \"visible\" : \"hidden\");\r\n\r\n\t\t$$.axes.y2.append(\"text\")\r\n\t\t\t.attr(\"class\", CLASS.axisY2Label)\r\n\t\t\t.attr(\"transform\", config.axis_rotated ? \"\" : \"rotate(-90)\")\r\n\t\t\t.style(\"text-anchor\", this.textAnchorForY2AxisLabel.bind(this));\r\n\t}\r\n\r\n\tgetXAxis(scale, orient, tickFormat,\r\n\t\ttickValues, withOuterTick, withoutTransition, withoutRotateTickText) {\r\n\t\tconst $$ = this.owner;\r\n\t\tconst config = $$.config;\r\n\t\tconst axisParams = {\r\n\t\t\tisCategory: $$.isCategorized(),\r\n\t\t\twithOuterTick,\r\n\t\t\ttickMultiline: config.axis_x_tick_multiline,\r\n\t\t\ttickWidth: config.axis_x_tick_width,\r\n\t\t\ttickTextRotate: withoutRotateTickText ? 0 : config.axis_x_tick_rotate,\r\n\t\t\twithoutTransition,\r\n\t\t};\r\n\r\n\t\tconst axis = bbAxis(axisParams)\r\n\t\t\t.scale(scale)\r\n\t\t\t.orient(orient);\r\n\r\n\t\tlet newTickValues = tickValues;\r\n\r\n\t\tif ($$.isTimeSeries() && tickValues && typeof tickValues !== \"function\") {\r\n\t\t\tnewTickValues = tickValues.map(v => $$.parseDate(v));\r\n\t\t}\r\n\r\n\t\t// Set tick\r\n\t\taxis.tickFormat(tickFormat).tickValues(newTickValues);\r\n\r\n\t\tif ($$.isCategorized()) {\r\n\t\t\taxis.tickCentered(config.axis_x_tick_centered);\r\n\t\t\tif (isEmpty(config.axis_x_tick_culling)) {\r\n\t\t\t\tconfig.axis_x_tick_culling = false;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn axis;\r\n\t}\r\n\r\n\tupdateXAxisTickValues(targets, axis) {\r\n\t\tconst $$ = this.owner;\r\n\t\tconst config = $$.config;\r\n\t\tlet tickValues;\r\n\r\n\t\tif (config.axis_x_tick_fit || config.axis_x_tick_count) {\r\n\t\t\ttickValues = this.generateTickValues(\r\n\t\t\t\t$$.mapTargetsToUniqueXs(targets),\r\n\t\t\t\tconfig.axis_x_tick_count,\r\n\t\t\t\t$$.isTimeSeries()\r\n\t\t\t);\r\n\t\t}\r\n\t\tif (axis) {\r\n\t\t\taxis.tickValues(tickValues);\r\n\t\t} else {\r\n\t\t\t$$.xAxis.tickValues(tickValues);\r\n\t\t\t$$.subXAxis.tickValues(tickValues);\r\n\t\t}\r\n\t\treturn tickValues;\r\n\t}\r\n\r\n\tgetYAxis(scale, orient, tickFormat, tickValues,\r\n\t\twithOuterTick, withoutTransition, withoutRotateTickText) {\r\n\t\tconst $$ = this.owner;\r\n\t\tconst config = $$.config;\r\n\t\tconst axisParams = {\r\n\t\t\twithOuterTick,\r\n\t\t\twithoutTransition,\r\n\t\t\ttickTextRotate: withoutRotateTickText ? 0 : config.axis_y_tick_rotate,\r\n\t\t};\r\n\t\tconst axis = bbAxis(axisParams)\r\n\t\t\t.scale(scale)\r\n\t\t\t.orient(orient)\r\n\t\t\t.tickFormat(tickFormat);\r\n\r\n\t\tif ($$.isTimeSeriesY()) {\r\n\t\t\t// https://github.com/d3/d3/blob/master/CHANGES.md#time-intervals-d3-time\r\n\t\t\taxis.ticks(config.axis_y_tick_time_value);\r\n\t\t} else {\r\n\t\t\taxis.tickValues(tickValues);\r\n\t\t}\r\n\t\treturn axis;\r\n\t}\r\n\r\n\tgetId(id) {\r\n\t\tconst config = this.owner.config;\r\n\r\n\t\treturn id in config.data_axes ? config.data_axes[id] : \"y\";\r\n\t}\r\n\r\n\tgetXAxisTickFormat() {\r\n\t\tconst $$ = this.owner;\r\n\t\tconst config = $$.config;\r\n\t\tlet format;\r\n\r\n\t\tif ($$.isTimeSeries()) {\r\n\t\t\tformat = $$.defaultAxisTimeFormat;\r\n\t\t} else {\r\n\t\t\tformat = $$.isCategorized() ?\r\n\t\t\t\t$$.categoryName : function(v) {\r\n\t\t\t\t\treturn v < 0 ? v.toFixed(0) : v;\r\n\t\t\t\t};\r\n\t\t}\r\n\r\n\t\tif (config.axis_x_tick_format) {\r\n\t\t\tif (isFunction(config.axis_x_tick_format)) {\r\n\t\t\t\tformat = config.axis_x_tick_format;\r\n\t\t\t} else if ($$.isTimeSeries()) {\r\n\t\t\t\tformat = date => (date ? $$.axisTimeFormat(config.axis_x_tick_format)(date) : \"\");\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn isFunction(format) ? function(v) {\r\n\t\t\treturn format.call($$, v);\r\n\t\t} : format;\r\n\t}\r\n\r\n\tgetTickValues(tickValues, axis) {\r\n\t\tlet values;\r\n\r\n\t\tif (tickValues) {\r\n\t\t\tvalues = tickValues;\r\n\t\t} else {\r\n\t\t\tvalues = axis ? axis.tickValues() : undefined;\r\n\t\t}\r\n\t\treturn values;\r\n\t}\r\n\r\n\tgetXAxisTickValues() {\r\n\t\treturn this.getTickValues(this.owner.config.axis_x_tick_values, this.owner.xAxis);\r\n\t}\r\n\r\n\tgetYAxisTickValues() {\r\n\t\treturn this.getTickValues(this.owner.config.axis_y_tick_values, this.owner.yAxis);\r\n\t}\r\n\r\n\tgetY2AxisTickValues() {\r\n\t\treturn this.getTickValues(this.owner.config.axis_y2_tick_values, this.owner.y2Axis);\r\n\t}\r\n\r\n\tgetLabelOptionByAxisId(axisId) {\r\n\t\tconst $$ = this.owner;\r\n\t\tconst config = $$.config;\r\n\t\tlet option;\r\n\r\n\t\tif (axisId === \"y\") {\r\n\t\t\toption = config.axis_y_label;\r\n\t\t} else if (axisId === \"y2\") {\r\n\t\t\toption = config.axis_y2_label;\r\n\t\t} else if (axisId === \"x\") {\r\n\t\t\toption = config.axis_x_label;\r\n\t\t}\r\n\t\treturn option;\r\n\t}\r\n\r\n\tgetLabelText(axisId) {\r\n\t\tconst option = this.getLabelOptionByAxisId(axisId);\r\n\t\tlet text;\r\n\r\n\t\tif (isString(option)) {\r\n\t\t\ttext = option;\r\n\t\t} else {\r\n\t\t\ttext = option ? option.text : null;\r\n\t\t}\r\n\t\treturn text;\r\n\t}\r\n\r\n\tsetLabelText(axisId, text) {\r\n\t\tconst $$ = this.owner;\r\n\t\tconst config = $$.config;\r\n\t\tconst option = this.getLabelOptionByAxisId(axisId);\r\n\r\n\t\tif (isString(option)) {\r\n\t\t\tif (axisId === \"y\") {\r\n\t\t\t\tconfig.axis_y_label = text;\r\n\t\t\t} else if (axisId === \"y2\") {\r\n\t\t\t\tconfig.axis_y2_label = text;\r\n\t\t\t} else if (axisId === \"x\") {\r\n\t\t\t\tconfig.axis_x_label = text;\r\n\t\t\t}\r\n\t\t} else if (option) {\r\n\t\t\toption.text = text;\r\n\t\t}\r\n\t}\r\n\r\n\tgetLabelPosition(axisId, defaultPosition) {\r\n\t\tconst option = this.getLabelOptionByAxisId(axisId);\r\n\t\tconst position = (typeof option === \"object\" && option.position) ? option.position : defaultPosition;\r\n\r\n\t\treturn {\r\n\t\t\tisInner: !!~position.indexOf(\"inner\"),\r\n\t\t\tisOuter: !!~position.indexOf(\"outer\"),\r\n\t\t\tisLeft: !!~position.indexOf(\"left\"),\r\n\t\t\tisCenter: !!~position.indexOf(\"center\"),\r\n\t\t\tisRight: !!~position.indexOf(\"right\"),\r\n\t\t\tisTop: !!~position.indexOf(\"top\"),\r\n\t\t\tisMiddle: !!~position.indexOf(\"middle\"),\r\n\t\t\tisBottom: !!~position.indexOf(\"bottom\"),\r\n\t\t};\r\n\t}\r\n\r\n\tgetXAxisLabelPosition() {\r\n\t\treturn this.getLabelPosition(\"x\", this.owner.config.axis_rotated ? \"inner-top\" : \"inner-right\");\r\n\t}\r\n\r\n\tgetYAxisLabelPosition() {\r\n\t\treturn this.getLabelPosition(\"y\", this.owner.config.axis_rotated ? \"inner-right\" : \"inner-top\");\r\n\t}\r\n\r\n\tgetY2AxisLabelPosition() {\r\n\t\treturn this.getLabelPosition(\"y2\", this.owner.config.axis_rotated ? \"inner-right\" : \"inner-top\");\r\n\t}\r\n\r\n\tgetLabelPositionById(id) {\r\n\t\tlet label;\r\n\r\n\t\tif (id === \"y2\") {\r\n\t\t\tlabel = this.getY2AxisLabelPosition();\r\n\t\t} else {\r\n\t\t\tlabel = id === \"y\" ? this.getYAxisLabelPosition() : this.getXAxisLabelPosition();\r\n\t\t}\r\n\t\treturn label;\r\n\t}\r\n\r\n\ttextForXAxisLabel() {\r\n\t\treturn this.getLabelText(\"x\");\r\n\t}\r\n\r\n\ttextForYAxisLabel() {\r\n\t\treturn this.getLabelText(\"y\");\r\n\t}\r\n\r\n\ttextForY2AxisLabel() {\r\n\t\treturn this.getLabelText(\"y2\");\r\n\t}\r\n\r\n\txForAxisLabel(forHorizontal, position) {\r\n\t\tconst $$ = this.owner;\r\n\t\tlet x;\r\n\r\n\t\tif (forHorizontal) {\r\n\t\t\tif (position.isLeft) {\r\n\t\t\t\tx = 0;\r\n\t\t\t} else {\r\n\t\t\t\tx = position.isCenter ? $$.width / 2 : $$.width;\r\n\t\t\t}\r\n\t\t} else if (position.isBottom) {\r\n\t\t\tx = -$$.height;\r\n\t\t} else {\r\n\t\t\tx = position.isMiddle ? -$$.height / 2 : 0;\r\n\t\t}\r\n\t\treturn x;\r\n\t}\r\n\r\n\tdxForAxisLabel(forHorizontal, position) {\r\n\t\tlet dx;\r\n\r\n\t\tif (forHorizontal) {\r\n\t\t\tif (position.isLeft) {\r\n\t\t\t\tdx = \"0.5em\";\r\n\t\t\t} else {\r\n\t\t\t\tdx = position.isRight ? \"-0.5em\" : \"0\";\r\n\t\t\t}\r\n\t\t} else if (position.isTop) {\r\n\t\t\tdx = \"-0.5em\";\r\n\t\t} else {\r\n\t\t\tdx = position.isBottom ? \"0.5em\" : \"0\";\r\n\t\t}\r\n\t\treturn dx;\r\n\t}\r\n\r\n\ttextAnchorForAxisLabel(forHorizontal, position) {\r\n\t\tlet anchor;\r\n\r\n\t\tif (forHorizontal) {\r\n\t\t\tif (position.isLeft) {\r\n\t\t\t\tanchor = \"start\";\r\n\t\t\t} else {\r\n\t\t\t\tanchor = position.isCenter ? \"middle\" : \"end\";\r\n\t\t\t}\r\n\t\t} else if (position.isBottom) {\r\n\t\t\tanchor = \"start\";\r\n\t\t} else {\r\n\t\t\tanchor = position.isMiddle ? \"middle\" : \"end\";\r\n\t\t}\r\n\t\treturn anchor;\r\n\t}\r\n\r\n\txForXAxisLabel() {\r\n\t\treturn this.xForAxisLabel(!this.owner.config.axis_rotated, this.getXAxisLabelPosition());\r\n\t}\r\n\r\n\txForYAxisLabel() {\r\n\t\treturn this.xForAxisLabel(this.owner.config.axis_rotated, this.getYAxisLabelPosition());\r\n\t}\r\n\r\n\txForY2AxisLabel() {\r\n\t\treturn this.xForAxisLabel(this.owner.config.axis_rotated, this.getY2AxisLabelPosition());\r\n\t}\r\n\r\n\tdxForXAxisLabel() {\r\n\t\treturn this.dxForAxisLabel(!this.owner.config.axis_rotated, this.getXAxisLabelPosition());\r\n\t}\r\n\r\n\tdxForYAxisLabel() {\r\n\t\treturn this.dxForAxisLabel(this.owner.config.axis_rotated, this.getYAxisLabelPosition());\r\n\t}\r\n\r\n\tdxForY2AxisLabel() {\r\n\t\treturn this.dxForAxisLabel(this.owner.config.axis_rotated, this.getY2AxisLabelPosition());\r\n\t}\r\n\r\n\tdyForXAxisLabel() {\r\n\t\tconst $$ = this.owner;\r\n\t\tconst config = $$.config;\r\n\t\tconst position = this.getXAxisLabelPosition();\r\n\r\n\t\tif (config.axis_rotated) {\r\n\t\t\treturn position.isInner ? \"1.2em\" : -25 - this.getMaxTickWidth(\"x\");\r\n\t\t} else if (position.isInner) {\r\n\t\t\treturn \"-0.5em\";\r\n\t\t} else if (config.axis_x_height) {\r\n\t\t\treturn config.axis_x_height - 10;\r\n\t\t} else {\r\n\t\t\treturn \"3em\";\r\n\t\t}\r\n\t}\r\n\r\n\tdyForYAxisLabel() {\r\n\t\tconst $$ = this.owner;\r\n\t\tconst position = this.getYAxisLabelPosition();\r\n\r\n\t\tif ($$.config.axis_rotated) {\r\n\t\t\treturn position.isInner ? \"-0.5em\" : \"3em\";\r\n\t\t} else {\r\n\t\t\treturn position.isInner ? \"1.2em\" : -10 - ($$.config.axis_y_inner ? 0 : (this.getMaxTickWidth(\"y\") + 10));\r\n\t\t}\r\n\t}\r\n\r\n\tdyForY2AxisLabel() {\r\n\t\tconst $$ = this.owner;\r\n\t\tconst position = this.getY2AxisLabelPosition();\r\n\r\n\t\tif ($$.config.axis_rotated) {\r\n\t\t\treturn position.isInner ? \"1.2em\" : \"-2.2em\";\r\n\t\t} else {\r\n\t\t\treturn position.isInner ? \"-0.5em\" : 15 + ($$.config.axis_y2_inner ? 0 : (this.getMaxTickWidth(\"y2\") + 15));\r\n\t\t}\r\n\t}\r\n\r\n\ttextAnchorForXAxisLabel() {\r\n\t\tconst $$ = this.owner;\r\n\r\n\t\treturn this.textAnchorForAxisLabel(!$$.config.axis_rotated, this.getXAxisLabelPosition());\r\n\t}\r\n\r\n\ttextAnchorForYAxisLabel() {\r\n\t\tconst $$ = this.owner;\r\n\r\n\t\treturn this.textAnchorForAxisLabel($$.config.axis_rotated, this.getYAxisLabelPosition());\r\n\t}\r\n\r\n\ttextAnchorForY2AxisLabel() {\r\n\t\tconst $$ = this.owner;\r\n\r\n\t\treturn this.textAnchorForAxisLabel($$.config.axis_rotated, this.getY2AxisLabelPosition());\r\n\t}\r\n\r\n\tgetMaxTickWidth(id, withoutRecompute) {\r\n\t\tconst $$ = this.owner;\r\n\t\tconst config = $$.config;\r\n\t\tlet maxWidth = 0;\r\n\t\tlet dummy;\r\n\t\tlet svg;\r\n\r\n\t\tif (withoutRecompute && $$.currentMaxTickWidths[id]) {\r\n\t\t\treturn $$.currentMaxTickWidths[id];\r\n\t\t}\r\n\r\n\t\tif ($$.svg) {\r\n\t\t\tconst targetsToShow = $$.filterTargetsToShow($$.data.targets);\r\n\t\t\tlet scale;\r\n\t\t\tlet axis;\r\n\r\n\t\t\tif (id === \"y\") {\r\n\t\t\t\tscale = $$.y.copy().domain($$.getYDomain(targetsToShow, \"y\"));\r\n\t\t\t\taxis = this.getYAxis(\r\n\t\t\t\t\tscale,\r\n\t\t\t\t\t$$.yOrient,\r\n\t\t\t\t\tconfig.axis_y_tick_format,\r\n\t\t\t\t\t$$.yAxisTickValues,\r\n\t\t\t\t\tfalse,\r\n\t\t\t\t\ttrue,\r\n\t\t\t\t\ttrue\r\n\t\t\t\t);\r\n\t\t\t} else if (id === \"y2\") {\r\n\t\t\t\tscale = $$.y2.copy().domain($$.getYDomain(targetsToShow, \"y2\"));\r\n\t\t\t\taxis = this.getYAxis(\r\n\t\t\t\t\tscale,\r\n\t\t\t\t\t$$.y2Orient,\r\n\t\t\t\t\tconfig.axis_y2_tick_format,\r\n\t\t\t\t\t$$.y2AxisTickValues,\r\n\t\t\t\t\tfalse,\r\n\t\t\t\t\ttrue,\r\n\t\t\t\t\ttrue\r\n\t\t\t\t);\r\n\t\t\t} else {\r\n\t\t\t\tscale = $$.x.copy().domain($$.getXDomain(targetsToShow));\r\n\t\t\t\taxis = this.getXAxis(\r\n\t\t\t\t\tscale,\r\n\t\t\t\t\t$$.xOrient,\r\n\t\t\t\t\t$$.xAxisTickFormat,\r\n\t\t\t\t\t$$.xAxisTickValues,\r\n\t\t\t\t\tfalse,\r\n\t\t\t\t\ttrue,\r\n\t\t\t\t\ttrue\r\n\t\t\t\t);\r\n\t\t\t\tthis.updateXAxisTickValues(targetsToShow, axis);\r\n\t\t\t}\r\n\r\n\t\t\tdummy = d3Select(\"body\")\r\n\t\t\t\t.append(\"div\")\r\n\t\t\t\t.classed(\"bb\", true);\r\n\r\n\t\t\tsvg = dummy.append(\"svg\")\r\n\t\t\t\t.style(\"visibility\", \"hidden\")\r\n\t\t\t\t.style(\"position\", \"fixed\")\r\n\t\t\t\t.style(\"top\", \"0px\")\r\n\t\t\t\t.style(\"left\", \"0px\");\r\n\r\n\r\n\t\t\tsvg.append(\"g\").call(axis)\r\n\t\t\t\t.each(function() {\r\n\t\t\t\t\td3Select(this).selectAll(\"text\")\r\n\t\t\t\t\t\t.each(function() {\r\n\t\t\t\t\t\t\tconst box = this.getBoundingClientRect();\r\n\r\n\t\t\t\t\t\t\tif (maxWidth < box.width) { maxWidth = box.width; }\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\tdummy.remove();\r\n\t\t\t\t});\r\n\t\t}\r\n\t\t$$.currentMaxTickWidths[id] = maxWidth <= 0 ? $$.currentMaxTickWidths[id] : maxWidth;\r\n\t\treturn $$.currentMaxTickWidths[id];\r\n\t}\r\n\r\n\tupdateLabels(withTransition) {\r\n\t\tconst $$ = this.owner;\r\n\t\tconst axisXLabel = $$.main.select(`.${CLASS.axisX} .${CLASS.axisXLabel}`);\r\n\t\tconst axisYLabel = $$.main.select(`.${CLASS.axisY} .${CLASS.axisYLabel}`);\r\n\t\tconst axisY2Label = $$.main.select(`.${CLASS.axisY2} .${CLASS.axisY2Label}`);\r\n\r\n\t\t(withTransition ? axisXLabel.transition() : axisXLabel)\r\n\t\t\t.attr(\"x\", this.xForXAxisLabel.bind(this))\r\n\t\t\t.attr(\"dx\", this.dxForXAxisLabel.bind(this))\r\n\t\t\t.attr(\"dy\", this.dyForXAxisLabel.bind(this))\r\n\t\t\t.text(this.textForXAxisLabel.bind(this));\r\n\r\n\t\t(withTransition ? axisYLabel.transition() : axisYLabel)\r\n\t\t\t.attr(\"x\", this.xForYAxisLabel.bind(this))\r\n\t\t\t.attr(\"dx\", this.dxForYAxisLabel.bind(this))\r\n\t\t\t.attr(\"dy\", this.dyForYAxisLabel.bind(this))\r\n\t\t\t.text(this.textForYAxisLabel.bind(this));\r\n\r\n\t\t(withTransition ? axisY2Label.transition() : axisY2Label)\r\n\t\t\t.attr(\"x\", this.xForY2AxisLabel.bind(this))\r\n\t\t\t.attr(\"dx\", this.dxForY2AxisLabel.bind(this))\r\n\t\t\t.attr(\"dy\", this.dyForY2AxisLabel.bind(this))\r\n\t\t\t.text(this.textForY2AxisLabel.bind(this));\r\n\t}\r\n\r\n\tgetPadding(padding, key, defaultValue, domainLength) {\r\n\t\tconst p = typeof padding === \"number\" ? padding : padding[key];\r\n\r\n\t\tif (!isValue(p)) {\r\n\t\t\treturn defaultValue;\r\n\t\t}\r\n\t\tif (padding.unit === \"ratio\") {\r\n\t\t\treturn padding[key] * domainLength;\r\n\t\t}\r\n\t\t// assume padding is pixels if unit is not specified\r\n\t\treturn this.convertPixelsToAxisPadding(p, domainLength);\r\n\t}\r\n\r\n\tconvertPixelsToAxisPadding(pixels, domainLength) {\r\n\t\tconst $$ = this.owner;\r\n\t\tconst length = $$.config.axis_rotated ? $$.width : $$.height;\r\n\r\n\t\treturn domainLength * (pixels / length);\r\n\t}\r\n\r\n\tgenerateTickValues(values, tickCount, forTimeSeries) {\r\n\t\tlet tickValues = values;\r\n\t\tlet start;\r\n\t\tlet end;\r\n\t\tlet count;\r\n\t\tlet interval;\r\n\t\tlet i;\r\n\t\tlet tickValue;\r\n\r\n\t\tif (tickCount) {\r\n\t\t\tconst targetCount = isFunction(tickCount) ? tickCount() : tickCount;\r\n\r\n\t\t\t// compute ticks according to tickCount\r\n\t\t\tif (targetCount === 1) {\r\n\t\t\t\ttickValues = [values[0]];\r\n\t\t\t} else if (targetCount === 2) {\r\n\t\t\t\ttickValues = [values[0], values[values.length - 1]];\r\n\t\t\t} else if (targetCount > 2) {\r\n\t\t\t\tcount = targetCount - 2;\r\n\t\t\t\tstart = values[0];\r\n\t\t\t\tend = values[values.length - 1];\r\n\t\t\t\tinterval = (end - start) / (count + 1);\r\n\t\t\t\t// re-construct unique values\r\n\t\t\t\ttickValues = [start];\r\n\r\n\t\t\t\tfor (i = 0; i < count; i++) {\r\n\t\t\t\t\ttickValue = +start + interval * (i + 1);\r\n\t\t\t\t\ttickValues.push(forTimeSeries ? new Date(tickValue) : tickValue);\r\n\t\t\t\t}\r\n\t\t\t\ttickValues.push(end);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (!forTimeSeries) {\r\n\t\t\ttickValues = tickValues.sort((a, b) => a - b);\r\n\t\t}\r\n\r\n\t\treturn tickValues;\r\n\t}\r\n\r\n\tgenerateTransitions(duration) {\r\n\t\tconst $$ = this.owner;\r\n\t\tconst axes = $$.axes;\r\n\r\n\t\treturn {\r\n\t\t\taxisX: duration ? axes.x.transition().duration(duration) : axes.x,\r\n\t\t\taxisY: duration ? axes.y.transition().duration(duration) : axes.y,\r\n\t\t\taxisY2: duration ? axes.y2.transition().duration(duration) : axes.y2,\r\n\t\t\taxisSubX: duration ? axes.subx.transition().duration(duration) : axes.subx,\r\n\t\t};\r\n\t}\r\n\r\n\tredraw(transitions, isHidden) {\r\n\t\tconst $$ = this.owner;\r\n\r\n\t\t$$.axes.x.style(\"opacity\", isHidden ? \"0\" : \"1\");\r\n\t\t$$.axes.y.style(\"opacity\", isHidden ? \"0\" : \"1\");\r\n\t\t$$.axes.y2.style(\"opacity\", isHidden ? \"0\" : \"1\");\r\n\t\t$$.axes.subx.style(\"opacity\", isHidden ? \"0\" : \"1\");\r\n\r\n\t\ttransitions.axisX.call($$.xAxis);\r\n\t\ttransitions.axisY.call($$.yAxis);\r\n\t\ttransitions.axisY2.call($$.y2Axis);\r\n\t\ttransitions.axisSubX.call($$.subXAxis);\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// src/axis/Axis.js","/**\r\n * Copyright (c) 2017 NAVER Corp.\r\n * billboard.js project is licensed under the MIT license\r\n */\r\nimport {\r\n\tscaleLinear as d3ScaleLinear,\r\n\tselect as d3Select\r\n} from \"d3\";\r\n\r\n// Features:\r\n// 1. category axis\r\n// 2. ceil values of translate/x/y to int for half pixel antialiasing\r\n// 3. multiline tick text\r\nlet tickTextCharSize;\r\n\r\nexport default function(params = {}) {\r\n\tlet scale = d3ScaleLinear();\r\n\tlet orient = \"bottom\";\r\n\tconst innerTickSize = 6;\r\n\tconst outerTickSize = params.withOuterTick ? 6 : 0;\r\n\tconst tickPadding = 3;\r\n\tlet tickValues = null;\r\n\tlet tickFormat;\r\n\tlet tickArguments;\r\n\tlet tickOffset = 0;\r\n\tlet tickCulling = true;\r\n\tlet tickCentered;\r\n\tlet transition;\r\n\r\n\tfunction axisX(selection, x) {\r\n\t\tselection.attr(\"transform\", d => `translate(${Math.ceil(x(d) + tickOffset)}, 0)`);\r\n\t}\r\n\r\n\tfunction axisY(selection, y) {\r\n\t\tselection.attr(\"transform\", d => `translate(0,${Math.ceil(y(d))})`);\r\n\t}\r\n\r\n\tfunction scaleExtent(domain) {\r\n\t\tconst start = domain[0];\r\n\t\tconst stop = domain[domain.length - 1];\r\n\r\n\t\treturn start < stop ? [start, stop] : [stop, start];\r\n\t}\r\n\r\n\tfunction generateTicks(scale) {\r\n\t\tconst ticks = [];\r\n\r\n\t\tif (scale.ticks) {\r\n\t\t\treturn scale.ticks(\r\n\t\t\t\t...(tickArguments ? Array.prototype.slice.call(tickArguments) : [])\r\n\t\t\t).map(v => (\r\n\t\t\t\t// round the tick value if is number\r\n\t\t\t\t/(string|number)/.test(typeof v) && !isNaN(v) ?\r\n\t\t\t\t\tMath.round(v * 10) / 10 : v\r\n\t\t\t));\r\n\t\t}\r\n\r\n\t\tconst domain = scale.domain();\r\n\r\n\t\tfor (let i = Math.ceil(domain[0]); i < domain[1]; i++) {\r\n\t\t\tticks.push(i);\r\n\t\t}\r\n\r\n\t\tif (ticks.length > 0 && ticks[0] > 0) {\r\n\t\t\tticks.unshift(ticks[0] - (ticks[1] - ticks[0]));\r\n\t\t}\r\n\r\n\t\treturn ticks;\r\n\t}\r\n\r\n\tfunction copyScale() {\r\n\t\tconst newScale = scale.copy();\r\n\r\n\t\tif (params.isCategory || !newScale.domain().length) {\r\n\t\t\tconst domain = scale.domain();\r\n\r\n\t\t\tnewScale.domain([domain[0], domain[1] - 1]);\r\n\t\t}\r\n\r\n\t\treturn newScale;\r\n\t}\r\n\r\n\tfunction textFormatted(v) {\r\n\t\tconst formatted = tickFormat ? tickFormat(v) : v;\r\n\r\n\t\treturn typeof formatted !== \"undefined\" ? formatted : \"\";\r\n\t}\r\n\r\n\tfunction getSizeFor1Char(tick) {\r\n\t\tif (tickTextCharSize) {\r\n\t\t\treturn tickTextCharSize;\r\n\t\t}\r\n\t\tconst size = {\r\n\t\t\th: 11.5,\r\n\t\t\tw: 5.5,\r\n\t\t};\r\n\r\n\t\ttick.select(\"text\")\r\n\t\t\t.text(textFormatted)\r\n\t\t\t.each(function(d) {\r\n\t\t\t\tconst box = this.getBoundingClientRect();\r\n\t\t\t\tconst text = textFormatted(d);\r\n\t\t\t\tconst h = box.height;\r\n\t\t\t\tconst w = text ? (box.width / text.length) : undefined;\r\n\r\n\t\t\t\tif (h && w) {\r\n\t\t\t\t\tsize.h = h;\r\n\t\t\t\t\tsize.w = w;\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t\t.text(\"\");\r\n\r\n\t\ttickTextCharSize = size;\r\n\r\n\t\treturn size;\r\n\t}\r\n\r\n\tfunction transitionise(selection) {\r\n\t\treturn params.withoutTransition ?\r\n\t\t\tselection : selection.transition(transition);\r\n\t}\r\n\r\n\tfunction axis(g) {\r\n\t\tg.each(function() {\r\n\t\t\tconst g = d3Select(this);\r\n\r\n\t\t\taxis.g = g;\r\n\r\n\t\t\tlet scale0 = this.__chart__ || scale;\r\n\t\t\tlet scale1 = copyScale();\r\n\r\n\t\t\tthis.__chart__ = scale1;\r\n\r\n\t\t\t// count of tick data in array\r\n\t\t\tconst ticks = tickValues || generateTicks(scale1);\r\n\r\n\t\t\t// update selection\r\n\t\t\tlet tick = g.selectAll(\".tick\")\r\n\t\t\t\t.data(ticks, scale1);\r\n\r\n\t\t\t// enter selection\r\n\t\t\tconst tickEnter = tick\r\n\t\t\t\t.enter()\r\n\t\t\t\t.insert(\"g\", \".domain\")\r\n\t\t\t\t.attr(\"class\", \"tick\")\r\n\t\t\t\t.style(\"opacity\", \"1\");\r\n\r\n\t\t\t// MEMO: No exit transition. The reason is this transition affects max tick width calculation because old tick will be included in the ticks.\r\n\t\t\tconst tickExit = tick.exit().remove();\r\n\r\n\t\t\t// enter + update selection\r\n\t\t\ttick = tickEnter.merge(tick);\r\n\r\n\t\t\tconst tickUpdate = transitionise(tick).style(\"opacity\", \"1\");\r\n\t\t\tlet tickTransform;\r\n\t\t\tlet tickX;\r\n\t\t\tlet tickY;\r\n\r\n\t\t\tconst range = scale.rangeExtent ? scale.rangeExtent() : scaleExtent(scale.range());\r\n\r\n\t\t\t// update selection - data join\r\n\t\t\tconst path = g.selectAll(\".domain\").data([0]);\r\n\r\n\t\t\t// enter + update selection\r\n\t\t\tconst pathUpdate = path.enter()\r\n\t\t\t\t.append(\"path\")\r\n\t\t\t\t.attr(\"class\", \"domain\")\r\n\t\t\t\t.merge(transitionise(path));\r\n\r\n\t\t\ttickEnter.append(\"line\");\r\n\t\t\ttickEnter.append(\"text\");\r\n\r\n\t\t\tconst lineEnter = tickEnter.select(\"line\");\r\n\t\t\tconst lineUpdate = tickUpdate.select(\"line\");\r\n\t\t\tconst textEnter = tickEnter.select(\"text\");\r\n\t\t\tconst textUpdate = tickUpdate.select(\"text\");\r\n\r\n\t\t\tif (params.isCategory) {\r\n\t\t\t\ttickOffset = Math.ceil((scale1(1) - scale1(0)) / 2);\r\n\t\t\t\ttickX = tickCentered ? 0 : tickOffset;\r\n\t\t\t\ttickY = tickCentered ? tickOffset : 0;\r\n\t\t\t} else {\r\n\t\t\t\ttickX = 0;\r\n\t\t\t\ttickOffset = tickX;\r\n\t\t\t}\r\n\r\n\t\t\tlet tspan;\r\n\t\t\tconst sizeFor1Char = getSizeFor1Char(g.select(\".tick\"));\r\n\t\t\tconst counts = [];\r\n\t\t\tconst tickLength = Math.max(innerTickSize, 0) + tickPadding;\r\n\t\t\tconst isVertical = orient === \"left\" || orient === \"right\";\r\n\r\n\t\t\t// this should be called only when category axis\r\n\t\t\tfunction splitTickText(d, maxWidthValue) {\r\n\t\t\t\tconst tickText = textFormatted(d);\r\n\t\t\t\tconst splitted = [];\r\n\t\t\t\tlet maxWidth = maxWidthValue;\r\n\t\t\t\tlet subtext;\r\n\t\t\t\tlet spaceIndex;\r\n\t\t\t\tlet textWidth;\r\n\r\n\t\t\t\tif (Object.prototype.toString.call(tickText) === \"[object Array]\") {\r\n\t\t\t\t\treturn tickText;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (!maxWidth || maxWidth <= 0) {\r\n\t\t\t\t\tmaxWidth = isVertical ?\r\n\t\t\t\t\t\t95 : params.isCategory ?\r\n\t\t\t\t\t\t\t(Math.ceil(scale1(ticks[1]) - scale1(ticks[0])) - 12) : 110;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction split(splitted, text) {\r\n\t\t\t\t\tspaceIndex = undefined;\r\n\t\t\t\t\tfor (let i = 1; i < text.length; i++) {\r\n\t\t\t\t\t\tif (text.charAt(i) === \" \") {\r\n\t\t\t\t\t\t\tspaceIndex = i;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tsubtext = text.substr(0, i + 1);\r\n\t\t\t\t\t\ttextWidth = sizeFor1Char.w * subtext.length;\r\n\r\n\t\t\t\t\t\t// if text width gets over tick width, split by space index or crrent index\r\n\t\t\t\t\t\tif (maxWidth < textWidth) {\r\n\t\t\t\t\t\t\treturn split(\r\n\t\t\t\t\t\t\t\tsplitted.concat(text.substr(0, spaceIndex || i)),\r\n\t\t\t\t\t\t\t\ttext.slice(spaceIndex ? spaceIndex + 1 : i)\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\treturn splitted.concat(text);\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn split(splitted, String(tickText));\r\n\t\t\t}\r\n\r\n\t\t\tfunction tspanDy(d, i) {\r\n\t\t\t\tlet dy = sizeFor1Char.h;\r\n\r\n\t\t\t\tif (i === 0) {\r\n\t\t\t\t\tdy = (orient === \"left\" || orient === \"right\") ?\r\n\t\t\t\t\t\t-((counts[d.index] - 1) * (sizeFor1Char.h / 2) - 3) :\r\n\t\t\t\t\t\t\".71em\";\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn dy;\r\n\t\t\t}\r\n\r\n\t\t\tfunction tickSize(d) {\r\n\t\t\t\tconst tickPosition = scale(d) + (tickCentered ? 0 : tickOffset);\r\n\r\n\t\t\t\treturn range[0] < tickPosition && tickPosition < range[1] ?\r\n\t\t\t\t\tinnerTickSize : 0;\r\n\t\t\t}\r\n\r\n\t\t\tconst text = tick.select(\"text\");\r\n\r\n\t\t\ttspan = text.selectAll(\"tspan\")\r\n\t\t\t\t.data((d, i) => {\r\n\t\t\t\t\tconst splitted = params.tickMultiline ?\r\n\t\t\t\t\t\tsplitTickText(d, params.tickWidth) : [].concat(textFormatted(d));\r\n\r\n\t\t\t\t\tcounts[i] = splitted.length;\r\n\r\n\t\t\t\t\treturn splitted.map(s => ({\r\n\t\t\t\t\t\tindex: i,\r\n\t\t\t\t\t\tsplitted: s,\r\n\t\t\t\t\t}));\r\n\t\t\t\t});\r\n\r\n\t\t\ttspan.exit().remove();\r\n\r\n\t\t\ttspan = tspan\r\n\t\t\t\t.enter()\r\n\t\t\t\t.append(\"tspan\")\r\n\t\t\t\t.merge(tspan)\r\n\t\t\t\t.text(d => d.splitted);\r\n\r\n\t\t\tconst rotate = params.tickTextRotate;\r\n\r\n\t\t\tfunction textAnchorForText(r) {\r\n\t\t\t\tif (!r) {\r\n\t\t\t\t\treturn \"middle\";\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn r > 0 ? \"start\" : \"end\";\r\n\t\t\t}\r\n\r\n\t\t\tfunction textTransform(r) {\r\n\t\t\t\treturn r ? `rotate(${r})` : \"\";\r\n\t\t\t}\r\n\r\n\t\t\tfunction dxForText(r) {\r\n\t\t\t\tif (!r) {\r\n\t\t\t\t\treturn 0;\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn 8 * Math.sin(Math.PI * (r / 180));\r\n\t\t\t}\r\n\r\n\t\t\tfunction yForText(r) {\r\n\t\t\t\tif (!r) {\r\n\t\t\t\t\treturn tickLength;\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn 11.5 - 2.5 * (r / 15) * (r > 0 ? 1 : -1);\r\n\t\t\t}\r\n\r\n\t\t\tswitch (orient) {\r\n\t\t\t\tcase \"bottom\":\r\n\t\t\t\t\ttickTransform = axisX;\r\n\t\t\t\t\tlineEnter.attr(\"y2\", innerTickSize);\r\n\t\t\t\t\ttextEnter.attr(\"y\", tickLength);\r\n\r\n\t\t\t\t\tlineUpdate.attr(\"x1\", tickX)\r\n\t\t\t\t\t\t.attr(\"x2\", tickX)\r\n\t\t\t\t\t\t.attr(\"y2\", tickSize);\r\n\r\n\t\t\t\t\ttextUpdate.attr(\"x\", 0)\r\n\t\t\t\t\t\t.attr(\"y\", yForText(rotate))\r\n\t\t\t\t\t\t.style(\"text-anchor\", textAnchorForText(rotate))\r\n\t\t\t\t\t\t.attr(\"transform\", textTransform(rotate));\r\n\r\n\t\t\t\t\ttspan.attr(\"x\", 0)\r\n\t\t\t\t\t\t.attr(\"dy\", tspanDy)\r\n\t\t\t\t\t\t.attr(\"dx\", dxForText(rotate));\r\n\r\n\t\t\t\t\tpathUpdate.attr(\"d\", `M${range[0]},${outerTickSize}V0H${range[1]}V${outerTickSize}`);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"top\":\r\n\t\t\t\t\t// @TODO: rotated tick text\r\n\t\t\t\t\ttickTransform = axisX;\r\n\t\t\t\t\tlineEnter.attr(\"y2\", -innerTickSize);\r\n\t\t\t\t\ttextEnter.attr(\"y\", -tickLength);\r\n\r\n\t\t\t\t\tlineUpdate\r\n\t\t\t\t\t\t.attr(\"x2\", 0)\r\n\t\t\t\t\t\t.attr(\"y2\", -innerTickSize);\r\n\r\n\t\t\t\t\ttextUpdate\r\n\t\t\t\t\t\t.attr(\"x\", 0)\r\n\t\t\t\t\t\t.attr(\"y\", -tickLength);\r\n\r\n\t\t\t\t\ttext.style(\"text-anchor\", \"middle\");\r\n\r\n\t\t\t\t\ttspan\r\n\t\t\t\t\t\t.attr(\"x\", 0)\r\n\t\t\t\t\t\t.attr(\"dy\", \"0em\");\r\n\r\n\t\t\t\t\tpathUpdate.attr(\"d\", `M${range[0]},${-outerTickSize}V0H${range[1]}V${-outerTickSize}`);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"left\":\r\n\t\t\t\t\ttickTransform = axisY;\r\n\t\t\t\t\tlineEnter.attr(\"x2\", -innerTickSize);\r\n\t\t\t\t\ttextEnter.attr(\"x\", -tickLength);\r\n\r\n\t\t\t\t\tlineUpdate.attr(\"x2\", -innerTickSize)\r\n\t\t\t\t\t\t.attr(\"y1\", tickY)\r\n\t\t\t\t\t\t.attr(\"y2\", tickY);\r\n\r\n\t\t\t\t\ttextUpdate\r\n\t\t\t\t\t\t.attr(\"x\", -tickLength)\r\n\t\t\t\t\t\t.attr(\"y\", tickOffset);\r\n\r\n\t\t\t\t\ttext.style(\"text-anchor\", \"end\");\r\n\r\n\t\t\t\t\ttspan\r\n\t\t\t\t\t\t.attr(\"x\", -tickLength)\r\n\t\t\t\t\t\t.attr(\"dy\", tspanDy);\r\n\r\n\t\t\t\t\tpathUpdate.attr(\"d\", `M${-outerTickSize},${range[0]}H0V${range[1]}H${-outerTickSize}`);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"right\":\r\n\t\t\t\t\ttickTransform = axisY;\r\n\t\t\t\t\tlineEnter.attr(\"x2\", innerTickSize);\r\n\t\t\t\t\ttextEnter.attr(\"x\", tickLength);\r\n\r\n\t\t\t\t\tlineUpdate\r\n\t\t\t\t\t\t.attr(\"x2\", innerTickSize)\r\n\t\t\t\t\t\t.attr(\"y2\", 0);\r\n\r\n\t\t\t\t\ttextUpdate\r\n\t\t\t\t\t\t.attr(\"x\", tickLength)\r\n\t\t\t\t\t\t.attr(\"y\", 0);\r\n\r\n\t\t\t\t\ttext.style(\"text-anchor\", \"start\");\r\n\r\n\t\t\t\t\ttspan\r\n\t\t\t\t\t\t.attr(\"x\", tickLength)\r\n\t\t\t\t\t\t.attr(\"dy\", tspanDy);\r\n\r\n\t\t\t\t\tpathUpdate.attr(\"d\", `M${outerTickSize},${range[0]}H0V${range[1]}H${outerTickSize}`);\r\n\t\t\t}\r\n\r\n\t\t\tif (scale1.bandwidth) {\r\n\t\t\t\tconst x = scale1;\r\n\t\t\t\tconst dx = x.bandwidth() / 2;\r\n\r\n\t\t\t\tscale0 = function(d) {\r\n\t\t\t\t\treturn x(d) + dx;\r\n\t\t\t\t};\r\n\t\t\t\tscale1 = scale0;\r\n\t\t\t} else if (scale0.bandwidth) {\r\n\t\t\t\tscale0 = scale1;\r\n\t\t\t} else {\r\n\t\t\t\ttickExit.call(tickTransform, scale1);\r\n\t\t\t}\r\n\r\n\t\t\ttickEnter.call(tickTransform, scale0);\r\n\t\t\ttickUpdate.call(tickTransform, scale1);\r\n\t\t});\r\n\t}\r\n\r\n\taxis.scale = function(x) {\r\n\t\tif (!arguments.length) {\r\n\t\t\treturn scale;\r\n\t\t}\r\n\r\n\t\tscale = x;\r\n\r\n\t\treturn axis;\r\n\t};\r\n\r\n\taxis.orient = function(x) {\r\n\t\tif (!arguments.length) {\r\n\t\t\treturn orient;\r\n\t\t}\r\n\r\n\t\torient = x in {\r\n\t\t\ttop: 1,\r\n\t\t\tright: 1,\r\n\t\t\tbottom: 1,\r\n\t\t\tleft: 1\r\n\t\t} ? String(x) : \"bottom\";\r\n\r\n\t\treturn axis;\r\n\t};\r\n\r\n\taxis.tickFormat = function(format) {\r\n\t\tif (!arguments.length) {\r\n\t\t\treturn tickFormat;\r\n\t\t}\r\n\r\n\t\ttickFormat = format;\r\n\r\n\t\treturn axis;\r\n\t};\r\n\r\n\taxis.tickCentered = function(isCentered) {\r\n\t\tif (!arguments.length) {\r\n\t\t\treturn tickCentered;\r\n\t\t}\r\n\r\n\t\ttickCentered = isCentered;\r\n\r\n\t\treturn axis;\r\n\t};\r\n\r\n\taxis.tickOffset = function() {\r\n\t\treturn tickOffset;\r\n\t};\r\n\r\n\taxis.tickInterval = function() {\r\n\t\tlet interval;\r\n\r\n\t\tif (params.isCategory) {\r\n\t\t\tinterval = tickOffset * 2;\r\n\t\t} else {\r\n\t\t\tconst length = axis.g.select(\"path.domain\")\r\n\t\t\t\t.node()\r\n\t\t\t\t.getTotalLength() - outerTickSize * 2;\r\n\r\n\t\t\tinterval = length / axis.g.selectAll(\"line\").size();\r\n\t\t}\r\n\r\n\t\treturn interval === Infinity ? 0 : interval;\r\n\t};\r\n\r\n\taxis.ticks = function(...args) {\r\n\t\tif (!args.length) {\r\n\t\t\treturn tickArguments;\r\n\t\t}\r\n\r\n\t\ttickArguments = Array.prototype.slice.call(args);\r\n\r\n\t\treturn axis;\r\n\t};\r\n\r\n\taxis.tickCulling = function(culling) {\r\n\t\tif (!arguments.length) {\r\n\t\t\treturn tickCulling;\r\n\t\t}\r\n\r\n\t\ttickCulling = culling;\r\n\r\n\t\treturn axis;\r\n\t};\r\n\r\n\taxis.tickValues = function(x) {\r\n\t\tif (typeof x === \"function\") {\r\n\t\t\ttickValues = function() {\r\n\t\t\t\treturn x(scale.domain());\r\n\t\t\t};\r\n\t\t} else {\r\n\t\t\tif (!arguments.length) {\r\n\t\t\t\treturn tickValues;\r\n\t\t\t}\r\n\r\n\t\t\ttickValues = x;\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t};\r\n\r\n\taxis.setTransition = function(t) {\r\n\t\ttransition = t;\r\n\t\treturn this;\r\n\t};\r\n\r\n\treturn axis;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// src/axis/bb.axis.js","/**\r\n * Copyright (c) 2017 NAVER Corp.\r\n * billboard.js project is licensed under the MIT license\r\n */\r\nimport Chart from \"../internals/Chart\";\r\nimport {isValue, isDefined, extend} from \"../internals/util\";\r\n\r\n/**\r\n * Set the min/max value\r\n * @param $$\r\n * @param type\r\n * @param value\r\n * @return {undefined}\r\n */\r\nconst setMinMax = ($$, type, value) => {\r\n\tconst config = $$.config;\r\n\tconst axisX = `axis_x_${type}`;\r\n\tconst axisY = `axis_y_${type}`;\r\n\tconst axisY2 = `axis_y2_${type}`;\r\n\r\n\tif (typeof value !== \"undefined\") {\r\n\t\tif (typeof value === \"object\") {\r\n\t\t\tif (isValue(value.x)) { config[axisX] = value.x; }\r\n\t\t\tif (isValue(value.y)) { config[axisY] = value.y; }\r\n\t\t\tif (isValue(value.y2)) { config[axisY2] = value.y2; }\r\n\t\t} else {\r\n\t\t\tconfig[axisY] = value;\r\n\t\t\tconfig[axisY2] = value;\r\n\t\t}\r\n\r\n\t\t$$.redraw({\r\n\t\t\twithUpdateOrgXDomain: true,\r\n\t\t\twithUpdateXDomain: true\r\n\t\t});\r\n\t}\r\n\r\n\treturn undefined;\r\n};\r\n\r\n/**\r\n * Get the min/max value\r\n * @param $$\r\n * @param type\r\n * @return {{x, y, y2}}\r\n */\r\nconst getMinMax = ($$, type) => {\r\n\tconst config = $$.config;\r\n\tconst axisX = `axis_x_${type}`;\r\n\tconst axisY = `axis_y_${type}`;\r\n\tconst axisY2 = `axis_y2_${type}`;\r\n\r\n\treturn {\r\n\t\tx: config[axisX],\r\n\t\ty: config[axisY],\r\n\t\ty2: config[axisY2]\r\n\t};\r\n};\r\n\r\n/**\r\n * Define axis\r\n */\r\nconst axis = function() {};\r\n\r\n/**\r\n * Get and set axis labels.\r\n * @method axis:labels\r\n * @instance\r\n * @memberof Chart\r\n * @param {Object} labels specified axis' label to be updated.\r\n * @example\r\n * // Update axis' label\r\n * chart.axis.labels({\r\n * x: \"New X Axis Label\",\r\n * y: \"New Y Axis Label\"\r\n * });\r\n */\r\naxis.labels = function(labels) {\r\n\tconst $$ = this.internal;\r\n\r\n\tif (arguments.length) {\r\n\t\tObject.keys(labels).forEach(axisId => {\r\n\t\t\t$$.axis.setLabelText(axisId, labels[axisId]);\r\n\t\t});\r\n\r\n\t\t$$.axis.updateLabels();\r\n\t}\r\n};\r\n\r\n/**\r\n * Get and set axis min value.\r\n * @method axis:min\r\n * @instance\r\n * @memberof Chart\r\n * @param {Object} min If min is given, specified axis' min value will be updated. If no argument is given, the current min values for each axis will be returned.\r\n * @example\r\n * // Update axis' min\r\n * chart.axis.min({\r\n * x: -10,\r\n * y: 1000,\r\n * y2: 100\r\n * });\r\n */\r\naxis.min = function(min) {\r\n\tif (arguments.length) {\r\n\t\treturn setMinMax(this.internal, \"min\", min);\r\n\t} else {\r\n\t\treturn getMinMax(this.internal, \"min\");\r\n\t}\r\n};\r\n\r\n/**\r\n * Get and set axis max value.\r\n * @method axis:max\r\n * @instance\r\n * @memberof Chart\r\n * @param {Object} max If max is given, specified axis' max value will be updated. If no argument is given, the current max values for each axis will be returned.\r\n * @example\r\n * // Update axis' label\r\n * chart.axis.max({\r\n * x: 100,\r\n * y: 1000,\r\n * y2: 10000\r\n * });\r\n */\r\naxis.max = function(max) {\r\n\tif (arguments.length) {\r\n\t\treturn setMinMax(this.internal, \"max\", max);\r\n\t} else {\r\n\t\treturn getMinMax(this.internal, \"max\");\r\n\t}\r\n};\r\n\r\n/**\r\n * Get and set axis min and max value.\r\n * @method axis:range\r\n * @instance\r\n * @memberof Chart\r\n * @param {Object} range If range is given, specified axis' min and max value will be updated. If no argument is given, the current min and max values for each axis will be returned.\r\n * @example\r\n * // Update axis' label\r\n * chart.axis.range({\r\n * min: {\r\n * x: -10,\r\n * y: -1000,\r\n * y2: -10000\r\n * },\r\n * max: {\r\n * x: 100,\r\n * y: 1000,\r\n * y2: 10000\r\n * },\r\n * });\r\n */\r\naxis.range = function(range) {\r\n\tif (arguments.length) {\r\n\t\tisDefined(range.max) && this.axis.max(range.max);\r\n\t\tisDefined(range.min) && this.axis.min(range.min);\r\n\t} else {\r\n\t\treturn {\r\n\t\t\tmax: this.axis.max(),\r\n\t\t\tmin: this.axis.min()\r\n\t\t};\r\n\t}\r\n\r\n\treturn undefined;\r\n};\r\n\r\nextend(Chart.prototype, {axis});\r\n\n\n\n// WEBPACK FOOTER //\n// src/api/api.axis.js","/**\r\n * Copyright (c) 2017 NAVER Corp.\r\n * billboard.js project is licensed under the MIT license\r\n */\r\nimport Chart from \"../internals/Chart\";\r\nimport {extend} from \"../internals/util\";\r\n\r\nextend(Chart.prototype, {\r\n\t/**\r\n\t * Set specified category name on category axis.\r\n\t * @method category\r\n\t * @instance\r\n\t * @memberof Chart\r\n\t * @param {Number} i index of category to be changed\r\n\t * @param {String} category category value to be changed\r\n\t * @example\r\n\t * chart.category(2, \"Category 3\");\r\n\t */\r\n\tcategory(i, category) {\r\n\t\tconst $$ = this.internal;\r\n\t\tconst config = $$.config;\r\n\r\n\t\tif (arguments.length > 1) {\r\n\t\t\tconfig.axis_x_categories[i] = category;\r\n\t\t\t$$.redraw();\r\n\t\t}\r\n\r\n\t\treturn config.axis_x_categories[i];\r\n\t},\r\n\r\n\t/**\r\n\t * Set category names on category axis.\r\n\t * @method categories\r\n\t * @instance\r\n\t * @memberof Chart\r\n\t * @param {Array} categories This must be an array that includes category names in string. If category names are included in the date by data.x option, this is not required.\r\n\t * @example\r\n\t * chart.categories([\r\n\t * \"Category 1\", \"Category 2\", ...\r\n\t * ]);\r\n\t */\r\n\tcategories(categories) {\r\n\t\tconst $$ = this.internal;\r\n\t\tconst config = $$.config;\r\n\r\n\t\tif (!arguments.length) {\r\n\t\t\treturn config.axis_x_categories;\r\n\t\t}\r\n\r\n\t\tconfig.axis_x_categories = categories;\r\n\t\t$$.redraw();\r\n\r\n\t\treturn config.axis_x_categories;\r\n\t}\r\n});\r\n\n\n\n// WEBPACK FOOTER //\n// src/api/api.category.js","/**\r\n * Copyright (c) 2017 NAVER Corp.\r\n * billboard.js project is licensed under the MIT license\r\n */\r\nimport Chart from \"../internals/Chart\";\r\nimport {window} from \"../internals/browser\";\r\nimport {removeEvent, extend} from \"../internals/util\";\r\n\r\nextend(Chart.prototype, {\r\n\t/**\r\n\t * Resize the chart.\r\n\t * @method resize\r\n\t * @instance\r\n\t * @memberof Chart\r\n\t * @param {Object} size This argument should include width and height in pixels.\r\n\t * @example\r\n\t * // Resize to 640x480\r\n\t * chart.resize({\r\n\t * width: 640,\r\n\t * height: 480\r\n\t * });\r\n\t */\r\n\tresize(size) {\r\n\t\tconst config = this.internal.config;\r\n\r\n\t\tconfig.size_width = size ? size.width : null;\r\n\t\tconfig.size_height = size ? size.height : null;\r\n\r\n\t\tthis.flush();\r\n\t},\r\n\r\n\t/**\r\n\t * Force to redraw.\r\n\t * @method flush\r\n\t * @instance\r\n\t * @memberof Chart\r\n\t * @example\r\n\t * chart.flush();\r\n\t */\r\n\tflush() {\r\n\t\tthis.internal.updateAndRedraw({\r\n\t\t\twithLegend: true,\r\n\t\t\twithTransition: false,\r\n\t\t\twithTransitionForTransform: false,\r\n\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * Reset the chart object and remove element and events completely.\r\n\t * @method destroy\r\n\t * @instance\r\n\t * @memberof Chart\r\n\t * @example\r\n\t * chart.destroy();\r\n\t */\r\n\tdestroy() {\r\n\t\tconst $$ = this.internal;\r\n\r\n\t\twindow.clearInterval($$.intervalForObserveInserted);\r\n\r\n\t\tif ($$.resizeTimeout !== undefined) {\r\n\t\t\twindow.clearTimeout($$.resizeTimeout);\r\n\t\t}\r\n\r\n\t\tremoveEvent(window, \"resize\", $$.resizeFunction);\r\n\t\t// if (window.detachEvent) {\r\n\t\t// window.detachEvent('onresize', $$.resizeFunction);\r\n\t\t// } else if (window.removeEventListener) {\r\n\t\t// window.removeEventListener('resize', $$.resizeFunction);\r\n\t\t// } else {\r\n\t\t// var wrapper = window.onresize;\r\n\t\t// // check if no one else removed our wrapper and remove our resizeFunction from it\r\n\t\t// if (wrapper && wrapper.add && wrapper.remove) {\r\n\t\t// wrapper.remove($$.resizeFunction);\r\n\t\t// }\r\n\t\t// }\r\n\r\n\t\t$$.selectChart.classed(\"bb\", false).html(\"\");\r\n\r\n\t\t// MEMO: this is needed because the reference of some elements will not be released, then memory leak will happen.\r\n\t\tObject.keys($$).forEach(key => {\r\n\t\t\t$$[key] = null;\r\n\t\t});\r\n\r\n\t\treturn null;\r\n\t}\r\n});\r\n\n\n\n// WEBPACK FOOTER //\n// src/api/api.chart.js","/**\r\n * Copyright (c) 2017 NAVER Corp.\r\n * billboard.js project is licensed under the MIT license\r\n */\r\nimport Chart from \"../internals/Chart\";\r\nimport {extend} from \"../internals/util\";\r\n\r\nextend(Chart.prototype, {\r\n\t/**\r\n\t * Get the color\r\n\t * @method color\r\n\t * @instance\r\n\t * @memberof Chart\r\n\t * @param {String} id id to get the color\r\n\t * @example\r\n\t * chart.color(\"data1\");\r\n\t */\r\n\tcolor(id) {\r\n\t\tconst $$ = this.internal;\r\n\r\n\t\treturn $$.color(id); // more patterns\r\n\t}\r\n});\r\n\n\n\n// WEBPACK FOOTER //\n// src/api/api.color.js","/**\r\n * Copyright (c) 2017 NAVER Corp.\r\n * billboard.js project is licensed under the MIT license\r\n */\r\nimport Chart from \"../internals/Chart\";\r\nimport {extend} from \"../internals/util\";\r\n\r\n/**\r\n * Get data loaded in the chart.\r\n * @method data\r\n * @instance\r\n * @memberof Chart\r\n * @param {String|Array} targetIds If this argument is given, this API returns the specified target data. If this argument is not given, all of data will be returned.\r\n * @example\r\n * // Get only data1 data\r\n * chart.data(\"data1\");\r\n *\r\n * // Get data1 and data2 data\r\n * chart.data([\"data1\", \"data2\"]);\r\n *\r\n * // Get all data\r\n * chart.data();\r\n */\r\nconst data = function(targetIds) {\r\n\tconst targets = this.internal.data.targets;\r\n\r\n\treturn typeof targetIds === \"undefined\" ?\r\n\t\ttargets : targets.filter(t => [].concat(targetIds).indexOf(t.id) >= 0);\r\n};\r\n\r\n/**\r\n * Get data shown in the chart.\r\n * @method data:shown\r\n * @instance\r\n * @memberof Chart\r\n * @param {String|Array} targetIds If this argument is given, this API filters the data with specified target ids. If this argument is not given, all shown data will be returned.\r\n * @example\r\n * // Get shown data by filtering to include only data1 data\r\n * chart.data.shown(\"data1\");\r\n *\r\n * // Get shown data by filtering to include data1 and data2 data\r\n * chart.data.shown([\"data1\", \"data2\"]);\r\n *\r\n * // Get all shown data\r\n * chart.data.shown();\r\n */\r\ndata.shown = function(targetIds) {\r\n\treturn this.internal.filterTargetsToShow(this.data(targetIds));\r\n};\r\n\r\n/**\r\n * Get values of the data loaded in the chart.\r\n * @method data:values\r\n * @instance\r\n * @memberof Chart\r\n * @param {String|Array} targetIds This API returns the values of specified target. If this argument is not given, null will be retruned\r\n * @example\r\n * // Get data1 values\r\n * chart.data.values(\"data1\");\r\n */\r\ndata.values = function(targetId) {\r\n\tlet values = null;\r\n\r\n\tif (targetId) {\r\n\t\tconst targets = this.data(targetId);\r\n\r\n\t\tif (targets && targets[0]) {\r\n\t\t\tvalues = targets[0].values.map(d => d.value);\r\n\t\t}\r\n\t}\r\n\r\n\treturn values;\r\n};\r\n\r\n/**\r\n * Get and set names of the data loaded in the chart.\r\n * @method data:names\r\n * @instance\r\n * @memberof Chart\r\n * @param {Object} names If this argument is given, the names of data will be updated. If not given, the current names will be returned. The format of this argument is the same as\r\n * @example\r\n * // Get current names\r\n * chart.data.names();\r\n *\r\n * // Update names\r\n * chart.data.names({\r\n * data1: \"New Name 1\",\r\n * data2: \"New Name 2\"\r\n *});\r\n */\r\ndata.names = function(names) {\r\n\tthis.internal.clearLegendItemTextBoxCache();\r\n\r\n\treturn this.internal.updateDataAttributes(\"names\", names);\r\n};\r\n\r\n/**\r\n * Get and set colors of the data loaded in the chart.\r\n * @method data:colors\r\n * @instance\r\n * @memberof Chart\r\n * @param {Object} colors If this argument is given, the colors of data will be updated. If not given, the current colors will be returned. The format of this argument is the same as\r\n * @example\r\n * // Get current colors\r\n * chart.data.colors();\r\n *\r\n * // Update colors\r\n * chart.data.colors({\r\n * data1: \"#FFFFFF\",\r\n * data2: \"#000000\"\r\n * });\r\n */\r\ndata.colors = function(colors) {\r\n\treturn this.internal.updateDataAttributes(\"colors\", colors);\r\n};\r\n\r\n/**\r\n * Get and set axes of the data loaded in the chart.\r\n * @method data:axes\r\n * @instance\r\n * @memberof Chart\r\n * @param {Object} axes If this argument is given, the axes of data will be updated. If not given, the current axes will be returned. The format of this argument is the same as\r\n * @example\r\n * // Get current axes\r\n * chart.data.axes();\r\n *\r\n * // Update axes\r\n * chart.data.axes({\r\n * data1: \"y\",\r\n * data2: \"y2\"\r\n * });\r\n */\r\ndata.axes = function(axes) {\r\n\treturn this.internal.updateDataAttributes(\"axes\", axes);\r\n};\r\n\r\nextend(Chart.prototype, {data});\r\n\n\n\n// WEBPACK FOOTER //\n// src/api/api.data.js","/**\r\n * Copyright (c) 2017 NAVER Corp.\r\n * billboard.js project is licensed under the MIT license\r\n */\r\nimport {\r\n\teaseLinear as d3EaseLinear,\r\n\ttransition as d3Transition,\r\n\tselectAll as d3SelectAll\r\n} from \"d3\";\r\nimport Chart from \"../internals/Chart\";\r\nimport ChartInternal from \"../internals/ChartInternal\";\r\nimport {isDefined, isValue, diffDomain, extend} from \"../internals/util\";\r\nimport CLASS from \"../config/classes\";\r\n\r\nextend(Chart.prototype, {\r\n\t/**\r\n\t * Flow data to the chart.

\r\n\t * By this API, you can append new data points to the chart.\r\n\t * @method flow\r\n\t * @instance\r\n\t * @memberof Chart\r\n\t * @param {Object} args\r\n\t * - If json, rows and columns given, the data will be loaded. If data that has the same target id is given, the chart will be appended. Otherwise, new target will be added. One of these is required when calling. If json specified, keys is required as well as data.json\r\n\t * - If to is given, the lower x edge will move to that point. If not given, the lower x edge will move by the number of given data points.\r\n\t * - If length is given, the lower x edge will move by the number of this argument.\r\n\t * - If duration is given, the duration of the transition will be specified value. If not given, transition.duration will be used as default.\r\n\t * - If done is given, the specified function will be called when flow ends.\r\n\t * @example\r\n\t * // 2 data points will be apprended to the tail and popped from the head.\r\n\t * // After that, 4 data points will be appended and no data points will be poppoed.\r\n\t * chart.flow({\r\n\t * columns: [\r\n\t * [\"x\", \"2013-01-11\", \"2013-01-21\"],\r\n\t * [\"data1\", 500, 200],\r\n\t * [\"data2\", 100, 300],\r\n\t * [\"data3\", 200, 120]\r\n\t * ],\r\n\t * done: function () {\r\n\t * chart.flow({\r\n\t * columns: [\r\n\t * [\"x\", \"2013-02-11\", \"2013-02-12\", \"2013-02-13\", \"2013-02-14\"],\r\n\t * [\"data1\", 200, 300, 100, 250],\r\n\t * [\"data2\", 100, 90, 40, 120],\r\n\t * [\"data3\", 100, 100, 300, 500]\r\n\t * ],\r\n\t * length: 0\r\n\t * });\r\n\t * }\r\n\t * });\r\n\t */\r\n\tflow(args) {\r\n\t\tconst $$ = this.internal;\r\n\t\tconst notfoundIds = [];\r\n\t\tconst orgDataCount = $$.getMaxDataCount();\r\n\r\n\t\tlet data;\r\n\t\tlet domain;\r\n\t\tlet length = 0;\r\n\t\tlet tail = 0;\r\n\t\tlet diff;\r\n\t\tlet to;\r\n\r\n\t\tif (args.json) {\r\n\t\t\tdata = $$.convertJsonToData(args.json, args.keys);\r\n\t\t} else if (args.rows) {\r\n\t\t\tdata = $$.convertRowsToData(args.rows);\r\n\t\t} else if (args.columns) {\r\n\t\t\tdata = $$.convertColumnsToData(args.columns);\r\n\t\t} else {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst targets = $$.convertDataToTargets(data, true);\r\n\r\n\t\t// Update/Add data\r\n\t\t$$.data.targets.forEach(t => {\r\n\t\t\tlet found = false;\r\n\t\t\tlet i;\r\n\t\t\tlet j;\r\n\r\n\t\t\tfor (i = 0; i < targets.length; i++) {\r\n\t\t\t\tif (t.id === targets[i].id) {\r\n\t\t\t\t\tfound = true;\r\n\r\n\t\t\t\t\tif (t.values[t.values.length - 1]) {\r\n\t\t\t\t\t\ttail = t.values[t.values.length - 1].index + 1;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tlength = targets[i].values.length;\r\n\r\n\t\t\t\t\tfor (j = 0; j < length; j++) {\r\n\t\t\t\t\t\ttargets[i].values[j].index = tail + j;\r\n\t\t\t\t\t\tif (!$$.isTimeSeries()) {\r\n\t\t\t\t\t\t\ttargets[i].values[j].x = tail + j;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tt.values = t.values.concat(targets[i].values);\r\n\r\n\t\t\t\t\ttargets.splice(i, 1);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (!found) { notfoundIds.push(t.id); }\r\n\t\t});\r\n\r\n\t\t// Append null for not found targets\r\n\t\t$$.data.targets.forEach(t => {\r\n\t\t\tlet i;\r\n\t\t\tlet j;\r\n\r\n\t\t\tfor (i = 0; i < notfoundIds.length; i++) {\r\n\t\t\t\tif (t.id === notfoundIds[i]) {\r\n\t\t\t\t\ttail = t.values[t.values.length - 1].index + 1;\r\n\r\n\t\t\t\t\tfor (j = 0; j < length; j++) {\r\n\t\t\t\t\t\tt.values.push({\r\n\t\t\t\t\t\t\tid: t.id,\r\n\t\t\t\t\t\t\tindex: tail + j,\r\n\t\t\t\t\t\t\tx: $$.isTimeSeries() ? $$.getOtherTargetX(tail + j) : tail + j,\r\n\t\t\t\t\t\t\tvalue: null\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t// Generate null values for new target\r\n\t\tif ($$.data.targets.length) {\r\n\t\t\ttargets.forEach(t => {\r\n\t\t\t\tlet i;\r\n\t\t\t\tconst missing = [];\r\n\r\n\t\t\t\tfor (i = $$.data.targets[0].values[0].index; i < tail; i++) {\r\n\t\t\t\t\tmissing.push({\r\n\t\t\t\t\t\tid: t.id,\r\n\t\t\t\t\t\tindex: i,\r\n\t\t\t\t\t\tx: $$.isTimeSeries() ? $$.getOtherTargetX(i) : i,\r\n\t\t\t\t\t\tvalue: null\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\r\n\t\t\t\tt.values.forEach(v => {\r\n\t\t\t\t\tv.index += tail;\r\n\r\n\t\t\t\t\tif (!$$.isTimeSeries()) {\r\n\t\t\t\t\t\tv.x += tail;\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\r\n\t\t\t\tt.values = missing.concat(t.values);\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t$$.data.targets = $$.data.targets.concat(targets); // add remained\r\n\r\n\t\t// check data count because behavior needs to change when it\"s only one\r\n\t\t// const dataCount = $$.getMaxDataCount();\r\n\t\tconst baseTarget = $$.data.targets[0];\r\n\t\tconst baseValue = baseTarget.values[0];\r\n\r\n\t\t// Update length to flow if needed\r\n\t\tif (isDefined(args.to)) {\r\n\t\t\tlength = 0;\r\n\t\t\tto = $$.isTimeSeries() ? $$.parseDate(args.to) : args.to;\r\n\t\t\tbaseTarget.values.forEach(v => {\r\n\t\t\t\tv.x < to && length++;\r\n\t\t\t});\r\n\t\t} else if (isDefined(args.length)) {\r\n\t\t\tlength = args.length;\r\n\t\t}\r\n\r\n\t\t// If only one data, update the domain to flow from left edge of the chart\r\n\t\tif (!orgDataCount) {\r\n\t\t\tif ($$.isTimeSeries()) {\r\n\t\t\t\tif (baseTarget.values.length > 1) {\r\n\t\t\t\t\tdiff = baseTarget.values[baseTarget.values.length - 1].x - baseValue.x;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tdiff = baseValue.x - $$.getXDomain($$.data.targets)[0];\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tdiff = 1;\r\n\t\t\t}\r\n\r\n\t\t\tdomain = [baseValue.x - diff, baseValue.x];\r\n\t\t\t$$.updateXDomain(null, true, true, false, domain);\r\n\t\t} else if (orgDataCount === 1) {\r\n\t\t\tif ($$.isTimeSeries()) {\r\n\t\t\t\tdiff = (baseTarget.values[baseTarget.values.length - 1].x - baseValue.x) / 2;\r\n\t\t\t\tdomain = [new Date(+baseValue.x - diff), new Date(+baseValue.x + diff)];\r\n\t\t\t\t$$.updateXDomain(null, true, true, false, domain);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Set targets\r\n\t\t$$.updateTargets($$.data.targets);\r\n\r\n\t\t// Redraw with new targets\r\n\t\t$$.redraw({\r\n\t\t\tflow: {\r\n\t\t\t\tindex: baseValue.index,\r\n\t\t\t\tlength: length,\r\n\t\t\t\tduration: isValue(args.duration) ? args.duration : $$.config.transition_duration,\r\n\t\t\t\tdone: args.done,\r\n\t\t\t\torgDataCount: orgDataCount,\r\n\t\t\t},\r\n\t\t\twithLegend: true,\r\n\t\t\twithTransition: orgDataCount > 1,\r\n\t\t\twithTrimXDomain: false,\r\n\t\t\twithUpdateXAxis: true\r\n\t\t});\r\n\t}\r\n});\r\n\r\nextend(ChartInternal.prototype, {\r\n\t/**\r\n\t * Generate flow\r\n\t * @memberof ChartInternal\r\n\t * @private\r\n\t * @param {Object} args\r\n\t * @return {Function}\r\n\t */\r\n\tgenerateFlow(args) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\r\n\t\treturn function() {\r\n\t\t\tconst targets = args.targets;\r\n\t\t\tconst flow = args.flow;\r\n\t\t\tconst drawBar = args.drawBar;\r\n\t\t\tconst drawLine = args.drawLine;\r\n\t\t\tconst drawArea = args.drawArea;\r\n\t\t\tconst cx = args.cx;\r\n\t\t\tconst cy = args.cy;\r\n\t\t\tconst xv = args.xv;\r\n\t\t\tconst xForText = args.xForText;\r\n\t\t\tconst yForText = args.yForText;\r\n\t\t\tconst duration = args.duration;\r\n\r\n\t\t\tlet translateX;\r\n\t\t\tlet scaleX = 1;\r\n\t\t\tconst flowIndex = flow.index;\r\n\t\t\tconst flowLength = flow.length;\r\n\t\t\tlet flowStart = $$.getValueOnIndex($$.data.targets[0].values, flowIndex);\r\n\t\t\tlet flowEnd = $$.getValueOnIndex($$.data.targets[0].values, flowIndex + flowLength);\r\n\t\t\tconst orgDomain = $$.x.domain();\r\n\t\t\tconst durationForFlow = flow.duration || duration;\r\n\t\t\tconst done = flow.done || function() {};\r\n\t\t\tconst wait = $$.generateWait();\r\n\r\n\t\t\tconst xgrid = $$.xgrid || d3SelectAll([]);\r\n\t\t\tconst xgridLines = $$.xgridLines || d3SelectAll([]);\r\n\t\t\tconst mainRegion = $$.mainRegion || d3SelectAll([]);\r\n\t\t\tconst mainText = $$.mainText || d3SelectAll([]);\r\n\t\t\tconst mainBar = $$.mainBar || d3SelectAll([]);\r\n\t\t\tconst mainLine = $$.mainLine || d3SelectAll([]);\r\n\t\t\tconst mainArea = $$.mainArea || d3SelectAll([]);\r\n\t\t\tconst mainCircle = $$.mainCircle || d3SelectAll([]);\r\n\r\n\t\t\t// set flag\r\n\t\t\t$$.flowing = true;\r\n\r\n\t\t\t// remove head data after rendered\r\n\t\t\t$$.data.targets.forEach(d => {\r\n\t\t\t\td.values.splice(0, flowLength);\r\n\t\t\t});\r\n\r\n\t\t\t// update x domain to generate axis elements for flow\r\n\t\t\tconst domain = $$.updateXDomain(targets, true, true);\r\n\r\n\t\t\t// update elements related to x scale\r\n\t\t\tif ($$.updateXGrid) { $$.updateXGrid(true); }\r\n\r\n\t\t\t// generate transform to flow\r\n\t\t\tif (!flow.orgDataCount) { // if empty\r\n\t\t\t\tif ($$.data.targets[0].values.length !== 1) {\r\n\t\t\t\t\ttranslateX = $$.x(orgDomain[0]) - $$.x(domain[0]);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif ($$.isTimeSeries()) {\r\n\t\t\t\t\t\tflowStart = $$.getValueOnIndex($$.data.targets[0].values, 0);\r\n\t\t\t\t\t\tflowEnd = $$.getValueOnIndex($$.data.targets[0].values, $$.data.targets[0].values.length - 1);\r\n\t\t\t\t\t\ttranslateX = $$.x(flowStart.x) - $$.x(flowEnd.x);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\ttranslateX = diffDomain(domain) / 2;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t} else if (flow.orgDataCount === 1 || (flowStart && flowStart.x) === (flowEnd && flowEnd.x)) {\r\n\t\t\t\ttranslateX = $$.x(orgDomain[0]) - $$.x(domain[0]);\r\n\t\t\t} else {\r\n\t\t\t\tif ($$.isTimeSeries()) {\r\n\t\t\t\t\ttranslateX = ($$.x(orgDomain[0]) - $$.x(domain[0]));\r\n\t\t\t\t} else {\r\n\t\t\t\t\ttranslateX = ($$.x(flowStart.x) - $$.x(flowEnd.x));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tscaleX = (diffDomain(orgDomain) / diffDomain(domain));\r\n\t\t\tconst transform = `translate(${translateX},0) scale(${scaleX},1)`;\r\n\r\n\t\t\t$$.hideXGridFocus();\r\n\r\n\t\t\tconst gt = d3Transition().ease(d3EaseLinear)\r\n\t\t\t\t.duration(durationForFlow);\r\n\r\n\t\t\twait.add([\r\n\t\t\t\t$$.axes.x\r\n\t\t\t\t\t.transition(gt)\r\n\t\t\t\t\t.call($$.xAxis.setTransition(gt)),\r\n\t\t\t\tmainBar\r\n\t\t\t\t\t.transition(gt)\r\n\t\t\t\t\t.attr(\"transform\", transform),\r\n\t\t\t\tmainLine\r\n\t\t\t\t\t.transition(gt)\r\n\t\t\t\t\t.attr(\"transform\", transform),\r\n\t\t\t\tmainArea\r\n\t\t\t\t\t.transition(gt)\r\n\t\t\t\t\t.attr(\"transform\", transform),\r\n\t\t\t\tmainCircle\r\n\t\t\t\t\t.transition(gt)\r\n\t\t\t\t\t.attr(\"transform\", transform),\r\n\t\t\t\tmainText\r\n\t\t\t\t\t.transition(gt)\r\n\t\t\t\t\t.attr(\"transform\", transform),\r\n\t\t\t\tmainRegion\r\n\t\t\t\t\t.filter($$.isRegionOnX)\r\n\t\t\t\t\t.transition(gt)\r\n\t\t\t\t\t.attr(\"transform\", transform),\r\n\t\t\t\txgrid\r\n\t\t\t\t\t.transition(gt)\r\n\t\t\t\t\t.attr(\"transform\", transform),\r\n\t\t\t\txgridLines\r\n\t\t\t\t\t.transition(gt)\r\n\t\t\t\t\t.attr(\"transform\", transform),\r\n\t\t\t]);\r\n\r\n\t\t\tgt.call(wait, () => {\r\n\t\t\t\tlet i;\r\n\t\t\t\tconst shapes = [];\r\n\t\t\t\tconst texts = [];\r\n\t\t\t\tconst eventRects = [];\r\n\r\n\t\t\t\t// remove flowed elements\r\n\t\t\t\tif (flowLength) {\r\n\t\t\t\t\tfor (i = 0; i < flowLength; i++) {\r\n\t\t\t\t\t\tshapes.push(`.${CLASS.shape}-${flowIndex + i}`);\r\n\t\t\t\t\t\ttexts.push(`.${CLASS.text}-${flowIndex + i}`);\r\n\t\t\t\t\t\teventRects.push(`.${CLASS.eventRect}-${flowIndex + i}`);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t$$.svg.selectAll(`.${CLASS.shapes}`)\r\n\t\t\t\t\t\t.selectAll(shapes)\r\n\t\t\t\t\t\t.remove();\r\n\r\n\t\t\t\t\t$$.svg.selectAll(`.${CLASS.texts}`)\r\n\t\t\t\t\t\t.selectAll(texts)\r\n\t\t\t\t\t\t.remove();\r\n\r\n\t\t\t\t\t$$.svg.selectAll(`.${CLASS.eventRects}`)\r\n\t\t\t\t\t\t.selectAll(eventRects)\r\n\t\t\t\t\t\t.remove();\r\n\r\n\t\t\t\t\t$$.svg.select(`.${CLASS.xgrid}`)\r\n\t\t\t\t\t\t.remove();\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// draw again for removing flowed elements and reverting attr\r\n\t\t\t\txgrid.size() && xgrid\r\n\t\t\t\t\t.attr(\"transform\", null)\r\n\t\t\t\t\t.attr($$.xgridAttr);\r\n\r\n\t\t\t\txgridLines\r\n\t\t\t\t\t.attr(\"transform\", null);\r\n\r\n\t\t\t\txgridLines.select(\"line\")\r\n\t\t\t\t\t.attr(\"x1\", config.axis_rotated ? 0 : xv)\r\n\t\t\t\t\t.attr(\"x2\", config.axis_rotated ? $$.width : xv);\r\n\r\n\t\t\t\txgridLines.select(\"text\")\r\n\t\t\t\t\t.attr(\"x\", config.axis_rotated ? $$.width : 0)\r\n\t\t\t\t\t.attr(\"y\", xv);\r\n\r\n\t\t\t\tmainBar\r\n\t\t\t\t\t.attr(\"transform\", null)\r\n\t\t\t\t\t.attr(\"d\", drawBar);\r\n\r\n\t\t\t\tmainLine\r\n\t\t\t\t\t.attr(\"transform\", null)\r\n\t\t\t\t\t.attr(\"d\", drawLine);\r\n\r\n\t\t\t\tmainArea\r\n\t\t\t\t\t.attr(\"transform\", null)\r\n\t\t\t\t\t.attr(\"d\", drawArea);\r\n\r\n\t\t\t\tmainCircle\r\n\t\t\t\t\t.attr(\"transform\", null)\r\n\t\t\t\t\t.attr(\"cx\", cx)\r\n\t\t\t\t\t.attr(\"cy\", cy);\r\n\r\n\t\t\t\tmainText\r\n\t\t\t\t\t.attr(\"transform\", null)\r\n\t\t\t\t\t.attr(\"x\", xForText)\r\n\t\t\t\t\t.attr(\"y\", yForText)\r\n\t\t\t\t\t.style(\"fill-opacity\", $$.opacityForText.bind($$));\r\n\r\n\t\t\t\tmainRegion\r\n\t\t\t\t\t.attr(\"transform\", null);\r\n\r\n\t\t\t\tmainRegion.select(\"rect\").filter($$.isRegionOnX)\r\n\t\t\t\t\t.attr(\"x\", $$.regionX.bind($$))\r\n\t\t\t\t\t.attr(\"width\", $$.regionWidth.bind($$));\r\n\r\n\t\t\t\tconfig.interaction_enabled && $$.redrawEventRect();\r\n\r\n\t\t\t\t// callback for end of flow\r\n\t\t\t\tdone();\r\n\r\n\t\t\t\t$$.flowing = false;\r\n\t\t\t});\r\n\t\t};\r\n\t}\r\n});\r\n\n\n\n// WEBPACK FOOTER //\n// src/api/api.flow.js","/**\r\n * Copyright (c) 2017 NAVER Corp.\r\n * billboard.js project is licensed under the MIT license\r\n */\r\nimport {select as d3Select} from \"d3\";\r\nimport Chart from \"../internals/Chart\";\r\nimport CLASS from \"../config/classes\";\r\nimport {extend} from \"../internals/util\";\r\n\r\nextend(Chart.prototype, {\r\n\t/**\r\n\t * This API highlights specified targets and fade out the others.

\r\n\t * You can specify multiple targets by giving an array that includes id as String. If no argument is given, all of targets will be highlighted.\r\n\t * @method focus\r\n\t * @instance\r\n\t * @memberof Chart\r\n\t * @param {String|Array} targetIdsValue Target ids to be highlighted.\r\n\t * @example\r\n\t * // data1 will be highlighted and the others will be faded out\r\n\t * chart.focus(\"data1\");\r\n\t *\r\n\t * // data1 and data2 will be highlighted and the others will be faded out\r\n\t * chart.focus([\"data1\", \"data2\"]);\r\n\t *\r\n\t * // all targets will be highlighted\r\n\t * chart.focus();\r\n\t */\r\n\tfocus(targetIdsValue) {\r\n\t\tconst $$ = this.internal;\r\n\t\tconst targetIds = $$.mapToTargetIds(targetIdsValue);\r\n\t\tconst candidates = $$.svg.selectAll(\r\n\t\t\t$$.selectorTargets(targetIds.filter($$.isTargetToShow, $$))\r\n\t\t);\r\n\r\n\t\tthis.revert();\r\n\t\tthis.defocus();\r\n\r\n\t\tcandidates.classed(CLASS.focused, true).classed(CLASS.defocused, false);\r\n\r\n\t\t$$.hasArcType() &&\r\n\t\t$$.expandArc(targetIds);\r\n\r\n\t\t$$.toggleFocusLegend(targetIds, true);\r\n\r\n\t\t$$.focusedTargetIds = targetIds;\r\n\t\t$$.defocusedTargetIds = $$.defocusedTargetIds.filter(id => targetIds.indexOf(id) < 0);\r\n\t},\r\n\r\n\t/**\r\n\t * This API fades out specified targets and reverts the others.

\r\n\t * You can specify multiple targets by giving an array that includes id as String. If no argument is given, all of targets will be faded out.\r\n\t * @method defocus\r\n\t * @instance\r\n\t * @memberof Chart\r\n\t * @param {String|Array} Target ids to be faded out.\r\n\t * @example\r\n\t * // data1 will be faded out and the others will be reverted.\r\n\t * chart.defocus(\"data1\");\r\n\t *\r\n\t * // data1 and data2 will be faded out and the others will be reverted.\r\n\t * chart.defocus([\"data1\", \"data2\"]);\r\n\t *\r\n\t * // all targets will be faded out.\r\n\t * chart.defocus();\r\n\t */\r\n\tdefocus(targetIdsValue) {\r\n\t\tconst $$ = this.internal;\r\n\t\tconst targetIds = $$.mapToTargetIds(targetIdsValue);\r\n\t\tconst candidates = $$.svg.selectAll(\r\n\t\t\t$$.selectorTargets(targetIds.filter($$.isTargetToShow, $$))\r\n\t\t);\r\n\r\n\t\tcandidates.classed(CLASS.focused, false).classed(CLASS.defocused, true);\r\n\r\n\t\t$$.hasArcType() &&\r\n\t\t$$.unexpandArc(targetIds);\r\n\r\n\t\t$$.toggleFocusLegend(targetIds, false);\r\n\r\n\t\t$$.focusedTargetIds = $$.focusedTargetIds.filter(id => targetIds.indexOf(id) < 0);\r\n\t\t$$.defocusedTargetIds = targetIds;\r\n\t},\r\n\r\n\t/**\r\n\t * This API reverts specified targets.

\r\n\t * You can specify multiple targets by giving an array that includes id as String. If no argument is given, all of targets will be reverted.\r\n\t * @method revert\r\n\t * @instance\r\n\t * @memberof Chart\r\n\t * @param {String|Array} Target ids to be reverted\r\n\t * @example\r\n\t * // data1 will be reverted.\r\n\t * chart.revert(\"data1\");\r\n\t *\r\n\t * // data1 and data2 will be reverted.\r\n\t * chart.revert([\"data1\", \"data2\"]);\r\n\t *\r\n\t * // all targets will be reverted.\r\n\t * chart.revert();\r\n\t */\r\n\trevert(targetIdsValue) {\r\n\t\tconst $$ = this.internal;\r\n\t\tconst targetIds = $$.mapToTargetIds(targetIdsValue);\r\n\t\tconst candidates = $$.svg.selectAll($$.selectorTargets(targetIds)); // should be for all targets\r\n\r\n\t\tcandidates.classed(CLASS.focused, false).classed(CLASS.defocused, false);\r\n\r\n\t\t$$.hasArcType() &&\r\n\t\t$$.unexpandArc(targetIds);\r\n\r\n\t\tif ($$.config.legend_show) {\r\n\t\t\t$$.showLegend(targetIds.filter($$.isLegendToShow.bind($$)));\r\n\t\t\t$$.legend.selectAll($$.selectorLegends(targetIds))\r\n\t\t\t\t.filter(function() {\r\n\t\t\t\t\treturn d3Select(this).classed(CLASS.legendItemFocused);\r\n\t\t\t\t})\r\n\t\t\t\t.classed(CLASS.legendItemFocused, false);\r\n\t\t}\r\n\r\n\t\t$$.focusedTargetIds = [];\r\n\t\t$$.defocusedTargetIds = [];\r\n\t}\r\n});\r\n\n\n\n// WEBPACK FOOTER //\n// src/api/api.focus.js","/**\r\n * Copyright (c) 2017 NAVER Corp.\r\n * billboard.js project is licensed under the MIT license\r\n */\r\nimport Chart from \"../internals/Chart\";\r\nimport {extend} from \"../internals/util\";\r\n\r\n/**\r\n * Update x grid lines.\r\n * @method xgrids\r\n * @instance\r\n * @memberof Chart\r\n * @param {Array} grids X grid lines will be replaced with this argument. The format of this argument is the same as grid.x.lines.\r\n * @example\r\n * // Show 2 x grid lines\r\n * chart.xgrids([\r\n * {value: 1, text: \"Label 1\"},\r\n * {value: 4, text: \"Label 4\"}\r\n * ]);\r\n */\r\nconst xgrids = function(grids) {\r\n\tconst $$ = this.internal;\r\n\tconst config = $$.config;\r\n\r\n\tif (!grids) {\r\n\t\treturn config.grid_x_lines;\r\n\t}\r\n\r\n\tconfig.grid_x_lines = grids;\r\n\t$$.redrawWithoutRescale();\r\n\r\n\treturn config.grid_x_lines;\r\n};\r\n\r\n/**\r\n * Add x grid lines.
\r\n * This API adds new x grid lines instead of replacing like xgrids.\r\n * @method xgrids:add\r\n * @instance\r\n * @memberof Chart\r\n * @param {Array|Object} grids New x grid lines will be added. The format of this argument is the same as grid.x.lines and it's possible to give an Object if only one line will be added.\r\n * @example\r\n * // Add a new x grid line\r\n * chart.xgrids.add(\r\n * {value: 4, text: \"Label 4\"}\r\n * );\r\n *\r\n * // Add new x grid lines\r\n * chart.xgrids.add([\r\n * {value: 2, text: \"Label 2\"},\r\n * {value: 4, text: \"Label 4\"}\r\n * ]);\r\n */\r\nxgrids.add = function(grids) {\r\n\treturn this.xgrids(\r\n\t\tthis.internal.config.grid_x_lines\r\n\t\t\t.concat(grids || [])\r\n\t);\r\n};\r\n\r\n/**\r\n * Remove x grid lines.
\r\n * This API removes x grid lines.\r\n * @method xgrids:remove\r\n * @instance\r\n * @memberof Chart\r\n * @param {Object} params This argument should include value or class. If value is given, the x grid lines that have specified x value will be removed. If class is given, the x grid lines that have specified class will be removed. If args is not given, all of x grid lines will be removed.\r\n * @example\r\n * // x grid line on x = 2 will be removed\r\n * chart.xgrids.remove({value: 2});\r\n *\r\n * // x grid lines that have 'grid-A' will be removed\r\n * chart.xgrids.remove({\r\n * class: \"grid-A\"\r\n * });\r\n *\r\n * // all of x grid lines will be removed\r\n * chart.xgrids.remove();\r\n */\r\nxgrids.remove = function(params) { // TODO: multiple\r\n\tthis.internal.removeGridLines(params, true);\r\n};\r\n\r\n/**\r\n * Update y grid lines.\r\n * @method ygrids\r\n * @instance\r\n * @memberof Chart\r\n * @param {Array} grids Y grid lines will be replaced with this argument. The format of this argument is the same as grid.y.lines.\r\n * @example\r\n * // Show 2 y grid lines\r\n * chart.ygrids([\r\n * {value: 100, text: \"Label 1\"},\r\n * {value: 400, text: \"Label 4\"}\r\n * ]);\r\n */\r\nconst ygrids = function(grids) {\r\n\tconst $$ = this.internal;\r\n\tconst config = $$.config;\r\n\r\n\tif (!grids) {\r\n\t\treturn config.grid_y_lines;\r\n\t}\r\n\r\n\tconfig.grid_y_lines = grids;\r\n\t$$.redrawWithoutRescale();\r\n\r\n\treturn config.grid_y_lines;\r\n};\r\n\r\n/**\r\n * Add y grid lines.
\r\n * This API adds new y grid lines instead of replacing like ygrids.\r\n * @method ygrids:add\r\n * @instance\r\n * @memberof Chart\r\n * @param {Array|Object} grids New y grid lines will be added. The format of this argument is the same as grid.y.lines and it's possible to give an Object if only one line will be added.\r\n * @example\r\n * // Add a new x grid line\r\n * chart.ygrids.add(\r\n * {value: 400, text: \"Label 4\"}\r\n * );\r\n *\r\n * // Add new x grid lines\r\n * chart.ygrids.add([\r\n * {value: 200, text: \"Label 2\"},\r\n * {value: 400, text: \"Label 4\"}\r\n * ]);\r\n */\r\nygrids.add = function(grids) {\r\n\treturn this.ygrids(\r\n\t\tthis.internal.config.grid_y_lines\r\n\t\t\t.concat(grids || [])\r\n\t);\r\n};\r\n\r\n/**\r\n * Remove y grid lines.
\r\n * This API removes x grid lines.\r\n * @method ygrids:remove\r\n * @instance\r\n * @memberof Chart\r\n * @param {Object} params This argument should include value or class. If value is given, the y grid lines that have specified y value will be removed. If class is given, the y grid lines that have specified class will be removed. If args is not given, all of y grid lines will be removed.\r\n * @example\r\n * // y grid line on y = 200 will be removed\r\n * chart.ygrids.remove({value: 200});\r\n *\r\n * // y grid lines that have 'grid-A' will be removed\r\n * chart.ygrids.remove({\r\n * class: \"grid-A\"\r\n * });\r\n *\r\n * // all of y grid lines will be removed\r\n * chart.ygrids.remove();\r\n */\r\nygrids.remove = function(params) { // TODO: multiple\r\n\tthis.internal.removeGridLines(params, false);\r\n};\r\n\r\nextend(Chart.prototype, {\r\n\txgrids,\r\n\tygrids\r\n});\r\n\n\n\n// WEBPACK FOOTER //\n// src/api/api.grid.js","/**\r\n * Copyright (c) 2017 NAVER Corp.\r\n * billboard.js project is licensed under the MIT license\r\n */\r\nimport Chart from \"../internals/Chart\";\r\nimport {isUndefined, extend} from \"../internals/util\";\r\n\r\nextend(Chart.prototype, {\r\n\t/**\r\n\t * Update groups for the targets.\r\n\t * @method groups\r\n\t * @instance\r\n\t * @memberof Chart\r\n\t * @param {Array} groups This argument needs to be an Array that includes one or more Array that includes target ids to be grouped.\r\n\t * @example\r\n\t * // data1 and data2 will be a new group.\r\n\t * chart.groups([\r\n\t * [\"data1\", \"data2\"]\r\n\t * ]);\r\n\t */\r\n\tgroups(groups) {\r\n\t\tconst $$ = this.internal;\r\n\t\tconst config = $$.config;\r\n\r\n\t\tif (isUndefined(groups)) {\r\n\t\t\treturn config.data_groups;\r\n\t\t}\r\n\r\n\t\tconfig.data_groups = groups;\r\n\t\t$$.redraw();\r\n\r\n\t\treturn config.data_groups;\r\n\t}\r\n});\r\n\n\n\n// WEBPACK FOOTER //\n// src/api/api.group.js","/**\r\n * Copyright (c) 2017 NAVER Corp.\r\n * billboard.js project is licensed under the MIT license\r\n */\r\nimport Chart from \"../internals/Chart\";\r\nimport {extend} from \"../internals/util\";\r\n\r\n/**\r\n * Define legend\r\n */\r\nconst legend = function() {};\r\n\r\n/**\r\n * Show legend for each target.\r\n * @method legend:show\r\n * @instance\r\n * @memberof Chart\r\n * @param {String|Array} targetIds\r\n * - If targetIds is given, specified target's legend will be shown.\r\n * - If only one target is the candidate, String can be passed.\r\n * - If no argument is given, all of target's legend will be shown.\r\n * @example\r\n * // Show legend for data1.\r\n * chart.legend.show(\"data1\");\r\n *\r\n * // Show legend for data1 and data2.\r\n * chart.legend.show([\"data1\", \"data2\"]);\r\n *\r\n * // Show all legend.\r\n * chart.legend.show();\r\n */\r\nlegend.show = function(targetIds) {\r\n\tconst $$ = this.internal;\r\n\r\n\t$$.showLegend($$.mapToTargetIds(targetIds));\r\n\t$$.updateAndRedraw({withLegend: true});\r\n};\r\n\r\n/**\r\n * Hide legend for each target.\r\n * @method legend:hide\r\n * @instance\r\n * @memberof Chart\r\n * @param {String|Array} targetIds\r\n * - If targetIds is given, specified target's legend will be hidden.\r\n * - If only one target is the candidate, String can be passed.\r\n * - If no argument is given, all of target's legend will be hidden.\r\n * @example\r\n * // Hide legend for data1.\r\n * chart.legend.hide(\"data1\");\r\n *\r\n * // Hide legend for data1 and data2.\r\n * chart.legend.hide([\"data1\", \"data2\"]);\r\n *\r\n * // Hide all legend.\r\n * chart.legend.hide();\r\n */\r\nlegend.hide = function(targetIds) {\r\n\tconst $$ = this.internal;\r\n\r\n\t$$.hideLegend($$.mapToTargetIds(targetIds));\r\n\t$$.updateAndRedraw({withLegend: true});\r\n};\r\n\r\nextend(Chart.prototype, {legend});\r\n\n\n\n// WEBPACK FOOTER //\n// src/api/api.legend.js","/**\r\n * Copyright (c) 2017 NAVER Corp.\r\n * billboard.js project is licensed under the MIT license\r\n */\r\nimport Chart from \"../internals/Chart\";\r\nimport {extend} from \"../internals/util\";\r\n\r\nextend(Chart.prototype, {\r\n\t/**\r\n\t * Load data to the chart.

\r\n\t * You can specify multiple targets by giving an array that includes id as String. If no argument is given, all of targets will be toggles.\r\n\t * - Note:\r\n\t * unload should be used if some data needs to be unloaded simultaneously. If you call unload API soon after/before load instead of unload param, chart will not be rendered properly because of cancel of animation.
\r\n\t * done will be called after data loaded, but it's not after rendering. It's because rendering will finish after some transition and there is some time lag between loading and rendering\r\n\t * @method load\r\n\t * @instance\r\n\t * @memberof Chart\r\n\t * @param {Object} args\r\n\t * - If url, json, rows and columns given, the data will be loaded. If data that has the same target id is given, the chart will be updated. Otherwise, new target will be added.\r\n\t * - If classes given, the classes specifed by data.classes will be updated. classes must be Object that has target id as keys.\r\n\t * - If categories given, the categories specifed by axis.x.categories or data.x will be updated. categories must be Array.\r\n\t * - If axes given, the axes specifed by data.axes will be updated. axes must be Object that has target id as keys.\r\n\t * - If colors given, the colors specifed by data.colors will be updated. colors must be Object that has target id as keys.\r\n\t * - If type or types given, the type of targets will be updated. type must be String and types must be Object.\r\n\t * - If unload given, data will be unloaded before loading new data. If true given, all of data will be unloaded. If target ids given as String or Array, specified targets will be unloaded.\r\n\t * - If done given, the specified function will be called after data loded.\r\n\t * @example\r\n\t * // Load data1 and unload data2 and data3\r\n\t * chart.load({\r\n\t * columns: [\r\n\t * [\"data1\", 100, 200, 150, ...],\r\n\t * ...\r\n\t * ],\r\n\t * unload: [\"data2\", \"data3\"]\r\n\t * });\r\n\t */\r\n\tload(args) {\r\n\t\tconst $$ = this.internal;\r\n\t\tconst config = $$.config;\r\n\r\n\t\t// update xs if specified\r\n\t\targs.xs && $$.addXs(args.xs);\r\n\r\n\t\t// update names if exists\r\n\t\t\"names\" in args &&\r\n\t\t\tthis.data.names(args.names);\r\n\r\n\t\t// update classes if exists\r\n\t\t\"classes\" in args &&\r\n\t\tObject.keys(args.classes).forEach(id => {\r\n\t\t\tconfig.data_classes[id] = args.classes[id];\r\n\t\t});\r\n\r\n\t\t// update categories if exists\r\n\t\tif (\"categories\" in args && $$.isCategorized()) {\r\n\t\t\tconfig.axis_x_categories = args.categories;\r\n\t\t}\r\n\r\n\t\t// update axes if exists\r\n\t\t\"axes\" in args &&\r\n\t\tObject.keys(args.axes).forEach(id => {\r\n\t\t\tconfig.data_axes[id] = args.axes[id];\r\n\t\t});\r\n\r\n\r\n\t\t// update colors if exists\r\n\t\t\"colors\" in args &&\r\n\t\tObject.keys(args.colors).forEach(id => {\r\n\t\t\tconfig.data_colors[id] = args.colors[id];\r\n\t\t});\r\n\r\n\t\t// use cache if exists\r\n\t\tif (\"cacheIds\" in args && $$.hasCaches(args.cacheIds)) {\r\n\t\t\t$$.load($$.getCaches(args.cacheIds), args.done);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// unload if needed\r\n\t\tif (\"unload\" in args) {\r\n\t\t\t// TODO: do not unload if target will load (included in url/rows/columns)\r\n\t\t\t$$.unload(\r\n\t\t\t\t$$.mapToTargetIds(\r\n\t\t\t\t\ttypeof args.unload === \"boolean\" && args.unload ?\r\n\t\t\t\t\t\tnull : args.unload), () => $$.loadFromArgs(args)\r\n\t\t\t);\r\n\t\t} else {\r\n\t\t\t$$.loadFromArgs(args);\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Unload data to the chart.

\r\n\t * You can specify multiple targets by giving an array that includes id as String. If no argument is given, all of targets will be toggles.\r\n\t * - Note:\r\n\t * If you call load API soon after/before unload, unload param of load should be used. Otherwise chart will not be rendered properly because of cancel of animation.
\r\n\t * `done` will be called after data loaded, but it's not after rendering. It's because rendering will finish after some transition and there is some time lag between loading and rendering.\r\n\t * @method unload\r\n\t * @instance\r\n\t * @memberof Chart\r\n\t * @param {Object} args\r\n\t * - If ids given, the data that has specified target id will be unloaded. ids should be String or Array. If ids is not specified, all data will be unloaded.\r\n\t * - If done given, the specified function will be called after data loded.\r\n\t * @example\r\n\t * // Unload data2 and data3\r\n\t * chart.unload({\r\n\t * ids: [\"data2\", \"data3\"]\r\n\t * });\r\n\t */\r\n\tunload(argsValue) {\r\n\t\tconst $$ = this.internal;\r\n\t\tlet args = argsValue || {};\r\n\r\n\t\tif (args instanceof Array) {\r\n\t\t\targs = {ids: args};\r\n\t\t} else if (typeof args === \"string\") {\r\n\t\t\targs = {ids: [args]};\r\n\t\t}\r\n\r\n\t\t$$.unload($$.mapToTargetIds(args.ids), () => {\r\n\t\t\t$$.redraw({\r\n\t\t\t\twithUpdateOrgXDomain: true,\r\n\t\t\t\twithUpdateXDomain: true,\r\n\t\t\t\twithLegend: true\r\n\t\t\t});\r\n\r\n\t\t\targs.done && args.done();\r\n\t\t});\r\n\t}\r\n});\r\n\n\n\n// WEBPACK FOOTER //\n// src/api/api.load.js","/**\r\n * Copyright (c) 2017 NAVER Corp.\r\n * billboard.js project is licensed under the MIT license\r\n */\r\nimport Chart from \"../internals/Chart\";\r\nimport CLASS from \"../config/classes\";\r\nimport {extend} from \"../internals/util\";\r\n\r\n/**\r\n * Update regions.\r\n * @method regions\r\n * @instance\r\n * @memberof Chart\r\n * @param {Array} regions Regions will be replaced with this argument. The format of this argument is the same as regions.\r\n * @return {Array} regions\r\n * @example\r\n * // Show 2 regions\r\n * chart.regions([\r\n * {axis: \"x\", start: 5, class: \"regionX\"},\r\n * {axis: \"y\", end: 50, class: \"regionY\"}\r\n * ]);\r\n */\r\nconst regions = function(regions) {\r\n\tconst $$ = this.internal;\r\n\tconst config = $$.config;\r\n\r\n\tif (!regions) {\r\n\t\treturn config.regions;\r\n\t}\r\n\r\n\tconfig.regions = regions;\r\n\t$$.redrawWithoutRescale();\r\n\r\n\treturn config.regions;\r\n};\r\n\r\n/**\r\n * Add new region.

\r\n * This API adds new region instead of replacing like regions.\r\n * @method regions:add\r\n * @instance\r\n * @memberof Chart\r\n * @param {Array|Object} regions New region will be added. The format of this argument is the same as regions and it's possible to give an Object if only one region will be added.\r\n * @return {Array} regions\r\n * @example\r\n * // Add a new region\r\n * chart.regions.add(\r\n * {axis: \"x\", start: 5, class: \"regionX\"}\r\n * );\r\n *\r\n * // Add new regions\r\n * chart.regions.add([\r\n * {axis: \"x\", start: 5, class: \"regionX\"},\r\n * {axis: \"y\", end: 50, class: \"regionY\"}\r\n *]);\r\n */\r\nregions.add = function(regions) {\r\n\tconst $$ = this.internal;\r\n\tconst config = $$.config;\r\n\r\n\tif (!regions) {\r\n\t\treturn config.regions;\r\n\t}\r\n\r\n\tconfig.regions = config.regions.concat(regions);\r\n\t$$.redrawWithoutRescale();\r\n\r\n\treturn config.regions;\r\n};\r\n\r\n/**\r\n * Remove regions.

\r\n * This API removes regions.\r\n * @method regions:remove\r\n * @instance\r\n * @memberof Chart\r\n * @param {Object} regions This argument should include classes. If classes is given, the regions that have one of the specified classes will be removed. If args is not given, all of regions will be removed.\r\n * @return {Array} regions\r\n * @example\r\n * // regions that have 'region-A' or 'region-B' will be removed.\r\n * chart.regions.remove({\r\n * classes: [\r\n * \"region-A\", \"region-B\"\r\n * ]\r\n * });\r\n *\r\n * // all of regions will be removed.\r\n * chart.regions.remove();\r\n */\r\nregions.remove = function(optionsValue) {\r\n\tconst $$ = this.internal;\r\n\tconst config = $$.config;\r\n\r\n\tconst options = optionsValue || {};\r\n\tconst duration = $$.getOption(options, \"duration\", config.transition_duration);\r\n\tconst classes = $$.getOption(options, \"classes\", [CLASS.region]);\r\n\tconst regions = $$.main.select(`.${CLASS.regions}`)\r\n\t\t.selectAll(classes.map(c => `.${c}`));\r\n\r\n\t(duration ? regions.transition().duration(duration) : regions)\r\n\t\t.style(\"opacity\", \"0\")\r\n\t\t.remove();\r\n\r\n\tconfig.regions = config.regions.filter(region => {\r\n\t\tlet found = false;\r\n\r\n\t\tif (!region.class) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tregion.class.split(\" \").forEach(c => {\r\n\t\t\tif (classes.indexOf(c) >= 0) {\r\n\t\t\t\tfound = true;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn !found;\r\n\t});\r\n\r\n\treturn config.regions;\r\n};\r\n\r\nextend(Chart.prototype, {regions});\r\n\n\n\n// WEBPACK FOOTER //\n// src/api/api.region.js","/**\r\n * Copyright (c) 2017 NAVER Corp.\r\n * billboard.js project is licensed under the MIT license\r\n */\r\nimport {select as d3Select} from \"d3\";\r\nimport Chart from \"../internals/Chart\";\r\nimport {isDefined, extend} from \"../internals/util\";\r\nimport CLASS from \"../config/classes\";\r\n\r\nextend(Chart.prototype, {\r\n\t/**\r\n\t * Get selected data points.

\r\n\t * By this API, you can get selected data points information. To use this API, data.selection.enabled needs to be set true.\r\n\t * @method selected\r\n\t * @instance\r\n\t * @memberof Chart\r\n\t * @param {String} targetId You can filter the result by giving target id that you want to get. If not given, all of data points will be returned.\r\n\t * @return {Array} dataPoint\r\n\t * @example\r\n\t * // all selected data points will be returned.\r\n\t * chart.selected();\r\n\t *\r\n\t * // all selected data points of data1 will be returned.\r\n\t * chart.selected(\"data1\");\r\n\t */\r\n\tselected(targetId) {\r\n\t\tconst $$ = this.internal;\r\n\t\tconst dataPoint = [];\r\n\r\n\t\t$$.main.selectAll(`.${CLASS.shapes + $$.getTargetSelectorSuffix(targetId)}`)\r\n\t\t\t.selectAll(`.${CLASS.shape}`)\r\n\t\t\t.filter(function() {\r\n\t\t\t\treturn d3Select(this).classed(CLASS.SELECTED);\r\n\t\t\t})\r\n\t\t\t.each(d => dataPoint.push(d));\r\n\r\n\t\treturn dataPoint;\r\n\t},\r\n\r\n\t/**\r\n\t * Set data points to be selected.\r\n\t * @method select\r\n\t * @instance\r\n\t * @memberof Chart\r\n\t * @param {String} ids\r\n\t * @param {Number} indices\r\n\t * @param {Boolean} resetOther\r\n\t * @example\r\n\t * // select from 'data1', indices 2 and unselect others selected\r\n\t * chart.select(\"data1\", 2, true);\r\n\t */\r\n\tselect(ids, indices, resetOther) {\r\n\t\tconst $$ = this.internal;\r\n\t\tconst config = $$.config;\r\n\r\n\t\tif (!config.data_selection_enabled) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t$$.main.selectAll(`.${CLASS.shapes}`)\r\n\t\t\t.selectAll(`.${CLASS.shape}`)\r\n\t\t\t.each(function(d, i) {\r\n\t\t\t\tconst shape = d3Select(this);\r\n\t\t\t\tconst id = d.data ? d.data.id : d.id;\r\n\t\t\t\tconst toggle = $$.getToggle(this, d).bind($$);\r\n\t\t\t\tconst isTargetId = config.data_selection_grouped || !ids || ids.indexOf(id) >= 0;\r\n\t\t\t\tconst isTargetIndex = !indices || indices.indexOf(i) >= 0;\r\n\t\t\t\tconst isSelected = shape.classed(CLASS.SELECTED);\r\n\r\n\t\t\t\t// line/area selection not supported yet\r\n\t\t\t\tif (shape.classed(CLASS.line) || shape.classed(CLASS.area)) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (isTargetId && isTargetIndex) {\r\n\t\t\t\t\tif (config.data_selection_isselectable(d) && !isSelected) {\r\n\t\t\t\t\t\ttoggle(true, shape.classed(CLASS.SELECTED, true), d, i);\r\n\t\t\t\t\t}\r\n\t\t\t\t} else if (isDefined(resetOther) && resetOther && isSelected) {\r\n\t\t\t\t\ttoggle(false, shape.classed(CLASS.SELECTED, false), d, i);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * Set data points to be un-selected.\r\n\t * @method unselect\r\n\t * @instance\r\n\t * @memberof Chart\r\n\t * @param {String} ids\r\n\t * @param {Number} indices\r\n\t * @example\r\n\t * // unselect from 'data1', indices 2\r\n\t * chart.unselect(\"data1\", 2);\r\n\t */\r\n\tunselect(ids, indices) {\r\n\t\tconst $$ = this.internal;\r\n\t\tconst config = $$.config;\r\n\r\n\t\tif (!config.data_selection_enabled) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t$$.main.selectAll(`.${CLASS.shapes}`)\r\n\t\t\t.selectAll(`.${CLASS.shape}`)\r\n\t\t\t.each(function(d, i) {\r\n\t\t\t\tconst shape = d3Select(this);\r\n\t\t\t\tconst id = d.data ? d.data.id : d.id;\r\n\t\t\t\tconst toggle = $$.getToggle(this, d).bind($$);\r\n\t\t\t\tconst isTargetId = config.data_selection_grouped || !ids || ids.indexOf(id) >= 0;\r\n\t\t\t\tconst isTargetIndex = !indices || indices.indexOf(i) >= 0;\r\n\t\t\t\tconst isSelected = shape.classed(CLASS.SELECTED);\r\n\r\n\t\t\t\t// line/area selection not supported yet\r\n\t\t\t\tif (shape.classed(CLASS.line) || shape.classed(CLASS.area)) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (isTargetId && isTargetIndex && config.data_selection_isselectable(d) && isSelected) {\r\n\t\t\t\t\ttoggle(false, shape.classed(CLASS.SELECTED, false), d, i);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t}\r\n});\r\n\n\n\n// WEBPACK FOOTER //\n// src/api/api.selection.js","/**\r\n * Copyright (c) 2017 NAVER Corp.\r\n * billboard.js project is licensed under the MIT license\r\n */\r\nimport Chart from \"../internals/Chart\";\r\nimport {extend} from \"../internals/util\";\r\n\r\nextend(Chart.prototype, {\r\n\t/**\r\n\t * Show data points\r\n\t * @method show\r\n\t * @instance\r\n\t * @memberof Chart\r\n\t * @param {String|Array} targetIdsValue\r\n\t * @param {Object} options\r\n\t */\r\n\tshow(targetIdsValue, options = {}) {\r\n\t\tconst $$ = this.internal;\r\n\r\n\t\tconst targetIds = $$.mapToTargetIds(targetIdsValue);\r\n\r\n\t\t$$.removeHiddenTargetIds(targetIds);\r\n\t\tconst targets = $$.svg.selectAll($$.selectorTargets(targetIds));\r\n\r\n\t\ttargets.transition()\r\n\t\t\t.style(\"opacity\", \"1\", \"important\")\r\n\t\t\t.call($$.endall, () => {\r\n\t\t\t\ttargets.style(\"opacity\", null).style(\"opacity\", \"1\");\r\n\t\t\t});\r\n\r\n\t\toptions.withLegend &&\r\n\t\t$$.showLegend(targetIds);\r\n\r\n\t\t$$.redraw({\r\n\t\t\twithUpdateOrgXDomain: true,\r\n\t\t\twithUpdateXDomain: true,\r\n\t\t\twithLegend: true\r\n\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * Hide data points\r\n\t * @method hide\r\n\t * @instance\r\n\t * @memberof Chart\r\n\t * @param {String|Array} targetIdsValue\r\n\t * @param {Object} options\r\n\t */\r\n\thide(targetIdsValue, options = {}) {\r\n\t\tconst $$ = this.internal;\r\n\t\tconst targetIds = $$.mapToTargetIds(targetIdsValue);\r\n\r\n\t\t$$.addHiddenTargetIds(targetIds);\r\n\t\tconst targets = $$.svg.selectAll($$.selectorTargets(targetIds));\r\n\r\n\t\ttargets.transition()\r\n\t\t\t.style(\"opacity\", \"0\", \"important\")\r\n\t\t\t.call($$.endall, () => {\r\n\t\t\t\ttargets.style(\"opacity\", null).style(\"opacity\", \"0\");\r\n\t\t\t});\r\n\r\n\t\toptions.withLegend &&\r\n\t\t$$.hideLegend(targetIds);\r\n\r\n\t\t$$.redraw({\r\n\t\t\twithUpdateOrgXDomain: true,\r\n\t\t\twithUpdateXDomain: true,\r\n\t\t\twithLegend: true\r\n\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * Toggle data points\r\n\t * @method toggle\r\n\t * @instance\r\n\t * @memberof Chart\r\n\t * @param {Array} targetIds\r\n\t * @param {Object} options\r\n\t */\r\n\ttoggle(targetIds, options = {}) {\r\n\t\tconst that = this;\r\n\t\tconst $$ = this.internal;\r\n\r\n\t\t$$.mapToTargetIds(targetIds).forEach(targetId => {\r\n\t\t\t$$.isTargetToShow(targetId) ?\r\n\t\t\t\tthat.hide(targetId, options) : that.show(targetId, options);\r\n\t\t});\r\n\t}\r\n});\r\n\r\n\n\n\n// WEBPACK FOOTER //\n// src/api/api.show.js","/**\r\n * Copyright (c) 2017 NAVER Corp.\r\n * billboard.js project is licensed under the MIT license\r\n */\r\nimport Chart from \"../internals/Chart\";\r\nimport {isValue, extend} from \"../internals/util\";\r\n\r\n/**\r\n * Define tooltip\r\n */\r\nconst tooltip = function() {};\r\n\r\n/**\r\n * Show tooltip\r\n * @method tooltip:show\r\n * @instance\r\n * @memberof Chart\r\n * @param {Array} args\r\n */\r\ntooltip.show = function(args) {\r\n\tconst $$ = this.internal;\r\n\tlet index;\r\n\tlet mouse;\r\n\r\n\t// determine mouse position on the chart\r\n\tif (args.mouse) {\r\n\t\tmouse = args.mouse;\r\n\t}\r\n\r\n\t// determine focus data\r\n\tif (args.data) {\r\n\t\tif ($$.isMultipleX()) {\r\n\t\t\t// if multiple xs, target point will be determined by mouse\r\n\t\t\tmouse = [\r\n\t\t\t\t$$.x(args.data.x),\r\n\t\t\t\t$$.getYScale(args.data.id)(args.data.value)\r\n\t\t\t];\r\n\r\n\t\t\tindex = null;\r\n\t\t} else {\r\n\t\t\t// TODO: when tooltip_grouped = false\r\n\t\t\tindex = isValue(args.data.index) ? args.data.index : $$.getIndexByX(args.data.x);\r\n\t\t}\r\n\t} else if (typeof args.x !== \"undefined\") {\r\n\t\tindex = $$.getIndexByX(args.x);\r\n\t} else if (typeof args.index !== \"undefined\") {\r\n\t\tindex = args.index;\r\n\t}\r\n\r\n\t// emulate mouse events to show\r\n\t$$.dispatchEvent(\"mouseover\", index, mouse);\r\n\t$$.dispatchEvent(\"mousemove\", index, mouse);\r\n\r\n\t$$.config.tooltip_onshow.call($$, args.data);\r\n};\r\n\r\n/**\r\n * Hide tooltip\r\n * @method tooltip:hide\r\n * @instance\r\n * @memberof Chart\r\n */\r\ntooltip.hide = function() {\r\n\t// TODO: get target data by checking the state of focus\r\n\tthis.internal.dispatchEvent(\"mouseout\", 0);\r\n\r\n\tthis.internal.config.tooltip_onhide.call(this);\r\n};\r\n\r\nextend(Chart.prototype, {tooltip});\r\n\n\n\n// WEBPACK FOOTER //\n// src/api/api.tooltip.js","/**\r\n * Copyright (c) 2017 NAVER Corp.\r\n * billboard.js project is licensed under the MIT license\r\n */\r\nimport Chart from \"../internals/Chart\";\r\nimport ChartInternal from \"../internals/ChartInternal\";\r\nimport {extend} from \"../internals/util\";\r\n\r\nextend(Chart.prototype, {\r\n\t/**\r\n\t * Change the type of the chart.\r\n\t * @method transform\r\n\t * @instance\r\n\t * @memberof Chart\r\n\t * @param {String} type Specify the type to be transformed. The types listed in data.type can be used.\r\n\t * @param {String|Array} targetIds Specify targets to be transformed. If not given, all targets will be the candidate.\r\n\t * @example\r\n\t * // all targets will be bar chart.\r\n\t * chart.transform(\"bar\");\r\n\t *\r\n\t * // only data1 will be bar chart.\r\n\t * chart.transform(\"bar\", \"data1\");\r\n\t *\r\n\t * // only data1 and data2 will be bar chart.\r\n\t * chart.transform(\"bar\", [\"data1\", \"data2\"]);\r\n\t */\r\n\ttransform(type, targetIds) {\r\n\t\tconst $$ = this.internal;\r\n\t\tconst options = [\"pie\", \"donut\"]\r\n\t\t\t.indexOf(type) >= 0 ? {withTransform: true} : null;\r\n\r\n\t\t$$.transformTo(targetIds, type, options);\r\n\t}\r\n});\r\n\r\nextend(ChartInternal.prototype, {\r\n\t/**\r\n\t * Change the type of the chart.\r\n\t * @private\r\n\t * @param {String|Array} targetIds\r\n\t * @param {String} type\r\n\t * @param {Object} optionsForRedraw\r\n\t */\r\n\ttransformTo(targetIds, type, optionsForRedraw) {\r\n\t\tconst $$ = this;\r\n\t\tconst withTransitionForAxis = !$$.hasArcType();\r\n\t\tconst options = optionsForRedraw || {withTransitionForAxis: withTransitionForAxis};\r\n\r\n\t\toptions.withTransitionForTransform = false;\r\n\t\t$$.transiting = false;\r\n\r\n\t\t$$.setTargetType(targetIds, type);\r\n\t\t$$.updateTargets($$.data.targets); // this is needed when transforming to arc\r\n\t\t$$.updateAndRedraw(options);\r\n\t}\r\n});\r\n\n\n\n// WEBPACK FOOTER //\n// src/api/api.transform.js","/**\r\n * Copyright (c) 2017 NAVER Corp.\r\n * billboard.js project is licensed under the MIT license\r\n */\r\nimport Chart from \"../internals/Chart\";\r\nimport {extend} from \"../internals/util\";\r\n\r\nextend(Chart.prototype, {\r\n\t/**\r\n\t * Get and set x values for the chart.\r\n\t * @method x\r\n\t * @instance\r\n\t * @memberof Chart\r\n\t * @param {Array} x If x is given, x values of every target will be updated. If no argument is given, current x values will be returned as an Object whose keys are the target ids.\r\n\t * @return {Object} xs\r\n\t * @example\r\n\t * // Get current x values\r\n\t * chart.x();\r\n\t *\r\n\t * // Update x values for all targets\r\n\t * chart.x([100, 200, 300, 400, ...]);\r\n\t */\r\n\tx(x) {\r\n\t\tconst $$ = this.internal;\r\n\r\n\t\tif (arguments.length) {\r\n\t\t\t$$.updateTargetX($$.data.targets, x);\r\n\r\n\t\t\t$$.redraw({\r\n\t\t\t\twithUpdateOrgXDomain: true,\r\n\t\t\t\twithUpdateXDomain: true\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\treturn $$.data.xs;\r\n\t},\r\n\r\n\t/**\r\n\t * Get and set x values for the chart.\r\n\t * @method xs\r\n\t * @instance\r\n\t * @memberof Chart\r\n\t * @param {Array} xs If xs is given, specified target's x values will be updated. If no argument is given, current x values will be returned as an Object whose keys are the target ids.\r\n\t * @return {Object} xs\r\n\t * @example\r\n\t * // Get current x values\r\n\t * chart.xs();\r\n\t *\r\n\t * // Update x values for all targets\r\n\t * chart.xs({\r\n\t * data1: [10, 20, 30, 40, ...],\r\n\t * data2: [100, 200, 300, 400, ...]\r\n\t * });\r\n\t */\r\n\txs(xs) {\r\n\t\tconst $$ = this.internal;\r\n\r\n\t\tif (arguments.length) {\r\n\t\t\t$$.updateTargetXs($$.data.targets, xs);\r\n\r\n\t\t\t$$.redraw({\r\n\t\t\t\twithUpdateOrgXDomain: true,\r\n\t\t\t\twithUpdateXDomain: true\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\treturn $$.data.xs;\r\n\t}\r\n});\r\n\n\n\n// WEBPACK FOOTER //\n// src/api/api.x.js","/**\r\n * Copyright (c) 2017 NAVER Corp.\r\n * billboard.js project is licensed under the MIT license\r\n */\r\nimport {\r\n\tmin as d3Min,\r\n\tmax as d3Max,\r\n\tzoomIdentity as d3ZoomIdentity,\r\n} from \"d3\";\r\nimport Chart from \"../internals/Chart\";\r\nimport {isDefined, extend} from \"../internals/util\";\r\n\r\n/**\r\n * Zoom by giving x domain.\r\n * @method zoom\r\n * @instance\r\n * @memberof Chart\r\n * @param {Array} domainValue If domain is given, the chart will be zoomed to the given domain. If no argument is given, the current zoomed domain will be returned.\r\n * @example\r\n * // Zoom to specified domain\r\n * chart.zoom([10, 20]);\r\n *\r\n * // Get the current zoomed domain\r\n * chart.zoom();\r\n */\r\nconst zoom = function(domainValue) {\r\n\tconst $$ = this.internal;\r\n\tlet domain = domainValue;\r\n\tlet resultDomain;\r\n\r\n\tif (domain) {\r\n\t\tif ($$.isTimeSeries()) {\r\n\t\t\tdomain = domain.map(x => $$.parseDate(x));\r\n\t\t}\r\n\r\n\t\tif ($$.config.subchart_show) {\r\n\t\t\tconst xScale = $$.zoomScale || $$.x;\r\n\r\n\t\t\t$$.brush.getSelection().call($$.brush.move, [xScale(domain[0]), xScale(domain[1])]);\r\n\t\t\tresultDomain = domain;\r\n\t\t} else {\r\n\t\t\tconst orgDomain = $$.x.orgDomain();\r\n\t\t\tconst k = (orgDomain[1] - orgDomain[0]) / (domain[1] - domain[0]);\r\n\t\t\tconst tx = $$.isTimeSeries() ?\r\n\t\t\t\t(0 - k * $$.x(domain[0].getTime())) : domain[0] - k * $$.x(domain[0]);\r\n\r\n\t\t\t$$.zoom.updateTransformScale(d3ZoomIdentity\r\n\t\t\t\t.translate(tx, 0)\r\n\t\t\t\t.scale(k));\r\n\t\t\tresultDomain = $$.zoomScale.domain();\r\n\t\t}\r\n\r\n\t\t$$.redraw({\r\n\t\t\twithTransition: true,\r\n\t\t\twithY: $$.config.zoom_rescale\r\n\t\t});\r\n\r\n\t\t$$.config.zoom_onzoom.call(this, $$.x.orgDomain());\r\n\t} else {\r\n\t\tresultDomain = ($$.zoomScale || $$.x).domain();\r\n\t}\r\n\treturn resultDomain;\r\n};\r\n\r\n/**\r\n * Enable and disable zooming.\r\n * @method zoom:enable\r\n * @instance\r\n * @memberof Chart\r\n * @param {Boolean} enabled If enabled is true, the feature of zooming will be enabled. If false is given, it will be disabled.\r\n * @example\r\n * // Enable zooming\r\n * chart.zoom.enable(true);\r\n */\r\nzoom.enable = function(enabled) {\r\n\tconst $$ = this.internal;\r\n\r\n\t$$.config.zoom_enabled = enabled;\r\n\t$$.updateAndRedraw();\r\n};\r\n\r\n/**\r\n * Set zoom max\r\n * @method zoom:max\r\n * @instance\r\n * @memberof Chart\r\n * @param {Number} max\r\n */\r\nzoom.max = function(max) {\r\n\tconst $$ = this.internal;\r\n\tconst config = $$.config;\r\n\r\n\tif (max === 0 || max) {\r\n\t\tconfig.zoom_x_max = d3Max([$$.orgXDomain[1], max]);\r\n\t} else {\r\n\t\treturn config.zoom_x_max;\r\n\t}\r\n\r\n\treturn undefined;\r\n};\r\n\r\n/**\r\n * Set zoom min\r\n * @method zoom:min\r\n * @instance\r\n * @memberof Chart\r\n * @param {Number} min\r\n */\r\nzoom.min = function(min) {\r\n\tconst $$ = this.internal;\r\n\tconst config = $$.config;\r\n\r\n\tif (min === 0 || min) {\r\n\t\tconfig.zoom_x_min = d3Min([$$.orgXDomain[0], min]);\r\n\t} else {\r\n\t\treturn config.zoom_x_min;\r\n\t}\r\n\r\n\treturn undefined;\r\n};\r\n\r\n/**\r\n * Set zoom range\r\n * @method zoom:range\r\n * @instance\r\n * @memberof Chart\r\n * @param {Object} range\r\n * @return {Object} range\r\n * {\r\n * min: 0,\r\n * max: 100\r\n * }\r\n * @example\r\n * chart.zoom.range({\r\n * min: 10,\r\n * max: 100\r\n * });\r\n */\r\nzoom.range = function(range) {\r\n\tif (arguments.length) {\r\n\t\tisDefined(range.max) && this.domain.max(range.max);\r\n\t\tisDefined(range.min) && this.domain.min(range.min);\r\n\t} else {\r\n\t\treturn {\r\n\t\t\tmax: this.domain.max(),\r\n\t\t\tmin: this.domain.min()\r\n\t\t};\r\n\t}\r\n\r\n\treturn undefined;\r\n};\r\n\r\nextend(Chart.prototype, {\r\n\tzoom,\r\n\t/**\r\n\t * Unzoom zoomed area\r\n\t * @method unzoom\r\n\t * @instance\r\n\t * @memberof Chart\r\n\t * @example\r\n\t * chart.unzoom();\r\n\t */\r\n\tunzoom() {\r\n\t\tconst $$ = this.internal;\r\n\r\n\t\tif ($$.config.subchart_show) {\r\n\t\t\t$$.brush.getSelection().call($$.brush.move, null);\r\n\t\t} else {\r\n\t\t\t$$.zoom.updateTransformScale(d3ZoomIdentity);\r\n\t\t}\r\n\r\n\t\t$$.redraw({\r\n\t\t\twithTransition: true,\r\n\t\t\twithY: $$.config.zoom_rescale\r\n\t\t});\r\n\t}\r\n});\r\n\n\n\n// WEBPACK FOOTER //\n// src/api/api.zoom.js","/**\r\n * Copyright (c) 2017 NAVER Corp.\r\n * billboard.js project is licensed under the MIT license\r\n */\r\nimport Options from \"./Options\";\r\nimport ChartInternal from \"../internals/ChartInternal\";\r\nimport {isDefined, merge, extend} from \"../internals/util\";\r\n\r\nextend(ChartInternal.prototype, {\r\n\tgetOptions() {\r\n\t\tconst config = new Options();\r\n\r\n\t\treturn merge(\r\n\t\t\tconfig.value,\r\n\t\t\tthis.additionalConfig\r\n\t\t);\r\n\t},\r\n\r\n\tadditionalConfig: {},\r\n\r\n\tloadConfig(config) {\r\n\t\tconst thisConfig = this.config;\r\n\t\tlet target;\r\n\t\tlet keys;\r\n\t\tlet read;\r\n\r\n\t\tfunction find() {\r\n\t\t\tconst key = keys.shift();\r\n\r\n\t\t\tif (key && target && typeof target === \"object\" && key in target) {\r\n\t\t\t\ttarget = target[key];\r\n\t\t\t\treturn find();\r\n\t\t\t} else if (!key) {\r\n\t\t\t\treturn target;\r\n\t\t\t} else {\r\n\t\t\t\treturn undefined;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tObject.keys(thisConfig).forEach(key => {\r\n\t\t\ttarget = config;\r\n\t\t\tkeys = key.split(\"_\");\r\n\t\t\tread = find();\r\n\r\n\t\t\tif (isDefined(read)) {\r\n\t\t\t\tthisConfig[key] = read;\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n});\r\n\r\n\n\n\n// WEBPACK FOOTER //\n// src/config/config.js","/**\r\n * Copyright (c) 2017 NAVER Corp.\r\n * billboard.js project is licensed under the MIT license\r\n */\r\nimport {\r\n\trequest as d3Request,\r\n\tkeys as d3Keys,\r\n\tcsvParse as d3CsvParse,\r\n\ttsvParse as d3TsvParse,\r\n\tcsvParseRows as d3CsvParseRows,\r\n\ttsvParseRows as d3TsvParseRows,\r\n} from \"d3\";\r\nimport ChartInternal from \"../internals/ChartInternal\";\r\nimport {isUndefined, isDefined, isValue, notEmpty, extend} from \"../internals/util\";\r\n\r\nextend(ChartInternal.prototype, {\r\n\tconvertUrlToData(url, mimeType = \"csv\", headers, keys, done) {\r\n\t\tconst type = mimeType;\r\n\t\tconst req = d3Request(url);\r\n\r\n\t\tif (headers) {\r\n\t\t\tfor (const header of Object.keys(headers)) {\r\n\t\t\t\treq.header(header, headers[header]);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treq.get((error, data) => {\r\n\t\t\tlet d;\r\n\r\n\t\t\tif (!data) {\r\n\t\t\t\tthrow new Error(`${error.responseURL} ${error.status} (${error.statusText})`);\r\n\t\t\t}\r\n\r\n\t\t\tconst response = data.response || data.responseText;\r\n\r\n\t\t\tif (type === \"json\") {\r\n\t\t\t\td = this.convertJsonToData(JSON.parse(response), keys);\r\n\t\t\t} else if (type === \"tsv\") {\r\n\t\t\t\t// ref : https://github.com/d3/d3-dsv#dsv_parse\r\n\t\t\t\td = this.convertTsvToData(response);\r\n\t\t\t} else {\r\n\t\t\t\td = this.convertCsvToData(response);\r\n\t\t\t}\r\n\r\n\t\t\tdone.call(this, d);\r\n\t\t});\r\n\t},\r\n\r\n\tconvertCsvToData(xsv) {\r\n\t\tconst rows = d3CsvParseRows(xsv);\r\n\t\tlet d;\r\n\r\n\t\tif (rows.length === 1) {\r\n\t\t\td = [{}];\r\n\t\t\trows[0].forEach(id => {\r\n\t\t\t\td[0][id] = null;\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\td = d3CsvParse(xsv);\r\n\t\t}\r\n\r\n\t\treturn d;\r\n\t},\r\n\r\n\tconvertTsvToData(xsv) {\r\n\t\tconst rows = d3TsvParseRows(xsv);\r\n\t\tlet d;\r\n\r\n\t\tif (rows.length === 1) {\r\n\t\t\td = [{}];\r\n\t\t\trows[0].forEach(id => {\r\n\t\t\t\td[0][id] = null;\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\td = d3TsvParse(xsv);\r\n\t\t}\r\n\r\n\t\treturn d;\r\n\t},\r\n\r\n\tconvertJsonToData(json, keys) {\r\n\t\tconst newRows = [];\r\n\t\tlet targetKeys;\r\n\t\tlet data;\r\n\r\n\t\tif (keys) { // when keys specified, json would be an array that includes objects\r\n\t\t\tif (keys.x) {\r\n\t\t\t\ttargetKeys = keys.value.concat(keys.x);\r\n\t\t\t\tthis.config.data_x = keys.x;\r\n\t\t\t} else {\r\n\t\t\t\ttargetKeys = keys.value;\r\n\t\t\t}\r\n\t\t\tnewRows.push(targetKeys);\r\n\r\n\t\t\tjson.forEach(o => {\r\n\t\t\t\tconst newRow = [];\r\n\t\t\t\tlet v;\r\n\r\n\t\t\t\tfor (const key of targetKeys) {\r\n\t\t\t\t\t// convert undefined to null because undefined data will be removed in convertDataToTargets()\r\n\t\t\t\t\tv = this.findValueInJson(o, key);\r\n\t\t\t\t\tif (isUndefined(v)) {\r\n\t\t\t\t\t\tv = null;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tnewRow.push(v);\r\n\t\t\t\t}\r\n\t\t\t\tnewRows.push(newRow);\r\n\t\t\t});\r\n\t\t\tdata = this.convertRowsToData(newRows);\r\n\t\t} else {\r\n\t\t\tObject.keys(json).forEach(key => newRows.push([key].concat(json[key])));\r\n\t\t\tdata = this.convertColumnsToData(newRows);\r\n\t\t}\r\n\t\treturn data;\r\n\t},\r\n\r\n\tfindValueInJson(object, path) {\r\n\t\tconst convertedPath = path.replace(/\\[(\\w+)\\]/g, \".$1\"); // convert indexes to properties (replace [] with .)\r\n\t\tconst pathArray = convertedPath.replace(/^\\./, \"\").split(\".\"); // strip a leading dot\r\n\t\tlet target = object;\r\n\r\n\t\tfor (const k of pathArray) {\r\n\t\t\tif (k in target) {\r\n\t\t\t\ttarget = target[k];\r\n\t\t\t} else {\r\n\t\t\t\ttarget = undefined;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn target;\r\n\t},\r\n\r\n\tconvertRowsToData(rows) {\r\n\t\tconst keys = rows[0];\r\n\t\tconst newRows = [];\r\n\t\tlet newRow = {};\r\n\t\tlet i;\r\n\t\tlet j;\r\n\r\n\t\tfor (i = 1; i < rows.length; i++) {\r\n\t\t\tnewRow = {};\r\n\t\t\tfor (j = 0; j < rows[i].length; j++) {\r\n\t\t\t\tif (isUndefined(rows[i][j])) {\r\n\t\t\t\t\tthrow new Error(`Source data is missing a component at (${i}, ${j})!`);\r\n\t\t\t\t}\r\n\t\t\t\tnewRow[keys[j]] = rows[i][j];\r\n\t\t\t}\r\n\t\t\tnewRows.push(newRow);\r\n\t\t}\r\n\r\n\t\treturn newRows;\r\n\t},\r\n\r\n\tconvertColumnsToData(columns) {\r\n\t\tconst newRows = [];\r\n\t\tlet i;\r\n\t\tlet j;\r\n\t\tlet key;\r\n\r\n\t\tfor (i = 0; i < columns.length; i++) {\r\n\t\t\tkey = columns[i][0];\r\n\t\t\tfor (j = 1; j < columns[i].length; j++) {\r\n\t\t\t\tif (isUndefined(newRows[j - 1])) {\r\n\t\t\t\t\tnewRows[j - 1] = {};\r\n\t\t\t\t}\r\n\t\t\t\tif (isUndefined(columns[i][j])) {\r\n\t\t\t\t\tthrow new Error(`Source data is missing a component at (${i}, ${j})!`);\r\n\t\t\t\t}\r\n\t\t\t\tnewRows[j - 1][key] = columns[i][j];\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn newRows;\r\n\t},\r\n\r\n\tconvertDataToTargets(data, appendXs) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tconst ids = d3Keys(data[0]).filter($$.isNotX, $$);\r\n\t\tconst xs = d3Keys(data[0]).filter($$.isX, $$);\r\n\r\n\t\t// save x for update data by load when custom x and bb.x API\r\n\t\tids.forEach(id => {\r\n\t\t\tconst xKey = this.getXKey(id);\r\n\r\n\t\t\tif (this.isCustomX() || this.isTimeSeries()) {\r\n\t\t\t\t// if included in input data\r\n\t\t\t\tif (xs.indexOf(xKey) >= 0) {\r\n\t\t\t\t\tthis.data.xs[id] =\r\n\t\t\t\t\t\t(appendXs && $$.data.xs[id] ? $$.data.xs[id] : [])\r\n\t\t\t\t\t\t\t.concat(\r\n\t\t\t\t\t\t\t\tdata.map(d => d[xKey])\r\n\t\t\t\t\t\t\t\t\t.filter(isValue)\r\n\t\t\t\t\t\t\t\t\t.map((rawX, i) => $$.generateTargetX(rawX, id, i)));\r\n\t\t\t\t} else if (config.data_x) {\r\n\t\t\t\t\t// if not included in input data, find from preloaded data of other id's x\r\n\t\t\t\t\tthis.data.xs[id] = this.getOtherTargetXs();\r\n\t\t\t\t} else if (notEmpty(config.data_xs)) {\r\n\t\t\t\t\t// if not included in input data, find from preloaded data\r\n\t\t\t\t\t$$.data.xs[id] = $$.getXValuesOfXKey(xKey, $$.data.targets);\r\n\t\t\t\t}\r\n\t\t\t\t// MEMO: if no x included, use same x of current will be used\r\n\t\t\t} else {\r\n\t\t\t\t$$.data.xs[id] = data.map((d, i) => i);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\r\n\t\t// check x is defined\r\n\t\tids.forEach(id => {\r\n\t\t\tif (!$$.data.xs[id]) {\r\n\t\t\t\tthrow new Error(`x is not defined for id = \"${id}\".`);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t// convert to target\r\n\t\tconst targets = ids.map((id, index) => {\r\n\t\t\tconst convertedId = config.data_idConverter(id);\r\n\r\n\t\t\treturn {\r\n\t\t\t\tid: convertedId,\r\n\t\t\t\tid_org: id,\r\n\t\t\t\tvalues: data.map((d, i) => {\r\n\t\t\t\t\tconst xKey = $$.getXKey(id);\r\n\t\t\t\t\tconst rawX = d[xKey];\r\n\t\t\t\t\tconst value = d[id] !== null && !isNaN(d[id]) ? +d[id] : null;\r\n\t\t\t\t\tlet x;\r\n\r\n\t\t\t\t\t// use x as categories if custom x and categorized\r\n\t\t\t\t\tif ($$.isCustomX() && $$.isCategorized() && index === 0 && !isUndefined(rawX)) {\r\n\t\t\t\t\t\tif (index === 0 && i === 0) {\r\n\t\t\t\t\t\t\tconfig.axis_x_categories = [];\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tx = config.axis_x_categories.indexOf(rawX);\r\n\t\t\t\t\t\tif (x === -1) {\r\n\t\t\t\t\t\t\tx = config.axis_x_categories.length;\r\n\t\t\t\t\t\t\tconfig.axis_x_categories.push(rawX);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tx = $$.generateTargetX(rawX, id, i);\r\n\t\t\t\t\t}\r\n\t\t\t\t\t// mark as x = undefined if value is undefined and filter to remove after mapped\r\n\t\t\t\t\tif (isUndefined(d[id]) || $$.data.xs[id].length <= i) {\r\n\t\t\t\t\t\tx = undefined;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn {x: x, value: value, id: convertedId};\r\n\t\t\t\t}).filter(v => isDefined(v.x))\r\n\t\t\t};\r\n\t\t});\r\n\r\n\t\t// finish targets\r\n\t\ttargets.forEach(t => {\r\n\t\t\tlet i;\r\n\r\n\t\t\t// sort values by its x\r\n\t\t\tif (config.data_xSort) {\r\n\t\t\t\tt.values = t.values.sort((v1, v2) => {\r\n\t\t\t\t\tconst x1 = v1.x || v1.x === 0 ? v1.x : Infinity;\r\n\t\t\t\t\tconst x2 = v2.x || v2.x === 0 ? v2.x : Infinity;\r\n\r\n\t\t\t\t\treturn x1 - x2;\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\t// indexing each value\r\n\t\t\ti = 0;\r\n\t\t\tt.values.forEach(v => {\r\n\t\t\t\tv.index = i++;\r\n\t\t\t});\r\n\t\t\t// this needs to be sorted because its index and value.index is identical\r\n\t\t\t$$.data.xs[t.id].sort((v1, v2) => v1 - v2);\r\n\t\t});\r\n\r\n\t\t// cache information about values\r\n\t\t$$.hasNegativeValue = $$.hasNegativeValueInTargets(targets);\r\n\t\t$$.hasPositiveValue = $$.hasPositiveValueInTargets(targets);\r\n\r\n\t\t// set target types\r\n\t\tif (config.data_type) {\r\n\t\t\t$$.setTargetType($$.mapToIds(targets)\r\n\t\t\t\t.filter(id => !(id in config.data_types)), config.data_type);\r\n\t\t}\r\n\r\n\t\t// cache as original id keyed\r\n\t\ttargets.forEach(d => {\r\n\t\t\t$$.addCache(d.id_org, d);\r\n\t\t});\r\n\r\n\t\treturn targets;\r\n\t}\r\n});\r\n\n\n\n// WEBPACK FOOTER //\n// src/data/data.convert.js","/**\r\n * Copyright (c) 2017 NAVER Corp.\r\n * billboard.js project is licensed under the MIT license\r\n */\r\nimport {\r\n\tset as d3Set,\r\n\tmax as d3Max,\r\n\tmin as d3Min,\r\n\tmerge as d3Merge\r\n} from \"d3\";\r\nimport CLASS from \"../config/classes\";\r\nimport ChartInternal from \"../internals/ChartInternal\";\r\nimport {extend, hasValue, isValue, notEmpty, isFunction} from \"../internals/util\";\r\n\r\nextend(ChartInternal.prototype, {\r\n\tisX(key) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tconst dataKey = config.data_x && key === config.data_x;\r\n\t\tconst existValue = notEmpty(config.data_xs) && hasValue(config.data_xs, key);\r\n\r\n\t\treturn (dataKey) || (existValue);\r\n\t},\r\n\r\n\tisNotX(key) {\r\n\t\treturn !this.isX(key);\r\n\t},\r\n\r\n\tgetXKey(id) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\r\n\t\treturn config.data_x ? config.data_x : notEmpty(config.data_xs) ? config.data_xs[id] : null;\r\n\t},\r\n\r\n\tgetXValuesOfXKey(key, targets) {\r\n\t\tconst $$ = this;\r\n\t\tconst ids = targets && notEmpty(targets) ? $$.mapToIds(targets) : [];\r\n\t\tlet xValues;\r\n\r\n\t\tids.forEach(id => {\r\n\t\t\tif ($$.getXKey(id) === key) {\r\n\t\t\t\txValues = $$.data.xs[id];\r\n\t\t\t}\r\n\t\t});\r\n\t\treturn xValues;\r\n\t},\r\n\r\n\tgetIndexByX(x) {\r\n\t\tconst $$ = this;\r\n\t\tconst data = $$.filterByX($$.data.targets, x);\r\n\r\n\t\treturn data.length ? data[0].index : null;\r\n\t},\r\n\r\n\tgetXValue(id, i) {\r\n\t\tconst $$ = this;\r\n\r\n\t\treturn id in $$.data.xs && $$.data.xs[id] && isValue($$.data.xs[id][i]) ? $$.data.xs[id][i] : i;\r\n\t},\r\n\r\n\tgetOtherTargetXs() {\r\n\t\tconst $$ = this;\r\n\t\tconst idsForX = Object.keys($$.data.xs);\r\n\r\n\t\treturn idsForX.length ? $$.data.xs[idsForX[0]] : null;\r\n\t},\r\n\r\n\tgetOtherTargetX(index) {\r\n\t\tconst xs = this.getOtherTargetXs();\r\n\r\n\t\treturn xs && index < xs.length ? xs[index] : null;\r\n\t},\r\n\r\n\taddXs(xs) {\r\n\t\tconst $$ = this;\r\n\r\n\t\tObject.keys(xs).forEach(id => {\r\n\t\t\t$$.config.data_xs[id] = xs[id];\r\n\t\t});\r\n\t},\r\n\r\n\thasMultipleX(xs) {\r\n\t\t// https://github.com/d3/d3-collection\r\n\t\treturn d3Set(Object.keys(xs).map(id => xs[id])).size() > 1;\r\n\t},\r\n\r\n\tisMultipleX() {\r\n\t\treturn notEmpty(this.config.data_xs) || !this.config.data_xSort || this.hasType(\"scatter\");\r\n\t},\r\n\r\n\taddName(data) {\r\n\t\tconst $$ = this;\r\n\t\tlet name;\r\n\r\n\t\tif (data) {\r\n\t\t\tname = $$.config.data_names[data.id];\r\n\t\t\tdata.name = name !== undefined ? name : data.id;\r\n\t\t}\r\n\t\treturn data;\r\n\t},\r\n\r\n\tgetValueOnIndex(values, index) {\r\n\t\tconst valueOnIndex = values.filter(v => v.index === index);\r\n\r\n\t\treturn valueOnIndex.length ? valueOnIndex[0] : null;\r\n\t},\r\n\r\n\tupdateTargetX(targets, x) {\r\n\t\tconst $$ = this;\r\n\r\n\t\ttargets.forEach(t => {\r\n\t\t\tt.values.forEach((v, i) => {\r\n\t\t\t\tv.x = $$.generateTargetX(x[i], t.id, i);\r\n\t\t\t});\r\n\t\t\t$$.data.xs[t.id] = x;\r\n\t\t});\r\n\t},\r\n\r\n\tupdateTargetXs(targets, xs) {\r\n\t\tconst $$ = this;\r\n\r\n\t\ttargets.forEach(t => {\r\n\t\t\tif (xs[t.id]) {\r\n\t\t\t\t$$.updateTargetX([t], xs[t.id]);\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\r\n\tgenerateTargetX(rawX, id, index) {\r\n\t\tconst $$ = this;\r\n\t\tlet x;\r\n\r\n\t\tif ($$.isTimeSeries()) {\r\n\t\t\tx = rawX ? $$.parseDate(rawX) : $$.parseDate($$.getXValue(id, index));\r\n\t\t} else if ($$.isCustomX() && !$$.isCategorized()) {\r\n\t\t\tx = isValue(rawX) ? +rawX : $$.getXValue(id, index);\r\n\t\t} else {\r\n\t\t\tx = index;\r\n\t\t}\r\n\t\treturn x;\r\n\t},\r\n\r\n\tcloneTarget(target) {\r\n\t\treturn {\r\n\t\t\tid: target.id,\r\n\t\t\tid_org: target.id_org,\r\n\t\t\tvalues: target.values.map(d => ({x: d.x, value: d.value, id: d.id}))\r\n\t\t};\r\n\t},\r\n\r\n\tupdateXs() {\r\n\t\tconst $$ = this;\r\n\r\n\t\tif ($$.data.targets.length) {\r\n\t\t\t$$.xs = [];\r\n\t\t\t$$.data.targets[0].values.forEach(v => {\r\n\t\t\t\t$$.xs[v.index] = v.x;\r\n\t\t\t});\r\n\t\t}\r\n\t},\r\n\r\n\tgetPrevX(i) {\r\n\t\tconst x = this.xs[i - 1];\r\n\r\n\t\treturn typeof x !== \"undefined\" ? x : null;\r\n\t},\r\n\r\n\tgetNextX(i) {\r\n\t\tconst x = this.xs[i + 1];\r\n\r\n\t\treturn typeof x !== \"undefined\" ? x : null;\r\n\t},\r\n\r\n\tgetMaxDataCount() {\r\n\t\tconst $$ = this;\r\n\r\n\t\treturn d3Max($$.data.targets, t => t.values.length);\r\n\t},\r\n\r\n\tgetMaxDataCountTarget(targets) {\r\n\t\tconst length = targets.length;\r\n\t\tlet max = 0;\r\n\t\tlet maxTarget;\r\n\r\n\t\tif (length > 1) {\r\n\t\t\ttargets.forEach(t => {\r\n\t\t\t\tif (t.values.length > max) {\r\n\t\t\t\t\tmaxTarget = t;\r\n\t\t\t\t\tmax = t.values.length;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\tmaxTarget = length ? targets[0] : null;\r\n\t\t}\r\n\t\treturn maxTarget;\r\n\t},\r\n\r\n\tgetEdgeX(targets) {\r\n\t\treturn !targets.length ? [0, 0] : [\r\n\t\t\td3Min(targets, t => t.values[0].x),\r\n\t\t\td3Max(targets, t => t.values[t.values.length - 1].x)\r\n\t\t];\r\n\t},\r\n\r\n\tmapToIds(targets) {\r\n\t\treturn targets.map(d => d.id);\r\n\t},\r\n\r\n\tmapToTargetIds(ids) {\r\n\t\tconst $$ = this;\r\n\r\n\t\treturn ids ? [].concat(ids) : $$.mapToIds($$.data.targets);\r\n\t},\r\n\r\n\thasTarget(targets, id) {\r\n\t\tconst ids = this.mapToIds(targets);\r\n\t\tlet i;\r\n\r\n\t\tfor (i = 0; i < ids.length; i++) {\r\n\t\t\tif (ids[i] === id) {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t},\r\n\r\n\tisTargetToShow(targetId) {\r\n\t\treturn this.hiddenTargetIds.indexOf(targetId) < 0;\r\n\t},\r\n\r\n\tisLegendToShow(targetId) {\r\n\t\treturn this.hiddenLegendIds.indexOf(targetId) < 0;\r\n\t},\r\n\r\n\tfilterTargetsToShow(targets) {\r\n\t\tconst $$ = this;\r\n\r\n\t\treturn targets.filter(t => $$.isTargetToShow(t.id));\r\n\t},\r\n\r\n\tmapTargetsToUniqueXs(targets) {\r\n\t\tconst $$ = this;\r\n\t\tlet xs = d3Set(d3Merge(\r\n\t\t\ttargets.map(t => t.values.map(v => +v.x))\r\n\t\t)).values();\r\n\r\n\t\txs = $$.isTimeSeries() ? xs.map(x => new Date(+x)) : xs.map(x => +x);\r\n\t\treturn xs.sort((a, b) => (a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN));\r\n\t},\r\n\r\n\taddHiddenTargetIds(targetIds) {\r\n\t\tthis.hiddenTargetIds = this.hiddenTargetIds.concat(targetIds);\r\n\t},\r\n\r\n\tremoveHiddenTargetIds(targetIds) {\r\n\t\tthis.hiddenTargetIds = this.hiddenTargetIds.filter(id => targetIds.indexOf(id) < 0);\r\n\t},\r\n\r\n\taddHiddenLegendIds(targetIds) {\r\n\t\tthis.hiddenLegendIds = this.hiddenLegendIds.concat(targetIds);\r\n\t},\r\n\r\n\tremoveHiddenLegendIds(targetIds) {\r\n\t\tthis.hiddenLegendIds = this.hiddenLegendIds.filter(id => targetIds.indexOf(id) < 0);\r\n\t},\r\n\r\n\tgetValuesAsIdKeyed(targets) {\r\n\t\tconst ys = {};\r\n\r\n\t\ttargets.forEach(t => {\r\n\t\t\tys[t.id] = [];\r\n\t\t\tt.values.forEach(v => {\r\n\t\t\t\tys[t.id].push(v.value);\r\n\t\t\t});\r\n\t\t});\r\n\t\treturn ys;\r\n\t},\r\n\r\n\tcheckValueInTargets(targets, checker) {\r\n\t\tconst ids = Object.keys(targets);\r\n\t\tlet i;\r\n\t\tlet j;\r\n\t\tlet values;\r\n\r\n\t\tfor (i = 0; i < ids.length; i++) {\r\n\t\t\tvalues = targets[ids[i]].values;\r\n\t\t\tfor (j = 0; j < values.length; j++) {\r\n\t\t\t\tif (checker(values[j].value)) {\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t},\r\n\r\n\thasNegativeValueInTargets(targets) {\r\n\t\treturn this.checkValueInTargets(targets, v => v < 0);\r\n\t},\r\n\r\n\thasPositiveValueInTargets(targets) {\r\n\t\treturn this.checkValueInTargets(targets, v => v > 0);\r\n\t},\r\n\r\n\tisOrderDesc() {\r\n\t\tconst config = this.config;\r\n\r\n\t\treturn typeof(config.data_order) === \"string\" && config.data_order.toLowerCase() === \"desc\";\r\n\t},\r\n\r\n\tisOrderAsc() {\r\n\t\tconst config = this.config;\r\n\r\n\t\treturn typeof(config.data_order) === \"string\" && config.data_order.toLowerCase() === \"asc\";\r\n\t},\r\n\r\n\torderTargets(targets) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tconst orderAsc = $$.isOrderAsc();\r\n\t\tconst orderDesc = $$.isOrderDesc();\r\n\r\n\t\tif (orderAsc || orderDesc) {\r\n\t\t\ttargets.sort((t1, t2) => {\r\n\t\t\t\tconst reducer = (p, c) => p + Math.abs(c.value);\r\n\t\t\t\tconst t1Sum = t1.values.reduce(reducer, 0);\r\n\t\t\t\tconst t2Sum = t2.values.reduce(reducer, 0);\r\n\r\n\t\t\t\treturn orderAsc ? t2Sum - t1Sum : t1Sum - t2Sum;\r\n\t\t\t});\r\n\t\t} else if (isFunction(config.data_order)) {\r\n\t\t\ttargets.sort(config.data_order);\r\n\t\t} // TODO: accept name array for order\r\n\t\treturn targets;\r\n\t},\r\n\r\n\tfilterByX(targets, x) {\r\n\t\treturn d3Merge(targets.map(t => t.values)).filter(v => v.x - x === 0);\r\n\t},\r\n\r\n\tfilterRemoveNull(data) {\r\n\t\treturn data.filter(d => isValue(d.value));\r\n\t},\r\n\r\n\tfilterByXDomain(targets, xDomain) {\r\n\t\treturn targets.map(t => ({\r\n\t\t\tid: t.id,\r\n\t\t\tid_org: t.id_org,\r\n\t\t\tvalues: t.values.filter(v => xDomain[0] <= v.x && v.x <= xDomain[1])\r\n\t\t}));\r\n\t},\r\n\r\n\thasDataLabel() {\r\n\t\tconst config = this.config;\r\n\r\n\t\tif (typeof config.data_labels === \"boolean\" && config.data_labels) {\r\n\t\t\treturn true;\r\n\t\t} else if (typeof config.data_labels === \"object\" && notEmpty(config.data_labels)) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\treturn false;\r\n\t},\r\n\r\n\tgetDataLabelLength(min, max, key) {\r\n\t\tconst $$ = this;\r\n\t\tconst lengths = [0, 0];\r\n\t\tconst paddingCoef = 1.3;\r\n\r\n\t\t$$.selectChart.select(\"svg\").selectAll(\".dummy\")\r\n\t\t\t.data([min, max])\r\n\t\t\t.enter()\r\n\t\t\t.append(\"text\")\r\n\t\t\t.text(d => $$.dataLabelFormat(d.id)(d))\r\n\t\t\t.each(function(d, i) {\r\n\t\t\t\tlengths[i] = this.getBoundingClientRect()[key] * paddingCoef;\r\n\t\t\t})\r\n\t\t\t.remove();\r\n\t\treturn lengths;\r\n\t},\r\n\r\n\tisNoneArc(d) {\r\n\t\treturn this.hasTarget(this.data.targets, d.id);\r\n\t},\r\n\r\n\tisArc(d) {\r\n\t\treturn \"data\" in d && this.hasTarget(this.data.targets, d.data.id);\r\n\t},\r\n\r\n\tfindSameXOfValues(values, index) {\r\n\t\tconst targetX = values[index].x;\r\n\t\tconst sames = [];\r\n\t\tlet i;\r\n\r\n\t\tfor (i = index - 1; i >= 0; i--) {\r\n\t\t\tif (targetX !== values[i].x) { break; }\r\n\t\t\tsames.push(values[i]);\r\n\t\t}\r\n\t\tfor (i = index; i < values.length; i++) {\r\n\t\t\tif (targetX !== values[i].x) { break; }\r\n\t\t\tsames.push(values[i]);\r\n\t\t}\r\n\t\treturn sames;\r\n\t},\r\n\r\n\tfindClosestFromTargets(targets, pos) {\r\n\t\tconst $$ = this;\r\n\t\tconst candidates = targets.map(target => $$.findClosest(target.values, pos)); // map to array of closest points of each target\r\n\r\n\t\t// decide closest point and return\r\n\t\treturn $$.findClosest(candidates, pos);\r\n\t},\r\n\r\n\tfindClosest(values, pos) {\r\n\t\tconst $$ = this;\r\n\t\tlet minDist = $$.config.point_sensitivity;\r\n\t\tlet closest;\r\n\r\n\t\t// find mouseovering bar\r\n\t\tvalues\r\n\t\t\t.filter(v => v && $$.isBarType(v.id))\r\n\t\t\t.forEach(v => {\r\n\t\t\t\tconst shape = $$.main.select().node(`.${CLASS.bars}${$$.getTargetSelectorSuffix(v.id)}.${CLASS.bar}-${v.index}`);\r\n\r\n\t\t\t\tif (!closest && $$.isWithinBar(shape)) {\r\n\t\t\t\t\tclosest = v;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t// find closest point from non-bar\r\n\t\tvalues\r\n\t\t\t.filter(v => v && !$$.isBarType(v.id))\r\n\t\t\t.forEach(v => {\r\n\t\t\t\tconst d = $$.dist(v, pos);\r\n\r\n\t\t\t\tif (d < minDist) {\r\n\t\t\t\t\tminDist = d;\r\n\t\t\t\t\tclosest = v;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\treturn closest;\r\n\t},\r\n\r\n\tdist(data, pos) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tconst xIndex = config.axis_rotated ? 1 : 0;\r\n\t\tconst yIndex = config.axis_rotated ? 0 : 1;\r\n\t\tconst y = $$.circleY(data, data.index);\r\n\t\tconst x = $$.x(data.x);\r\n\r\n\t\treturn Math.sqrt(Math.pow(x - pos[xIndex], 2) + Math.pow(y - pos[yIndex], 2));\r\n\t},\r\n\r\n\tconvertValuesToStep(values) {\r\n\t\tconst converted = [].concat(values);\r\n\t\tlet i;\r\n\r\n\t\tif (!this.isCategorized()) {\r\n\t\t\treturn values;\r\n\t\t}\r\n\r\n\t\tfor (i = values.length + 1; i > 0; i--) {\r\n\t\t\tconverted[i] = converted[i - 1];\r\n\t\t}\r\n\r\n\t\tconverted[0] = {\r\n\t\t\tx: converted[0].x - 1,\r\n\t\t\tvalue: converted[0].value,\r\n\t\t\tid: converted[0].id\r\n\t\t};\r\n\t\tconverted[values.length + 1] = {\r\n\t\t\tx: converted[values.length].x + 1,\r\n\t\t\tvalue: converted[values.length].value,\r\n\t\t\tid: converted[values.length].id\r\n\t\t};\r\n\r\n\t\treturn converted;\r\n\t},\r\n\r\n\tupdateDataAttributes(name, attrs) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tconst current = config[`data_${name}`];\r\n\r\n\t\tif (typeof attrs === \"undefined\") {\r\n\t\t\treturn current;\r\n\t\t}\r\n\t\tObject.keys(attrs).forEach(id => {\r\n\t\t\tcurrent[id] = attrs[id];\r\n\t\t});\r\n\t\t$$.redraw({withLegend: true});\r\n\t\treturn current;\r\n\t}\r\n});\r\n\r\n\n\n\n// WEBPACK FOOTER //\n// src/data/data.js","/**\r\n * Copyright (c) 2017 NAVER Corp.\r\n * billboard.js project is licensed under the MIT license\r\n */\r\nimport CLASS from \"../config/classes\";\r\nimport ChartInternal from \"../internals/ChartInternal\";\r\nimport {extend} from \"../internals/util\";\r\n\r\nextend(ChartInternal.prototype, {\r\n\tload(rawTargets, args) {\r\n\t\tconst $$ = this;\r\n\t\tlet targets = rawTargets;\r\n\r\n\t\tif (targets) {\r\n\t\t\t// filter loading targets if needed\r\n\t\t\tif (args.filter) {\r\n\t\t\t\ttargets = targets.filter(args.filter);\r\n\t\t\t}\r\n\t\t\t// set type if args.types || args.type specified\r\n\t\t\tif (args.type || args.types) {\r\n\t\t\t\ttargets.forEach(t => {\r\n\t\t\t\t\tconst type = args.types && args.types[t.id] ? args.types[t.id] : args.type;\r\n\r\n\t\t\t\t\t$$.setTargetType(t.id, type);\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\t// Update/Add data\r\n\t\t\t$$.data.targets.forEach(d => {\r\n\t\t\t\tfor (let i = 0; i < targets.length; i++) {\r\n\t\t\t\t\tif (d.id === targets[i].id) {\r\n\t\t\t\t\t\td.values = targets[i].values;\r\n\t\t\t\t\t\ttargets.splice(i, 1);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\t$$.data.targets = $$.data.targets.concat(targets); // add remained\r\n\t\t}\r\n\r\n\t\t// Set targets\r\n\t\t$$.updateTargets($$.data.targets);\r\n\r\n\t\t// Redraw with new targets\r\n\t\t$$.redraw({withUpdateOrgXDomain: true, withUpdateXDomain: true, withLegend: true});\r\n\r\n\t\tif (args.done) { args.done(); }\r\n\t},\r\n\r\n\tloadFromArgs(args) {\r\n\t\tconst $$ = this;\r\n\r\n\t\tif (args.data) {\r\n\t\t\t$$.load($$.convertDataToTargets(args.data), args);\r\n\t\t} else if (args.url) {\r\n\t\t\t$$.convertUrlToData(args.url, args.mimeType, args.headers, args.keys, data => {\r\n\t\t\t\t$$.load($$.convertDataToTargets(data), args);\r\n\t\t\t});\r\n\t\t} else if (args.json) {\r\n\t\t\t$$.load($$.convertDataToTargets($$.convertJsonToData(args.json, args.keys)), args);\r\n\t\t} else if (args.rows) {\r\n\t\t\t$$.load($$.convertDataToTargets($$.convertRowsToData(args.rows)), args);\r\n\t\t} else if (args.columns) {\r\n\t\t\t$$.load($$.convertDataToTargets($$.convertColumnsToData(args.columns)), args);\r\n\t\t} else {\r\n\t\t\t$$.load(null, args);\r\n\t\t}\r\n\t},\r\n\r\n\tunload(rawTargetIds, customDoneCb) {\r\n\t\tconst $$ = this;\r\n\t\tlet done = customDoneCb;\r\n\t\tlet targetIds = rawTargetIds;\r\n\r\n\t\tif (!done) {\r\n\t\t\tdone = () => {};\r\n\t\t}\r\n\r\n\t\t// filter existing target\r\n\t\ttargetIds = targetIds.filter(id => $$.hasTarget($$.data.targets, id));\r\n\r\n\t\t// If no target, call done and return\r\n\t\tif (!targetIds || targetIds.length === 0) {\r\n\t\t\tdone();\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t$$.svg.selectAll(targetIds.map(id => $$.selectorTarget(id)))\r\n\t\t\t.transition()\r\n\t\t\t.style(\"opacity\", \"0\")\r\n\t\t\t.remove()\r\n\t\t\t.call($$.endall, done);\r\n\r\n\t\ttargetIds.forEach(id => {\r\n\t\t\t// Reset fadein for future load\r\n\t\t\t$$.withoutFadeIn[id] = false;\r\n\t\t\t// Remove target's elements\r\n\t\t\tif ($$.legend) {\r\n\t\t\t\t$$.legend.selectAll(`.${CLASS.legendItem}${$$.getTargetSelectorSuffix(id)}`).remove();\r\n\t\t\t}\r\n\t\t\t// Remove target\r\n\t\t\t$$.data.targets = $$.data.targets.filter(t => t.id !== id);\r\n\t\t});\r\n\t}\r\n});\r\n\r\n\n\n\n// WEBPACK FOOTER //\n// src/data/data.load.js","/**\r\n * Copyright (c) 2017 NAVER Corp.\r\n * billboard.js project is licensed under the MIT license\r\n */\r\nimport {\r\n\tselect as d3Select,\r\n} from \"d3\"; // interpolate\r\nimport ChartInternal from \"../internals/ChartInternal\";\r\nimport CLASS from \"../config/classes\";\r\nimport {extend, getPathBox} from \"../internals/util\";\r\n\r\nextend(ChartInternal.prototype, {\r\n\t/**\r\n\t * Called when dragging.\r\n\t * Data points can be selected.\r\n\t * @private\r\n\t * @param {Object} mouse Object\r\n\t */\r\n\tdrag(mouse) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tconst main = $$.main;\r\n\r\n\t\tif ($$.hasArcType()) { return; }\r\n\t\tif (!config.data_selection_enabled) { return; } // do nothing if not selectable\r\n\t\tif (config.zoom_enabled && !$$.zoom.altDomain) { return; } // skip if zoomable because of conflict drag dehavior\r\n\t\tif (!config.data_selection_multiple) { return; } // skip when single selection because drag is used for multiple selection\r\n\r\n\t\tconst sx = $$.dragStart[0];\r\n\t\tconst sy = $$.dragStart[1];\r\n\t\tconst mx = mouse[0];\r\n\t\tconst my = mouse[1];\r\n\t\tconst minX = Math.min(sx, mx);\r\n\t\tconst maxX = Math.max(sx, mx);\r\n\t\tconst minY = config.data_selection_grouped ? $$.margin.top : Math.min(sy, my);\r\n\t\tconst maxY = config.data_selection_grouped ? $$.height : Math.max(sy, my);\r\n\r\n\t\tmain.select(`.${CLASS.dragarea}`)\r\n\t\t\t.attr(\"x\", minX)\r\n\t\t\t.attr(\"y\", minY)\r\n\t\t\t.attr(\"width\", maxX - minX)\r\n\t\t\t.attr(\"height\", maxY - minY);\r\n\r\n\t\t// TODO: binary search when multiple xs\r\n\t\tmain.selectAll(`.${CLASS.shapes}`).selectAll(`.${CLASS.shape}`)\r\n\t\t\t.filter(d => config.data_selection_isselectable(d))\r\n\t\t\t.each(function(d, i) {\r\n\t\t\t\tconst shape = d3Select(this);\r\n\t\t\t\tconst isSelected = shape.classed(CLASS.SELECTED);\r\n\t\t\t\tconst isIncluded = shape.classed(CLASS.INCLUDED);\r\n\t\t\t\tlet _x;\r\n\t\t\t\tlet\t_y;\r\n\t\t\t\tlet\t_w;\r\n\t\t\t\tlet _h;\r\n\t\t\t\tlet toggle;\r\n\t\t\t\tlet isWithin = false;\r\n\t\t\t\tlet box;\r\n\r\n\t\t\t\tif (shape.classed(CLASS.circle)) {\r\n\t\t\t\t\t_x = shape.attr(\"cx\") * 1;\r\n\t\t\t\t\t_y = shape.attr(\"cy\") * 1;\r\n\t\t\t\t\ttoggle = $$.togglePoint;\r\n\t\t\t\t\tisWithin = minX < _x && _x < maxX && minY < _y && _y < maxY;\r\n\t\t\t\t} else if (shape.classed(CLASS.bar)) {\r\n\t\t\t\t\tbox = getPathBox(this);\r\n\t\t\t\t\t_x = box.x;\r\n\t\t\t\t\t_y = box.y;\r\n\t\t\t\t\t_w = box.width;\r\n\t\t\t\t\t_h = box.height;\r\n\t\t\t\t\ttoggle = $$.togglePath;\r\n\t\t\t\t\tisWithin = !(maxX < _x || _x + _w < minX) && !(maxY < _y || _y + _h < minY);\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// line/area selection not supported yet\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tif (isWithin ^ isIncluded) {\r\n\t\t\t\t\tshape.classed(CLASS.INCLUDED, !isIncluded);\r\n\t\t\t\t\t// TODO: included/unincluded callback here\r\n\t\t\t\t\tshape.classed(CLASS.SELECTED, !isSelected);\r\n\t\t\t\t\ttoggle.call($$, !isSelected, shape, d, i);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * Called when the drag starts.\r\n\t * Adds and Shows the drag area.\r\n\t * @private\r\n\t * @param {Object} mouse Object\r\n\t */\r\n\tdragstart(mouse) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\r\n\t\tif ($$.hasArcType()) { return; }\r\n\t\tif (!config.data_selection_enabled) { return; } // do nothing if not selectable\r\n\t\t$$.dragStart = mouse;\r\n\t\t$$.main.select(`.${CLASS.chart}`)\r\n\t\t\t.append(\"rect\")\r\n\t\t\t.attr(\"class\", CLASS.dragarea)\r\n\t\t\t.style(\"opacity\", \"0.1\");\r\n\t\t$$.dragging = true;\r\n\t},\r\n\r\n\t/**\r\n\t * Called when the drag finishes.\r\n\t * Removes the drag area.\r\n\t * @private\r\n\t */\r\n\tdragend() {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\r\n\t\tif ($$.hasArcType()) { return; }\r\n\t\tif (!config.data_selection_enabled) { return; } // do nothing if not selectable\r\n\t\t$$.main.select(`.${CLASS.dragarea}`)\r\n\t\t\t.transition()\r\n\t\t\t.duration(100)\r\n\t\t\t.style(\"opacity\", \"0\")\r\n\t\t\t.remove();\r\n\t\t$$.main.selectAll(`.${CLASS.shape}`)\r\n\t\t\t.classed(CLASS.INCLUDED, false);\r\n\t\t$$.dragging = false;\r\n\t},\r\n});\r\n\n\n\n// WEBPACK FOOTER //\n// src/interactions/drag.js","/**\r\n * Copyright (c) 2017 NAVER Corp.\r\n * billboard.js project is licensed under the MIT license\r\n */\r\nimport {\r\n\tdrag as d3Drag,\r\n\tmouse as d3Mouse,\r\n\tselect as d3Select,\r\n\tevent as d3Event\r\n} from \"d3\";\r\nimport ChartInternal from \"../internals/ChartInternal\";\r\nimport CLASS from \"../config/classes\";\r\nimport {extend} from \"../internals/util\";\r\n\r\nextend(ChartInternal.prototype, {\r\n\t/**\r\n\t * Initialize the area that detects the event.\r\n\t * Add a container for the zone that detects the event.\r\n\t * @private\r\n\t */\r\n\tinitEventRect() {\r\n\t\tconst $$ = this;\r\n\r\n\t\t$$.main.select(`.${CLASS.chart}`)\r\n\t\t\t.append(\"g\")\r\n\t\t\t.attr(\"class\", CLASS.eventRects)\r\n\t\t\t.style(\"fill-opacity\", \"0\");\r\n\t},\r\n\r\n\t/**\r\n\t * Redraws the area that detects the event.\r\n\t * @private\r\n\t */\r\n\tredrawEventRect() {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tconst isMultipleX = $$.isMultipleX();\r\n\t\tconst eventRects = $$.main.select(`.${CLASS.eventRects}`)\r\n\t\t\t.style(\"cursor\", config.zoom_enabled ? config.axis_rotated ? \"ns-resize\" : \"ew-resize\" : null)\r\n\t\t\t.classed(CLASS.eventRectsMultiple, isMultipleX)\r\n\t\t\t.classed(CLASS.eventRectsSingle, !isMultipleX);\r\n\r\n\t\t// rects for mouseover\r\n\t\tlet eventRectUpdate;\r\n\t\tlet maxDataCountTarget;\r\n\r\n\t\t// clear old rects\r\n\t\teventRects.selectAll(`.${CLASS.eventRect}`).remove();\r\n\r\n\t\t// open as public constiable\r\n\t\t$$.eventRect = eventRects.selectAll(`.${CLASS.eventRect}`);\r\n\r\n\t\tif (isMultipleX) {\r\n\t\t\teventRectUpdate = $$.eventRect.data([0]);\r\n\t\t\t// update\r\n\t\t\teventRectUpdate = $$.generateEventRectsForMultipleXs(eventRectUpdate.enter()) // enter : only one rect will be added\r\n\t\t\t\t.merge(eventRectUpdate);\r\n\t\t\t$$.updateEventRect(eventRectUpdate);\r\n\t\t\t// exit : not needed because always only one rect exists\r\n\t\t} else {\r\n\t\t\t// Set data and update $$.eventRect\r\n\t\t\tmaxDataCountTarget = $$.getMaxDataCountTarget($$.data.targets);\r\n\t\t\teventRects.datum(maxDataCountTarget ? maxDataCountTarget.values : []);\r\n\t\t\t$$.eventRect = eventRects.selectAll(`.${CLASS.eventRect}`);\r\n\t\t\teventRectUpdate = $$.eventRect.data(d => d);\r\n\r\n\t\t\t// exit\r\n\t\t\teventRectUpdate.exit().remove();\r\n\r\n\t\t\t// update\r\n\t\t\teventRectUpdate = $$.generateEventRectsForSingleX(eventRectUpdate.enter())\r\n\t\t\t\t.merge(eventRectUpdate);\r\n\r\n\t\t\t$$.updateEventRect(eventRectUpdate);\r\n\t\t}\r\n\r\n\t\tif ($$.inputType === \"touch\" && !$$.hasArcType()) {\r\n\t\t\tconst getEventRect = () => {\r\n\t\t\t\tconst touch = d3Event.changedTouches[0];\r\n\r\n\t\t\t\treturn d3Select(document.elementFromPoint(touch.clientX, touch.clientY));\r\n\t\t\t};\r\n\r\n\t\t\tconst getIndex = eventRect => {\r\n\t\t\t\tlet index = eventRect && eventRect.attr(\"class\") && eventRect.attr(\"class\")\r\n\t\t\t\t\t\t.replace(new RegExp(`(${CLASS.eventRect}-?|s)`, \"g\"), \"\") * 1;\r\n\r\n\t\t\t\tif (isNaN(index) || index === null) {\r\n\t\t\t\t\tindex = -1;\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn index;\r\n\t\t\t};\r\n\t\t\tlet startClientY;\r\n\r\n\t\t\tconst selectRect = context => {\r\n\t\t\t\tconst eventType = d3Event.type;\r\n\t\t\t\tconst touch = d3Event.changedTouches[0];\r\n\t\t\t\tconst axisRotated = $$.config.axis_rotated;\r\n\r\n\t\t\t\t// If movement is less than 5px, scrolling outside the chart is prevented from working.\r\n\t\t\t\tconst currentClientY = touch.clientY;\r\n\r\n\t\t\t\tif (eventType === \"touchstart\") {\r\n\t\t\t\t\tstartClientY = currentClientY;\r\n\t\t\t\t\taxisRotated && d3Event.preventDefault();\r\n\t\t\t\t} else if (eventType === \"touchmove\" && startClientY) {\r\n\t\t\t\t\tconst moveY = Math.abs(startClientY - currentClientY);\r\n\r\n\t\t\t\t\tif (!axisRotated && moveY < 5) {\r\n\t\t\t\t\t\td3Event.preventDefault();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (isMultipleX) {\r\n\t\t\t\t\t$$.selectRectForMultipleXs(context);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tconst eventRect = getEventRect();\r\n\t\t\t\t\tconst index = getIndex(eventRect);\r\n\r\n\t\t\t\t\tif (index === -1) {\r\n\t\t\t\t\t\t$$.unselectRect();\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\t$$.selectRectForSingle(context, eventRect, index);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\tconst touchHandler = function() {\r\n\t\t\t\tconst eventRect = getEventRect();\r\n\r\n\t\t\t\tif (eventRect.classed(CLASS.eventRect)) {\r\n\t\t\t\t\tif ($$.dragging || $$.flowing || $$.hasArcType()) {\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tselectRect(this);\r\n\t\t\t\t} else {\r\n\t\t\t\t\t$$.unselectRect();\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\t$$.svg.on(\"touchstart\", touchHandler)\r\n\t\t\t\t.on(\"touchmove\", touchHandler)\r\n\t\t\t\t.on(\"touchend\", () => {\r\n\t\t\t\t\tconst eventRect = getEventRect();\r\n\r\n\t\t\t\t\tif (eventRect.classed(CLASS.eventRect)) {\r\n\t\t\t\t\t\tif ($$.hasArcType() || !$$.toggleShape || $$.cancelClick) {\r\n\t\t\t\t\t\t\t$$.cancelClick && ($$.cancelClick = false);\r\n\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t// Call event handler\r\n\t\t\t\t\t\tconst index = getIndex(eventRect);\r\n\r\n\t\t\t\t\t\t!isMultipleX && index !== -1 &&\r\n\t\t\t\t\t\t$$.main.selectAll(`.${CLASS.shape}-${index}`)\r\n\t\t\t\t\t\t\t.each(d2 => config.data_onout.call($$.api, d2));\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Updates the location and size of the eventRect.\r\n\t * @private\r\n\t * @param {Object} D3.select(CLASS.eventRects) object.\r\n\t */\r\n\tupdateEventRect(eventRectUpdate) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tconst eventRectData = eventRectUpdate || $$.eventRect.data();// set update selection if null\r\n\t\tlet x;\r\n\t\tlet y;\r\n\t\tlet w;\r\n\t\tlet h;\r\n\r\n\t\tif ($$.isMultipleX()) {\r\n\t\t\t// TODO: rotated not supported yet\r\n\t\t\tx = 0;\r\n\t\t\ty = 0;\r\n\t\t\tw = $$.width;\r\n\t\t\th = $$.height;\r\n\t\t} else {\r\n\t\t\tlet rectW;\r\n\t\t\tlet rectX;\r\n\r\n\t\t\tif (($$.isCustomX() || $$.isTimeSeries()) && !$$.isCategorized()) {\r\n\t\t\t\t// update index for x that is used by prevX and nextX\r\n\t\t\t\t$$.updateXs();\r\n\r\n\t\t\t\trectW = d => {\r\n\t\t\t\t\tlet prevX = $$.getPrevX(d.index);\r\n\t\t\t\t\tlet nextX = $$.getNextX(d.index);\r\n\r\n\t\t\t\t\t// if there this is a single data point make the eventRect full width (or height)\r\n\t\t\t\t\tif (prevX === null && nextX === null) {\r\n\t\t\t\t\t\treturn config.axis_rotated ? $$.height : $$.width;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (prevX === null) { prevX = $$.x.domain()[0]; }\r\n\t\t\t\t\tif (nextX === null) { nextX = $$.x.domain()[1]; }\r\n\t\t\t\t\treturn Math.max(0, ($$.x(nextX) - $$.x(prevX)) / 2);\r\n\t\t\t\t};\r\n\r\n\t\t\t\trectX = d => {\r\n\t\t\t\t\tconst nextX = $$.getNextX(d.index);\r\n\t\t\t\t\tconst thisX = $$.data.xs[d.id][d.index];\r\n\t\t\t\t\tlet prevX = $$.getPrevX(d.index);\r\n\r\n\t\t\t\t\t// if there this is a single data point position the eventRect at 0\r\n\t\t\t\t\tif (prevX === null && nextX === null) {\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (prevX === null) {\r\n\t\t\t\t\t\tprevX = $$.x.domain()[0];\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\treturn ($$.x(thisX) + $$.x(prevX)) / 2;\r\n\t\t\t\t};\r\n\t\t\t} else {\r\n\t\t\t\tconst edgs = $$.getEdgeX($$.data.targets);\r\n\r\n\t\t\t\trectW = ($$.x(edgs[1]) - $$.x(edgs[0])) / $$.getMaxDataCount();\r\n\t\t\t\trectX = d => $$.x(d.x) - (rectW / 2);\r\n\t\t\t}\r\n\r\n\t\t\tx = config.axis_rotated ? 0 : rectX;\r\n\t\t\ty = config.axis_rotated ? rectX : 0;\r\n\t\t\tw = config.axis_rotated ? $$.width : rectW;\r\n\t\t\th = config.axis_rotated ? rectW : $$.height;\r\n\t\t}\r\n\r\n\t\teventRectData.attr(\"class\", $$.classEvent.bind($$))\r\n\t\t\t.attr(\"x\", x)\r\n\t\t\t.attr(\"y\", y)\r\n\t\t\t.attr(\"width\", w)\r\n\t\t\t.attr(\"height\", h);\r\n\t},\r\n\r\n\tselectRectForSingle(context, eventRect, index) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\t// Show tooltip\r\n\t\tconst selectedData = $$.filterTargetsToShow($$.data.targets)\r\n\t\t\t.map(t => $$.addName($$.getValueOnIndex(t.values, index)));\r\n\r\n\t\tif (config.tooltip_grouped) {\r\n\t\t\t$$.showTooltip(selectedData, context);\r\n\t\t\t$$.showXGridFocus(selectedData);\r\n\r\n\t\t\tif (!config.data_selection_enabled || config.data_selection_grouped) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t$$.main.selectAll(`.${CLASS.shape}-${index}`)\r\n\t\t\t.each(function() {\r\n\t\t\t\td3Select(this).classed(CLASS.EXPANDED, true);\r\n\t\t\t\tif (config.data_selection_enabled) {\r\n\t\t\t\t\teventRect.style(\"cursor\", config.data_selection_grouped ? \"pointer\" : null);\r\n\t\t\t\t}\r\n\t\t\t\tif (!config.tooltip_grouped) {\r\n\t\t\t\t\t$$.hideXGridFocus();\r\n\t\t\t\t\t$$.hideTooltip();\r\n\t\t\t\t\tif (!config.data_selection_grouped) {\r\n\t\t\t\t\t\t$$.unexpandCircles(index);\r\n\t\t\t\t\t\t$$.unexpandBars(index);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t\t.filter(function(d) { return $$.isWithinShape(this, d); })\r\n\t\t\t.each(function(d) {\r\n\t\t\t\tif (config.data_selection_enabled) {\r\n\t\t\t\t\tif (config.data_selection_grouped || config.data_selection_isselectable(d)) {\r\n\t\t\t\t\t\teventRect.style(\"cursor\", \"pointer\");\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (!config.tooltip_grouped) {\r\n\t\t\t\t\t$$.showTooltip([d], this);\r\n\t\t\t\t\t$$.showXGridFocus([d]);\r\n\t\t\t\t\tif (config.point_focus_expand_enabled) { $$.expandCircles(index, d.id, true); }\r\n\t\t\t\t\t$$.expandBars(index, d.id, true);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t},\r\n\r\n\tselectRectForMultipleXs(context) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tconst targetsToShow = $$.filterTargetsToShow($$.data.targets);\r\n\r\n\t\tif ($$.dragging) { return; } // do nothing when dragging\r\n\t\tif ($$.hasArcType(targetsToShow)) { return; }\r\n\r\n\t\tconst mouse = d3Mouse($$.main.select(`.${CLASS.eventRects} .${CLASS.eventRect}`).node());\r\n\t\tconst closest = $$.findClosestFromTargets(targetsToShow, mouse);\r\n\t\tlet sameXData;\r\n\r\n\t\tif ($$.mouseover && (!closest || closest.id !== $$.mouseover.id)) {\r\n\t\t\tconfig.data_onout.call($$.api, $$.mouseover);\r\n\t\t\t$$.mouseover = undefined;\r\n\t\t}\r\n\r\n\t\tif (!closest) {\r\n\t\t\t$$.unselectRect();\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif ($$.isScatterType(closest) || !config.tooltip_grouped) {\r\n\t\t\tsameXData = [closest];\r\n\t\t} else {\r\n\t\t\tsameXData = $$.filterByX(targetsToShow, closest.x);\r\n\t\t}\r\n\t\t// show tooltip when cursor is close to some point\r\n\t\tconst selectedData = sameXData.map(d => $$.addName(d));\r\n\r\n\t\t$$.showTooltip(selectedData, context);\r\n\r\n\t\t// expand points\r\n\t\tif (config.point_focus_expand_enabled) {\r\n\t\t\t$$.expandCircles(closest.index, closest.id, true);\r\n\t\t}\r\n\t\t$$.expandBars(closest.index, closest.id, true);\r\n\r\n\t\t// Show xgrid focus line\r\n\t\t$$.showXGridFocus(selectedData);\r\n\r\n\t\t// Show cursor as pointer if point is close to mouse position\r\n\t\tif ($$.isBarType(closest.id) || $$.dist(closest, mouse) < config.point_sensitivity) {\r\n\t\t\t$$.svg.select(`${CLASS.eventRect}`).style(\"cursor\", \"pointer\");\r\n\t\t\tif (!$$.mouseover) {\r\n\t\t\t\tconfig.data_onover.call($$.api, closest);\r\n\t\t\t\t$$.mouseover = closest;\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Unselect EventRect.\r\n\t * @private\r\n\t */\r\n\tunselectRect() {\r\n\t\tconst $$ = this;\r\n\r\n\t\t$$.svg.select(`.${CLASS.eventRect}`).style(\"cursor\", null);\r\n\t\t$$.hideXGridFocus();\r\n\t\t$$.hideTooltip();\r\n\t\t$$.unexpandCircles();\r\n\t\t$$.unexpandBars();\r\n\t},\r\n\r\n\t/**\r\n\t * Create eventRect for each data on the x-axis.\r\n\t * Register touch and drag events.\r\n\t * @private\r\n\t * @param {Object} D3.select(CLASS.eventRects) object.\r\n\t * @returns {Object} D3.select(CLASS.eventRects) object.\r\n\t */\r\n\tgenerateEventRectsForSingleX(eventRectEnter) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tconst isMouse = ($$.inputType === \"mouse\");\r\n\r\n\t\treturn eventRectEnter.append(\"rect\")\r\n\t\t\t.attr(\"class\", $$.classEvent.bind($$))\r\n\t\t\t.style(\"cursor\", config.data_selection_enabled && config.data_selection_grouped ? \"pointer\" : null)\r\n\t\t\t.on(isMouse ? \"mouseover\" : undefined, d => {\r\n\t\t\t\tif ($$.dragging || $$.flowing || $$.hasArcType()) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t} // do nothing while dragging/flowing\r\n\r\n\t\t\t\tconst index = d.index;\r\n\r\n\t\t\t\t// Expand shapes for selection\r\n\t\t\t\tif (config.point_focus_expand_enabled) {\r\n\t\t\t\t\t$$.expandCircles(index, null, true);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t$$.expandBars(index, null, true);\r\n\r\n\t\t\t\t// Call event handler\r\n\t\t\t\tindex !== -1 && $$.main.selectAll(`.${CLASS.shape}-${index}`)\r\n\t\t\t\t\t.each(d2 => config.data_onover.call($$.api, d2));\r\n\t\t\t})\r\n\t\t\t.on(isMouse ? \"mousemove\" : undefined, function(d) {\r\n\t\t\t\tif ($$.dragging || $$.flowing || $$.hasArcType()) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t} // do nothing while dragging/flowing\r\n\r\n\t\t\t\tlet index = d.index;\r\n\t\t\t\tconst eventRect = $$.svg.select(`.${CLASS.eventRect}-${index}`);\r\n\r\n\t\t\t\tif ($$.isStepType(d) &&\r\n\t\t\t\t\t$$.config.line_step_type === \"step-after\" &&\r\n\t\t\t\t\td3Mouse(this)[0] < $$.x($$.getXValue(d.id, index))\r\n\t\t\t\t) {\r\n\t\t\t\t\tindex -= 1;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tindex === -1 ?\r\n\t\t\t\t\t$$.unselectRect() : $$.selectRectForSingle(this, eventRect, index);\r\n\t\t\t})\r\n\t\t\t.on(isMouse ? \"mouseout\" : undefined, d => {\r\n\t\t\t\tif (!$$.config || $$.hasArcType()) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t} // chart is destroyed\r\n\r\n\t\t\t\tconst index = d.index;\r\n\r\n\t\t\t\t$$.unselectRect();\r\n\t\t\t\t// Call event handler\r\n\t\t\t\t$$.main.selectAll(`.${CLASS.shape}-${index}`)\r\n\t\t\t\t\t.each(d2 => config.data_onout.call($$.api, d2));\r\n\t\t\t})\r\n\t\t\t.on(isMouse ? \"click\" : undefined, d => {\r\n\t\t\t\tif ($$.hasArcType() || !$$.toggleShape || $$.cancelClick) {\r\n\t\t\t\t\t$$.cancelClick && ($$.cancelClick = false);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst index = d.index;\r\n\r\n\t\t\t\t$$.main.selectAll(`.${CLASS.shape}-${index}`).each(function(d2) {\r\n\t\t\t\t\tif (config.data_selection_grouped || $$.isWithinShape(this, d2)) {\r\n\t\t\t\t\t\t$$.toggleShape(this, d2, index);\r\n\t\t\t\t\t\t$$.config.data_onclick.call($$.api, d2, this);\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t})\r\n\t\t\t.call(\r\n\t\t\t\tconfig.data_selection_draggable && $$.drag ? (\r\n\t\t\t\t\td3Drag().origin(Object)\r\n\t\t\t\t\t\t.on(\"drag\", function() { $$.drag(d3Mouse(this)); })\r\n\t\t\t\t\t\t.on(\"dragstart\", function() { $$.dragstart(d3Mouse(this)); })\r\n\t\t\t\t\t\t.on(\"dragend\", () => { $$.dragend(); })\r\n\t\t\t\t) : () => {}\r\n\t\t\t);\r\n\t},\r\n\r\n\t/**\r\n\t * Create an eventRect,\r\n\t * Register touch and drag events.\r\n\t * @private\r\n\t * @param {Object} D3.select(CLASS.eventRects) object.\r\n\t * @returns {Object} D3.select(CLASS.eventRects) object.\r\n\t */\r\n\tgenerateEventRectsForMultipleXs(eventRectEnter) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tconst isMouse = ($$.inputType === \"mouse\");\r\n\r\n\t\treturn eventRectEnter\r\n\t\t\t.append(\"rect\")\r\n\t\t\t.attr(\"x\", 0)\r\n\t\t\t.attr(\"y\", 0)\r\n\t\t\t.attr(\"width\", $$.width)\r\n\t\t\t.attr(\"height\", $$.height)\r\n\t\t\t.attr(\"class\", CLASS.eventRect)\r\n\t\t\t.on(isMouse ? \"mouseover\" : undefined, function() {\r\n\t\t\t\t$$.selectRectForMultipleXs(this);\r\n\t\t\t})\r\n\t\t\t.on(isMouse ? \"mouseout\" : undefined, () => {\r\n\t\t\t\tif (!$$.config || $$.hasArcType()) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t} // chart is destroyed\r\n\r\n\t\t\t\t$$.unselectRect();\r\n\t\t\t})\r\n\t\t\t.on(isMouse ? \"mousemove\" : undefined, function() {\r\n\t\t\t\t$$.selectRectForMultipleXs(this);\r\n\t\t\t})\r\n\t\t\t.on(isMouse ? \"click\" : undefined, function() {\r\n\t\t\t\tconst targetsToShow = $$.filterTargetsToShow($$.data.targets);\r\n\r\n\t\t\t\tif ($$.hasArcType(targetsToShow)) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst mouse = d3Mouse(this);\r\n\t\t\t\tconst closest = $$.findClosestFromTargets(targetsToShow, mouse);\r\n\r\n\t\t\t\tif (!closest) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// select if selection enabled\r\n\t\t\t\tif ($$.isBarType(closest.id) || $$.dist(closest, mouse) < config.point_sensitivity) {\r\n\t\t\t\t\t$$.main.selectAll(`.${CLASS.shapes}${$$.getTargetSelectorSuffix(closest.id)}`)\r\n\t\t\t\t\t\t.selectAll(`.${CLASS.shape}-${closest.index}`)\r\n\t\t\t\t\t\t.each(() => {\r\n\t\t\t\t\t\t\tif (config.data_selection_grouped || $$.isWithinShape(this, closest)) {\r\n\t\t\t\t\t\t\t\t$$.toggleShape(this, closest, closest.index);\r\n\t\t\t\t\t\t\t\t$$.config.data_onclick.call($$.api, closest, this);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t\t.call(\r\n\t\t\t\tconfig.data_selection_draggable && $$.drag ? (\r\n\t\t\t\t\td3Drag().origin(Object)\r\n\t\t\t\t\t\t.on(\"drag\", function() { $$.drag(d3Mouse(this)); })\r\n\t\t\t\t\t\t.on(\"dragstart\", function() { $$.dragstart(d3Mouse(this)); })\r\n\t\t\t\t\t\t.on(\"dragend\", () => { $$.dragend(); })\r\n\t\t\t\t) : () => {}\r\n\t\t\t);\r\n\t},\r\n\r\n\t/**\r\n\t * Dispatch an event.\r\n\t * @private\r\n\t * @param {String} type event type\r\n\t * @param {Number} index Index of eventRect\r\n\t * @param {Object} mouse Object\r\n\t */\r\n\tdispatchEvent(type, index, mouse) {\r\n\t\tconst $$ = this;\r\n\t\tconst selector = $$.isMultipleX() ?\r\n\t\t\t`.${CLASS.eventRect}` : `${CLASS.eventRect}-${index}`;\r\n\r\n\t\tconst eventRect = $$.main.select(selector).node();\r\n\t\tconst box = eventRect.getBoundingClientRect();\r\n\t\tconst x = box.left + (mouse ? mouse[0] : 0);\r\n\t\tconst y = box.top + (mouse ? mouse[1] : 0);\r\n\r\n\t\tconst event = document.createEvent(\"MouseEvents\")\r\n\t\t\t.initMouseEvent(type, true, true, window, 0, x, y, x, y, false, false, false, false, 0, null);\r\n\r\n\t\teventRect.dispatchEvent(event);\r\n\t},\r\n});\r\n\n\n\n// WEBPACK FOOTER //\n// src/interactions/interaction.js","/**\r\n * Copyright (c) 2017 NAVER Corp.\r\n * billboard.js project is licensed under the MIT license\r\n */\r\nimport {\r\n\tselect as d3Select,\r\n\tbrushX as d3BrushX,\r\n\tbrushY as d3BrushY,\r\n\tevent as d3Event\r\n} from \"d3\";\r\nimport ChartInternal from \"../internals/ChartInternal\";\r\nimport CLASS from \"../config/classes\";\r\nimport {extend, isFunction} from \"../internals/util\";\r\n\r\nextend(ChartInternal.prototype, {\r\n\t/**\r\n\t * Initialize the brush.\r\n\t * @private\r\n\t */\r\n\tinitBrush() {\r\n\t\tconst $$ = this;\r\n\r\n\t\t// set the brush\r\n\t\t$$.brush = $$.config.axis_rotated ? d3BrushY() : d3BrushX();\r\n\r\n\t\t// set \"brush\" event\r\n\t\tconst brushHandler = () => {\r\n\t\t\t$$.redrawForBrush();\r\n\t\t};\r\n\r\n\t\t$$.brush\r\n\t\t\t.on(\"start\", () => {\r\n\t\t\t\t$$.inputType === \"touch\" && $$.hideTooltip();\r\n\t\t\t\tbrushHandler();\r\n\t\t\t})\r\n\t\t\t.on(\"brush\", brushHandler);\r\n\r\n\t\t$$.brush.update = function() {\r\n\t\t\tconst extent = this.extent()();\r\n\r\n\t\t\tif (extent[1].filter(v => isNaN(v)).length === 0) {\r\n\t\t\t\t$$.context && $$.context.select(`.${CLASS.brush}`).call(this);\r\n\t\t\t}\r\n\r\n\t\t\treturn this;\r\n\t\t};\r\n\r\n\t\t// set the brush extent\r\n\t\t$$.brush.scale = function(scale, height) {\r\n\t\t\tconst overlay = $$.svg.select(\".bb-brush .overlay\");\r\n\t\t\tconst extent = [[0, 0]];\r\n\r\n\t\t\tif (scale.range) {\r\n\t\t\t\textent.push([\r\n\t\t\t\t\tscale.range()[1],\r\n\t\t\t\t\t((height || !overlay.empty()) && ~~overlay.attr(\"height\")) || 60\r\n\t\t\t\t]);\r\n\t\t\t} else if (scale.constructor === Array) {\r\n\t\t\t\textent.push(scale);\r\n\t\t\t}\r\n\r\n\t\t\t$$.config.axis_rotated && extent.reverse();\r\n\t\t\tthis.extent($$.config.axis_x_extent || extent);\r\n\r\n\t\t\t// when extent updates, brush selection also be re-applied\r\n\t\t\t// https://github.com/d3/d3/issues/2918\r\n\t\t\tthis.update();\r\n\t\t};\r\n\r\n\t\t$$.brush.getSelection = function() {\r\n\t\t\treturn $$.context ? $$.context.select(`.${CLASS.brush}`) : d3Select([]);\r\n\t\t};\r\n\t},\r\n\r\n\t/**\r\n\t * Initialize the subchart.\r\n\t * @private\r\n\t */\r\n\tinitSubchart() {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tconst visibility = config.subchart_show ? \"visible\" : \"hidden\";\r\n\r\n\t\t$$.context = $$.svg.append(\"g\").attr(\"transform\", $$.getTranslate(\"context\"));\r\n\r\n\t\tconst context = $$.context;\r\n\r\n\t\tcontext.style(\"visibility\", visibility);\r\n\r\n\t\t// Define g for chart area\r\n\t\tcontext.append(\"g\")\r\n\t\t\t.attr(\"clip-path\", $$.clipPathForSubchart)\r\n\t\t\t.attr(\"class\", CLASS.chart);\r\n\r\n\t\t// Define g for bar chart area\r\n\t\tcontext.select(`.${CLASS.chart}`)\r\n\t\t\t.append(\"g\")\r\n\t\t\t.attr(\"class\", CLASS.chartBars);\r\n\r\n\t\t// Define g for line chart area\r\n\t\tcontext.select(`.${CLASS.chart}`)\r\n\t\t\t.append(\"g\")\r\n\t\t\t.attr(\"class\", CLASS.chartLines);\r\n\r\n\t\t// Add extent rect for Brush\r\n\t\tcontext.append(\"g\")\r\n\t\t\t.attr(\"clip-path\", $$.clipPath)\r\n\t\t\t.attr(\"class\", CLASS.brush)\r\n\t\t\t.call($$.brush);\r\n\r\n\t\t// ATTENTION: This must be called AFTER chart added\r\n\t\t// Add Axis\r\n\t\t$$.axes.subx = context.append(\"g\")\r\n\t\t\t.attr(\"class\", CLASS.axisX)\r\n\t\t\t.attr(\"transform\", $$.getTranslate(\"subx\"))\r\n\t\t\t.attr(\"clip-path\", config.axis_rotated ? \"\" : $$.clipPathForXAxis)\r\n\t\t\t.style(\"visibility\", config.subchart_axis_x_show ? visibility : \"hidden\");\r\n\t},\r\n\r\n\t/**\r\n\t * Update sub chart\r\n\t * @private\r\n\t * @param {Object} $$.data.targets\r\n\t */\r\n\tupdateTargetsForSubchart(targets) {\r\n\t\tconst $$ = this;\r\n\t\tconst context = $$.context;\r\n\t\tconst config = $$.config;\r\n\t\tconst classChartBar = $$.classChartBar.bind($$);\r\n\t\tconst classBars = $$.classBars.bind($$);\r\n\t\tconst classChartLine = $$.classChartLine.bind($$);\r\n\t\tconst classLines = $$.classLines.bind($$);\r\n\t\tconst classAreas = $$.classAreas.bind($$);\r\n\r\n\t\tif (config.subchart_show) {\r\n\t\t\t// -- Bar --//\r\n\t\t\tconst contextBarUpdate = context.select(`.${CLASS.chartBars}`)\r\n\t\t\t\t.selectAll(`.${CLASS.chartBar}`)\r\n\t\t\t\t.data(targets)\r\n\t\t\t\t.attr(\"class\", classChartBar);\r\n\t\t\tconst contextBarEnter = contextBarUpdate.enter()\r\n\t\t\t\t.append(\"g\")\r\n\t\t\t\t.style(\"opacity\", \"0\")\r\n\t\t\t\t.attr(\"class\", classChartBar)\r\n\t\t\t\t.merge(contextBarUpdate);\r\n\r\n\t\t\t// Bars for each data\r\n\t\t\tcontextBarEnter.append(\"g\")\r\n\t\t\t\t.attr(\"class\", classBars);\r\n\r\n\t\t\t// -- Line --//\r\n\t\t\tconst contextLineUpdate = context.select(`.${CLASS.chartLines}`)\r\n\t\t\t\t.selectAll(`.${CLASS.chartLine}`)\r\n\t\t\t\t.data(targets)\r\n\t\t\t\t.attr(\"class\", classChartLine);\r\n\t\t\tconst contextLineEnter = contextLineUpdate.enter().append(\"g\")\r\n\t\t\t\t.style(\"opacity\", \"0\")\r\n\t\t\t\t.attr(\"class\", classChartLine)\r\n\t\t\t\t.merge(contextLineUpdate);\r\n\r\n\t\t\t// Lines for each data\r\n\t\t\tcontextLineEnter.append(\"g\")\r\n\t\t\t\t.attr(\"class\", classLines);\r\n\r\n\t\t\t// Area\r\n\t\t\tcontextLineEnter.append(\"g\")\r\n\t\t\t\t.attr(\"class\", classAreas);\r\n\r\n\t\t\t// -- Brush --//\r\n\t\t\tcontext.selectAll(`.${CLASS.brush} rect`)\r\n\t\t\t\t.attr(config.axis_rotated ? \"width\" : \"height\", config.axis_rotated ? $$.width2 : $$.height2);\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Update the bar of the sub chart\r\n\t * @private\r\n\t * @param {Object} durationForExit\r\n\t */\r\n\tupdateBarForSubchart(durationForExit) {\r\n\t\tconst $$ = this;\r\n\r\n\t\t$$.contextBar = $$.context.selectAll(`.${CLASS.bars}`).selectAll(`.${CLASS.bar}`)\r\n\t\t\t.data($$.barData.bind($$));\r\n\r\n\t\t$$.contextBar\r\n\t\t\t.exit()\r\n\t\t\t.transition()\r\n\t\t\t.duration(durationForExit)\r\n\t\t\t.style(\"opacity\", \"0\")\r\n\t\t\t.remove();\r\n\r\n\t\t$$.contextBar = $$.contextBar\r\n\t\t\t.enter()\r\n\t\t\t.append(\"path\")\r\n\t\t\t.attr(\"class\", $$.classBar.bind($$))\r\n\t\t\t.style(\"stroke\", \"none\")\r\n\t\t\t.style(\"fill\", $$.color)\r\n\t\t\t.merge($$.contextBar)\r\n\t\t\t.style(\"opacity\", $$.initialOpacity.bind($$));\r\n\t},\r\n\r\n\t/**\r\n\t * Redraw the bar of the subchart\r\n\t * @private\r\n\t * @param {String} path in subchart bar\r\n\t * @param {Boolean} whether or not to transition.\r\n\t * @param {Number} transition duration\r\n\t */\r\n\tredrawBarForSubchart(drawBarOnSub, withTransition, duration) {\r\n\t\tlet contextBar;\r\n\r\n\t\tif (withTransition) {\r\n\t\t\tcontextBar = this.contextBar.transition(Math.random().toString()).duration(duration);\r\n\t\t} else {\r\n\t\t\tcontextBar = this.contextBar;\r\n\t\t}\r\n\r\n\t\tcontextBar.attr(\"d\", drawBarOnSub)\r\n\t\t\t.style(\"opacity\", \"1\");\r\n\t},\r\n\r\n\t/**\r\n\t * Update the line of the sub chart\r\n\t * @private\r\n\t * @param {Number} Fade-out transition duration\r\n\t */\r\n\tupdateLineForSubchart(durationForExit) {\r\n\t\tconst $$ = this;\r\n\r\n\t\t$$.contextLine = $$.context.selectAll(`.${CLASS.lines}`).selectAll(`.${CLASS.line}`)\r\n\t\t\t.data($$.lineData.bind($$));\r\n\r\n\t\t$$.contextLine\r\n\t\t\t.exit()\r\n\t\t\t.transition()\r\n\t\t\t.duration(durationForExit)\r\n\t\t\t.style(\"opacity\", \"0\")\r\n\t\t\t.remove();\r\n\r\n\t\t$$.contextLine = $$.contextLine\r\n\t\t\t.enter()\r\n\t\t\t.append(\"path\")\r\n\t\t\t.attr(\"class\", $$.classLine.bind($$))\r\n\t\t\t.style(\"stroke\", $$.color)\r\n\t\t\t.merge($$.contextLine)\r\n\t\t\t.style(\"opacity\", $$.initialOpacity.bind($$));\r\n\t},\r\n\r\n\t/**\r\n\t * Redraw the line of the subchart\r\n\t * @private\r\n\t * @param {String} path in subchart line\r\n\t * @param {Boolean} whether or not to transition\r\n\t * @param {Number} transition duration\r\n\t */\r\n\tredrawLineForSubchart(drawLineOnSub, withTransition, duration) {\r\n\t\tlet contextLine;\r\n\r\n\t\tif (withTransition) {\r\n\t\t\tcontextLine = this.contextLine.transition(Math.random().toString()).duration(duration);\r\n\t\t} else {\r\n\t\t\tcontextLine = this.contextLine;\r\n\t\t}\r\n\r\n\t\tcontextLine.attr(\"d\", drawLineOnSub)\r\n\t\t\t.style(\"opacity\", \"1\");\r\n\t},\r\n\r\n\t/**\r\n\t * Update the area of the sub chart\r\n\t * @private\r\n\t * @param {Number} Fade-out transition duration\r\n\t */\r\n\tupdateAreaForSubchart(durationForExit) {\r\n\t\tconst $$ = this;\r\n\r\n\t\t$$.contextArea = $$.context.selectAll(`.${CLASS.areas}`)\r\n\t\t\t.selectAll(`.${CLASS.area}`)\r\n\t\t\t.data($$.lineData.bind($$));\r\n\r\n\t\t$$.contextArea\r\n\t\t\t.exit()\r\n\t\t\t.transition()\r\n\t\t\t.duration(durationForExit)\r\n\t\t\t.style(\"opacity\", \"0\")\r\n\t\t\t.remove();\r\n\r\n\t\t$$.contextArea = $$.contextArea\r\n\t\t\t.enter()\r\n\t\t\t.append(\"path\")\r\n\t\t\t.attr(\"class\", $$.classArea.bind($$))\r\n\t\t\t.style(\"fill\", $$.color)\r\n\t\t\t.style(\"opacity\", function() {\r\n\t\t\t\t$$.orgAreaOpacity = d3Select(this).style(\"opacity\");\r\n\t\t\t\treturn \"0\";\r\n\t\t\t})\r\n\t\t\t.merge($$.contextArea)\r\n\t\t\t.style(\"opacity\", \"0\");\r\n\t},\r\n\t/**\r\n\t * Redraw the area of the subchart\r\n\t * @private\r\n\t * @param {String} path in subchart line\r\n\t * @param {Boolean} whether or not to transition\r\n\t * @param {Number} transition duration\r\n\t */\r\n\tredrawAreaForSubchart(drawAreaOnSub, withTransition, duration) {\r\n\t\tlet contextArea;\r\n\r\n\t\tif (withTransition) {\r\n\t\t\tcontextArea = this.contextArea.transition(Math.random().toString()).duration(duration);\r\n\t\t} else {\r\n\t\t\tcontextArea = this.contextArea;\r\n\t\t}\r\n\r\n\t\tcontextArea.attr(\"d\", drawAreaOnSub)\r\n\t\t\t.style(\"fill\", this.color)\r\n\t\t\t.style(\"opacity\", this.orgAreaOpacity);\r\n\t},\r\n\r\n\t/**\r\n\t * Redraw subchart.\r\n\t * @private\r\n\t * @param {Boolean} whether or not to show subchart\r\n\t * @param Do not use.\r\n\t * @param {Number} transition duration\r\n\t * @param Do not use.\r\n\t * @param {Object} area Indices\r\n\t * @param {Object} bar Indices\r\n\t * @param {Object} line Indices\r\n\t */\r\n\tredrawSubchart(withSubchart, transitions, duration,\r\n\t\tdurationForExit, areaIndices, barIndices, lineIndices) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\r\n\t\t$$.context.style(\"visibility\", config.subchart_show ? \"visible\" : \"hidden\");\r\n\r\n\t\t// subchart\r\n\t\tif (config.subchart_show) {\r\n\t\t\t// reflect main chart to extent on subchart if zoomed\r\n\t\t\tif (d3Event && d3Event.type === \"zoom\") {\r\n\t\t\t\t$$.brush.update();\r\n\t\t\t}\r\n\r\n\t\t\t// update subchart elements if needed\r\n\t\t\tif (withSubchart) {\r\n\t\t\t\t// extent rect\r\n\t\t\t\tif (!$$.brushEmpty()) {\r\n\t\t\t\t\t$$.brush.update();\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// setup drawer - MEMO: this must be called after axis updated\r\n\t\t\t\tconst drawAreaOnSub = $$.generateDrawArea(areaIndices, true);\r\n\t\t\t\tconst drawBarOnSub = $$.generateDrawBar(barIndices, true);\r\n\t\t\t\tconst drawLineOnSub = $$.generateDrawLine(lineIndices, true);\r\n\r\n\t\t\t\t$$.updateBarForSubchart(duration);\r\n\t\t\t\t$$.updateLineForSubchart(duration);\r\n\t\t\t\t$$.updateAreaForSubchart(duration);\r\n\r\n\t\t\t\t$$.redrawBarForSubchart(drawBarOnSub, duration, duration);\r\n\t\t\t\t$$.redrawLineForSubchart(drawLineOnSub, duration, duration);\r\n\t\t\t\t$$.redrawAreaForSubchart(drawAreaOnSub, duration, duration);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Redraw the brush.\r\n\t * @private\r\n\t */\r\n\tredrawForBrush() {\r\n\t\tconst $$ = this;\r\n\t\tconst x = $$.x;\r\n\r\n\t\t$$.redraw({\r\n\t\t\twithTransition: false,\r\n\t\t\twithY: $$.config.zoom_rescale,\r\n\t\t\twithSubchart: false,\r\n\t\t\twithUpdateXDomain: true,\r\n\t\t\twithDimension: false\r\n\t\t});\r\n\r\n\t\t$$.config.subchart_onbrush.call($$.api, x.orgDomain());\r\n\t},\r\n\r\n\t/**\r\n\t * Transform context\r\n\t * @private\r\n\t * @param {Boolean} indicates transition is enabled\r\n\t * @param {Object} The return value of the generateTransitions method of Axis.\r\n\t */\r\n\ttransformContext(withTransition, transitions) {\r\n\t\tconst $$ = this;\r\n\t\tlet subXAxis;\r\n\r\n\t\tif (transitions && transitions.axisSubX) {\r\n\t\t\tsubXAxis = transitions.axisSubX;\r\n\t\t} else {\r\n\t\t\tsubXAxis = $$.context.select(`.${CLASS.axisX}`);\r\n\t\t\tif (withTransition) { subXAxis = subXAxis.transition(); }\r\n\t\t}\r\n\r\n\t\t$$.context.attr(\"transform\", $$.getTranslate(\"context\"));\r\n\t\tsubXAxis.attr(\"transform\", $$.getTranslate(\"subx\"));\r\n\t},\r\n\r\n\t/**\r\n\t * Get default extent\r\n\t * @private\r\n\t * @returns {Array} default extent\r\n\t */\r\n\tgetDefaultExtent() {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tlet extent = isFunction(config.axis_x_extent) ?\r\n\t\t\tconfig.axis_x_extent($$.getXDomain($$.data.targets)) : config.axis_x_extent;\r\n\r\n\t\tif ($$.isTimeSeries()) {\r\n\t\t\textent = [$$.parseDate(extent[0]), $$.parseDate(extent[1])];\r\n\t\t}\r\n\r\n\t\treturn extent;\r\n\t},\r\n});\r\n\n\n\n// WEBPACK FOOTER //\n// src/interactions/subchart.js","/**\r\n * Copyright (c) 2017 NAVER Corp.\r\n * billboard.js project is licensed under the MIT license\r\n */\r\nimport {\r\n\tevent as d3Event,\r\n\tzoom as d3Zoom,\r\n\tmin as d3Min,\r\n\tmax as d3Max\r\n} from \"d3\";\r\nimport ChartInternal from \"../internals/ChartInternal\";\r\nimport CLASS from \"../config/classes\";\r\nimport {extend, diffDomain} from \"../internals/util\";\r\n\r\nextend(ChartInternal.prototype, {\r\n\t/**\r\n\t * Initialize zoom.\r\n\t * @private\r\n\t */\r\n\tinitZoom() {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tlet startEvent;\r\n\r\n\t\t$$.zoomScale = null;\r\n\t\t$$.zoom = d3Zoom()\r\n\t\t\t.duration(0)\r\n\t\t\t.on(\"start\", () => {\r\n\t\t\t\tstartEvent = d3Event.sourceEvent;\r\n\r\n\t\t\t\t$$.zoom.altDomain = d3Event.sourceEvent.altKey ?\r\n\t\t\t\t\t$$.x.orgDomain() : null;\r\n\r\n\t\t\t\tconfig.zoom_onzoomstart.call($$.api, d3Event.sourceEvent);\r\n\t\t\t})\r\n\t\t\t.on(\"zoom\", () => {\r\n\t\t\t\t$$.redrawForZoom.call($$);\r\n\t\t\t})\r\n\t\t\t.on(\"end\", () => {\r\n\t\t\t\tconst event = d3Event.sourceEvent;\r\n\r\n\t\t\t\t// if click, do nothing. otherwise, click interaction will be canceled.\r\n\t\t\t\tif (event && startEvent.clientX === event.clientX && startEvent.clientY === event.clientY) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t$$.redrawEventRect();\r\n\t\t\t\t$$.updateZoom();\r\n\t\t\t\tconfig.zoom_onzoomend.call($$.api, $$.x.orgDomain());\r\n\t\t\t});\r\n\r\n\t\t$$.zoom.orgScaleExtent = () => {\r\n\t\t\tconst extent = config.zoom_extent ? config.zoom_extent : [1, 10];\r\n\r\n\t\t\treturn [extent[0], Math.max($$.getMaxDataCount() / extent[1], extent[1])];\r\n\t\t};\r\n\r\n\t\t$$.zoom.updateScaleExtent = function() {\r\n\t\t\tconst ratio = diffDomain($$.x.orgDomain()) / diffDomain($$.getZoomDomain());\r\n\t\t\tconst extent = this.orgScaleExtent();\r\n\r\n\t\t\tthis.scaleExtent([extent[0] * ratio, extent[1] * ratio]);\r\n\t\t\treturn this;\r\n\t\t};\r\n\r\n\t\t$$.zoom.updateTransformScale = function(transform) {\r\n\t\t\tconst newScale = transform.rescaleX($$.x);\r\n\r\n\t\t\tnewScale.domain($$.trimXDomain(newScale.domain()));\r\n\t\t\t$$.zoomScale = newScale;\r\n\t\t\t$$.xAxis.scale($$.zoomScale);\r\n\t\t\t$$.main.select(`.${CLASS.eventRects}`).node().__zoom = transform;\r\n\t\t};\r\n\t},\r\n\r\n\t/**\r\n\t * Get zoom domain\r\n\t * @private\r\n\t * @returns {Array} zoom domain\r\n\t */\r\n\tgetZoomDomain() {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tconst min = d3Min([$$.orgXDomain[0], config.zoom_x_min]);\r\n\t\tconst max = d3Max([$$.orgXDomain[1], config.zoom_x_max]);\r\n\r\n\t\treturn [min, max];\r\n\t},\r\n\r\n\t/**\r\n\t * Update zoom\r\n\t * @private\r\n\t */\r\n\tupdateZoom() {\r\n\t\tconst $$ = this;\r\n\t\tconst z = $$.config.zoom_enabled ? $$.zoom : () => {};\r\n\r\n\t\t// bind zoom module\r\n\t\t// $$.main.select(`.${CLASS.zoomRect}`)\r\n\t\t// \t.call(z)\r\n\t\t// \t.on(\"dblclick.zoom\", null);\r\n\r\n\t\t$$.main.select(`.${CLASS.eventRects}`)\r\n\t\t\t.call(z)\r\n\t\t\t.on(\"dblclick.zoom\", null);\r\n\t},\r\n\r\n\t/**\r\n\t * Redraw the zoom.\r\n\t * @private\r\n\t */\r\n\tredrawForZoom() {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\r\n\t\tif (!config.zoom_enabled) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst zoom = $$.zoom;\r\n\t\tconst x = $$.x;\r\n\t\tconst event = d3Event;\r\n\t\tconst transform = event.transform;\r\n\r\n\t\t$$.zoom.updateTransformScale(transform);\r\n\r\n\t\tif ($$.filterTargetsToShow($$.data.targets).length === 0) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (event.sourceEvent.type === \"mousemove\" && zoom.altDomain) {\r\n\t\t\tx.domain(zoom.altDomain);\r\n\t\t\ttransform.scale($$.zoomScale).updateScaleExtent();\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif ($$.isCategorized() && x.orgDomain()[0] === $$.orgXDomain[0]) {\r\n\t\t\tx.domain([$$.orgXDomain[0] - 1e-10, x.orgDomain()[1]]);\r\n\t\t}\r\n\r\n\t\t$$.redraw({\r\n\t\t\twithTransition: false,\r\n\t\t\twithY: config.zoom_rescale,\r\n\t\t\twithSubchart: false,\r\n\t\t\twithEventRect: false,\r\n\t\t\twithDimension: false\r\n\t\t});\r\n\r\n\t\tif (event.sourceEvent.type === \"mousemove\") {\r\n\t\t\t$$.cancelClick = true;\r\n\t\t}\r\n\r\n\t\tconfig.zoom_onzoom.call($$.api, x.orgDomain());\r\n\t},\r\n});\r\n\n\n\n// WEBPACK FOOTER //\n// src/interactions/zoom.js","/**\r\n * Copyright (c) 2017 NAVER Corp.\r\n * billboard.js project is licensed under the MIT license\r\n */\r\nimport {\r\n\tselect as d3Select,\r\n\tarc as d3Arc,\r\n\tpie as d3Pie,\r\n\tevent as d3Event,\r\n\tinterpolate as d3Interpolate\r\n} from \"d3\";\r\nimport ChartInternal from \"./ChartInternal\";\r\nimport CLASS from \"../config/classes\";\r\nimport {extend, isFunction} from \"./util\";\r\n\r\nextend(ChartInternal.prototype, {\r\n\tinitPie() {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\r\n\t\t$$.pie = d3Pie()\r\n\t\t\t.padAngle(config[`${config.data_type}_padAngle`] || 0)\r\n\t\t\t.value(d => d.values.reduce((a, b) => a + b.value, 0));\r\n\r\n\t\tif (!config.data_order) {\r\n\t\t\t$$.pie.sort(null);\r\n\t\t}\r\n\t},\r\n\tupdateRadius() {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tconst w = config.gauge_width || config.donut_width;\r\n\r\n\t\t$$.radiusExpanded = Math.min($$.arcWidth, $$.arcHeight) / 2;\r\n\t\t$$.radius = $$.radiusExpanded * 0.95;\r\n\t\t$$.innerRadiusRatio = w ? ($$.radius - w) / $$.radius : 0.6;\r\n\r\n\t\t$$.innerRadius = $$.hasType(\"donut\") || $$.hasType(\"gauge\") ?\r\n\t\t$$.radius * $$.innerRadiusRatio : 0;\r\n\t},\r\n\tupdateArc() {\r\n\t\tconst $$ = this;\r\n\r\n\t\t$$.svgArc = $$.getSvgArc();\r\n\t\t$$.svgArcExpanded = $$.getSvgArcExpanded();\r\n\t\t$$.svgArcExpandedSub = $$.getSvgArcExpanded(0.98);\r\n\t},\r\n\tupdateAngle(dValue) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tlet d = dValue;\r\n\t\tlet found = false;\r\n\t\tlet index = 0;\r\n\t\tlet gMin;\r\n\t\tlet gMax;\r\n\t\tlet gTic;\r\n\t\tlet gValue;\r\n\r\n\t\tif (!config) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\t$$.pie($$.filterTargetsToShow($$.data.targets)).forEach(t => {\r\n\t\t\tif (!found && t.data.id === d.data.id) {\r\n\t\t\t\tfound = true;\r\n\t\t\t\td = t;\r\n\t\t\t\td.index = index;\r\n\t\t\t}\r\n\r\n\t\t\tindex++;\r\n\t\t});\r\n\r\n\t\tif (isNaN(d.startAngle)) {\r\n\t\t\td.startAngle = 0;\r\n\t\t}\r\n\r\n\t\tif (isNaN(d.endAngle)) {\r\n\t\t\td.endAngle = d.startAngle;\r\n\t\t}\r\n\r\n\t\tif ($$.isGaugeType(d.data)) {\r\n\t\t\tgMin = config.gauge_min;\r\n\t\t\tgMax = config.gauge_max;\r\n\t\t\tgTic = (Math.PI * (config.gauge_fullCircle ? 2 : 1)) / (gMax - gMin);\r\n\r\n\t\t\tgValue = d.value < gMin ?\r\n\t\t\t\t0 : (d.value < gMax ? d.value - gMin : (gMax - gMin));\r\n\r\n\t\t\td.startAngle = config.gauge_startingAngle;\r\n\t\t\td.endAngle = d.startAngle + gTic * gValue;\r\n\t\t}\r\n\r\n\t\treturn found ? d : null;\r\n\t},\r\n\r\n\tgetSvgArc() {\r\n\t\tconst $$ = this;\r\n\t\tconst arc = d3Arc()\r\n\t\t\t.outerRadius($$.radius)\r\n\t\t\t.innerRadius($$.innerRadius);\r\n\r\n\t\tconst newArc = function(d, withoutUpdate) {\r\n\t\t\tif (withoutUpdate) {\r\n\t\t\t\treturn arc(d);\r\n\t\t\t} // for interpolate\r\n\r\n\t\t\tconst updated = $$.updateAngle(d);\r\n\r\n\t\t\treturn updated ? arc(updated) : \"M 0 0\";\r\n\t\t};\r\n\r\n\t\t// TODO: extends all function\r\n\t\tnewArc.centroid = arc.centroid;\r\n\r\n\t\treturn newArc;\r\n\t},\r\n\tgetSvgArcExpanded(rate) {\r\n\t\tconst $$ = this;\r\n\t\tconst arc = d3Arc()\r\n\t\t\t.outerRadius($$.radiusExpanded * (rate || 1))\r\n\t\t\t.innerRadius($$.innerRadius);\r\n\r\n\t\treturn function(d) {\r\n\t\t\tconst updated = $$.updateAngle(d);\r\n\r\n\t\t\treturn updated ? arc(updated) : \"M 0 0\";\r\n\t\t};\r\n\t},\r\n\tgetArc(d, withoutUpdate, force) {\r\n\t\treturn force || this.isArcType(d.data) ? this.svgArc(d, withoutUpdate) : \"M 0 0\";\r\n\t},\r\n\r\n\ttransformForArcLabel(d) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tconst updated = $$.updateAngle(d);\r\n\t\tlet c;\r\n\t\tlet x;\r\n\t\tlet y;\r\n\t\tlet h;\r\n\t\tlet ratio;\r\n\t\tlet translate = \"\";\r\n\r\n\t\tif (updated && !$$.hasType(\"gauge\")) {\r\n\t\t\tc = this.svgArc.centroid(updated);\r\n\t\t\tx = isNaN(c[0]) ? 0 : c[0];\r\n\t\t\ty = isNaN(c[1]) ? 0 : c[1];\r\n\t\t\th = Math.sqrt(x * x + y * y);\r\n\t\t\tif ($$.hasType(\"donut\") && config.donut_label_ratio) {\r\n\t\t\t\tratio = isFunction(config.donut_label_ratio) ?\r\n\t\t\t\t\tconfig.donut_label_ratio(d, $$.radius, h) : config.donut_label_ratio;\r\n\t\t\t} else if ($$.hasType(\"pie\") && config.pie_label_ratio) {\r\n\t\t\t\tratio = isFunction(config.pie_label_ratio) ?\r\n\t\t\t\t\tconfig.pie_label_ratio(d, $$.radius, h) : config.pie_label_ratio;\r\n\t\t\t} else {\r\n\t\t\t\tratio = $$.radius &&\r\n\t\t\t\t\t(h ? (36 / $$.radius > 0.375 ? 1.175 - 36 / $$.radius : 0.8) * $$.radius / h : 0);\r\n\t\t\t}\r\n\t\t\ttranslate = `translate(${x * ratio},${y * ratio})`;\r\n\t\t}\r\n\t\treturn translate;\r\n\t},\r\n\r\n\tgetArcRatio(d) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tconst whole = Math.PI * ($$.hasType(\"gauge\") && !config.gauge_fullCircle ? 1 : 2);\r\n\r\n\t\treturn d ? (d.endAngle - d.startAngle) / whole : null;\r\n\t},\r\n\r\n\tconvertToArcData(d) {\r\n\t\treturn this.addName({\r\n\t\t\tid: d.data.id,\r\n\t\t\tvalue: d.value,\r\n\t\t\tratio: this.getArcRatio(d),\r\n\t\t\tindex: d.index,\r\n\t\t});\r\n\t},\r\n\r\n\ttextForArcLabel(d) {\r\n\t\tconst $$ = this;\r\n\r\n\t\tif (!$$.shouldShowArcLabel()) {\r\n\t\t\treturn \"\";\r\n\t\t}\r\n\t\tconst updated = $$.updateAngle(d);\r\n\t\tconst value = updated ? updated.value : null;\r\n\t\tconst ratio = $$.getArcRatio(updated);\r\n\t\tconst id = d.data.id;\r\n\r\n\t\tif (!$$.hasType(\"gauge\") && !$$.meetsArcLabelThreshold(ratio)) {\r\n\t\t\treturn \"\";\r\n\t\t}\r\n\t\tconst format = $$.getArcLabelFormat();\r\n\r\n\t\treturn format ? format(value, ratio, id) : $$.defaultArcValueFormat(value, ratio);\r\n\t},\r\n\r\n\ttextForGaugeMinMax(value, isMax) {\r\n\t\tconst format = this.getGaugeLabelExtents();\r\n\r\n\t\treturn format ? format(value, isMax) : value;\r\n\t},\r\n\r\n\texpandArc(targetIds) {\r\n\t\tconst $$ = this;\r\n\t\tlet interval;\r\n\r\n\t\t// MEMO: avoid to cancel transition\r\n\t\tif ($$.transiting) {\r\n\t\t\tinterval = window.setInterval(() => {\r\n\t\t\t\tif (!$$.transiting) {\r\n\t\t\t\t\twindow.clearInterval(interval);\r\n\t\t\t\t\tif ($$.legend.selectAll(\".bb-legend-item-focused\").size() > 0) {\r\n\t\t\t\t\t\t$$.expandArc(targetIds);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}, 10);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst newTargetIds = $$.mapToTargetIds(targetIds);\r\n\r\n\t\t$$.svg.selectAll($$.selectorTargets(newTargetIds, `.${CLASS.chartArc}`)).each(function(d) {\r\n\t\t\tif (!$$.shouldExpand(d.data.id)) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\td3Select(this).selectAll(\"path\")\r\n\t\t\t\t.transition()\r\n\t\t\t\t.duration($$.expandDuration(d.data.id))\r\n\t\t\t\t.attr(\"d\", $$.svgArcExpanded)\r\n\t\t\t\t.transition()\r\n\t\t\t\t.duration($$.expandDuration(d.data.id) * 2)\r\n\t\t\t\t.attr(\"d\", $$.svgArcExpandedSub)\r\n\t\t\t\t.each(v => {\r\n\t\t\t\t\tif ($$.isDonutType(v.data)) {\r\n\t\t\t\t\t\t// callback here\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t});\r\n\t},\r\n\r\n\tunexpandArc(targetIds) {\r\n\t\tconst $$ = this;\r\n\r\n\t\tif ($$.transiting) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst newTargetIds = $$.mapToTargetIds(targetIds);\r\n\r\n\t\t$$.svg.selectAll($$.selectorTargets(newTargetIds, `.${CLASS.chartArc}`))\r\n\t\t\t.selectAll(\"path\")\r\n\t\t\t.transition()\r\n\t\t\t.duration(d => $$.expandDuration(d.data.id))\r\n\t\t\t.attr(\"d\", $$.svgArc);\r\n\t\t$$.svg.selectAll(`${CLASS.arc}`)\r\n\t\t\t.style(\"opacity\", \"1\");\r\n\t},\r\n\r\n\texpandDuration(id) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\r\n\t\tif ($$.isDonutType(id)) {\r\n\t\t\treturn config.donut_expand_duration;\r\n\t\t} else if ($$.isGaugeType(id)) {\r\n\t\t\treturn config.gauge_expand_duration;\r\n\t\t} else if ($$.isPieType(id)) {\r\n\t\t\treturn config.pie_expand_duration;\r\n\t\t} else {\r\n\t\t\treturn 50;\r\n\t\t}\r\n\t},\r\n\r\n\tshouldExpand(id) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\r\n\t\treturn ($$.isDonutType(id) && config.donut_expand) ||\r\n\t\t\t($$.isGaugeType(id) && config.gauge_expand) ||\r\n\t\t\t($$.isPieType(id) && config.pie_expand);\r\n\t},\r\n\r\n\tshouldShowArcLabel() {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tlet shouldShow = true;\r\n\r\n\t\tif ($$.hasType(\"donut\")) {\r\n\t\t\tshouldShow = config.donut_label_show;\r\n\t\t} else if ($$.hasType(\"pie\")) {\r\n\t\t\tshouldShow = config.pie_label_show;\r\n\t\t}\r\n\t\t// when gauge, always true\r\n\t\treturn shouldShow;\r\n\t},\r\n\r\n\tmeetsArcLabelThreshold(ratio) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tconst threshold = $$.hasType(\"donut\") ? config.donut_label_threshold : config.pie_label_threshold;\r\n\r\n\t\treturn ratio >= threshold;\r\n\t},\r\n\r\n\tgetArcLabelFormat() {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tlet format = config.pie_label_format;\r\n\r\n\t\tif ($$.hasType(\"gauge\")) {\r\n\t\t\tformat = config.gauge_label_format;\r\n\t\t} else if ($$.hasType(\"donut\")) {\r\n\t\t\tformat = config.donut_label_format;\r\n\t\t}\r\n\t\treturn format;\r\n\t},\r\n\r\n\tgetGaugeLabelExtents() {\r\n\t\tconst config = this.config;\r\n\r\n\t\treturn config.gauge_label_extents;\r\n\t},\r\n\r\n\tgetArcTitle() {\r\n\t\tconst $$ = this;\r\n\r\n\t\treturn $$.hasType(\"donut\") ? $$.config.donut_title : \"\";\r\n\t},\r\n\r\n\tupdateTargetsForArc(targets) {\r\n\t\tconst $$ = this;\r\n\t\tconst main = $$.main;\r\n\t\tconst classChartArc = $$.classChartArc.bind($$);\r\n\t\tconst classArcs = $$.classArcs.bind($$);\r\n\t\tconst classFocus = $$.classFocus.bind($$);\r\n\t\tconst mainPieUpdate = main.select(`.${CLASS.chartArcs}`)\r\n\t\t\t.selectAll(`.${CLASS.chartArc}`)\r\n\t\t\t.data($$.pie(targets))\r\n\t\t\t.attr(\"class\", d => classChartArc(d) + classFocus(d.data));\r\n\r\n\t\tconst mainPieEnter = mainPieUpdate.enter().append(\"g\")\r\n\t\t\t.attr(\"class\", classChartArc);\r\n\r\n\t\tmainPieEnter.append(\"g\")\r\n\t\t\t.attr(\"class\", classArcs)\r\n\t\t\t.merge(mainPieUpdate);\r\n\r\n\t\tmainPieEnter.append(\"text\")\r\n\t\t\t.attr(\"dy\", $$.hasType(\"gauge\") ? \"-.1em\" : \".35em\")\r\n\t\t\t.style(\"opacity\", \"0\")\r\n\t\t\t.style(\"text-anchor\", \"middle\")\r\n\t\t\t.style(\"pointer-events\", \"none\");\r\n\t\t// MEMO: can not keep same color..., but not bad to update color in redraw\r\n\t\t// mainPieUpdate.exit().remove();\r\n\t},\r\n\r\n\tinitArc() {\r\n\t\tconst $$ = this;\r\n\r\n\t\t$$.arcs = $$.main.select(`.${CLASS.chart}`)\r\n\t\t\t.append(\"g\")\r\n\t\t\t.attr(\"class\", CLASS.chartArcs)\r\n\t\t\t.attr(\"transform\", $$.getTranslate(\"arc\"));\r\n\r\n\t\t$$.arcs.append(\"text\")\r\n\t\t\t.attr(\"class\", CLASS.chartArcsTitle)\r\n\t\t\t.style(\"text-anchor\", \"middle\")\r\n\t\t\t.text($$.getArcTitle());\r\n\t},\r\n\r\n\tredrawArc(duration, durationForExit, withTransform) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tconst main = $$.main;\r\n\t\tconst isTouch = ($$.inputType === \"touch\");\r\n\t\tconst isMouse = ($$.inputType === \"mouse\");\r\n\r\n\t\tfunction selectArc(_this, arcData, id) {\r\n\t\t\t// transitions\r\n\t\t\t$$.expandArc(id);\r\n\t\t\t$$.api.focus(id);\r\n\t\t\t$$.toggleFocusLegend(id, true);\r\n\t\t\t$$.showTooltip([arcData], _this);\r\n\t\t}\r\n\r\n\t\tfunction unselectArc(arcData) {\r\n\t\t\tconst id = (arcData && arcData.id) || undefined;\r\n\r\n\t\t\t$$.unexpandArc(id);\r\n\t\t\t$$.api.revert();\r\n\t\t\t$$.revertLegend();\r\n\t\t\t$$.hideTooltip();\r\n\t\t}\r\n\r\n\t\tlet mainArc = main.selectAll(`.${CLASS.arcs}`)\r\n\t\t\t.selectAll(`.${CLASS.arc}`)\r\n\t\t\t.data($$.arcData.bind($$));\r\n\r\n\t\tmainArc.exit().transition()\r\n\t\t\t.duration(durationForExit)\r\n\t\t\t.style(\"opacity\", \"0\")\r\n\t\t\t.remove();\r\n\r\n\t\tmainArc = mainArc.enter().append(\"path\")\r\n\t\t\t.attr(\"class\", $$.classArc.bind($$))\r\n\t\t\t.style(\"fill\", d => $$.color(d.data))\r\n\t\t\t.style(\"cursor\", d => config.interaction_enabled &&\r\n\t\t\t(config.data_selection_isselectable(d) ? \"pointer\" : null))\r\n\t\t\t.style(\"opacity\", \"0\")\r\n\t\t\t.each(function(d) {\r\n\t\t\t\tif ($$.isGaugeType(d.data)) {\r\n\t\t\t\t\td.startAngle = config.gauge_startingAngle;\r\n\t\t\t\t\td.endAngle = config.gauge_startingAngle;\r\n\t\t\t\t}\r\n\t\t\t\tthis._current = d;\r\n\t\t\t})\r\n\t\t\t.merge(mainArc);\r\n\r\n\t\tmainArc\r\n\t\t\t.attr(\"transform\", d => (!$$.isGaugeType(d.data) && withTransform ? \"scale(0)\" : \"\"))\r\n\t\t\t.style(\"opacity\", function(d) {\r\n\t\t\t\treturn d === this._current ? \"0\" : \"1\";\r\n\t\t\t})\r\n\t\t\t.on(isMouse ? \"mouseover\" : undefined, config.interaction_enabled ? function(d) {\r\n\t\t\t\tif ($$.transiting) { // skip while transiting\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst updated = $$.updateAngle(d);\r\n\t\t\t\tconst arcData = updated ? $$.convertToArcData(updated) : null;\r\n\t\t\t\tconst id = (arcData && arcData.id) || undefined;\r\n\r\n\t\t\t\tselectArc(this, arcData, id);\r\n\r\n\t\t\t\t$$.config.data_onover(arcData, this);\r\n\t\t\t} : null)\r\n\t\t\t.on(isMouse ? \"mouseout\" : undefined, config.interaction_enabled ? function(d) {\r\n\t\t\t\tif ($$.transiting) { // skip while transiting\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tconst updated = $$.updateAngle(d);\r\n\t\t\t\tconst arcData = updated ? $$.convertToArcData(updated) : null;\r\n\r\n\t\t\t\tunselectArc();\r\n\r\n\t\t\t\t$$.config.data_onout(arcData, this);\r\n\t\t\t} : null)\r\n\t\t\t.on(isMouse ? \"mousemove\" : undefined, config.interaction_enabled ? function(d) {\r\n\t\t\t\tconst updated = $$.updateAngle(d);\r\n\t\t\t\tconst arcData = updated ? $$.convertToArcData(updated) : null;\r\n\r\n\t\t\t\t$$.showTooltip([arcData], this);\r\n\t\t\t} : null)\r\n\t\t\t.on(isMouse ? \"click\" : undefined, config.interaction_enabled ? function(d, i) {\r\n\t\t\t\tconst updated = $$.updateAngle(d);\r\n\t\t\t\tlet arcData;\r\n\r\n\t\t\t\tif (updated) {\r\n\t\t\t\t\tarcData = $$.convertToArcData(updated);\r\n\t\t\t\t\tif ($$.toggleShape) {\r\n\t\t\t\t\t\t$$.toggleShape(this, arcData, i);\r\n\t\t\t\t\t}\r\n\t\t\t\t\t$$.config.data_onclick.call($$.api, arcData, this);\r\n\t\t\t\t}\r\n\t\t\t} : null)\r\n\t\t\t.each(() => {\r\n\t\t\t\t$$.transiting = true;\r\n\t\t\t})\r\n\t\t\t.transition()\r\n\t\t\t.duration(duration)\r\n\t\t\t.attrTween(\"d\", function(d) {\r\n\t\t\t\tconst updated = $$.updateAngle(d);\r\n\r\n\t\t\t\tif (!updated) {\r\n\t\t\t\t\treturn function() {\r\n\t\t\t\t\t\treturn \"M 0 0\";\r\n\t\t\t\t\t};\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (isNaN(this._current.startAngle)) {\r\n\t\t\t\t\tthis._current.startAngle = 0;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (isNaN(this._current.endAngle)) {\r\n\t\t\t\t\tthis._current.endAngle = this._current.startAngle;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst interpolate = d3Interpolate(this._current, updated);\r\n\r\n\t\t\t\tthis._current = interpolate(0);\r\n\r\n\t\t\t\treturn function(t) {\r\n\t\t\t\t\tconst interpolated = interpolate(t);\r\n\r\n\t\t\t\t\tinterpolated.data = d.data; // data.id will be updated by interporator\r\n\t\t\t\t\treturn $$.getArc(interpolated, true);\r\n\t\t\t\t};\r\n\t\t\t})\r\n\t\t\t.attr(\"transform\", withTransform ? \"scale(1)\" : \"\")\r\n\t\t\t.style(\"fill\", d => ($$.levelColor ?\r\n\t\t\t\t$$.levelColor(d.data.values[0].value) : $$.color(d.data.id))\r\n\t\t\t)\r\n\t\t\t// Where gauge reading color would receive customization.\r\n\t\t\t.style(\"opacity\", \"1\")\r\n\t\t\t.call($$.endall, () => {\r\n\t\t\t\t$$.transiting = false;\r\n\t\t\t});\r\n\r\n\t\tif (isTouch && config.interaction_enabled && $$.hasArcType()) {\r\n\t\t\tconst getEventArc = () => {\r\n\t\t\t\tconst touch = d3Event.changedTouches[0];\r\n\t\t\t\tconst eventArc = d3Select(document.elementFromPoint(touch.clientX, touch.clientY));\r\n\r\n\t\t\t\treturn eventArc;\r\n\t\t\t};\r\n\r\n\t\t\t$$.svg.on(\"touchstart\", function() {\r\n\t\t\t\tif ($$.transiting) { // skip while transiting\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst eventArc = getEventArc();\r\n\t\t\t\tconst datum = eventArc.datum();\r\n\t\t\t\tconst updated = (datum && datum.data && datum.data.id) ? $$.updateAngle(datum) : null;\r\n\t\t\t\tconst arcData = updated ? $$.convertToArcData(updated) : null;\r\n\t\t\t\tconst id = (arcData && arcData.id) || undefined;\r\n\r\n\t\t\t\t(id === undefined) ? unselectArc() : selectArc(this, arcData, id);\r\n\t\t\t\t$$.config.data_onover(arcData, this);\r\n\t\t\t})\r\n\t\t\t\t.on(\"touchend\", function() {\r\n\t\t\t\t\tif ($$.transiting) { // skip while transiting\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tconst eventArc = getEventArc();\r\n\t\t\t\t\tconst datum = eventArc.datum();\r\n\t\t\t\t\tconst updated = (datum && datum.data && datum.data.id) ? $$.updateAngle(datum) : null;\r\n\t\t\t\t\tconst arcData = updated ? $$.convertToArcData(updated) : null;\r\n\t\t\t\t\tconst id = (arcData && arcData.id) || undefined;\r\n\r\n\t\t\t\t\t(id === undefined) ? unselectArc() : selectArc(this, arcData, id);\r\n\t\t\t\t\t$$.config.data_onout(arcData, this);\r\n\t\t\t\t})\r\n\t\t\t\t.on(\"touchmove\", function() {\r\n\t\t\t\t\tconst eventArc = getEventArc();\r\n\t\t\t\t\tconst datum = eventArc.datum();\r\n\t\t\t\t\tconst updated = (datum && datum.data && datum.data.id) ? $$.updateAngle(datum) : null;\r\n\t\t\t\t\tconst arcData = updated ? $$.convertToArcData(updated) : null;\r\n\t\t\t\t\tconst id = (arcData && arcData.id) || undefined;\r\n\r\n\t\t\t\t\t(id === undefined) ? unselectArc() : selectArc(this, arcData, id);\r\n\t\t\t\t});\r\n\t\t}\r\n\r\n\t\tmain.selectAll(`.${CLASS.chartArc}`)\r\n\t\t\t.select(\"text\")\r\n\t\t\t.style(\"opacity\", \"0\")\r\n\t\t\t.attr(\"class\", d => ($$.isGaugeType(d.data) ? CLASS.gaugeValue : \"\"))\r\n\t\t\t.text($$.textForArcLabel.bind($$))\r\n\t\t\t.attr(\"transform\", $$.transformForArcLabel.bind($$))\r\n\t\t\t.style(\"font-size\", d => ($$.isGaugeType(d.data) ? `${Math.round($$.radius / 5)}px` : \"\"))\r\n\t\t\t.transition()\r\n\t\t\t.duration(duration)\r\n\t\t\t.style(\"opacity\", d => ($$.isTargetToShow(d.data.id) && $$.isArcType(d.data) ? \"1\" : \"0\"));\r\n\r\n\t\tmain.select(`.${CLASS.chartArcsTitle}`)\r\n\t\t\t.style(\"opacity\", $$.hasType(\"donut\") || $$.hasType(\"gauge\") ? \"1\" : \"0\");\r\n\r\n\t\tif ($$.hasType(\"gauge\")) {\r\n\t\t\t$$.arcs.select(`.${CLASS.chartArcsBackground}`)\r\n\t\t\t\t.attr(\"d\", () => {\r\n\t\t\t\t\tconst d = {\r\n\t\t\t\t\t\tdata: [{value: config.gauge_max}],\r\n\t\t\t\t\t\tstartAngle: config.gauge_startingAngle,\r\n\t\t\t\t\t\tendAngle: -1 * config.gauge_startingAngle\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\treturn $$.getArc(d, true, true);\r\n\t\t\t\t});\r\n\t\t\t$$.arcs.select(`.${CLASS.chartArcsGaugeUnit}`)\r\n\t\t\t\t.attr(\"dy\", \".75em\")\r\n\t\t\t\t.text(config.gauge_label_show ? config.gauge_units : \"\");\r\n\t\t\t$$.arcs.select(`.${CLASS.chartArcsGaugeMin}`)\r\n\t\t\t\t.attr(\"dx\", `${-1 * ($$.innerRadius + (($$.radius - $$.innerRadius) / (config.gauge_fullCircle ? 1 : 2)))}px`)\r\n\t\t\t\t.attr(\"dy\", \"1.2em\")\r\n\t\t\t\t.text(config.gauge_label_show ? $$.textForGaugeMinMax(config.gauge_min, false) : \"\");\r\n\t\t\t$$.arcs.select(`.${CLASS.chartArcsGaugeMax}`)\r\n\t\t\t\t.attr(\"dx\", `${$$.innerRadius + (($$.radius - $$.innerRadius) / (config.gauge_fullCircle ? 1 : 2))}px`)\r\n\t\t\t\t.attr(\"dy\", \"1.2em\")\r\n\t\t\t\t.text(config.gauge_label_show ? $$.textForGaugeMinMax(config.gauge_max, true) : \"\");\r\n\t\t}\r\n\t},\r\n\r\n\tinitGauge() {\r\n\t\tconst arcs = this.arcs;\r\n\r\n\t\tif (this.hasType(\"gauge\")) {\r\n\t\t\tarcs.append(\"path\")\r\n\t\t\t\t.attr(\"class\", CLASS.chartArcsBackground);\r\n\t\t\tarcs.append(\"text\")\r\n\t\t\t\t.attr(\"class\", CLASS.chartArcsGaugeUnit)\r\n\t\t\t\t.style(\"text-anchor\", \"middle\")\r\n\t\t\t\t.style(\"pointer-events\", \"none\");\r\n\t\t\tarcs.append(\"text\")\r\n\t\t\t\t.attr(\"class\", CLASS.chartArcsGaugeMin)\r\n\t\t\t\t.style(\"text-anchor\", \"middle\")\r\n\t\t\t\t.style(\"pointer-events\", \"none\");\r\n\t\t\tarcs.append(\"text\")\r\n\t\t\t\t.attr(\"class\", CLASS.chartArcsGaugeMax)\r\n\t\t\t\t.style(\"text-anchor\", \"middle\")\r\n\t\t\t\t.style(\"pointer-events\", \"none\");\r\n\t\t}\r\n\t},\r\n\r\n\tgetGaugeLabelHeight() {\r\n\t\treturn this.config.gauge_label_show ? 20 : 0;\r\n\t},\r\n});\r\n\n\n\n// WEBPACK FOOTER //\n// src/internals/arc.js","/**\r\n * Copyright (c) 2017 NAVER Corp.\r\n * billboard.js project is licensed under the MIT license\r\n */\r\nimport ChartInternal from \"./ChartInternal\";\r\nimport {extend} from \"./util\";\r\n\r\nextend(ChartInternal.prototype, {\r\n\thasCaches(ids) {\r\n\t\tfor (let i = 0; i < ids.length; i++) {\r\n\t\t\tif (!(ids[i] in this.cache)) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t},\r\n\r\n\taddCache(id, target) {\r\n\t\tthis.cache[id] = this.cloneTarget(target);\r\n\t},\r\n\r\n\tgetCaches(ids) {\r\n\t\tconst targets = [];\r\n\r\n\t\tfor (let i = 0; i < ids.length; i++) {\r\n\t\t\tif (ids[i] in this.cache) {\r\n\t\t\t\ttargets.push(this.cloneTarget(this.cache[ids[i]]));\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn targets;\r\n\t}\r\n});\r\n\n\n\n// WEBPACK FOOTER //\n// src/internals/cache.js","/**\r\n * Copyright (c) 2017 NAVER Corp.\r\n * billboard.js project is licensed under the MIT license\r\n */\r\nimport ChartInternal from \"./ChartInternal\";\r\nimport {extend} from \"./util\";\r\n\r\nextend(ChartInternal.prototype, {\r\n\t/**\r\n\t * Category Name\r\n\t * @private\r\n\t * @param {Number} index\r\n\t * @returns {String} gategory Name\r\n\t */\r\n\tcategoryName(i) {\r\n\t\tconst config = this.config;\r\n\r\n\t\treturn i < config.axis_x_categories.length ? config.axis_x_categories[i] : i;\r\n\t},\r\n});\r\n\n\n\n// WEBPACK FOOTER //\n// src/internals/category.js","/**\r\n * Copyright (c) 2017 NAVER Corp.\r\n * billboard.js project is licensed under the MIT license\r\n */\r\nimport ChartInternal from \"./ChartInternal\";\r\nimport CLASS from \"../config/classes\";\r\nimport {extend} from \"./util\";\r\n\r\n\r\nextend(ChartInternal.prototype, {\r\n\tCLASS,\r\n\r\n\tgenerateClass(prefix, targetId) {\r\n\t\treturn ` ${prefix} ${prefix + this.getTargetSelectorSuffix(targetId)}`;\r\n\t},\r\n\r\n\tclassText(d) {\r\n\t\treturn this.generateClass(CLASS.text, d.index);\r\n\t},\r\n\r\n\tclassTexts(d) {\r\n\t\treturn this.generateClass(CLASS.texts, d.id);\r\n\t},\r\n\r\n\tclassShape(d) {\r\n\t\treturn this.generateClass(CLASS.shape, d.index);\r\n\t},\r\n\r\n\tclassShapes(d) {\r\n\t\treturn this.generateClass(CLASS.shapes, d.id);\r\n\t},\r\n\r\n\tclassLine(d) {\r\n\t\treturn this.classShape(d) + this.generateClass(CLASS.line, d.id);\r\n\t},\r\n\r\n\tclassLines(d) {\r\n\t\treturn this.classShapes(d) + this.generateClass(CLASS.lines, d.id);\r\n\t},\r\n\r\n\tclassCircle(d) {\r\n\t\treturn this.classShape(d) + this.generateClass(CLASS.circle, d.index);\r\n\t},\r\n\r\n\tclassCircles(d) {\r\n\t\treturn this.classShapes(d) + this.generateClass(CLASS.circles, d.id);\r\n\t},\r\n\r\n\tclassBar(d) {\r\n\t\treturn this.classShape(d) + this.generateClass(CLASS.bar, d.index);\r\n\t},\r\n\r\n\tclassBars(d) {\r\n\t\treturn this.classShapes(d) + this.generateClass(CLASS.bars, d.id);\r\n\t},\r\n\r\n\tclassArc(d) {\r\n\t\treturn this.classShape(d.data) + this.generateClass(CLASS.arc, d.data.id);\r\n\t},\r\n\r\n\tclassArcs(d) {\r\n\t\treturn this.classShapes(d.data) + this.generateClass(CLASS.arcs, d.data.id);\r\n\t},\r\n\r\n\tclassArea(d) {\r\n\t\treturn this.classShape(d) + this.generateClass(CLASS.area, d.id);\r\n\t},\r\n\r\n\tclassAreas(d) {\r\n\t\treturn this.classShapes(d) + this.generateClass(CLASS.areas, d.id);\r\n\t},\r\n\r\n\tclassRegion(d, i) {\r\n\t\treturn `${this.generateClass(CLASS.region, i)} ${\"class\" in d ? d.class : \"\"}`;\r\n\t},\r\n\r\n\tclassEvent(d) {\r\n\t\treturn this.generateClass(CLASS.eventRect, d.index);\r\n\t},\r\n\r\n\tclassTarget(id) {\r\n\t\tconst additionalClassSuffix = this.config.data_classes[id];\r\n\t\tlet additionalClass = \"\";\r\n\r\n\t\tif (additionalClassSuffix) {\r\n\t\t\tadditionalClass = ` ${CLASS.target}-${additionalClassSuffix}`;\r\n\t\t}\r\n\r\n\t\treturn this.generateClass(CLASS.target, id) + additionalClass;\r\n\t},\r\n\r\n\tclassFocus(d) {\r\n\t\treturn this.classFocused(d) + this.classDefocused(d);\r\n\t},\r\n\r\n\tclassFocused(d) {\r\n\t\treturn ` ${this.focusedTargetIds.indexOf(d.id) >= 0 ? CLASS.focused : \"\"}`;\r\n\t},\r\n\r\n\tclassDefocused(d) {\r\n\t\treturn ` ${this.defocusedTargetIds.indexOf(d.id) >= 0 ? CLASS.defocused : \"\"}`;\r\n\t},\r\n\r\n\tclassChartText(d) {\r\n\t\treturn CLASS.chartText + this.classTarget(d.id);\r\n\t},\r\n\r\n\tclassChartLine(d) {\r\n\t\treturn CLASS.chartLine + this.classTarget(d.id);\r\n\t},\r\n\r\n\tclassChartBar(d) {\r\n\t\treturn CLASS.chartBar + this.classTarget(d.id);\r\n\t},\r\n\r\n\tclassChartArc(d) {\r\n\t\treturn CLASS.chartArc + this.classTarget(d.data.id);\r\n\t},\r\n\r\n\tgetTargetSelectorSuffix(targetId) {\r\n\t\treturn targetId || targetId === 0 ?\r\n\t\t\t`-${targetId}`.replace(/[\\s?!@#$%^&*()_=+,.<>'\":;\\[\\]\\/|~`{}\\\\]/g, \"-\") : \"\";\r\n\t},\r\n\r\n\tselectorTarget(id, prefix) {\r\n\t\treturn `${prefix || \"\"}.${CLASS.target + this.getTargetSelectorSuffix(id)}`;\r\n\t},\r\n\r\n\tselectorTargets(idsValue, prefix) {\r\n\t\tconst $$ = this;\r\n\t\tconst ids = idsValue || [];\r\n\r\n\t\treturn ids.length ?\r\n\t\t\tids.map(id => $$.selectorTarget(id, prefix)) : null;\r\n\t},\r\n\r\n\tselectorLegend(id) {\r\n\t\treturn `.${CLASS.legendItem + this.getTargetSelectorSuffix(id)}`;\r\n\t},\r\n\r\n\tselectorLegends(ids) {\r\n\t\tconst $$ = this;\r\n\r\n\t\treturn ids && ids.length ?\r\n\t\t\tids.map(id => $$.selectorLegend(id)) : null;\r\n\t},\r\n});\r\n\n\n\n// WEBPACK FOOTER //\n// src/internals/class.js","/**\r\n * Copyright (c) 2017 NAVER Corp.\r\n * billboard.js project is licensed under the MIT license\r\n */\r\nimport ChartInternal from \"./ChartInternal\";\r\nimport {extend} from \"./util\";\r\n\r\nextend(ChartInternal.prototype, {\r\n\tgetClipPath(id) {\r\n\t\tconst isIE9 = window.navigator.appVersion\r\n\t\t\t\t.toLowerCase().indexOf(\"msie 9.\") >= 0;\r\n\r\n\t\treturn `url(${(isIE9 ? \"\" : document.URL.split(\"#\")[0])}#${id})`;\r\n\t},\r\n\r\n\tappendClip(parent, id) {\r\n\t\treturn parent.append(\"clipPath\")\r\n\t\t\t.attr(\"id\", id)\r\n\t\t\t.append(\"rect\");\r\n\t},\r\n\r\n\tgetAxisClipX(forHorizontal) {\r\n\t\t// axis line width + padding for left\r\n\t\tconst left = Math.max(30, this.margin.left);\r\n\r\n\t\treturn forHorizontal ? -(1 + left) : -(left - 1);\r\n\t},\r\n\r\n\tgetAxisClipY(forHorizontal) {\r\n\t\treturn forHorizontal ? -20 : -this.margin.top;\r\n\t},\r\n\r\n\tgetXAxisClipX() {\r\n\t\tconst $$ = this;\r\n\r\n\t\treturn $$.getAxisClipX(!$$.config.axis_rotated);\r\n\t},\r\n\r\n\tgetXAxisClipY() {\r\n\t\tconst $$ = this;\r\n\r\n\t\treturn $$.getAxisClipY(!$$.config.axis_rotated);\r\n\t},\r\n\r\n\tgetYAxisClipX() {\r\n\t\tconst $$ = this;\r\n\r\n\t\treturn $$.config.axis_y_inner ?\r\n\t\t\t-1 : $$.getAxisClipX($$.config.axis_rotated);\r\n\t},\r\n\r\n\tgetYAxisClipY() {\r\n\t\tconst $$ = this;\r\n\r\n\t\treturn $$.getAxisClipY($$.config.axis_rotated);\r\n\t},\r\n\r\n\tgetAxisClipWidth(forHorizontal) {\r\n\t\tconst $$ = this;\r\n\t\tconst left = Math.max(30, $$.margin.left);\r\n\t\tconst right = Math.max(30, $$.margin.right);\r\n\r\n\t\t// width + axis line width + padding for left/right\r\n\t\treturn forHorizontal ?\r\n\t\t\t$$.width + 2 + left + right : $$.margin.left + 20;\r\n\t},\r\n\r\n\tgetAxisClipHeight(forHorizontal) {\r\n\t\t// less than 20 is not enough to show the axis label 'outer' without legend\r\n\t\treturn (forHorizontal ? this.margin.bottom : (this.margin.top + this.height)) + 20;\r\n\t},\r\n\r\n\tgetXAxisClipWidth() {\r\n\t\tconst $$ = this;\r\n\r\n\t\treturn $$.getAxisClipWidth(!$$.config.axis_rotated);\r\n\t},\r\n\r\n\tgetXAxisClipHeight() {\r\n\t\tconst $$ = this;\r\n\r\n\t\treturn $$.getAxisClipHeight(!$$.config.axis_rotated);\r\n\t},\r\n\r\n\tgetYAxisClipWidth() {\r\n\t\tconst $$ = this;\r\n\r\n\t\treturn $$.getAxisClipWidth($$.config.axis_rotated) + ($$.config.axis_y_inner ? 20 : 0);\r\n\t},\r\n\r\n\tgetYAxisClipHeight() {\r\n\t\tconst $$ = this;\r\n\r\n\t\treturn $$.getAxisClipHeight($$.config.axis_rotated);\r\n\t}\r\n});\r\n\n\n\n// WEBPACK FOOTER //\n// src/internals/clip.js","/**\r\n * Copyright (c) 2017 NAVER Corp.\r\n * billboard.js project is licensed under the MIT license\r\n */\r\nimport {\r\n\tscaleOrdinal as d3ScaleOrdinal,\r\n\tschemeCategory10 as d3SchemeCategory10\r\n} from \"d3\";\r\nimport ChartInternal from \"./ChartInternal\";\r\nimport {notEmpty, extend} from \"./util\";\r\n\r\nextend(ChartInternal.prototype, {\r\n\tgenerateColor() {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tconst colors = config.data_colors;\r\n\t\tconst callback = config.data_color;\r\n\t\tconst ids = [];\r\n\t\tconst pattern = notEmpty(config.color_pattern) ?\r\n\t\t\tconfig.color_pattern : d3ScaleOrdinal(d3SchemeCategory10).range();\r\n\r\n\t\treturn function(d) {\r\n\t\t\tconst id = d.id || (d.data && d.data.id) || d;\r\n\t\t\tlet color;\r\n\r\n\t\t\t// if callback function is provided\r\n\t\t\tif (colors[id] instanceof Function) {\r\n\t\t\t\tcolor = colors[id](d);\r\n\r\n\t\t\t// if specified, choose that color\r\n\t\t\t} else if (colors[id]) {\r\n\t\t\t\tcolor = colors[id];\r\n\r\n\t\t\t// if not specified, choose from pattern\r\n\t\t\t} else {\r\n\t\t\t\tif (ids.indexOf(id) < 0) { ids.push(id); }\r\n\t\t\t\tcolor = pattern[ids.indexOf(id) % pattern.length];\r\n\t\t\t\tcolors[id] = color;\r\n\t\t\t}\r\n\r\n\t\t\treturn callback instanceof Function ?\r\n\t\t\t\tcallback(color, d) : color;\r\n\t\t};\r\n\t},\r\n\r\n\tgenerateLevelColor() {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tconst colors = config.color_pattern;\r\n\t\tconst threshold = config.color_threshold;\r\n\r\n\t\tconst asValue = threshold.unit === \"value\";\r\n\t\tconst max = threshold.max || 100;\r\n\t\tconst values = threshold.values &&\r\n\t\t\tthreshold.values.length ? threshold.values : [];\r\n\r\n\t\treturn notEmpty(threshold) ? function(value) {\r\n\t\t\tlet color = colors[colors.length - 1];\r\n\r\n\t\t\tfor (let i = 0, v; i < values.length; i++) {\r\n\t\t\t\tv = asValue ? value : (value * 100 / max);\r\n\t\t\t\tif (v < values[i]) {\r\n\t\t\t\t\tcolor = colors[i];\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn color;\r\n\t\t} : null;\r\n\t}\r\n});\r\n\n\n\n// WEBPACK FOOTER //\n// src/internals/color.js","/**\r\n * Copyright (c) 2017 NAVER Corp.\r\n * billboard.js project is licensed under the MIT license\r\n */\r\nimport {\r\n\tmin as d3Min,\r\n\tmax as d3Max,\r\n\textent as d3Extent\r\n} from \"d3\"; // selection\r\nimport ChartInternal from \"./ChartInternal\";\r\nimport {extend, isDefined, notEmpty, isValue, diffDomain} from \"./util\";\r\n\r\n\r\nextend(ChartInternal.prototype, {\r\n\tgetYDomainMin(targets) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tconst ids = $$.mapToIds(targets);\r\n\t\tconst ys = $$.getValuesAsIdKeyed(targets);\r\n\t\tlet j;\r\n\t\tlet k;\r\n\t\tlet baseId;\r\n\t\tlet idsInGroup;\r\n\t\tlet id;\r\n\t\tlet hasNegativeValue;\r\n\r\n\t\tif (config.data_groups.length > 0) {\r\n\t\t\thasNegativeValue = $$.hasNegativeValueInTargets(targets);\r\n\r\n\t\t\tfor (j = 0; j < config.data_groups.length; j++) {\r\n\t\t\t\t// Determine baseId\r\n\t\t\t\tidsInGroup = config.data_groups[j].filter(v => (ids.indexOf(v) >= 0));\r\n\r\n\t\t\t\tif (idsInGroup.length === 0) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tbaseId = idsInGroup[0];\r\n\r\n\t\t\t\t// Consider negative values\r\n\t\t\t\tif (hasNegativeValue && ys[baseId]) {\r\n\t\t\t\t\tys[baseId].forEach((v, i) => {\r\n\t\t\t\t\t\tys[baseId][i] = v < 0 ? v : 0;\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Compute min\r\n\t\t\t\tfor (k = 1; k < idsInGroup.length; k++) {\r\n\t\t\t\t\tid = idsInGroup[k];\r\n\r\n\t\t\t\t\tif (!ys[id]) {\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tys[id].forEach((v, i) => {\r\n\t\t\t\t\t\tif ($$.axis.getId(id) === $$.axis.getId(baseId) &&\r\n\t\t\t\t\t\t\tys[baseId] && !(hasNegativeValue && +v > 0)) {\r\n\t\t\t\t\t\t\tys[baseId][i] += +v;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn d3Min(Object.keys(ys).map(key => d3Min(ys[key])));\r\n\t},\r\n\tgetYDomainMax(targets) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tconst ids = $$.mapToIds(targets);\r\n\t\tconst ys = $$.getValuesAsIdKeyed(targets);\r\n\t\tlet j;\r\n\t\tlet k;\r\n\t\tlet baseId;\r\n\t\tlet idsInGroup;\r\n\t\tlet id;\r\n\t\tlet hasPositiveValue;\r\n\r\n\t\tif (config.data_groups.length > 0) {\r\n\t\t\thasPositiveValue = $$.hasPositiveValueInTargets(targets);\r\n\t\t\tfor (j = 0; j < config.data_groups.length; j++) {\r\n\t\t\t\t// Determine baseId\r\n\t\t\t\tidsInGroup = config.data_groups[j].filter(v => (ids.indexOf(v) >= 0));\r\n\r\n\t\t\t\tif (idsInGroup.length === 0) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tbaseId = idsInGroup[0];\r\n\r\n\t\t\t\t// Consider positive values\r\n\t\t\t\tif (hasPositiveValue && ys[baseId]) {\r\n\t\t\t\t\tys[baseId].forEach((v, i) => {\r\n\t\t\t\t\t\tys[baseId][i] = v > 0 ? v : 0;\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t\t// Compute max\r\n\t\t\t\tfor (k = 1; k < idsInGroup.length; k++) {\r\n\t\t\t\t\tid = idsInGroup[k];\r\n\r\n\t\t\t\t\tif (!ys[id]) {\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tys[id].forEach((v, i) => {\r\n\t\t\t\t\t\tif ($$.axis.getId(id) === $$.axis.getId(baseId) &&\r\n\t\t\t\t\t\t\tys[baseId] && !(hasPositiveValue && +v < 0)) {\r\n\t\t\t\t\t\t\tys[baseId][i] += +v;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn d3Max(Object.keys(ys).map(key => d3Max(ys[key])));\r\n\t},\r\n\tgetYDomain(targets, axisId, xDomain) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tconst targetsByAxisId = targets.filter(t => $$.axis.getId(t.id) === axisId);\r\n\t\tconst yTargets = xDomain ? $$.filterByXDomain(targetsByAxisId, xDomain) : targetsByAxisId;\r\n\t\tconst yMin = axisId === \"y2\" ? config.axis_y2_min : config.axis_y_min;\r\n\t\tconst yMax = axisId === \"y2\" ? config.axis_y2_max : config.axis_y_max;\r\n\t\tlet yDomainMin = $$.getYDomainMin(yTargets);\r\n\t\tlet yDomainMax = $$.getYDomainMax(yTargets);\r\n\t\tconst center = axisId === \"y2\" ? config.axis_y2_center : config.axis_y_center;\r\n\t\tlet isZeroBased = ($$.hasType(\"bar\", yTargets) && config.bar_zerobased) || ($$.hasType(\"area\", yTargets) && config.area_zerobased);\r\n\t\tconst isInverted = axisId === \"y2\" ? config.axis_y2_inverted : config.axis_y_inverted;\r\n\t\tconst showHorizontalDataLabel = $$.hasDataLabel() && config.axis_rotated;\r\n\t\tconst showVerticalDataLabel = $$.hasDataLabel() && !config.axis_rotated;\r\n\t\tlet lengths;\r\n\r\n\t\t// MEMO: avoid inverting domain unexpectedly\r\n\t\tyDomainMin = isValue(yMin) ? yMin :\r\n\t\t\t(isValue(yMax) ? (yDomainMin < yMax ? yDomainMin : yMax - 10) : yDomainMin);\r\n\t\tyDomainMax = isValue(yMax) ? yMax :\r\n\t\t\t(isValue(yMin) ? (yMin < yDomainMax ? yDomainMax : yMin + 10) : yDomainMax);\r\n\r\n\t\tif (yTargets.length === 0) { // use current domain if target of axisId is none\r\n\t\t\treturn axisId === \"y2\" ? $$.y2.domain() : $$.y.domain();\r\n\t\t}\r\n\r\n\t\tif (isNaN(yDomainMin)) { // set minimum to zero when not number\r\n\t\t\tyDomainMin = 0;\r\n\t\t}\r\n\r\n\t\tif (isNaN(yDomainMax)) { // set maximum to have same value as yDomainMin\r\n\t\t\tyDomainMax = yDomainMin;\r\n\t\t}\r\n\r\n\t\tif (yDomainMin === yDomainMax) {\r\n\t\t\tyDomainMin < 0 ? yDomainMax = 0 : yDomainMin = 0;\r\n\t\t}\r\n\r\n\t\tconst isAllPositive = yDomainMin >= 0 && yDomainMax >= 0;\r\n\t\tconst isAllNegative = yDomainMin <= 0 && yDomainMax <= 0;\r\n\r\n\t\t// Cancel zerobased if axis_*_min / axis_*_max specified\r\n\t\tif ((isValue(yMin) && isAllPositive) || (isValue(yMax) && isAllNegative)) {\r\n\t\t\tisZeroBased = false;\r\n\t\t}\r\n\r\n\t\t// Bar/Area chart should be 0-based if all positive|negative\r\n\t\tif (isZeroBased) {\r\n\t\t\tif (isAllPositive) { yDomainMin = 0; }\r\n\t\t\tif (isAllNegative) { yDomainMax = 0; }\r\n\t\t}\r\n\r\n\t\tconst domainLength = Math.abs(yDomainMax - yDomainMin);\r\n\t\tlet paddingTop = domainLength * 0.1;\r\n\t\tlet paddingBottom = domainLength * 0.1;\r\n\r\n\t\tif (typeof center !== \"undefined\") {\r\n\t\t\tconst yDomainAbs = Math.max(Math.abs(yDomainMin), Math.abs(yDomainMax));\r\n\r\n\t\t\tyDomainMax = center + yDomainAbs;\r\n\t\t\tyDomainMin = center - yDomainAbs;\r\n\t\t}\r\n\r\n\t\t// add padding for data label\r\n\t\tif (showHorizontalDataLabel) {\r\n\t\t\tlengths = $$.getDataLabelLength(yDomainMin, yDomainMax, \"width\");\r\n\t\t\tconst diff = diffDomain($$.y.range());\r\n\t\t\tconst ratio = [lengths[0] / diff, lengths[1] / diff];\r\n\r\n\t\t\tpaddingTop += domainLength * (ratio[1] / (1 - ratio[0] - ratio[1]));\r\n\t\t\tpaddingBottom += domainLength * (ratio[0] / (1 - ratio[0] - ratio[1]));\r\n\t\t} else if (showVerticalDataLabel) {\r\n\t\t\tlengths = $$.getDataLabelLength(yDomainMin, yDomainMax, \"height\");\r\n\t\t\tpaddingTop += $$.axis.convertPixelsToAxisPadding(lengths[1], domainLength);\r\n\t\t\tpaddingBottom += $$.axis.convertPixelsToAxisPadding(lengths[0], domainLength);\r\n\t\t}\r\n\r\n\t\tif (axisId === \"y\" && notEmpty(config.axis_y_padding)) {\r\n\t\t\tpaddingTop = $$.axis.getPadding(config.axis_y_padding, \"top\", paddingTop, domainLength);\r\n\t\t\tpaddingBottom = $$.axis.getPadding(config.axis_y_padding, \"bottom\", paddingBottom, domainLength);\r\n\t\t}\r\n\r\n\t\tif (axisId === \"y2\" && notEmpty(config.axis_y2_padding)) {\r\n\t\t\tpaddingTop = $$.axis.getPadding(config.axis_y2_padding, \"top\", paddingTop, domainLength);\r\n\t\t\tpaddingBottom = $$.axis.getPadding(config.axis_y2_padding, \"bottom\", paddingBottom, domainLength);\r\n\t\t}\r\n\r\n\t\t// Bar/Area chart should be 0-based if all positive|negative\r\n\t\tif (isZeroBased) {\r\n\t\t\tif (isAllPositive) {\r\n\t\t\t\tpaddingBottom = yDomainMin;\r\n\t\t\t}\r\n\t\t\tif (isAllNegative) {\r\n\t\t\t\tpaddingTop = -yDomainMax;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst domain = [yDomainMin - paddingBottom, yDomainMax + paddingTop];\r\n\r\n\t\treturn isInverted ? domain.reverse() : domain;\r\n\t},\r\n\r\n\tgetXDomainMin(targets) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\r\n\t\treturn isDefined(config.axis_x_min) ?\r\n\t\t\t($$.isTimeSeries() ? this.parseDate(config.axis_x_min) : config.axis_x_min) :\r\n\t\td3Min(targets, t => d3Min(t.values, v => v.x));\r\n\t},\r\n\r\n\tgetXDomainMax(targets) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\r\n\t\treturn isDefined(config.axis_x_max) ?\r\n\t\t\t($$.isTimeSeries() ? this.parseDate(config.axis_x_max) : config.axis_x_max) :\r\n\t\td3Max(targets, t => d3Max(t.values, v => v.x));\r\n\t},\r\n\r\n\tgetXDomainPadding(domain) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tconst diff = domain[1] - domain[0];\r\n\t\tlet maxDataCount;\r\n\t\tlet padding;\r\n\t\tlet paddingLeft;\r\n\t\tlet paddingRight;\r\n\r\n\t\tif ($$.isCategorized()) {\r\n\t\t\tpadding = 0;\r\n\t\t} else if ($$.hasType(\"bar\")) {\r\n\t\t\tmaxDataCount = $$.getMaxDataCount();\r\n\t\t\tpadding = maxDataCount > 1 ? (diff / (maxDataCount - 1)) / 2 : 0.5;\r\n\t\t} else {\r\n\t\t\tpadding = diff * 0.01;\r\n\t\t}\r\n\r\n\t\tif (typeof config.axis_x_padding === \"object\" && notEmpty(config.axis_x_padding)) {\r\n\t\t\tpaddingLeft = isValue(config.axis_x_padding.left) ? config.axis_x_padding.left : padding;\r\n\t\t\tpaddingRight = isValue(config.axis_x_padding.right) ? config.axis_x_padding.right : padding;\r\n\t\t} else if (typeof config.axis_x_padding === \"number\") {\r\n\t\t\tpaddingLeft = config.axis_x_padding;\r\n\t\t\tpaddingRight = config.axis_x_padding;\r\n\t\t} else {\r\n\t\t\tpaddingLeft = padding;\r\n\t\t\tpaddingRight = padding;\r\n\t\t}\r\n\t\treturn {left: paddingLeft, right: paddingRight};\r\n\t},\r\n\r\n\tgetXDomain(targets) {\r\n\t\tconst $$ = this;\r\n\t\tconst xDomain = [$$.getXDomainMin(targets), $$.getXDomainMax(targets)];\r\n\t\tlet firstX = xDomain[0];\r\n\t\tlet lastX = xDomain[1];\r\n\t\tconst padding = $$.getXDomainPadding(xDomain);\r\n\t\tlet min = 0;\r\n\t\tlet max = 0;\r\n\t\t// show center of x domain if min and max are the same\r\n\r\n\t\tif ((firstX - lastX) === 0 && !$$.isCategorized()) {\r\n\t\t\tif ($$.isTimeSeries()) {\r\n\t\t\t\tfirstX = new Date(firstX.getTime() * 0.5);\r\n\t\t\t\tlastX = new Date(lastX.getTime() * 1.5);\r\n\t\t\t} else {\r\n\t\t\t\tfirstX = firstX === 0 ? 1 : (firstX * 0.5);\r\n\t\t\t\tlastX = lastX === 0 ? -1 : (lastX * 1.5);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (firstX || firstX === 0) {\r\n\t\t\tmin = $$.isTimeSeries() ? new Date(firstX.getTime() - padding.left) : firstX - padding.left;\r\n\t\t}\r\n\r\n\t\tif (lastX || lastX === 0) {\r\n\t\t\tmax = $$.isTimeSeries() ? new Date(lastX.getTime() + padding.right) : lastX + padding.right;\r\n\t\t}\r\n\r\n\t\treturn [min, max];\r\n\t},\r\n\r\n\tupdateXDomain(targets, withUpdateXDomain, withUpdateOrgXDomain, withTrim, domain) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\r\n\t\tif (withUpdateOrgXDomain) {\r\n\t\t\t$$.x.domain(domain || d3Extent($$.getXDomain(targets)));\r\n\t\t\t$$.orgXDomain = $$.x.domain();\r\n\r\n\t\t\tconfig.zoom_enabled &&\r\n\t\t\t\t$$.zoom.updateScaleExtent();\r\n\r\n\t\t\t$$.subX.domain($$.x.domain());\r\n\r\n\t\t\t$$.brush && $$.brush.scale($$.subX);\r\n\t\t}\r\n\r\n\t\tif (withUpdateXDomain) {\r\n\t\t\tconst domainValue = domain || (!$$.brush || $$.brushEmpty()) ?\r\n\t\t\t\t\t$$.orgXDomain : $$.getBrushSelection().map(v => $$.subX.invert(v));\r\n\r\n\t\t\t$$.x.domain(domainValue);\r\n\r\n\t\t\tconfig.zoom_enabled &&\r\n\t\t\t\t$$.zoom.updateScaleExtent();\r\n\t\t}\r\n\r\n\t\t// Trim domain when too big by zoom mousemove event\r\n\t\tif (withTrim) { $$.x.domain($$.trimXDomain($$.x.orgDomain())); }\r\n\r\n\t\treturn $$.x.domain();\r\n\t},\r\n\r\n\ttrimXDomain(domain) {\r\n\t\tconst zoomDomain = this.getZoomDomain();\r\n\t\tconst min = zoomDomain[0];\r\n\t\tconst max = zoomDomain[1];\r\n\r\n\t\tif (domain[0] <= min) {\r\n\t\t\tdomain[1] = +domain[1] + (min - domain[0]);\r\n\t\t\tdomain[0] = min;\r\n\t\t}\r\n\r\n\t\tif (max <= domain[1]) {\r\n\t\t\tdomain[0] = +domain[0] - (domain[1] - max);\r\n\t\t\tdomain[1] = max;\r\n\t\t}\r\n\r\n\t\treturn domain;\r\n\t},\r\n});\r\n\n\n\n// WEBPACK FOOTER //\n// src/internals/domain.js","/**\r\n * Copyright (c) 2017 NAVER Corp.\r\n * billboard.js project is licensed under the MIT license\r\n */\r\nimport ChartInternal from \"./ChartInternal\";\r\nimport {isValue, extend} from \"./util\";\r\n\r\nconst getFormat = ($$, typeValue, v) => {\r\n\tconst config = $$.config;\r\n\tconst type = `axis_${typeValue}_tick_format`;\r\n\tconst format = config[type] ?\r\n\t\tconfig[type] : $$.defaultValueFormat;\r\n\r\n\treturn format(v);\r\n};\r\n\r\nextend(ChartInternal.prototype, {\r\n\tgetYFormat(forArc) {\r\n\t\tconst $$ = this;\r\n\t\tlet formatForY = $$.yFormat;\r\n\t\tlet formatForY2 = $$.y2Format;\r\n\r\n\t\tif (forArc && !$$.hasType(\"gauge\")) {\r\n\t\t\tformatForY = $$.defaultArcValueFormat;\r\n\t\t\tformatForY2 = $$.defaultArcValueFormat;\r\n\t\t}\r\n\r\n\t\treturn function(v, ratio, id) {\r\n\t\t\tconst format = $$.axis.getId(id) === \"y2\" ?\r\n\t\t\t\tformatForY2 : formatForY;\r\n\r\n\t\t\treturn format.call($$, v, ratio);\r\n\t\t};\r\n\t},\r\n\r\n\tyFormat(v) {\r\n\t\treturn getFormat(this, \"y\", v);\r\n\t},\r\n\r\n\ty2Format(v) {\r\n\t\treturn getFormat(this, \"y2\", v);\r\n\t},\r\n\r\n\tdefaultValueFormat(v) {\r\n\t\treturn isValue(v) ? +v : \"\";\r\n\t},\r\n\r\n\tdefaultArcValueFormat(v, ratio) {\r\n\t\treturn `${(ratio * 100).toFixed(1)}%`;\r\n\t},\r\n\r\n\tdataLabelFormat(targetId) {\r\n\t\tconst $$ = this;\r\n\t\tconst dataLabels = $$.config.data_labels;\r\n\t\tconst defaultFormat = v => (isValue(v) ? +v : \"\");\r\n\t\tlet format;\r\n\r\n\t\t// find format according to axis id\r\n\t\tif (typeof dataLabels.format === \"function\") {\r\n\t\t\tformat = dataLabels.format;\r\n\t\t} else if (typeof dataLabels.format === \"object\") {\r\n\t\t\tif (dataLabels.format[targetId]) {\r\n\t\t\t\tformat = dataLabels.format[targetId] === true ? defaultFormat : dataLabels.format[targetId];\r\n\t\t\t} else {\r\n\t\t\t\tformat = () => \"\";\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tformat = defaultFormat;\r\n\t\t}\r\n\r\n\t\treturn format;\r\n\t}\r\n});\r\n\n\n\n// WEBPACK FOOTER //\n// src/internals/format.js","/**\r\n * Copyright (c) 2017 NAVER Corp.\r\n * billboard.js project is licensed under the MIT license\r\n */\r\nimport {\r\n\tselect as d3Select,\r\n\tselectAll as d3SelectAll\r\n} from \"d3\";\r\nimport ChartInternal from \"./ChartInternal\";\r\nimport CLASS from \"../config/classes\";\r\nimport {extend, isValue} from \"./util\";\r\n\r\nextend(ChartInternal.prototype, {\r\n\tinitGrid() {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\r\n\t\t$$.grid = $$.main.append(\"g\")\r\n\t\t\t.attr(\"clip-path\", $$.clipPathForGrid)\r\n\t\t\t.attr(\"class\", CLASS.grid);\r\n\r\n\t\tif (config.grid_x_show) {\r\n\t\t\t$$.grid.append(\"g\").attr(\"class\", CLASS.xgrids);\r\n\t\t}\r\n\r\n\t\tif (config.grid_y_show) {\r\n\t\t\t$$.grid.append(\"g\").attr(\"class\", CLASS.ygrids);\r\n\t\t}\r\n\r\n\t\tif (config.grid_focus_show) {\r\n\t\t\t$$.grid.append(\"g\")\r\n\t\t\t\t.attr(\"class\", CLASS.xgridFocus)\r\n\t\t\t\t.append(\"line\")\r\n\t\t\t\t.attr(\"class\", CLASS.xgridFocus);\r\n\t\t}\r\n\r\n\t\t$$.xgrid = d3SelectAll([]);\r\n\r\n\t\tif (!config.grid_lines_front) {\r\n\t\t\t$$.initGridLines();\r\n\t\t}\r\n\t},\r\n\r\n\tinitGridLines() {\r\n\t\tconst $$ = this;\r\n\r\n\t\t$$.gridLines = $$.main.append(\"g\")\r\n\t\t\t.attr(\"clip-path\", $$.clipPathForGrid)\r\n\t\t\t.attr(\"class\", `${CLASS.grid} ${CLASS.gridLines}`);\r\n\r\n\t\t$$.gridLines.append(\"g\").attr(\"class\", CLASS.xgridLines);\r\n\t\t$$.gridLines.append(\"g\").attr(\"class\", CLASS.ygridLines);\r\n\r\n\t\t$$.xgridLines = d3SelectAll([]);\r\n\t},\r\n\r\n\tupdateXGrid(withoutUpdate) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tconst xgridData = $$.generateGridData(config.grid_x_type, $$.x);\r\n\t\tconst tickOffset = $$.isCategorized() ? $$.xAxis.tickOffset() : 0;\r\n\r\n\t\t$$.xgridAttr = config.axis_rotated ? {\r\n\t\t\t\"x1\": 0,\r\n\t\t\t\"x2\": $$.width,\r\n\t\t\t\"y1\": d => $$.x(d) - tickOffset,\r\n\t\t\t\"y2\": d => $$.x(d) - tickOffset,\r\n\t\t} : {\r\n\t\t\t\"x1\": d => $$.x(d) + tickOffset,\r\n\t\t\t\"x2\": d => $$.x(d) + tickOffset,\r\n\t\t\t\"y1\": 0,\r\n\t\t\t\"y2\": $$.height,\r\n\t\t};\r\n\r\n\t\t$$.xgrid = $$.main.select(`.${CLASS.xgrids}`)\r\n\t\t\t.selectAll(`.${CLASS.xgrid}`)\r\n\t\t\t.data(xgridData);\r\n\r\n\t\t$$.xgrid.exit().remove();\r\n\r\n\t\t$$.xgrid = $$.xgrid.enter()\r\n\t\t\t.append(\"line\")\r\n\t\t\t.attr(\"class\", CLASS.xgrid)\r\n\t\t\t.merge($$.xgrid);\r\n\r\n\t\tif (!withoutUpdate) {\r\n\t\t\t$$.xgrid.each(function() {\r\n\t\t\t\tconst grid = d3Select(this);\r\n\r\n\t\t\t\tObject.keys($$.xgridAttr).forEach(id => {\r\n\t\t\t\t\tgrid.attr(id, $$.xgridAttr[id])\r\n\t\t\t\t\t\t.style(\"opacity\", () => (\r\n\t\t\t\t\t\t\tgrid.attr(config.axis_rotated ? \"y1\" : \"x1\") === (config.axis_rotated ? $$.height : 0) ?\r\n\t\t\t\t\t\t\t\t\"0\" : \"1\"\r\n\t\t\t\t\t\t));\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t}\r\n\t},\r\n\r\n\tupdateYGrid() {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tconst gridValues = $$.yAxis.tickValues() || $$.y.ticks(config.grid_y_ticks);\r\n\r\n\t\t$$.ygrid = $$.main.select(`.${CLASS.ygrids}`)\r\n\t\t\t.selectAll(`.${CLASS.ygrid}`)\r\n\t\t\t.data(gridValues);\r\n\r\n\t\t$$.ygrid.exit().remove();\r\n\r\n\t\t$$.ygrid = $$.ygrid\r\n\t\t\t.enter()\r\n\t\t\t.append(\"line\")\r\n\t\t\t.attr(\"class\", CLASS.ygrid)\r\n\t\t\t.merge($$.ygrid);\r\n\r\n\t\t$$.ygrid.attr(\"x1\", config.axis_rotated ? $$.y : 0)\r\n\t\t\t.attr(\"x2\", config.axis_rotated ? $$.y : $$.width)\r\n\t\t\t.attr(\"y1\", config.axis_rotated ? 0 : $$.y)\r\n\t\t\t.attr(\"y2\", config.axis_rotated ? $$.height : $$.y);\r\n\r\n\t\t$$.smoothLines($$.ygrid, \"grid\");\r\n\t},\r\n\r\n\tgridTextAnchor(d) {\r\n\t\treturn d.position ? d.position : \"end\";\r\n\t},\r\n\r\n\tgridTextDx(d) {\r\n\t\treturn d.position === \"start\" ? 4 : d.position === \"middle\" ? 0 : -4;\r\n\t},\r\n\r\n\txGridTextX(d) {\r\n\t\treturn d.position === \"start\" ? -this.height : d.position === \"middle\" ? -this.height / 2 : 0;\r\n\t},\r\n\r\n\tyGridTextX(d) {\r\n\t\treturn d.position === \"start\" ? 0 : d.position === \"middle\" ? this.width / 2 : this.width;\r\n\t},\r\n\r\n\tupdateGrid(duration) {\r\n\t\tconst $$ = this;\r\n\t\tconst main = $$.main;\r\n\t\tconst config = $$.config;\r\n\r\n\t\t// hide if arc type\r\n\t\t$$.grid.style(\"visibility\", $$.hasArcType() ? \"hidden\" : \"visible\");\r\n\r\n\t\tmain.select(`line.${CLASS.xgridFocus}`)\r\n\t\t\t.style(\"visibility\", \"hidden\");\r\n\r\n\t\tif (config.grid_x_show) {\r\n\t\t\t$$.updateXGrid();\r\n\t\t}\r\n\r\n\t\t$$.xgridLines = main.select(`.${CLASS.xgridLines}`)\r\n\t\t\t.selectAll(`.${CLASS.xgridLine}`)\r\n\t\t\t.data(config.grid_x_lines);\r\n\r\n\t\t// exit\r\n\t\t$$.xgridLines.exit().transition()\r\n\t\t\t.duration(duration)\r\n\t\t\t.style(\"opacity\", \"0\")\r\n\t\t\t.remove();\r\n\r\n\t\t// enter\r\n\t\tconst xgridLine = $$.xgridLines.enter().append(\"g\")\r\n\t\t\t.attr(\"class\", d => CLASS.xgridLine + (d.class ? ` ${d.class}` : \"\"));\r\n\r\n\t\txgridLine.append(\"line\")\r\n\t\t\t.style(\"opacity\", \"0\");\r\n\r\n\t\txgridLine.append(\"text\")\r\n\t\t\t.attr(\"text-anchor\", $$.gridTextAnchor)\r\n\t\t\t.attr(\"transform\", config.axis_rotated ? \"\" : \"rotate(-90)\")\r\n\t\t\t.attr(\"dx\", $$.gridTextDx)\r\n\t\t\t.attr(\"dy\", -5)\r\n\t\t\t.style(\"opacity\", \"0\");\r\n\r\n\t\t$$.xgridLines = xgridLine.merge($$.xgridLines);\r\n\r\n\t\t// Y-Grid\r\n\t\tif (config.grid_y_show) {\r\n\t\t\t$$.updateYGrid();\r\n\t\t}\r\n\t\t$$.ygridLines = main.select(`.${CLASS.ygridLines}`)\r\n\t\t\t.selectAll(`.${CLASS.ygridLine}`)\r\n\t\t\t.data(config.grid_y_lines);\r\n\r\n\t\t// exit\r\n\t\t$$.ygridLines.exit()\r\n\t\t\t.transition()\r\n\t\t\t.duration(duration)\r\n\t\t\t.style(\"opacity\", \"0\")\r\n\t\t\t.remove();\r\n\r\n\t\t// enter\r\n\t\tconst ygridLine = $$.ygridLines.enter().append(\"g\")\r\n\t\t\t.attr(\"class\", d => CLASS.ygridLine + (d.class ? ` ${d.class}` : \"\"));\r\n\r\n\t\tygridLine.append(\"line\")\r\n\t\t\t.style(\"opacity\", \"0\");\r\n\r\n\t\tygridLine.append(\"text\")\r\n\t\t\t.attr(\"text-anchor\", $$.gridTextAnchor)\r\n\t\t\t.attr(\"transform\", config.axis_rotated ? \"rotate(-90)\" : \"\")\r\n\t\t\t.attr(\"dx\", $$.gridTextDx)\r\n\t\t\t.attr(\"dy\", -5)\r\n\t\t\t.style(\"opacity\", \"0\");\r\n\r\n\t\t$$.ygridLines = ygridLine.merge($$.ygridLines);\r\n\r\n\t\t// update\r\n\t\tconst yv = $$.yv.bind($$);\r\n\r\n\t\t$$.ygridLines.select(\"line\")\r\n\t\t\t.transition()\r\n\t\t\t.duration(duration)\r\n\t\t\t.attr(\"x1\", config.axis_rotated ? yv : 0)\r\n\t\t\t.attr(\"x2\", config.axis_rotated ? yv : $$.width)\r\n\t\t\t.attr(\"y1\", config.axis_rotated ? 0 : yv)\r\n\t\t\t.attr(\"y2\", config.axis_rotated ? $$.height : yv)\r\n\t\t\t.transition()\r\n\t\t\t.style(\"opacity\", \"1\");\r\n\r\n\t\t$$.ygridLines.select(\"text\")\r\n\t\t\t.transition()\r\n\t\t\t.duration(duration)\r\n\t\t\t.attr(\"x\", config.axis_rotated ? $$.xGridTextX.bind($$) : $$.yGridTextX.bind($$))\r\n\t\t\t.attr(\"y\", yv)\r\n\t\t\t.text(d => d.text)\r\n\t\t\t.transition()\r\n\t\t\t.style(\"opacity\", \"1\");\r\n\t},\r\n\r\n\tredrawGrid(withTransition) {\r\n\t\tconst $$ = this;\r\n\t\tconst rotated = $$.config.axis_rotated;\r\n\t\tconst xv = $$.xv.bind($$);\r\n\r\n\t\tlet lines = $$.xgridLines.select(\"line\");\r\n\t\tlet texts = $$.xgridLines.select(\"text\");\r\n\r\n\t\tlines = (withTransition ? lines.transition() : lines)\r\n\t\t\t.attr(\"x1\", rotated ? 0 : xv)\r\n\t\t\t.attr(\"x2\", rotated ? $$.width : xv)\r\n\t\t\t.attr(\"y1\", rotated ? xv : 0)\r\n\t\t\t.attr(\"y2\", rotated ? xv : $$.height);\r\n\r\n\t\ttexts = (withTransition ? texts.transition() : texts)\r\n\t\t\t.attr(\"x\", rotated ? $$.yGridTextX.bind($$) : $$.xGridTextX.bind($$))\r\n\t\t\t.attr(\"y\", xv)\r\n\t\t\t.text(d => d.text);\r\n\r\n\t\treturn [\r\n\t\t\t(withTransition ? lines.transition() : lines).style(\"opacity\", \"1\"),\r\n\t\t\t(withTransition ? texts.transition() : texts).style(\"opacity\", \"1\")\r\n\t\t];\r\n\t},\r\n\r\n\tshowXGridFocus(selectedData) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tconst dataToShow = selectedData.filter(d => d && isValue(d.value));\r\n\t\tconst focusEl = $$.main.selectAll(`line.${CLASS.xgridFocus}`);\r\n\t\tconst xx = $$.xx.bind($$);\r\n\r\n\t\tif (!config.tooltip_show) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Hide when scatter plot exists\r\n\t\tif ($$.hasType(\"scatter\") || $$.hasArcType()) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tfocusEl\r\n\t\t\t.style(\"visibility\", \"visible\")\r\n\t\t\t.data([dataToShow[0]])\r\n\t\t\t.attr(config.axis_rotated ? \"y1\" : \"x1\", xx)\r\n\t\t\t.attr(config.axis_rotated ? \"y2\" : \"x2\", xx);\r\n\r\n\t\t$$.smoothLines(focusEl, \"grid\");\r\n\t},\r\n\r\n\thideXGridFocus() {\r\n\t\tthis.main.select(`line.${CLASS.xgridFocus}`).style(\"visibility\", \"hidden\");\r\n\t},\r\n\r\n\tupdateXgridFocus() {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\r\n\t\t$$.main.select(`line.${CLASS.xgridFocus}`)\r\n\t\t\t.attr(\"x1\", config.axis_rotated ? 0 : -10)\r\n\t\t\t.attr(\"x2\", config.axis_rotated ? $$.width : -10)\r\n\t\t\t.attr(\"y1\", config.axis_rotated ? -10 : 0)\r\n\t\t\t.attr(\"y2\", config.axis_rotated ? -10 : $$.height);\r\n\t},\r\n\r\n\tgenerateGridData(type, scale) {\r\n\t\tconst $$ = this;\r\n\t\tconst tickNum = $$.main.select(`.${CLASS.axisX}`)\r\n\t\t\t.selectAll(\".tick\")\r\n\t\t\t.size();\r\n\t\tlet gridData = [];\r\n\r\n\t\tif (type === \"year\") {\r\n\t\t\tconst xDomain = $$.getXDomain();\r\n\t\t\tconst firstYear = xDomain[0].getFullYear();\r\n\t\t\tconst lastYear = xDomain[1].getFullYear();\r\n\r\n\t\t\tfor (let i = firstYear; i <= lastYear; i++) {\r\n\t\t\t\tgridData.push(new Date(`${i}-01-01 00:00:00`));\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tgridData = scale.ticks(10);\r\n\t\t\tif (gridData.length > tickNum) { // use only int\r\n\t\t\t\tgridData = gridData.filter(d => String(d).indexOf(\".\") < 0);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn gridData;\r\n\t},\r\n\r\n\tgetGridFilterToRemove(params) {\r\n\t\treturn params ? function(line) {\r\n\t\t\tlet found = false;\r\n\r\n\t\t\t[].concat(params).forEach(param => {\r\n\t\t\t\tif (((\"value\" in param && line.value === param.value) || (\"class\" in param && line.class === param.class))) {\r\n\t\t\t\t\tfound = true;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\treturn found;\r\n\t\t} : function() { return true; };\r\n\t},\r\n\r\n\tremoveGridLines(params, forX) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tconst toRemove = $$.getGridFilterToRemove(params);\r\n\t\tconst toShow = function(line) {\r\n\t\t\treturn !toRemove(line);\r\n\t\t};\r\n\t\tconst classLines = forX ? CLASS.xgridLines : CLASS.ygridLines;\r\n\t\tconst classLine = forX ? CLASS.xgridLine : CLASS.ygridLine;\r\n\r\n\t\t$$.main.select(`.${classLines}`)\r\n\t\t\t.selectAll(`.${classLine}`)\r\n\t\t\t.filter(toRemove)\r\n\t\t\t.transition()\r\n\t\t\t.duration(config.transition_duration)\r\n\t\t\t.style(\"opacity\", \"0\")\r\n\t\t\t.remove();\r\n\r\n\t\tif (forX) {\r\n\t\t\tconfig.grid_x_lines = config.grid_x_lines.filter(toShow);\r\n\t\t} else {\r\n\t\t\tconfig.grid_y_lines = config.grid_y_lines.filter(toShow);\r\n\t\t}\r\n\t},\r\n});\r\n\n\n\n// WEBPACK FOOTER //\n// src/internals/grid.js","/**\r\n * Copyright (c) 2017 NAVER Corp.\r\n * billboard.js project is licensed under the MIT license\r\n */\r\nimport {\r\n\tselect as d3Select,\r\n\tevent as d3Event\r\n} from \"d3\";\r\nimport ChartInternal from \"./ChartInternal\";\r\nimport CLASS from \"../config/classes\";\r\nimport {extend, isDefined, getOption, isEmpty} from \"./util\";\r\n\r\n\r\nextend(ChartInternal.prototype, {\r\n\t/**\r\n\t * Initialize the legend.\r\n\t * @private\r\n\t */\r\n\tinitLegend() {\r\n\t\tconst $$ = this;\r\n\r\n\t\t$$.legendItemTextBox = {};\r\n\t\t$$.legendHasRendered = false;\r\n\t\t$$.legend = $$.svg.append(\"g\").attr(\"transform\", $$.getTranslate(\"legend\"));\r\n\t\tif (!$$.config.legend_show) {\r\n\t\t\t$$.legend.style(\"visibility\", \"hidden\");\r\n\t\t\t$$.hiddenLegendIds = $$.mapToIds($$.data.targets);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t// MEMO: call here to update legend box and tranlate for all\r\n\t\t// MEMO: translate will be upated by this, so transform not needed in updateLegend()\r\n\t\t$$.updateLegendWithDefaults();\r\n\t},\r\n\r\n\t/**\r\n\t * Update the legend to its default value.\r\n\t * @private\r\n\t */\r\n\tupdateLegendWithDefaults() {\r\n\t\tconst $$ = this;\r\n\r\n\t\t$$.updateLegend($$.mapToIds($$.data.targets), {\r\n\t\t\twithTransform: false,\r\n\t\t\twithTransitionForTransform: false,\r\n\t\t\twithTransition: false\r\n\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * Update the size of the legend.\r\n\t * @private\r\n\t * @param {Number} height\r\n\t * @param {Number} width\r\n\t */\r\n\tupdateSizeForLegend(legendHeight, legendWidth) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\r\n\t\tconst insetLegendPosition = {\r\n\t\t\ttop: $$.isLegendTop ?\r\n\t\t\t\t$$.getCurrentPaddingTop() + config.legend_inset_y + 5.5 :\r\n\t\t\t\t$$.currentHeight - legendHeight - $$.getCurrentPaddingBottom() - config.legend_inset_y,\r\n\t\t\tleft: $$.isLegendLeft ?\r\n\t\t\t\t$$.getCurrentPaddingLeft() + config.legend_inset_x + 0.5 :\r\n\t\t\t\t$$.currentWidth - legendWidth - $$.getCurrentPaddingRight() - config.legend_inset_x + 0.5\r\n\t\t};\r\n\r\n\t\t$$.margin3 = {\r\n\t\t\ttop: $$.isLegendRight ?\r\n\t\t\t\t0 : $$.isLegendInset ? insetLegendPosition.top : $$.currentHeight - legendHeight,\r\n\t\t\tright: NaN,\r\n\t\t\tbottom: 0,\r\n\t\t\tleft: $$.isLegendRight ?\r\n\t\t\t\t$$.currentWidth - legendWidth : $$.isLegendInset ? insetLegendPosition.left : 0\r\n\t\t};\r\n\t},\r\n\t/**\r\n\t * Transform Legend\r\n\t * @private\r\n\t * @param {Boolean} whether or not to transition.\r\n\t */\r\n\ttransformLegend(withTransition) {\r\n\t\tconst $$ = this;\r\n\r\n\t\t(withTransition ? $$.legend.transition() : $$.legend)\r\n\t\t\t.attr(\"transform\", $$.getTranslate(\"legend\"));\r\n\t},\r\n\r\n\t/**\r\n\t * Update the legend step\r\n\t * @private\r\n\t * @param {Number} step\r\n\t */\r\n\tupdateLegendStep(step) {\r\n\t\tthis.legendStep = step;\r\n\t},\r\n\r\n\t/**\r\n\t * Update legend item width\r\n\t * @private\r\n\t * @param {Number} width\r\n\t */\r\n\tupdateLegendItemWidth(w) {\r\n\t\tthis.legendItemWidth = w;\r\n\t},\r\n\r\n\t/**\r\n\t * Update legend item height\r\n\t * @private\r\n\t * @param {Number} height\r\n\t */\r\n\tupdateLegendItemHeight(h) {\r\n\t\tthis.legendItemHeight = h;\r\n\t},\r\n\r\n\t/**\r\n\t * Get the width of the legend\r\n\t * @private\r\n\t * @param {Number} width\r\n\t */\r\n\tgetLegendWidth() {\r\n\t\tconst $$ = this;\r\n\r\n\t\treturn $$.config.legend_show ?\r\n\t\t\t$$.isLegendRight ||\r\n\t\t\t$$.isLegendInset ? $$.legendItemWidth * ($$.legendStep + 1) : $$.currentWidth : 0;\r\n\t},\r\n\t/**\r\n\t * Get the height of the legend\r\n\t * @private\r\n\t * @param {Number} height\r\n\t */\r\n\tgetLegendHeight() {\r\n\t\tconst $$ = this;\r\n\t\tlet h = 0;\r\n\r\n\t\tif ($$.config.legend_show) {\r\n\t\t\tif ($$.isLegendRight) {\r\n\t\t\t\th = $$.currentHeight;\r\n\t\t\t} else {\r\n\t\t\t\th = Math.max(20, $$.legendItemHeight) * ($$.legendStep + 1);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn h;\r\n\t},\r\n\t/**\r\n\t * Get the opacity of the legend\r\n\t * @private\r\n\t * @param {Object} d3.Select\r\n\t * @returns {Number} opacity\r\n\t */\r\n\topacityForLegend(legendItem) {\r\n\t\treturn legendItem.classed(CLASS.legendItemHidden) ? null : \"1\";\r\n\t},\r\n\r\n\t/**\r\n\t * Get the opacity of the legend that is unfocused\r\n\t * @private\r\n\t * @param {Object} legendItem, d3.Select\r\n\t * @returns {Number} opacity\r\n\t */\r\n\topacityForUnfocusedLegend(legendItem) {\r\n\t\treturn legendItem.classed(CLASS.legendItemHidden) ? null : \"0.3\";\r\n\t},\r\n\t/**\r\n\t * Toggles the focus of the legend\r\n\t * @private\r\n\t * @param {Array} ID's of target\r\n\t * @param {Boolean} whether or not to focus.\r\n\t */\r\n\ttoggleFocusLegend(targetIds, focus) {\r\n\t\tconst $$ = this;\r\n\t\tconst targetIdz = $$.mapToTargetIds(targetIds);\r\n\r\n\t\t$$.legend.selectAll(`.${CLASS.legendItem}`)\r\n\t\t\t.filter(id => targetIdz.indexOf(id) >= 0)\r\n\t\t\t.classed(CLASS.legendItemFocused, focus)\r\n\t\t\t.transition()\r\n\t\t\t.duration(100)\r\n\t\t\t.style(\"opacity\", function() {\r\n\t\t\t\tconst opacity = focus ? $$.opacityForLegend : $$.opacityForUnfocusedLegend;\r\n\r\n\t\t\t\treturn opacity.call($$, d3Select(this));\r\n\t\t\t});\r\n\t},\r\n\t/**\r\n\t * Revert the legend to its default state\r\n\t * @private\r\n\t */\r\n\trevertLegend() {\r\n\t\tconst $$ = this;\r\n\r\n\t\t$$.legend.selectAll(`.${CLASS.legendItem}`)\r\n\t\t\t.classed(CLASS.legendItemFocused, false)\r\n\t\t\t.transition()\r\n\t\t\t.duration(100)\r\n\t\t\t.style(\"opacity\", function() {\r\n\t\t\t\treturn $$.opacityForLegend(d3Select(this));\r\n\t\t\t});\r\n\t},\r\n\t/**\r\n\t * Shows the legend\r\n\t * @private\r\n\t * @param {Array} ID's of target\r\n\t */\r\n\tshowLegend(targetIds) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\r\n\t\tif (!config.legend_show) {\r\n\t\t\tconfig.legend_show = true;\r\n\t\t\t$$.legend.style(\"visibility\", \"visible\");\r\n\t\t\tif (!$$.legendHasRendered) {\r\n\t\t\t\t$$.updateLegendWithDefaults();\r\n\t\t\t}\r\n\t\t}\r\n\t\t$$.removeHiddenLegendIds(targetIds);\r\n\r\n\t\t$$.legend.selectAll($$.selectorLegends(targetIds))\r\n\t\t\t.style(\"visibility\", \"visible\")\r\n\t\t\t.transition()\r\n\t\t\t.style(\"opacity\", function() {\r\n\t\t\t\treturn $$.opacityForLegend(d3Select(this));\r\n\t\t\t});\r\n\t},\r\n\t/**\r\n\t * Hide the legend\r\n\t * @private\r\n\t * @param {Array} ID's of target\r\n\t */\r\n\thideLegend(targetIds) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\r\n\t\tif (config.legend_show && isEmpty(targetIds)) {\r\n\t\t\tconfig.legend_show = false;\r\n\t\t\t$$.legend.style(\"visibility\", \"hidden\");\r\n\t\t}\r\n\t\t$$.addHiddenLegendIds(targetIds);\r\n\t\t$$.legend.selectAll($$.selectorLegends(targetIds))\r\n\t\t\t.style(\"opacity\", \"0\")\r\n\t\t\t.style(\"visibility\", \"hidden\");\r\n\t},\r\n\t/**\r\n\t * Clear the LegendItemTextBox cache.\r\n\t * @private\r\n\t */\r\n\tclearLegendItemTextBoxCache() {\r\n\t\tthis.legendItemTextBox = {};\r\n\t},\r\n\t/**\r\n\t * Update the legend\r\n\t * @private\r\n\t * @param {Array} ID's of target\r\n\t * @param {Object} withTransform : Whether to use the transform property / withTransitionForTransform: Whether transition is used when using the transform property / withTransition : whether or not to transition.\r\n\t * @param {Object} the return value of the generateTransitions\r\n\t */\r\n\tupdateLegend(targetIds, options, transitions) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tconst paddingTop = 4;\r\n\t\tconst paddingRight = 10;\r\n\t\tconst posMin = 10;\r\n\t\tconst tileWidth = config.legend_item_tile_width + 5;\r\n\t\tconst isTouch = ($$.inputType === \"touch\");\r\n\t\tlet maxWidth = 0;\r\n\t\tlet maxHeight = 0;\r\n\t\tlet xForLegend;\r\n\t\tlet yForLegend;\r\n\t\tlet totalLength = 0;\r\n\t\tconst offsets = {};\r\n\t\tconst widths = {};\r\n\t\tconst heights = {};\r\n\t\tconst margins = [0];\r\n\t\tconst steps = {};\r\n\t\tlet step = 0;\r\n\t\tlet background;\r\n\t\t// Skip elements when their name is set to null\r\n\t\tconst targetIdz = targetIds\r\n\t\t\t.filter(id => !isDefined(config.data_names[id]) || config.data_names[id] !== null);\r\n\t\tconst optionz = options || {};\r\n\t\tconst withTransition = getOption(optionz, \"withTransition\", true);\r\n\t\tconst withTransitionForTransform = getOption(optionz, \"withTransitionForTransform\", true);\r\n\t\tconst getTextBox = function(textElement, id) {\r\n\t\t\tif (!$$.legendItemTextBox[id]) {\r\n\t\t\t\t$$.legendItemTextBox[id] =\r\n\t\t\t\t\t$$.getTextRect(textElement.textContent, CLASS.legendItem, textElement);\r\n\t\t\t}\r\n\t\t\treturn $$.legendItemTextBox[id];\r\n\t\t};\r\n\t\tconst updatePositions = function(textElement, id, index) {\r\n\t\t\tconst reset = index === 0;\r\n\t\t\tconst isLast = index === targetIdz.length - 1;\r\n\t\t\tconst box = getTextBox(textElement, id);\r\n\t\t\tconst itemWidth = box.width + tileWidth +\r\n\t\t\t\t(isLast && !($$.isLegendRight || $$.isLegendInset) ? 0 : paddingRight) + config.legend_padding;\r\n\t\t\tconst itemHeight = box.height + paddingTop;\r\n\t\t\tconst itemLength = $$.isLegendRight ||\r\n\t\t\t\t$$.isLegendInset ? itemHeight : itemWidth;\r\n\t\t\tconst areaLength = $$.isLegendRight ||\r\n\t\t\t\t$$.isLegendInset ? $$.getLegendHeight() : $$.getLegendWidth();\r\n\t\t\tlet margin;\r\n\r\n\t\t\t// MEMO: care about condifion of step, totalLength\r\n\t\t\tconst updateValues = function(id2, withoutStep) {\r\n\t\t\t\tif (!withoutStep) {\r\n\t\t\t\t\tmargin = (areaLength - totalLength - itemLength) / 2;\r\n\t\t\t\t\tif (margin < posMin) {\r\n\t\t\t\t\t\tmargin = (areaLength - itemLength) / 2;\r\n\t\t\t\t\t\ttotalLength = 0;\r\n\t\t\t\t\t\tstep++;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tsteps[id2] = step;\r\n\t\t\t\tmargins[step] = $$.isLegendInset ? 10 : margin;\r\n\t\t\t\toffsets[id2] = totalLength;\r\n\t\t\t\ttotalLength += itemLength;\r\n\t\t\t};\r\n\r\n\t\t\tif (reset) {\r\n\t\t\t\ttotalLength = 0;\r\n\t\t\t\tstep = 0;\r\n\t\t\t\tmaxWidth = 0;\r\n\t\t\t\tmaxHeight = 0;\r\n\t\t\t}\r\n\r\n\t\t\tif (config.legend_show && !$$.isLegendToShow(id)) {\r\n\t\t\t\twidths[id] = 0;\r\n\t\t\t\theights[id] = 0;\r\n\t\t\t\tsteps[id] = 0;\r\n\t\t\t\toffsets[id] = 0;\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\twidths[id] = itemWidth;\r\n\t\t\theights[id] = itemHeight;\r\n\r\n\t\t\tif (!maxWidth || itemWidth >= maxWidth) {\r\n\t\t\t\tmaxWidth = itemWidth;\r\n\t\t\t}\r\n\r\n\t\t\tif (!maxHeight || itemHeight >= maxHeight) {\r\n\t\t\t\tmaxHeight = itemHeight;\r\n\t\t\t}\r\n\r\n\t\t\tconst maxLength = $$.isLegendRight || $$.isLegendInset ? maxHeight : maxWidth;\r\n\r\n\t\t\tif (config.legend_equally) {\r\n\t\t\t\tObject.keys(widths).forEach(id2 => (widths[id2] = maxWidth));\r\n\t\t\t\tObject.keys(heights).forEach(id2 => (heights[id2] = maxHeight));\r\n\t\t\t\tmargin = (areaLength - maxLength * targetIdz.length) / 2;\r\n\t\t\t\tif (margin < posMin) {\r\n\t\t\t\t\ttotalLength = 0;\r\n\t\t\t\t\tstep = 0;\r\n\t\t\t\t\ttargetIdz.forEach(id2 => updateValues(id2));\r\n\t\t\t\t} else {\r\n\t\t\t\t\tupdateValues(id, true);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tupdateValues(id);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tif ($$.isLegendInset) {\r\n\t\t\tstep = config.legend_inset_step ? config.legend_inset_step : targetIdz.length;\r\n\t\t\t$$.updateLegendStep(step);\r\n\t\t}\r\n\r\n\t\tif ($$.isLegendRight) {\r\n\t\t\txForLegend = id => maxWidth * steps[id];\r\n\t\t\tyForLegend = id => margins[steps[id]] + offsets[id];\r\n\t\t} else if ($$.isLegendInset) {\r\n\t\t\txForLegend = id => maxWidth * steps[id] + 10;\r\n\t\t\tyForLegend = id => margins[steps[id]] + offsets[id];\r\n\t\t} else {\r\n\t\t\txForLegend = id => margins[steps[id]] + offsets[id];\r\n\t\t\tyForLegend = id => maxHeight * steps[id];\r\n\t\t}\r\n\r\n\t\tconst xForLegendText = (id, i) => xForLegend(id, i) + 4 + config.legend_item_tile_width;\r\n\t\tconst yForLegendText = (id, i) => yForLegend(id, i) + 9;\r\n\t\tconst xForLegendRect = (id, i) => xForLegend(id, i);\r\n\t\tconst yForLegendRect = (id, i) => yForLegend(id, i) - 5;\r\n\t\tconst x1ForLegendTile = (id, i) => xForLegend(id, i) - 2;\r\n\t\tconst x2ForLegendTile = (id, i) => xForLegend(id, i) - 2 + config.legend_item_tile_width;\r\n\t\tconst yForLegendTile = (id, i) => yForLegend(id, i) + 4;\r\n\r\n\t\t// Define g for legend area\r\n\t\tconst l = $$.legend.selectAll(`.${CLASS.legendItem}`)\r\n\t\t\t.data(targetIdz)\r\n\t\t\t.enter()\r\n\t\t\t.append(\"g\")\r\n\t\t\t.attr(\"class\", id => $$.generateClass(CLASS.legendItem, id))\r\n\t\t\t.style(\"visibility\", id => ($$.isLegendToShow(id) ? \"visible\" : \"hidden\"))\r\n\t\t\t.style(\"cursor\", \"pointer\")\r\n\t\t\t.on(isTouch ? \"touchstart\" : \"click\", id => {\r\n\t\t\t\tif (config.legend_item_onclick) {\r\n\t\t\t\t\tconfig.legend_item_onclick.call($$, id);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif (d3Event.altKey) {\r\n\t\t\t\t\t\t$$.api.hide();\r\n\t\t\t\t\t\t$$.api.show(id);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\t$$.api.toggle(id);\r\n\t\t\t\t\t\t$$.isTargetToShow(id) ? $$.api.focus(id) : $$.api.revert();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tisTouch && $$.hideTooltip();\r\n\t\t\t})\r\n\t\t\t.on(isTouch ? undefined : \"mouseover\", function(id) {\r\n\t\t\t\tif (config.legend_item_onover) {\r\n\t\t\t\t\tconfig.legend_item_onover.call($$, id);\r\n\t\t\t\t} else {\r\n\t\t\t\t\td3Select(this).classed(CLASS.legendItemFocused, true);\r\n\t\t\t\t\tif (!$$.transiting && $$.isTargetToShow(id)) {\r\n\t\t\t\t\t\t$$.api.focus(id);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t\t.on(isTouch ? \"touchend\" : \"mouseout\", function(id) {\r\n\t\t\t\tif (config.legend_item_onout) {\r\n\t\t\t\t\tconfig.legend_item_onout.call($$, id);\r\n\t\t\t\t} else {\r\n\t\t\t\t\td3Select(this).classed(CLASS.legendItemFocused, false);\r\n\t\t\t\t\t$$.api.revert();\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\tl.append(\"text\")\r\n\t\t\t.text(id => (isDefined(config.data_names[id]) ? config.data_names[id] : id))\r\n\t\t\t.each(function(id, i) {\r\n\t\t\t\tupdatePositions(this, id, i);\r\n\t\t\t})\r\n\t\t\t.style(\"pointer-events\", \"none\")\r\n\t\t\t.attr(\"x\", $$.isLegendRight || $$.isLegendInset ? xForLegendText : -200)\r\n\t\t\t.attr(\"y\", $$.isLegendRight || $$.isLegendInset ? -200 : yForLegendText);\r\n\r\n\t\tl.append(\"rect\")\r\n\t\t\t.attr(\"class\", CLASS.legendItemEvent)\r\n\t\t\t.style(\"fill-opacity\", \"0\")\r\n\t\t\t.attr(\"x\", $$.isLegendRight || $$.isLegendInset ? xForLegendRect : -200)\r\n\t\t\t.attr(\"y\", $$.isLegendRight || $$.isLegendInset ? -200 : yForLegendRect);\r\n\r\n\t\tl.append(\"line\")\r\n\t\t\t.attr(\"class\", CLASS.legendItemTile)\r\n\t\t\t.style(\"stroke\", $$.color)\r\n\t\t\t.style(\"pointer-events\", \"none\")\r\n\t\t\t.attr(\"x1\", $$.isLegendRight || $$.isLegendInset ? x1ForLegendTile : -200)\r\n\t\t\t.attr(\"y1\", $$.isLegendRight || $$.isLegendInset ? -200 : yForLegendTile)\r\n\t\t\t.attr(\"x2\", $$.isLegendRight || $$.isLegendInset ? x2ForLegendTile : -200)\r\n\t\t\t.attr(\"y2\", $$.isLegendRight || $$.isLegendInset ? -200 : yForLegendTile)\r\n\t\t\t.attr(\"stroke-width\", config.legend_item_tile_height);\r\n\r\n\t\t// Set background for inset legend\r\n\t\tbackground = $$.legend.select(`.${CLASS.legendBackground} rect`);\r\n\r\n\t\tif ($$.isLegendInset && maxWidth > 0 && background.size() === 0) {\r\n\t\t\tbackground = $$.legend.insert(\"g\", `.${CLASS.legendItem}`)\r\n\t\t\t\t.attr(\"class\", CLASS.legendBackground)\r\n\t\t\t\t.append(\"rect\");\r\n\t\t}\r\n\r\n\t\tconst texts = $$.legend.selectAll(\"text\")\r\n\t\t\t.data(targetIdz)\r\n\t\t\t.text(id => (isDefined(config.data_names[id]) ? config.data_names[id] : id)) // MEMO: needed for update\r\n\t\t\t.each(function(id, i) {\r\n\t\t\t\tupdatePositions(this, id, i);\r\n\t\t\t});\r\n\r\n\t\t(withTransition ? texts.transition() : texts)\r\n\t\t\t.attr(\"x\", xForLegendText)\r\n\t\t\t.attr(\"y\", yForLegendText);\r\n\r\n\t\tconst rects = $$.legend.selectAll(`rect.${CLASS.legendItemEvent}`)\r\n\t\t\t.data(targetIdz);\r\n\r\n\t\t(withTransition ? rects.transition() : rects)\r\n\t\t\t.attr(\"width\", id => widths[id])\r\n\t\t\t.attr(\"height\", id => heights[id])\r\n\t\t\t.attr(\"x\", xForLegendRect)\r\n\t\t\t.attr(\"y\", yForLegendRect);\r\n\r\n\t\tconst tiles = $$.legend.selectAll(`line.${CLASS.legendItemTile}`)\r\n\t\t\t.data(targetIdz);\r\n\r\n\t\t(withTransition ? tiles.transition() : tiles)\r\n\t\t\t.style(\"stroke\", $$.color)\r\n\t\t\t.attr(\"x1\", x1ForLegendTile)\r\n\t\t\t.attr(\"y1\", yForLegendTile)\r\n\t\t\t.attr(\"x2\", x2ForLegendTile)\r\n\t\t\t.attr(\"y2\", yForLegendTile);\r\n\r\n\t\tif (background) {\r\n\t\t\t(withTransition ? background.transition() : background)\r\n\t\t\t\t.attr(\"height\", $$.getLegendHeight() - 12)\r\n\t\t\t\t.attr(\"width\", maxWidth * (step + 1) + 10);\r\n\t\t}\r\n\r\n\t\t// toggle legend state\r\n\t\t$$.legend.selectAll(`.${CLASS.legendItem}`)\r\n\t\t\t.classed(CLASS.legendItemHidden, id => !$$.isTargetToShow(id));\r\n\r\n\t\t// Update all to reflect change of legend\r\n\t\t$$.updateLegendItemWidth(maxWidth);\r\n\t\t$$.updateLegendItemHeight(maxHeight);\r\n\t\t$$.updateLegendStep(step);\r\n\t\t// Update size and scale\r\n\t\t$$.updateSizes();\r\n\t\t$$.updateScales();\r\n\t\t$$.updateSvgSize();\r\n\t\t// Update g positions\r\n\t\t$$.transformAll(withTransitionForTransform, transitions);\r\n\t\t$$.legendHasRendered = true;\r\n\t},\r\n});\r\n\n\n\n// WEBPACK FOOTER //\n// src/internals/legend.js","/**\r\n * Copyright (c) 2017 NAVER Corp.\r\n * billboard.js project is licensed under the MIT license\r\n */\r\nimport {select as d3Select} from \"d3\"; // selection\r\nimport ChartInternal from \"./ChartInternal\";\r\nimport CLASS from \"../config/classes\";\r\nimport {isValue, extend} from \"./util\";\r\n\r\nextend(ChartInternal.prototype, {\r\n\tinitRegion() {\r\n\t\tconst $$ = this;\r\n\r\n\t\t$$.region = $$.main.append(\"g\")\r\n\t\t\t.attr(\"clip-path\", $$.clipPath)\r\n\t\t\t.attr(\"class\", CLASS.regions);\r\n\t},\r\n\r\n\tupdateRegion(duration) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\r\n\t\t// hide if arc type\r\n\t\t$$.region.style(\"visibility\", $$.hasArcType() ? \"hidden\" : \"visible\");\r\n\r\n\t\t// select element\r\n\t\t$$.mainRegion = $$.main.select(`.${CLASS.regions}`)\r\n\t\t\t.selectAll(`.${CLASS.region}`)\r\n\t\t\t.data(config.regions);\r\n\r\n\t\t$$.mainRegion.exit()\r\n\t\t\t.transition()\r\n\t\t\t.duration(duration)\r\n\t\t\t.style(\"opacity\", \"0\")\r\n\t\t\t.remove();\r\n\r\n\t\t$$.mainRegion = $$.mainRegion.enter()\r\n\t\t\t.append(\"g\")\r\n\t\t\t.merge($$.mainRegion)\r\n\t\t\t.attr(\"class\", $$.classRegion.bind($$));\r\n\r\n\t\t$$.mainRegion\r\n\t\t\t.append(\"rect\")\r\n\t\t\t.style(\"fill-opacity\", \"0\");\r\n\t},\r\n\r\n\tredrawRegion(withTransition) {\r\n\t\tconst $$ = this;\r\n\t\tconst x = $$.regionX.bind($$);\r\n\t\tconst y = $$.regionY.bind($$);\r\n\t\tconst w = $$.regionWidth.bind($$);\r\n\t\tconst h = $$.regionHeight.bind($$);\r\n\r\n\t\tlet regions = $$.mainRegion.select(\"rect\");\r\n\r\n\t\tregions = (withTransition ? regions.transition() : regions)\r\n\t\t\t.attr(\"x\", x)\r\n\t\t\t.attr(\"y\", y)\r\n\t\t\t.attr(\"width\", w)\r\n\t\t\t.attr(\"height\", h);\r\n\r\n\t\treturn [\r\n\t\t\t(withTransition ? regions.transition() : regions)\r\n\t\t\t\t.style(\"fill-opacity\", d => (isValue(d.opacity) ? d.opacity : \"0.1\"))\r\n\t\t\t\t.on(\"end\", function() {\r\n\t\t\t\t\t// remove unnecessary rect after transition\r\n\t\t\t\t\td3Select(this.parentNode)\r\n\t\t\t\t\t\t.selectAll(\"rect:not([x])\")\r\n\t\t\t\t\t\t.remove();\r\n\t\t\t\t})\r\n\t\t];\r\n\t},\r\n\r\n\tregionX(d) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tconst yScale = d.axis === \"y\" ? $$.y : $$.y2;\r\n\t\tlet xPos;\r\n\r\n\t\tif (d.axis === \"y\" || d.axis === \"y2\") {\r\n\t\t\txPos = config.axis_rotated ? (\r\n\t\t\t\t\"start\" in d ? yScale(d.start) : 0\r\n\t\t\t) : 0;\r\n\t\t} else {\r\n\t\t\txPos = config.axis_rotated ? 0 : (\r\n\t\t\t\t\"start\" in d ? $$.x(\r\n\t\t\t\t\t$$.isTimeSeries() ? $$.parseDate(d.start) : d.start\r\n\t\t\t\t) : 0\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t\treturn xPos;\r\n\t},\r\n\r\n\tregionY(d) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tconst yScale = d.axis === \"y\" ? $$.y : $$.y2;\r\n\t\tlet yPos;\r\n\r\n\t\tif (d.axis === \"y\" || d.axis === \"y2\") {\r\n\t\t\tyPos = config.axis_rotated ? 0 : (\r\n\t\t\t\t\"end\" in d ? yScale(d.end) : 0\r\n\t\t\t);\r\n\t\t} else {\r\n\t\t\tyPos = config.axis_rotated ? (\r\n\t\t\t\t\"start\" in d ? $$.x(\r\n\t\t\t\t\t$$.isTimeSeries() ? $$.parseDate(d.start) : d.start\r\n\t\t\t\t) : 0\r\n\t\t\t) : 0;\r\n\t\t}\r\n\r\n\t\treturn yPos;\r\n\t},\r\n\r\n\tregionWidth(d) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tconst yScale = d.axis === \"y\" ? $$.y : $$.y2;\r\n\t\tconst start = $$.regionX(d);\r\n\t\tlet end;\r\n\r\n\t\tif (d.axis === \"y\" || d.axis === \"y2\") {\r\n\t\t\tend = config.axis_rotated ? (\r\n\t\t\t\t\"end\" in d ? yScale(d.end) : $$.width\r\n\t\t\t) : $$.width;\r\n\t\t} else {\r\n\t\t\tend = config.axis_rotated ?\r\n\t\t\t\t$$.width : \"end\" in d ? $$.x(\r\n\t\t\t\t\t\t$$.isTimeSeries() ? $$.parseDate(d.end) : d.end\r\n\t\t\t\t\t) : $$.width;\r\n\t\t}\r\n\r\n\t\treturn end < start ? 0 : end - start;\r\n\t},\r\n\r\n\tregionHeight(d) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tconst start = this.regionY(d);\r\n\t\tlet end;\r\n\t\tconst yScale = d.axis === \"y\" ? $$.y : $$.y2;\r\n\r\n\t\tif (d.axis === \"y\" || d.axis === \"y2\") {\r\n\t\t\tend = config.axis_rotated ?\r\n\t\t\t\t$$.height : (\r\n\t\t\t\t\t\"start\" in d ? yScale(d.start) : $$.height\r\n\t\t\t\t);\r\n\t\t} else {\r\n\t\t\tend = config.axis_rotated ? (\r\n\t\t\t\t\"end\" in d ? $$.x(\r\n\t\t\t\t\t$$.isTimeSeries() ? $$.parseDate(d.end) : d.end\r\n\t\t\t\t) : $$.height\r\n\t\t\t) : $$.height;\r\n\t\t}\r\n\r\n\t\treturn end < start ? 0 : end - start;\r\n\t},\r\n\r\n\tisRegionOnX(d) {\r\n\t\treturn !d.axis || d.axis === \"x\";\r\n\t},\r\n});\r\n\n\n\n// WEBPACK FOOTER //\n// src/internals/region.js","/**\r\n * Copyright (c) 2017 NAVER Corp.\r\n * billboard.js project is licensed under the MIT license\r\n */\r\nimport {\r\n\tscaleTime as d3ScaleTime,\r\n\tscaleLinear as d3ScaleLinear\r\n} from \"d3\";\r\nimport ChartInternal from \"./ChartInternal\";\r\nimport {extend} from \"./util\";\r\n\r\nextend(ChartInternal.prototype, {\r\n\tgetScale(min, max, forTimeseries) {\r\n\t\treturn (forTimeseries ?\r\n\t\t\t\td3ScaleTime() : d3ScaleLinear()\r\n\t\t\t).range([min, max]);\r\n\t},\r\n\r\n\tgetX(min, max, domain, offsetValue) {\r\n\t\tconst $$ = this;\r\n\t\tlet scale = $$.getScale(min, max, $$.isTimeSeries());\r\n\t\tconst _scale = domain ? scale.domain(domain) : scale;\r\n\t\tlet key;\r\n\t\tlet offset;\r\n\r\n\t\t// Define customized scale if categorized axis\r\n\t\tif ($$.isCategorized()) {\r\n\t\t\toffset = offsetValue || function() { return 0; };\r\n\t\t\tscale = function(d, raw) {\r\n\t\t\t\tconst v = _scale(d) + offset(d);\r\n\r\n\t\t\t\treturn raw ? v : Math.ceil(v);\r\n\t\t\t};\r\n\t\t} else {\r\n\t\t\tscale = function(d, raw) {\r\n\t\t\t\tconst v = _scale(d);\r\n\r\n\t\t\t\treturn raw ? v : Math.ceil(v);\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\t// define functions\r\n\t\tfor (key in _scale) {\r\n\t\t\tscale[key] = _scale[key];\r\n\t\t}\r\n\r\n\t\tscale.orgDomain = function() {\r\n\t\t\treturn _scale.domain();\r\n\t\t};\r\n\r\n\t\t// define custom domain() for categorized axis\r\n\t\tif ($$.isCategorized()) {\r\n\t\t\tscale.domain = function(domainValue) {\r\n\t\t\t\tlet domain = domainValue;\r\n\r\n\t\t\t\tif (!arguments.length) {\r\n\t\t\t\t\tdomain = this.orgDomain();\r\n\t\t\t\t\treturn [domain[0], domain[1] + 1];\r\n\t\t\t\t}\r\n\r\n\t\t\t\t_scale.domain(domain);\r\n\r\n\t\t\t\treturn scale;\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\treturn scale;\r\n\t},\r\n\r\n\tgetY(min, max, domain) {\r\n\t\tconst scale = this.getScale(min, max, this.isTimeSeriesY());\r\n\r\n\t\tif (domain) {\r\n\t\t\tscale.domain(domain);\r\n\t\t}\r\n\r\n\t\treturn scale;\r\n\t},\r\n\r\n\tgetYScale(id) {\r\n\t\treturn this.axis.getId(id) === \"y2\" ? this.y2 : this.y;\r\n\t},\r\n\r\n\tgetSubYScale(id) {\r\n\t\treturn this.axis.getId(id) === \"y2\" ? this.subY2 : this.subY;\r\n\t},\r\n\r\n\t/**\r\n\t * Update scale\r\n\t * @private\r\n\t * @param {Boolean} withoutTransitionAtInit - param is given at the init rendering\r\n\t */\r\n\tupdateScales(withoutTransitionAtInit) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tconst forInit = !$$.x;\r\n\r\n\t\t// update edges\r\n\t\t$$.xMin = config.axis_rotated ? 1 : 0;\r\n\t\t$$.xMax = config.axis_rotated ? $$.height : $$.width;\r\n\t\t$$.yMin = config.axis_rotated ? 0 : $$.height;\r\n\t\t$$.yMax = config.axis_rotated ? $$.width : 1;\r\n\t\t$$.subXMin = $$.xMin;\r\n\t\t$$.subXMax = $$.xMax;\r\n\t\t$$.subYMin = config.axis_rotated ? 0 : $$.height2;\r\n\t\t$$.subYMax = config.axis_rotated ? $$.width2 : 1;\r\n\r\n\t\t// update scales\r\n\t\t$$.x = $$.getX($$.xMin, $$.xMax,\r\n\t\t\tforInit ? undefined : $$.x.orgDomain(), () => $$.xAxis.tickOffset());\r\n\r\n\t\t$$.y = $$.getY($$.yMin, $$.yMax, forInit ? config.axis_y_default : $$.y.domain());\r\n\t\t$$.y2 = $$.getY($$.yMin, $$.yMax, forInit ? config.axis_y2_default : $$.y2.domain());\r\n\t\t$$.subX = $$.getX($$.xMin, $$.xMax, $$.orgXDomain, d => (d % 1 ? 0 : $$.subXAxis.tickOffset()));\r\n\t\t$$.subY = $$.getY($$.subYMin, $$.subYMax, forInit ? config.axis_y_default : $$.subY.domain());\r\n\t\t$$.subY2 = $$.getY($$.subYMin, $$.subYMax, forInit ? config.axis_y2_default : $$.subY2.domain());\r\n\r\n\t\t// update axes\r\n\t\t$$.xAxisTickFormat = $$.axis.getXAxisTickFormat();\r\n\t\t$$.xAxisTickValues = $$.axis.getXAxisTickValues();\r\n\t\t$$.yAxisTickValues = $$.axis.getYAxisTickValues();\r\n\t\t$$.y2AxisTickValues = $$.axis.getY2AxisTickValues();\r\n\r\n\t\t$$.xAxis = $$.axis\r\n\t\t\t.getXAxis($$.x, $$.xOrient, $$.xAxisTickFormat,\r\n\t\t\t\t$$.xAxisTickValues, config.axis_x_tick_outer, withoutTransitionAtInit);\r\n\r\n\t\t$$.subXAxis = $$.axis\r\n\t\t\t.getXAxis($$.subX, $$.subXOrient, $$.xAxisTickFormat,\r\n\t\t\t\t$$.xAxisTickValues, config.axis_x_tick_outer);\r\n\r\n\t\t$$.yAxis = $$.axis\r\n\t\t\t.getYAxis($$.y, $$.yOrient, config.axis_y_tick_format,\r\n\t\t\t\t$$.yAxisTickValues, config.axis_y_tick_outer);\r\n\r\n\t\t$$.y2Axis = $$.axis\r\n\t\t\t.getYAxis($$.y2, $$.y2Orient, config.axis_y2_tick_format,\r\n\t\t\t\t$$.y2AxisTickValues, config.axis_y2_tick_outer);\r\n\r\n\t\t// update for arc\r\n\t\tif ($$.updateArc) { $$.updateArc(); }\r\n\t},\r\n});\r\n\n\n\n// WEBPACK FOOTER //\n// src/internals/scale.js","/**\r\n * Copyright (c) 2017 NAVER Corp.\r\n * billboard.js project is licensed under the MIT license\r\n */\r\nimport {\r\n\tselect as d3Select,\r\n\trgb as d3Rgb\r\n} from \"d3\";\r\nimport ChartInternal from \"./ChartInternal\";\r\nimport CLASS from \"../config/classes\";\r\nimport {extend} from \"./util\";\r\n\r\nextend(ChartInternal.prototype, {\r\n\t/**\r\n\t * Select a point\r\n\t * @private\r\n\t * @param {Object} target point\r\n\t * @param {Object} data\r\n\t * @param {Number} index\r\n\t */\r\n\tselectPoint(target, d, i) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tconst cx = (config.axis_rotated ? $$.circleY : $$.circleX).bind($$);\r\n\t\tconst cy = (config.axis_rotated ? $$.circleX : $$.circleY).bind($$);\r\n\t\tconst r = $$.pointSelectR.bind($$);\r\n\r\n\t\tconfig.data_onselected\r\n\t\t\t.call($$.api, d, target.node());\r\n\r\n\t\t// add selected-circle on low layer g\r\n\t\t$$.main.select(`.${CLASS.selectedCircles}${$$.getTargetSelectorSuffix(d.id)}`).selectAll(`.${CLASS.selectedCircle}-${i}`)\r\n\t\t\t.data([d])\r\n\t\t\t.enter()\r\n\t\t\t.append(\"circle\")\r\n\t\t\t.attr(\"class\", () => $$.generateClass(CLASS.selectedCircle, i))\r\n\t\t\t.attr(\"cx\", cx)\r\n\t\t\t.attr(\"cy\", cy)\r\n\t\t\t.attr(\"stroke\", () => $$.color(d))\r\n\t\t\t.attr(\"r\", d2 => $$.pointSelectR(d2) * 1.4)\r\n\t\t\t.transition()\r\n\t\t\t.duration(100)\r\n\t\t\t.attr(\"r\", r);\r\n\t},\r\n\r\n\t/**\r\n\t * Unelect a point\r\n\t * @private\r\n\t * @param {Object} target point\r\n\t * @param {Object} data\r\n\t * @param {Number} index\r\n\t */\r\n\tunselectPoint(target, d, i) {\r\n\t\tconst $$ = this;\r\n\r\n\t\t$$.config.data_onunselected.call($$.api, d, target.node());\r\n\t\t// remove selected-circle from low layer g\r\n\t\t$$.main.select(`.${CLASS.selectedCircles}${$$.getTargetSelectorSuffix(d.id)}`).selectAll(`.${CLASS.selectedCircle}-${i}`)\r\n\t\t\t.transition()\r\n\t\t\t.duration(100)\r\n\t\t\t.attr(\"r\", 0)\r\n\t\t\t.remove();\r\n\t},\r\n\r\n\t/**\r\n\t * Toggles the selection of points\r\n\t * @private\r\n\t * @param {Boolean} whether or not to select.\r\n\t * @param {Object} target point\r\n\t * @param {Object} data\r\n\t * @param {Number} index\r\n\t */\r\n\ttogglePoint(selected, target, d, i) {\r\n\t\tselected ? this.selectPoint(target, d, i) : this.unselectPoint(target, d, i);\r\n\t},\r\n\r\n\t/**\r\n\t * Select a path\r\n\t * @private\r\n\t * @param {Object} target path\r\n\t * @param {Object} data\r\n\t */\r\n\tselectPath(target, d) {\r\n\t\tconst $$ = this;\r\n\r\n\t\t$$.config.data_onselected.call($$, d, target.node());\r\n\t\tif ($$.config.interaction_brighten) {\r\n\t\t\ttarget.transition().duration(100)\r\n\t\t\t\t.style(\"fill\", () => d3Rgb($$.color(d)).brighter(0.75));\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Unelect a path\r\n\t * @private\r\n\t * @param {Object} target path\r\n\t * @param {Object} data\r\n\t */\r\n\tunselectPath(target, d) {\r\n\t\tconst $$ = this;\r\n\r\n\t\t$$.config.data_onunselected.call($$, d, target.node());\r\n\t\tif ($$.config.interaction_brighten) {\r\n\t\t\ttarget.transition().duration(100)\r\n\t\t\t\t.style(\"fill\", () => $$.color(d));\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Toggles the selection of lines\r\n\t * @private\r\n\t * @param {Boolean} whether or not to select.\r\n\t * @param {Object} target shape\r\n\t * @param {Object} data\r\n\t * @param {Number} index\r\n\t */\r\n\ttogglePath(selected, target, d, i) {\r\n\t\tselected ? this.selectPath(target, d, i) : this.unselectPath(target, d, i);\r\n\t},\r\n\r\n\t/**\r\n\t * Returns the toggle method of the target\r\n\t * @private\r\n\t * @param {Object} target shape\r\n\t * @param {Object} data\r\n\t * @returns {Function} toggle method\r\n\t */\r\n\tgetToggle(that, d) {\r\n\t\tconst $$ = this;\r\n\t\tlet toggle;\r\n\r\n\t\tif (that.nodeName === \"circle\") {\r\n\t\t\tif ($$.isStepType(d)) {\r\n\t\t\t\t// circle is hidden in step chart, so treat as within the click area\r\n\t\t\t\ttoggle = () => {}; // TODO: how to select step chart?\r\n\t\t\t} else {\r\n\t\t\t\ttoggle = $$.togglePoint;\r\n\t\t\t}\r\n\t\t} else if (that.nodeName === \"path\") {\r\n\t\t\ttoggle = $$.togglePath;\r\n\t\t}\r\n\t\treturn toggle;\r\n\t},\r\n\r\n\t/**\r\n\t * Toggles the selection of shapes\r\n\t * @private\r\n\t * @param {Object} target shape\r\n\t * @param {Object} data\r\n\t * @param {Number} index\r\n\t */\r\n\ttoggleShape(that, d, i) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tconst shape = d3Select(that);\r\n\t\tconst isSelected = shape.classed(CLASS.SELECTED);\r\n\t\tconst toggle = $$.getToggle(that, d).bind($$);\r\n\r\n\t\tif (config.data_selection_enabled && config.data_selection_isselectable(d)) {\r\n\t\t\tif (!config.data_selection_multiple) {\r\n\t\t\t\tlet selecter = `.${CLASS.shapes}`;\r\n\r\n\t\t\t\tif (config.data_selection_grouped) {\r\n\t\t\t\t\tselecter = `.${selecter}${$$.getTargetSelectorSuffix(d.id)}`;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t$$.main.selectAll(selecter)\r\n\t\t\t\t\t.selectAll(`.${CLASS.shape}`)\r\n\t\t\t\t\t.each((d, i) => {\r\n\t\t\t\t\t\tconst shape = d3Select(this);\r\n\r\n\t\t\t\t\t\tif (shape.classed(CLASS.SELECTED)) {\r\n\t\t\t\t\t\t\ttoggle(false, shape.classed(CLASS.SELECTED, false), d, i);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t}\r\n\t\t\tshape.classed(CLASS.SELECTED, !isSelected);\r\n\t\t\ttoggle(!isSelected, shape, d, i);\r\n\t\t}\r\n\t},\r\n});\r\n\n\n\n// WEBPACK FOOTER //\n// src/internals/selection.js","/**\r\n * Copyright (c) 2017 NAVER Corp.\r\n * billboard.js project is licensed under the MIT license\r\n */\r\nimport {\r\n\tmouse as d3Mouse\r\n} from \"d3\";\r\nimport CLASS from \"../config/classes\";\r\nimport ChartInternal from \"./ChartInternal\";\r\nimport {extend, isValue, getRectSegList} from \"./util\";\r\n\r\nextend(ChartInternal.prototype, {\r\n\tinitBar() {\r\n\t\tconst $$ = this;\r\n\r\n\t\t$$.main.select(`.${CLASS.chart}`).append(\"g\")\r\n\t\t\t.attr(\"class\", CLASS.chartBars);\r\n\t},\r\n\r\n\tupdateTargetsForBar(targets) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tconst classChartBar = $$.classChartBar.bind($$);\r\n\t\tconst classBars = $$.classBars.bind($$);\r\n\t\tconst classFocus = $$.classFocus.bind($$);\r\n\t\tconst mainBarUpdate = $$.main.select(`.${CLASS.chartBars}`)\r\n\t\t\t.selectAll(`.${CLASS.chartBar}`)\r\n\t\t\t.data(targets)\r\n\t\t\t.attr(\"class\", d => classChartBar(d) + classFocus(d));\r\n\t\tconst mainBarEnter = mainBarUpdate.enter().append(\"g\")\r\n\t\t\t.attr(\"class\", classChartBar)\r\n\t\t\t.style(\"opacity\", \"0\")\r\n\t\t\t.style(\"pointer-events\", \"none\");\r\n\r\n\t\t// Bars for each data\r\n\t\tmainBarEnter.append(\"g\")\r\n\t\t\t.attr(\"class\", classBars)\r\n\t\t\t.style(\"cursor\", d => (config.data_selection_isselectable(d) ? \"pointer\" : null));\r\n\t},\r\n\r\n\tupdateBar(durationForExit) {\r\n\t\tconst $$ = this;\r\n\t\tconst barData = $$.barData.bind($$);\r\n\t\tconst classBar = $$.classBar.bind($$);\r\n\t\tconst initialOpacity = $$.initialOpacity.bind($$);\r\n\t\tconst color = d => $$.color(d.id);\r\n\r\n\t\t$$.mainBar = $$.main.selectAll(`.${CLASS.bars}`).selectAll(`.${CLASS.bar}`)\r\n\t\t\t.data(barData);\r\n\r\n\t\t$$.mainBar.exit().transition()\r\n\t\t\t.duration(durationForExit)\r\n\t\t\t.style(\"opacity\", \"0\")\r\n\t\t\t.remove();\r\n\r\n\t\t$$.mainBar = $$.mainBar.enter().append(\"path\")\r\n\t\t\t.attr(\"class\", classBar)\r\n\t\t\t.style(\"stroke\", color)\r\n\t\t\t.style(\"fill\", color)\r\n\t\t\t.merge($$.mainBar)\r\n\t\t\t.style(\"opacity\", initialOpacity);\r\n\t},\r\n\r\n\tredrawBar(drawBar, withTransition) {\r\n\t\treturn [\r\n\t\t\t(withTransition ? this.mainBar.transition(Math.random().toString()) : this.mainBar)\r\n\t\t\t\t.attr(\"d\", drawBar)\r\n\t\t\t\t.style(\"fill\", this.color)\r\n\t\t\t\t.style(\"opacity\", \"1\")\r\n\t\t];\r\n\t},\r\n\r\n\tgetBarW(axis, barTargetsNum) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tconst w = typeof config.bar_width === \"number\" ? config.bar_width : barTargetsNum ? (axis.tickInterval() * config.bar_width_ratio) / barTargetsNum : 0;\r\n\r\n\t\treturn config.bar_width_max && w > config.bar_width_max ? config.bar_width_max : w;\r\n\t},\r\n\r\n\tgetBars(i, id) {\r\n\t\tconst $$ = this;\r\n\t\tconst suffix = (isValue(i) ? `-${i}` : ``);\r\n\r\n\t\treturn (id ? $$.main\r\n\t\t\t.selectAll(`.${CLASS.bars}${$$.getTargetSelectorSuffix(id)}`) : $$.main)\r\n\t\t\t.selectAll(`.${CLASS.bar}${suffix}`);\r\n\t},\r\n\r\n\texpandBars(i, id, reset) {\r\n\t\tconst $$ = this;\r\n\r\n\t\tif (reset) { $$.unexpandBars(); }\r\n\t\t$$.getBars(i, id).classed(CLASS.EXPANDED, true);\r\n\t},\r\n\r\n\tunexpandBars(i) {\r\n\t\tconst $$ = this;\r\n\r\n\t\t$$.getBars(i).classed(CLASS.EXPANDED, false);\r\n\t},\r\n\r\n\tgenerateDrawBar(barIndices, isSub) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tconst getPoints = $$.generateGetBarPoints(barIndices, isSub);\r\n\r\n\t\treturn (d, i) => {\r\n\t\t\t// 4 points that make a bar\r\n\t\t\tconst points = getPoints(d, i);\r\n\r\n\t\t\t// switch points if axis is rotated, not applicable for sub chart\r\n\t\t\tconst indexX = config.axis_rotated ? 1 : 0;\r\n\t\t\tconst indexY = config.axis_rotated ? 0 : 1;\r\n\r\n\t\t\tconst path = `M ${points[0][indexX]},${points[0][indexY]}\r\n\t\t\tL ${points[1][indexX]},${points[1][indexY]}\r\n\t\t\tL ${points[2][indexX]},${points[2][indexY]}\r\n\t\t\tL ${points[3][indexX]},${points[3][indexY]} z`;\r\n\r\n\t\t\treturn path;\r\n\t\t};\r\n\t},\r\n\r\n\tgenerateGetBarPoints(barIndices, isSub) {\r\n\t\tconst $$ = this;\r\n\t\tconst axis = isSub ? $$.subXAxis : $$.xAxis;\r\n\t\tconst barTargetsNum = barIndices.__max__ + 1;\r\n\t\tconst barW = $$.getBarW(axis, barTargetsNum);\r\n\t\tconst barX = $$.getShapeX(barW, barTargetsNum, barIndices, !!isSub);\r\n\t\tconst barY = $$.getShapeY(!!isSub);\r\n\t\tconst barOffset = $$.getShapeOffset($$.isBarType, barIndices, !!isSub);\r\n\t\tconst yScale = isSub ? $$.getSubYScale : $$.getYScale;\r\n\r\n\t\treturn (d, i) => {\r\n\t\t\tconst y0 = yScale.call($$, d.id)(0);\r\n\t\t\tconst offset = barOffset(d, i) || y0; // offset is for stacked bar chart\r\n\t\t\tconst posX = barX(d);\r\n\t\t\tlet posY = barY(d);\r\n\r\n\t\t\t// fix posY not to overflow opposite quadrant\r\n\t\t\tif ($$.config.axis_rotated) {\r\n\t\t\t\tif ((d.value > 0 && posY < y0) || (d.value < 0 && y0 < posY)) { posY = y0; }\r\n\t\t\t}\r\n\t\t\t// 4 points that make a bar\r\n\t\t\treturn [\r\n\t\t\t\t[posX, offset],\r\n\t\t\t\t[posX, posY - (y0 - offset)],\r\n\t\t\t\t[posX + barW, posY - (y0 - offset)],\r\n\t\t\t\t[posX + barW, offset]\r\n\t\t\t];\r\n\t\t};\r\n\t},\r\n\r\n\tisWithinBar(that) {\r\n\t\tconst mouse = d3Mouse(that);\r\n\t\tconst list = getRectSegList(that);\r\n\t\tconst box = that.getBBox();\r\n\t\tconst seg0 = list[0];\r\n\t\tconst seg1 = list[1];\r\n\t\tconst x = Math.min(seg0.x, seg1.x);\r\n\t\tconst y = Math.min(seg0.y, seg1.y);\r\n\t\tconst w = box.width;\r\n\t\tconst h = box.height;\r\n\t\tconst offset = 2;\r\n\t\tconst sx = x - offset;\r\n\t\tconst ex = x + w + offset;\r\n\t\tconst sy = y + h + offset;\r\n\t\tconst ey = y - offset;\r\n\t\tconst isIn = sx < mouse[0] && mouse[0] < ex && ey < mouse[1] && mouse[1] < sy;\r\n\r\n\t\treturn isIn;\r\n\t}\r\n});\r\n\r\n\n\n\n// WEBPACK FOOTER //\n// src/internals/shape.bar.js","/**\r\n * Copyright (c) 2017 NAVER Corp.\r\n * billboard.js project is licensed under the MIT license\r\n */\r\nimport {\r\n\tcurveBasisClosed as d3CurveBasisClosed,\r\n\tcurveBasisOpen as d3CurveBasisOpen,\r\n\tcurveBasis as d3CurveBasis,\r\n\tcurveBundle as d3CurveBundle,\r\n\tcurveCardinalClosed as d3CurveCardinalClosed,\r\n\tcurveCardinalOpen as d3CurveCardinalOpen,\r\n\tcurveCardinal as d3CurveCardinal,\r\n\tcurveCatmullRomClosed as d3CurveCatmullRomClosed,\r\n\tcurveCatmullRomOpen as d3CurveCatmullRomOpen,\r\n\tcurveCatmullRom as d3CurveCatmullRom,\r\n\tcurveLinearClosed as d3CurveLinearClosed,\r\n\tcurveLinear as d3CurveLinear,\r\n\tcurveMonotoneX as d3CurveMonotoneX,\r\n\tcurveMonotoneY as d3CurveMonotoneY,\r\n\tcurveNatural as d3CurveNatural,\r\n\tcurveStep as d3CurveStep,\r\n\tselect as d3Select\r\n} from \"d3\";\r\n\r\nimport CLASS from \"../config/classes\";\r\nimport ChartInternal from \"./ChartInternal\";\r\nimport {isUndefined, extend} from \"./util\";\r\n\r\nextend(ChartInternal.prototype, {\r\n\tgetShapeIndices(typeFilter) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tconst indices = {};\r\n\t\tlet i = 0;\r\n\t\tlet j;\r\n\t\tlet k;\r\n\r\n\t\t$$.filterTargetsToShow($$.data.targets.filter(typeFilter, $$)).forEach(d => {\r\n\t\t\tfor (j = 0; j < config.data_groups.length; j++) {\r\n\t\t\t\tif (config.data_groups[j].indexOf(d.id) < 0) { continue; }\r\n\t\t\t\tfor (k = 0; k < config.data_groups[j].length; k++) {\r\n\t\t\t\t\tif (config.data_groups[j][k] in indices) {\r\n\t\t\t\t\t\tindices[d.id] = indices[config.data_groups[j][k]];\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (isUndefined(indices[d.id])) { indices[d.id] = i++; }\r\n\t\t});\r\n\t\tindices.__max__ = i - 1;\r\n\t\treturn indices;\r\n\t},\r\n\r\n\tgetShapeX(offset, targetsNum, indices, isSub) {\r\n\t\tconst $$ = this;\r\n\t\tconst scale = isSub ? $$.subX : $$.x;\r\n\r\n\t\treturn d => {\r\n\t\t\tconst index = d.id in indices ? indices[d.id] : 0;\r\n\r\n\t\t\treturn d.x || d.x === 0 ? scale(d.x) - offset * (targetsNum / 2 - index) : 0;\r\n\t\t};\r\n\t},\r\n\r\n\tgetShapeY(isSub) {\r\n\t\tconst $$ = this;\r\n\r\n\t\treturn d => {\r\n\t\t\tconst scale = isSub ? $$.getSubYScale(d.id) : $$.getYScale(d.id);\r\n\r\n\t\t\treturn scale(d.value);\r\n\t\t};\r\n\t},\r\n\r\n\tgetShapeOffset(typeFilter, indices, isSub) {\r\n\t\tconst $$ = this;\r\n\t\tconst targets = $$.orderTargets($$.filterTargetsToShow($$.data.targets.filter(typeFilter, $$)));\r\n\t\tconst targetIds = targets.map(t => t.id);\r\n\r\n\t\treturn (d, idx) => {\r\n\t\t\tconst scale = isSub ? $$.getSubYScale(d.id) : $$.getYScale(d.id);\r\n\t\t\tconst y0 = scale(0);\r\n\t\t\tlet offset = y0;\r\n\t\t\tlet i = idx;\r\n\r\n\t\t\ttargets.forEach(t => {\r\n\t\t\t\tconst values = $$.isStepType(d) ? $$.convertValuesToStep(t.values) : t.values;\r\n\r\n\t\t\t\tif (t.id === d.id || indices[t.id] !== indices[d.id]) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tif (targetIds.indexOf(t.id) < targetIds.indexOf(d.id)) {\r\n\t\t\t\t\t// check if the x values line up\r\n\t\t\t\t\tif (typeof values[i] === \"undefined\" || +values[i].x !== +d.x) { // \"+\" for timeseries\r\n\t\t\t\t\t\t// if not, try to find the value that does line up\r\n\t\t\t\t\t\ti = -1;\r\n\t\t\t\t\t\tvalues.forEach((v, j) => {\r\n\t\t\t\t\t\t\tif (v.x === d.x) {\r\n\t\t\t\t\t\t\t\ti = j;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (i in values && values[i].value * d.value >= 0) {\r\n\t\t\t\t\t\toffset += scale(values[i].value) - y0;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\treturn offset;\r\n\t\t};\r\n\t},\r\n\r\n\tisWithinShape(that, d) {\r\n\t\tconst $$ = this;\r\n\t\tconst shape = d3Select(that);\r\n\t\tlet isWithin;\r\n\r\n\t\tif (!$$.isTargetToShow(d.id)) {\r\n\t\t\tisWithin = false;\r\n\t\t} else if (that.nodeName === \"circle\") {\r\n\t\t\tisWithin = $$.isStepType(d) ?\r\n\t\t\t\t$$.isWithinStep(that, $$.getYScale(d.id)(d.value)) :\r\n\t\t\t\t$$.isWithinCircle(that, $$.pointSelectR(d) * 1.5);\r\n\t\t} else if (that.nodeName === \"path\") {\r\n\t\t\tisWithin = shape.classed(CLASS.bar) ? $$.isWithinBar(that) : true;\r\n\t\t}\r\n\t\treturn isWithin;\r\n\t},\r\n\r\n\tgetInterpolate(d) {\r\n\t\tconst $$ = this;\r\n\t\tconst interpolation = $$.getInterpolateType(d);\r\n\r\n\t\treturn {\r\n\t\t\t\"basis\": d3CurveBasis,\r\n\t\t\t\"basis-closed\": d3CurveBasisClosed,\r\n\t\t\t\"basis-open\": d3CurveBasisOpen,\r\n\t\t\t\"bundle\": d3CurveBundle,\r\n\t\t\t\"cardinal\": d3CurveCardinal,\r\n\t\t\t\"cardinal-closed\": d3CurveCardinalClosed,\r\n\t\t\t\"cardinal-open\": d3CurveCardinalOpen,\r\n\t\t\t\"catmull-rom\": d3CurveCatmullRom,\r\n\t\t\t\"catmull-rom-closed\": d3CurveCatmullRomClosed,\r\n\t\t\t\"catmull-rom-open\": d3CurveCatmullRomOpen,\r\n\t\t\t\"monotone-x\": d3CurveMonotoneX,\r\n\t\t\t\"monotone-y\": d3CurveMonotoneY,\r\n\t\t\t\"natural\": d3CurveNatural,\r\n\t\t\t\"linear-closed\": d3CurveLinearClosed,\r\n\t\t\t\"linear\": d3CurveLinear,\r\n\t\t\t\"step\": d3CurveStep\r\n\t\t}[interpolation];\r\n\t},\r\n\r\n\tgetInterpolateType(d) {\r\n\t\tconst $$ = this;\r\n\r\n\t\tlet interpolation = $$.isInterpolationType($$.config.spline_interpolation_type) ?\r\n\t\t\t$$.config.spline_interpolation_type : \"cardinal\";\r\n\r\n\t\tinterpolation = $$.isSplineType(d) ? interpolation : ($$.isStepType(d) ? $$.config.line_step_type : \"linear\");\r\n\t\treturn interpolation;\r\n\t}\r\n\r\n});\r\n\n\n\n// WEBPACK FOOTER //\n// src/internals/shape.js","/**\r\n * Copyright (c) 2017 NAVER Corp.\r\n * billboard.js project is licensed under the MIT license\r\n */\r\nimport {\r\n\tarea as d3Area,\r\n\tline as d3Line,\r\n\tselect as d3Select,\r\n\tmouse as d3Mouse,\r\n} from \"d3\";\r\nimport CLASS from \"../config/classes\";\r\nimport ChartInternal from \"./ChartInternal\";\r\nimport {isFunction, isValue, isDefined, isUndefined, extend} from \"./util\";\r\n\r\nextend(ChartInternal.prototype, {\r\n\tinitLine() {\r\n\t\tconst $$ = this;\r\n\r\n\t\t$$.main.select(`.${CLASS.chart}`).append(\"g\")\r\n\t\t\t.attr(\"class\", CLASS.chartLines);\r\n\t},\r\n\r\n\tupdateTargetsForLine(targets) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tconst classChartLine = $$.classChartLine.bind($$);\r\n\t\tconst classLines = $$.classLines.bind($$);\r\n\t\tconst classAreas = $$.classAreas.bind($$);\r\n\t\tconst classCircles = $$.classCircles.bind($$);\r\n\t\tconst classFocus = $$.classFocus.bind($$);\r\n\r\n\t\tconst mainLineUpdate = $$.main.select(`.${CLASS.chartLines}`)\r\n\t\t\t.selectAll(`.${CLASS.chartLine}`)\r\n\t\t\t.data(targets)\r\n\t\t\t.attr(\"class\", d => classChartLine(d) + classFocus(d));\r\n\r\n\t\tconst mainLineEnter = mainLineUpdate.enter().append(\"g\")\r\n\t\t\t.attr(\"class\", classChartLine)\r\n\t\t\t.style(\"opacity\", \"0\")\r\n\t\t\t.style(\"pointer-events\", \"none\");\r\n\r\n\t\t// Lines for each data\r\n\t\tmainLineEnter.append(\"g\")\r\n\t\t\t.attr(\"class\", classLines);\r\n\r\n\t\t// Areas\r\n\t\tmainLineEnter.append(\"g\")\r\n\t\t\t.attr(\"class\", classAreas);\r\n\r\n\t\t// Circles for each data point on lines\r\n\t\tmainLineEnter.append(\"g\")\r\n\t\t\t.attr(\"class\", d => $$.generateClass(CLASS.selectedCircles, d.id));\r\n\r\n\t\tmainLineEnter.append(\"g\")\r\n\t\t\t.attr(\"class\", classCircles)\r\n\t\t\t.style(\"cursor\", d => (config.data_selection_isselectable(d) ? \"pointer\" : null));\r\n\r\n\t\t// Update date for selected circles\r\n\t\ttargets.forEach(t => {\r\n\t\t\t$$.main.selectAll(`.${CLASS.selectedCircles}${$$.getTargetSelectorSuffix(t.id)}`)\r\n\t\t\t\t.selectAll(`${CLASS.selectedCircle}`)\r\n\t\t\t\t.each(d => {\r\n\t\t\t\t\td.value = t.values[d.index].value;\r\n\t\t\t\t});\r\n\t\t});\r\n\r\n\t\t// MEMO: can not keep same color...\r\n\t\t// mainLineUpdate.exit().remove();\r\n\t},\r\n\r\n\tupdateLine(durationForExit) {\r\n\t\tconst $$ = this;\r\n\r\n\t\t$$.mainLine = $$.main\r\n\t\t\t.selectAll(`.${CLASS.lines}`)\r\n\t\t\t.selectAll(`.${CLASS.line}`)\r\n\t\t\t.data($$.lineData.bind($$));\r\n\r\n\t\t$$.mainLine.exit().transition()\r\n\t\t\t.duration(durationForExit)\r\n\t\t\t.style(\"opacity\", \"0\")\r\n\t\t\t.remove();\r\n\r\n\t\t$$.mainLine = $$.mainLine.enter()\r\n\t\t\t.append(\"path\")\r\n\t\t\t.attr(\"class\", $$.classLine.bind($$))\r\n\t\t\t.style(\"stroke\", $$.color)\r\n\t\t\t.merge($$.mainLine)\r\n\t\t\t.style(\"opacity\", $$.initialOpacity.bind($$))\r\n\t\t\t.style(\"shape-rendering\", d => ($$.isStepType(d) ? \"crispEdges\" : \"\"))\r\n\t\t\t.attr(\"transform\", null);\r\n\t},\r\n\r\n\tredrawLine(drawLine, withTransition) {\r\n\t\treturn [\r\n\t\t\t(withTransition ? this.mainLine.transition(Math.random().toString()) : this.mainLine)\r\n\t\t\t\t.attr(\"d\", drawLine)\r\n\t\t\t\t.style(\"stroke\", this.color)\r\n\t\t\t\t.style(\"opacity\", \"1\")\r\n\t\t];\r\n\t},\r\n\r\n\tgenerateDrawLine(lineIndices, isSub) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tconst getPoints = $$.generateGetLinePoints(lineIndices, isSub);\r\n\t\tconst yScaleGetter = isSub ? $$.getSubYScale : $$.getYScale;\r\n\t\tconst xValue = d => (isSub ? $$.subxx : $$.xx).call($$, d);\r\n\t\tconst yValue = (d, i) => (config.data_groups.length > 0 ?\r\n\t\t\tgetPoints(d, i)[0][1] : yScaleGetter.call($$, d.id)(d.value));\r\n\t\tlet line = d3Line();\r\n\r\n\t\tline = config.axis_rotated ?\r\n\t\t\tline.x(yValue).y(xValue) : line.x(xValue).y(yValue);\r\n\r\n\t\tif (!config.line_connectNull) {\r\n\t\t\tline = line.defined(d => d.value !== null);\r\n\t\t}\r\n\r\n\t\treturn d => {\r\n\t\t\tconst x = isSub ? $$.x : $$.subX;\r\n\t\t\tconst y = yScaleGetter.call($$, d.id);\r\n\t\t\tlet values = config.line_connectNull ?\r\n\t\t\t\t$$.filterRemoveNull(d.values) : d.values;\r\n\t\t\tlet x0 = 0;\r\n\t\t\tlet y0 = 0;\r\n\t\t\tlet path;\r\n\r\n\t\t\tif ($$.isLineType(d)) {\r\n\t\t\t\tif (config.data_regions[d.id]) {\r\n\t\t\t\t\tpath = $$.lineWithRegions(values, x, y, config.data_regions[d.id]);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif ($$.isStepType(d)) { values = $$.convertValuesToStep(values); }\r\n\t\t\t\t\tpath = line.curve($$.getInterpolate(d))(values);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tif (values[0]) {\r\n\t\t\t\t\tx0 = x(values[0].x);\r\n\t\t\t\t\ty0 = y(values[0].value);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tpath = config.axis_rotated ? `M ${y0} ${x0}` : `M ${x0} ${y0}`;\r\n\t\t\t}\r\n\t\t\treturn path || \"M 0 0\";\r\n\t\t};\r\n\t},\r\n\r\n\tgenerateGetLinePoints(lineIndices, isSub) { // partial duplication of generateGetBarPoints\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tconst lineTargetsNum = lineIndices.__max__ + 1;\r\n\t\tconst x = $$.getShapeX(0, lineTargetsNum, lineIndices, !!isSub);\r\n\t\tconst y = $$.getShapeY(!!isSub);\r\n\t\tconst lineOffset = $$.getShapeOffset($$.isLineType, lineIndices, !!isSub);\r\n\t\tconst yScale = isSub ? $$.getSubYScale : $$.getYScale;\r\n\r\n\t\treturn (d, i) => {\r\n\t\t\tconst y0 = yScale.call($$, d.id)(0);\r\n\t\t\tconst offset = lineOffset(d, i) || y0; // offset is for stacked area chart\r\n\t\t\tconst posX = x(d);\r\n\t\t\tlet posY = y(d);\r\n\r\n\t\t\t// fix posY not to overflow opposite quadrant\r\n\t\t\tif (config.axis_rotated) {\r\n\t\t\t\tif ((d.value > 0 && posY < y0) || (d.value < 0 && y0 < posY)) { posY = y0; }\r\n\t\t\t}\r\n\t\t\t// 1 point that marks the line position\r\n\t\t\treturn [\r\n\t\t\t\t[posX, posY - (y0 - offset)],\r\n\t\t\t\t[posX, posY - (y0 - offset)], // needed for compatibility\r\n\t\t\t\t[posX, posY - (y0 - offset)], // needed for compatibility\r\n\t\t\t\t[posX, posY - (y0 - offset)] // needed for compatibility\r\n\t\t\t];\r\n\t\t};\r\n\t},\r\n\r\n\tlineWithRegions(d, x, y, _regions) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tconst xOffset = $$.isCategorized() ? 0.5 : 0;\r\n\t\tconst regions = [];\r\n\r\n\t\tlet i;\r\n\t\tlet j;\r\n\t\tlet s = \"M\";\r\n\t\tlet sWithRegion;\r\n\t\tlet xp;\r\n\t\tlet yp;\r\n\t\tlet dx;\r\n\t\tlet dy;\r\n\t\tlet dd;\r\n\t\tlet diff;\r\n\t\tlet diffx2;\r\n\r\n\t\tfunction isWithinRegions(withinX, withinRegions) {\r\n\t\t\tlet idx;\r\n\r\n\t\t\tfor (idx = 0; idx < withinRegions.length; idx++) {\r\n\t\t\t\tif (withinRegions[idx].start < withinX && withinX <= withinRegions[idx].end) { return true; }\r\n\t\t\t}\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t// Check start/end of regions\r\n\t\tif (isDefined(_regions)) {\r\n\t\t\tfor (i = 0; i < _regions.length; i++) {\r\n\t\t\t\tregions[i] = {};\r\n\t\t\t\tif (isUndefined(_regions[i].start)) {\r\n\t\t\t\t\tregions[i].start = d[0].x;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tregions[i].start = $$.isTimeSeries() ? $$.parseDate(_regions[i].start) : _regions[i].start;\r\n\t\t\t\t}\r\n\t\t\t\tif (isUndefined(_regions[i].end)) {\r\n\t\t\t\t\tregions[i].end = d[d.length - 1].x;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tregions[i].end = $$.isTimeSeries() ? $$.parseDate(_regions[i].end) : _regions[i].end;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Set scales\r\n\t\tconst xValue = config.axis_rotated ? dt => y(dt.value) : dt => x(dt.x);\r\n\t\tconst yValue = config.axis_rotated ? dt => x(dt.x) : dt => y(dt.value);\r\n\r\n\t\t// Define svg generator function for region\r\n\t\tfunction generateM(points) {\r\n\t\t\treturn `M${points[0][0]} ${points[0][1]} ${points[1][0]} ${points[1][1]}`;\r\n\t\t}\r\n\r\n\t\tif ($$.isTimeSeries()) {\r\n\t\t\tsWithRegion = (d0, d1, k, timeseriesDiff) => {\r\n\t\t\t\tconst x0 = d0.x.getTime();\r\n\t\t\t\tconst xDiff = d1.x - d0.x;\r\n\t\t\t\tconst xv0 = new Date(x0 + xDiff * k);\r\n\t\t\t\tconst xv1 = new Date(x0 + xDiff * (k + timeseriesDiff));\r\n\t\t\t\tlet points;\r\n\r\n\t\t\t\tif (config.axis_rotated) {\r\n\t\t\t\t\tpoints = [[y(yp(k)), x(xv0)], [y(yp(k + diff)), x(xv1)]];\r\n\t\t\t\t} else {\r\n\t\t\t\t\tpoints = [[x(xv0), y(yp(k))], [x(xv1), y(yp(k + diff))]];\r\n\t\t\t\t}\r\n\t\t\t\treturn generateM(points);\r\n\t\t\t};\r\n\t\t} else {\r\n\t\t\tsWithRegion = function(d0, d1, k, otherDiff) {\r\n\t\t\t\tlet points;\r\n\r\n\t\t\t\tif (config.axis_rotated) {\r\n\t\t\t\t\tpoints = [[y(yp(k), true), x(xp(k))], [y(yp(k + otherDiff), true), x(xp(k + otherDiff))]];\r\n\t\t\t\t} else {\r\n\t\t\t\t\tpoints = [[x(xp(k), true), y(yp(k))], [x(xp(k + otherDiff), true), y(yp(k + otherDiff))]];\r\n\t\t\t\t}\r\n\t\t\t\treturn generateM(points);\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\t// Generate\r\n\t\tfor (i = 0; i < d.length; i++) {\r\n\t\t\t// Draw as normal\r\n\t\t\tif (isUndefined(regions) || !isWithinRegions(d[i].x, regions)) {\r\n\t\t\t\ts += ` ${xValue(d[i])} ${yValue(d[i])}`;\r\n\t\t\t} else {\r\n\t\t\t\t// Draw with region // TODO: Fix for horizotal charts\r\n\t\t\t\txp = $$.getScale(d[i - 1].x + xOffset, d[i].x + xOffset, $$.isTimeSeries());\r\n\t\t\t\typ = $$.getScale(d[i - 1].value, d[i].value);\r\n\r\n\t\t\t\tdx = x(d[i].x) - x(d[i - 1].x);\r\n\t\t\t\tdy = y(d[i].value) - y(d[i - 1].value);\r\n\t\t\t\tdd = Math.sqrt(Math.pow(dx, 2) + Math.pow(dy, 2));\r\n\t\t\t\tdiff = 2 / dd;\r\n\t\t\t\tdiffx2 = diff * 2;\r\n\r\n\t\t\t\tfor (j = diff; j <= 1; j += diffx2) {\r\n\t\t\t\t\ts += sWithRegion(d[i - 1], d[i], j, diff);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn s;\r\n\t},\r\n\r\n\tupdateArea(durationForExit) {\r\n\t\tconst $$ = this;\r\n\r\n\t\t$$.mainArea = $$.main.selectAll(`.${CLASS.areas}`).selectAll(`.${CLASS.area}`)\r\n\t\t\t.data($$.lineData.bind($$));\r\n\r\n\t\t$$.mainArea.exit().transition()\r\n\t\t\t.duration(durationForExit)\r\n\t\t\t.style(\"opacity\", \"0\")\r\n\t\t\t.remove();\r\n\r\n\t\t$$.mainArea = $$.mainArea.enter().append(\"path\")\r\n\t\t\t.attr(\"class\", $$.classArea.bind($$))\r\n\t\t\t.style(\"fill\", $$.color)\r\n\t\t\t.style(\"opacity\", function() {\r\n\t\t\t\t$$.orgAreaOpacity = d3Select(this).style(\"opacity\");\r\n\t\t\t\treturn \"0\";\r\n\t\t\t})\r\n\t\t\t.merge($$.mainArea);\r\n\r\n\t\t$$.mainArea\r\n\t\t\t.style(\"opacity\", $$.orgAreaOpacity);\r\n\t},\r\n\r\n\tredrawArea(drawArea, withTransition) {\r\n\t\treturn [\r\n\t\t\t(withTransition ? this.mainArea.transition(Math.random().toString()) : this.mainArea)\r\n\t\t\t\t.attr(\"d\", drawArea)\r\n\t\t\t\t.style(\"fill\", this.color)\r\n\t\t\t\t.style(\"opacity\", this.orgAreaOpacity)\r\n\t\t];\r\n\t},\r\n\r\n\tgenerateDrawArea(areaIndices, isSub) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tconst getPoints = $$.generateGetAreaPoints(areaIndices, isSub);\r\n\t\tconst yScaleGetter = isSub ? $$.getSubYScale : $$.getYScale;\r\n\t\tconst xValue = d => (isSub ? $$.subxx : $$.xx).call($$, d);\r\n\t\tconst value0 = (d, i) => (config.data_groups.length > 0 ?\r\n\t\t\tgetPoints(d, i)[0][1] : yScaleGetter.call($$, d.id)($$.getAreaBaseValue(d.id)));\r\n\t\tconst value1 = (d, i) => (config.data_groups.length > 0 ?\r\n\t\t\tgetPoints(d, i)[1][1] : yScaleGetter.call($$, d.id)(d.value));\r\n\t\tlet area = d3Area();\r\n\r\n\t\tarea = config.axis_rotated ?\r\n\t\t\tarea.x0(value0)\r\n\t\t\t\t.x1(value1)\r\n\t\t\t\t.y(xValue) :\r\n\t\t\tarea.x(xValue)\r\n\t\t\t\t.y0(config.area_above ? 0 : value0)\r\n\t\t\t\t.y1(value1);\r\n\r\n\t\tif (!config.line_connectNull) {\r\n\t\t\tarea = area.defined(d => d.value !== null);\r\n\t\t}\r\n\r\n\t\treturn d => {\r\n\t\t\tlet values = config.line_connectNull ? $$.filterRemoveNull(d.values) : d.values;\r\n\t\t\tlet x0 = 0;\r\n\t\t\tlet y0 = 0;\r\n\t\t\tlet path;\r\n\r\n\t\t\tif ($$.isAreaType(d)) {\r\n\t\t\t\tif ($$.isStepType(d)) {\r\n\t\t\t\t\tvalues = $$.convertValuesToStep(values);\r\n\t\t\t\t}\r\n\t\t\t\tpath = area.curve($$.getInterpolate(d))(values);\r\n\t\t\t} else {\r\n\t\t\t\tif (values[0]) {\r\n\t\t\t\t\tx0 = $$.x(values[0].x);\r\n\t\t\t\t\ty0 = $$.getYScale(d.id)(values[0].value);\r\n\t\t\t\t}\r\n\t\t\t\tpath = config.axis_rotated ? `M ${y0} ${x0}` : `M ${x0} ${y0}`;\r\n\t\t\t}\r\n\t\t\treturn path || \"M 0 0\";\r\n\t\t};\r\n\t},\r\n\r\n\tgetAreaBaseValue() {\r\n\t\treturn 0;\r\n\t},\r\n\r\n\tgenerateGetAreaPoints(areaIndices, isSub) { // partial duplication of generateGetBarPoints\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tconst areaTargetsNum = areaIndices.__max__ + 1;\r\n\t\tconst x = $$.getShapeX(0, areaTargetsNum, areaIndices, !!isSub);\r\n\t\tconst y = $$.getShapeY(!!isSub);\r\n\t\tconst areaOffset = $$.getShapeOffset($$.isAreaType, areaIndices, !!isSub);\r\n\t\tconst yScale = isSub ? $$.getSubYScale : $$.getYScale;\r\n\r\n\t\treturn function(d, i) {\r\n\t\t\tconst y0 = yScale.call($$, d.id)(0);\r\n\t\t\tconst offset = areaOffset(d, i) || y0; // offset is for stacked area chart\r\n\t\t\tconst posX = x(d);\r\n\t\t\tlet posY = y(d);\r\n\r\n\t\t\t// fix posY not to overflow opposite quadrant\r\n\t\t\tif (config.axis_rotated) {\r\n\t\t\t\tif ((d.value > 0 && posY < y0) || (d.value < 0 && y0 < posY)) { posY = y0; }\r\n\t\t\t}\r\n\r\n\t\t\t// 1 point that marks the area position\r\n\t\t\treturn [\r\n\t\t\t\t[posX, offset],\r\n\t\t\t\t[posX, posY - (y0 - offset)],\r\n\t\t\t\t[posX, posY - (y0 - offset)], // needed for compatibility\r\n\t\t\t\t[posX, offset] // needed for compatibility\r\n\t\t\t];\r\n\t\t};\r\n\t},\r\n\r\n\tupdateCircle() {\r\n\t\tconst $$ = this;\r\n\r\n\t\t$$.mainCircle = $$.main.selectAll(`.${CLASS.circles}`).selectAll(`.${CLASS.circle}`)\r\n\t\t\t.data($$.lineOrScatterData.bind($$));\r\n\r\n\t\t$$.mainCircle.exit().remove();\r\n\r\n\t\t$$.mainCircle = $$.mainCircle.enter().append(\"circle\")\r\n\t\t\t.attr(\"class\", $$.classCircle.bind($$))\r\n\t\t\t.attr(\"r\", $$.pointR.bind($$))\r\n\t\t\t.style(\"fill\", $$.color)\r\n\t\t\t.merge($$.mainCircle)\r\n\t\t\t.style(\"opacity\", $$.initialOpacityForCircle.bind($$));\r\n\t},\r\n\r\n\tredrawCircle(cx, cy, withTransition, flow) {\r\n\t\tlet selectedCircles = this.main.selectAll(`.${CLASS.selectedCircle}`);\r\n\t\tlet mainCircles;\r\n\r\n\t\tif (withTransition) {\r\n\t\t\tconst transitionName = Math.random().toString();\r\n\r\n\t\t\tif (flow) {\r\n\t\t\t\tmainCircles = this.mainCircle\r\n\t\t\t\t\t\t.attr(\"cx\", cx)\r\n\t\t\t\t\t.transition(transitionName)\r\n\t\t\t\t\t\t.attr(\"cx\", cx)\r\n\t\t\t\t\t\t.attr(\"cy\", cy)\r\n\t\t\t\t\t.transition(transitionName)\r\n\t\t\t\t\t\t.style(\"opacity\", this.opacityForCircle.bind(this))\r\n\t\t\t\t\t\t.style(\"fill\", this.color);\r\n\t\t\t} else {\r\n\t\t\t\tmainCircles = this.mainCircle\r\n\t\t\t\t\t.transition(transitionName)\r\n\t\t\t\t\t\t.attr(\"cx\", cx)\r\n\t\t\t\t\t\t.attr(\"cy\", cy)\r\n\t\t\t\t\t.transition(transitionName)\r\n\t\t\t\t\t\t.style(\"opacity\", this.opacityForCircle.bind(this))\r\n\t\t\t\t\t\t.style(\"fill\", this.color);\r\n\t\t\t}\r\n\r\n\t\t\tselectedCircles = selectedCircles.transition(Math.random().toString());\r\n\t\t} else {\r\n\t\t\tmainCircles = this.mainCircle\r\n\t\t\t\t.attr(\"cx\", cx)\r\n\t\t\t\t.attr(\"cy\", cy)\r\n\t\t\t\t.style(\"opacity\", this.opacityForCircle.bind(this))\r\n\t\t\t\t.style(\"fill\", this.color);\r\n\t\t}\r\n\r\n\t\treturn [\r\n\t\t\tmainCircles,\r\n\t\t\tselectedCircles\r\n\t\t\t\t.attr(\"cx\", cx)\r\n\t\t\t\t.attr(\"cy\", cy)\r\n\t\t];\r\n\t},\r\n\r\n\tcircleX(d) {\r\n\t\treturn this.config.zoom_enabled && this.zoomScale ?\r\n\t\t\t(d.x || d.x === 0 ? this.zoomScale(d.x) : null) :\r\n\t\t\t(d.x || d.x === 0 ? this.x(d.x) : null);\r\n\t},\r\n\r\n\tupdateCircleY() {\r\n\t\tconst $$ = this;\r\n\t\tlet lineIndices;\r\n\t\tlet getPoints;\r\n\r\n\t\tif ($$.config.data_groups.length > 0) {\r\n\t\t\tlineIndices = $$.getShapeIndices($$.isLineType);\r\n\t\t\tgetPoints = $$.generateGetLinePoints(lineIndices);\r\n\r\n\t\t\t$$.circleY = function(d, i) {\r\n\t\t\t\treturn getPoints(d, i)[0][1];\r\n\t\t\t};\r\n\t\t} else {\r\n\t\t\t$$.circleY = function(d) {\r\n\t\t\t\treturn $$.getYScale(d.id)(d.value);\r\n\t\t\t};\r\n\t\t}\r\n\t},\r\n\r\n\tgetCircles(i, id) {\r\n\t\tconst $$ = this;\r\n\t\tconst suffix = (isValue(i) ? `-${i}` : ``);\r\n\r\n\t\treturn (id ? $$.main.selectAll(`.${CLASS.circles}${$$.getTargetSelectorSuffix(id)}`) : $$.main)\r\n\t\t\t.selectAll(`.${CLASS.circle}${suffix}`);\r\n\t},\r\n\r\n\texpandCircles(i, id, reset) {\r\n\t\tconst $$ = this;\r\n\t\tconst r = $$.pointExpandedR.bind($$);\r\n\r\n\t\tif (reset) {\r\n\t\t\t$$.unexpandCircles();\r\n\t\t}\r\n\t\t$$.getCircles(i, id)\r\n\t\t\t.classed(CLASS.EXPANDED, true)\r\n\t\t\t.attr(\"r\", r);\r\n\t},\r\n\r\n\tunexpandCircles(i) {\r\n\t\tconst $$ = this;\r\n\t\tconst r = $$.pointR.bind($$);\r\n\r\n\t\t$$.getCircles(i)\r\n\t\t\t.filter(function() { return d3Select(this).classed(CLASS.EXPANDED); })\r\n\t\t\t.classed(CLASS.EXPANDED, false)\r\n\t\t\t.attr(\"r\", r);\r\n\t},\r\n\r\n\tpointR(d) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\r\n\t\treturn $$.isStepType(d) ? 0 : (isFunction(config.point_r) ? config.point_r(d) : config.point_r);\r\n\t},\r\n\r\n\tpointExpandedR(d) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\r\n\t\treturn config.point_focus_expand_enabled ?\r\n\t\t\t(config.point_focus_expand_r ? config.point_focus_expand_r : $$.pointR(d) * 1.75) : $$.pointR(d);\r\n\t},\r\n\r\n\tpointSelectR(d) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\r\n\t\treturn isFunction(config.point_select_r) ?\r\n\t\t\tconfig.point_select_r(d) : ((config.point_select_r) ? config.point_select_r : $$.pointR(d) * 4);\r\n\t},\r\n\r\n\tisWithinCircle(that, r) {\r\n\t\tconst mouse = d3Mouse(that);\r\n\t\tconst d3This = d3Select(that);\r\n\t\tconst cx = +d3This.attr(\"cx\");\r\n\t\tconst cy = +d3This.attr(\"cy\");\r\n\r\n\t\treturn Math.sqrt(Math.pow(cx - mouse[0], 2) + Math.pow(cy - mouse[1], 2)) < r;\r\n\t},\r\n\r\n\tisWithinStep(that, y) {\r\n\t\treturn Math.abs(y - d3Mouse(that)[1]) < 30;\r\n\t}\r\n});\r\n\n\n\n// WEBPACK FOOTER //\n// src/internals/shape.line.js","/**\r\n * Copyright (c) 2017 NAVER Corp.\r\n * billboard.js project is licensed under the MIT license\r\n */\r\nimport ChartInternal from \"./ChartInternal\";\r\nimport CLASS from \"../config/classes\";\r\nimport {isValue, ceil10, extend} from \"./util\";\r\n\r\nextend(ChartInternal.prototype, {\r\n\tgetCurrentWidth() {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\r\n\t\treturn config.size_width ? config.size_width : $$.getParentWidth();\r\n\t},\r\n\r\n\tgetCurrentHeight() {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tconst h = config.size_height ?\r\n\t\t\tconfig.size_height : $$.getParentHeight();\r\n\r\n\t\treturn h > 0 ? h : 320 / ($$.hasType(\"gauge\") && !config.gauge_fullCircle ? 2 : 1);\r\n\t},\r\n\r\n\tgetCurrentPaddingTop() {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tlet padding = isValue(config.padding_top) ?\r\n\t\t\tconfig.padding_top : 0;\r\n\r\n\t\tif ($$.title && $$.title.node()) {\r\n\t\t\tpadding += $$.getTitlePadding();\r\n\t\t}\r\n\r\n\t\treturn padding;\r\n\t},\r\n\r\n\tgetCurrentPaddingBottom() {\r\n\t\tconst config = this.config;\r\n\r\n\t\treturn isValue(config.padding_bottom) ?\r\n\t\t\tconfig.padding_bottom : 0;\r\n\t},\r\n\r\n\tgetCurrentPaddingLeft(withoutRecompute) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tlet paddingLeft;\r\n\r\n\t\tif (isValue(config.padding_left)) {\r\n\t\t\tpaddingLeft = config.padding_left;\r\n\t\t} else if (config.axis_rotated) {\r\n\t\t\tpaddingLeft = !config.axis_x_show ?\r\n\t\t\t\t1 : Math.max(ceil10($$.getAxisWidthByAxisId(\"x\", withoutRecompute)), 40);\r\n\t\t} else if (!config.axis_y_show || config.axis_y_inner) { // && !config.axis_rotated\r\n\t\t\tpaddingLeft = $$.axis.getYAxisLabelPosition().isOuter ? 30 : 1;\r\n\t\t} else {\r\n\t\t\tpaddingLeft = ceil10($$.getAxisWidthByAxisId(\"y\", withoutRecompute));\r\n\t\t}\r\n\r\n\t\treturn paddingLeft;\r\n\t},\r\n\r\n\tgetCurrentPaddingRight() {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tconst defaultPadding = 10;\r\n\t\tconst legendWidthOnRight = $$.isLegendRight ?\r\n\t\t\t$$.getLegendWidth() + 20 : 0;\r\n\t\tlet paddingRight;\r\n\r\n\t\tif (isValue(config.padding_right)) {\r\n\t\t\tpaddingRight = config.padding_right + 1; // 1 is needed not to hide tick line\r\n\t\t} else if (config.axis_rotated) {\r\n\t\t\tpaddingRight = defaultPadding + legendWidthOnRight;\r\n\t\t} else if (!config.axis_y2_show || config.axis_y2_inner) { // && !config.axis_rotated\r\n\t\t\tpaddingRight = 2 +\r\n\t\t\t\tlegendWidthOnRight +\r\n\t\t\t\t($$.axis.getY2AxisLabelPosition().isOuter ? 20 : 0);\r\n\t\t} else {\r\n\t\t\tpaddingRight = ceil10($$.getAxisWidthByAxisId(\"y2\")) + legendWidthOnRight;\r\n\t\t}\r\n\r\n\t\treturn paddingRight;\r\n\t},\r\n\r\n\tgetParentRectValue(key) {\r\n\t\tlet parent = this.selectChart.node();\r\n\t\tlet v;\r\n\r\n\t\twhile (parent && parent.tagName !== \"BODY\") {\r\n\t\t\ttry {\r\n\t\t\t\tv = parent.getBoundingClientRect()[key];\r\n\t\t\t} catch (e) {\r\n\t\t\t\tif (key === \"width\") {\r\n\t\t\t\t\t// In IE in certain cases getBoundingClientRect\r\n\t\t\t\t\t// will cause an \"unspecified error\"\r\n\t\t\t\t\tv = parent.offsetWidth;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (v) {\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\tparent = parent.parentNode;\r\n\t\t}\r\n\r\n\t\treturn v;\r\n\t},\r\n\r\n\tgetParentWidth() {\r\n\t\treturn this.getParentRectValue(\"width\");\r\n\t},\r\n\r\n\tgetParentHeight() {\r\n\t\tconst h = this.selectChart.style(\"height\");\r\n\r\n\t\treturn h.indexOf(\"px\") > 0 ? +h.replace(\"px\", \"\") : 0;\r\n\t},\r\n\r\n\tgetSvgLeft(withoutRecompute) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tconst hasLeftAxisRect = config.axis_rotated || (!config.axis_rotated && !config.axis_y_inner);\r\n\t\tconst leftAxisClass = config.axis_rotated ? CLASS.axisX : CLASS.axisY;\r\n\t\tconst leftAxis = $$.main.select(`.${leftAxisClass}`).node();\r\n\t\tconst svgRect = leftAxis && hasLeftAxisRect ? leftAxis.getBoundingClientRect() : {right: 0};\r\n\t\tconst chartRect = $$.selectChart.node().getBoundingClientRect();\r\n\t\tconst hasArc = $$.hasArcType();\r\n\t\tconst svgLeft = svgRect.right -\r\n\t\t\tchartRect.left -\r\n\t\t\t(hasArc ? 0 : $$.getCurrentPaddingLeft(withoutRecompute));\r\n\r\n\t\treturn svgLeft > 0 ? svgLeft : 0;\r\n\t},\r\n\r\n\tgetAxisWidthByAxisId(id, withoutRecompute) {\r\n\t\tconst $$ = this;\r\n\t\tconst position = $$.axis.getLabelPositionById(id);\r\n\r\n\t\treturn $$.axis.getMaxTickWidth(id, withoutRecompute) +\r\n\t\t\t(position.isInner ? 20 : 40);\r\n\t},\r\n\r\n\tgetHorizontalAxisHeight(axisId) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tlet h = 30;\r\n\r\n\t\tif (axisId === \"x\" && !config.axis_x_show) {\r\n\t\t\treturn 8;\r\n\t\t}\r\n\r\n\t\tif (axisId === \"x\" && config.axis_x_height) {\r\n\t\t\treturn config.axis_x_height;\r\n\t\t}\r\n\r\n\t\tif (axisId === \"y\" && !config.axis_y_show) {\r\n\t\t\treturn config.legend_show &&\r\n\t\t\t\t!$$.isLegendRight &&\r\n\t\t\t\t!$$.isLegendInset ? 10 : 1;\r\n\t\t}\r\n\r\n\t\tif (axisId === \"y2\" && !config.axis_y2_show) {\r\n\t\t\treturn $$.rotated_padding_top;\r\n\t\t}\r\n\r\n\t\t// Calculate x axis height when tick rotated\r\n\t\tif (axisId === \"x\" && !config.axis_rotated && config.axis_x_tick_rotate) {\r\n\t\t\th = 30 +\r\n\t\t\t\t$$.axis.getMaxTickWidth(axisId) *\r\n\t\t\t\tMath.cos(Math.PI * (90 - config.axis_x_tick_rotate) / 180);\r\n\t\t}\r\n\r\n\t\t// Calculate y axis height when tick rotated\r\n\t\tif (axisId === \"y\" && config.axis_rotated && config.axis_y_tick_rotate) {\r\n\t\t\th = 30 +\r\n\t\t\t\t$$.axis.getMaxTickWidth(axisId) *\r\n\t\t\t\tMath.cos(Math.PI * (90 - config.axis_y_tick_rotate) / 180);\r\n\t\t}\r\n\r\n\t\treturn h +\r\n\t\t\t($$.axis.getLabelPositionById(axisId).isInner ? 0 : 10) +\r\n\t\t\t(axisId === \"y2\" ? -10 : 0);\r\n\t},\r\n\r\n\tgetEventRectWidth() {\r\n\t\treturn Math.max(0, this.xAxis.tickInterval());\r\n\t}\r\n});\r\n\n\n\n// WEBPACK FOOTER //\n// src/internals/size.js","/**\r\n * Copyright (c) 2017 NAVER Corp.\r\n * billboard.js project is licensed under the MIT license\r\n */\r\nimport {\r\n\tselect as d3Select,\r\n\tselectAll as d3SelectAll\r\n} from \"d3\";\r\nimport ChartInternal from \"./ChartInternal\";\r\nimport CLASS from \"../config/classes\";\r\nimport {extend} from \"./util\";\r\n\r\nextend(ChartInternal.prototype, {\r\n\t/**\r\n\t * Initializes the text\r\n\t * @private\r\n\t */\r\n\tinitText() {\r\n\t\tconst $$ = this;\r\n\r\n\t\t$$.main.select(`.${CLASS.chart}`).append(\"g\")\r\n\t\t\t.attr(\"class\", CLASS.chartTexts);\r\n\t\t$$.mainText = d3SelectAll([]);\r\n\t},\r\n\r\n\t/**\r\n\t * Update chartText\r\n\t * @private\r\n\t * @param {Object} $$.data.targets\r\n\t */\r\n\tupdateTargetsForText(targets) {\r\n\t\tconst $$ = this;\r\n\t\tconst classChartText = $$.classChartText.bind($$);\r\n\t\tconst classTexts = $$.classTexts.bind($$);\r\n\t\tconst classFocus = $$.classFocus.bind($$);\r\n\t\tconst mainTextUpdate = $$.main.select(`.${CLASS.chartTexts}`).selectAll(`.${CLASS.chartText}`)\r\n\t\t\t.data(targets)\r\n\t\t\t.attr(\"class\", d => classChartText(d) + classFocus(d));\r\n\t\tconst mainTextEnter = mainTextUpdate.enter().append(\"g\")\r\n\t\t\t.attr(\"class\", classChartText)\r\n\t\t\t.style(\"opacity\", \"0\")\r\n\t\t\t.style(\"pointer-events\", \"none\");\r\n\r\n\t\tmainTextEnter.append(\"g\")\r\n\t\t\t.attr(\"class\", classTexts);\r\n\t},\r\n\r\n\t/**\r\n\t * Update text\r\n\t * @private\r\n\t * @param {Number} Fade-out transition duration\r\n\t */\r\n\tupdateText(durationForExit) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tconst barOrLineData = $$.barOrLineData.bind($$);\r\n\t\tconst classText = $$.classText.bind($$);\r\n\r\n\t\t$$.mainText = $$.main.selectAll(`.${CLASS.texts}`).selectAll(`.${CLASS.text}`)\r\n\t\t\t.data(barOrLineData);\r\n\r\n\t\t$$.mainText.exit()\r\n\t\t\t.transition()\r\n\t\t\t.duration(durationForExit)\r\n\t\t\t.style(\"fill-opacity\", \"0\")\r\n\t\t\t.remove();\r\n\r\n\t\t$$.mainText = $$.mainText.enter()\r\n\t\t\t.append(\"text\")\r\n\t\t\t.attr(\"class\", classText)\r\n\t\t\t.attr(\"text-anchor\", d => (config.axis_rotated ? (d.value < 0 ? \"end\" : \"start\") : \"middle\"))\r\n\t\t\t.style(\"stroke\", \"none\")\r\n\t\t\t.style(\"fill\", d => $$.color(d))\r\n\t\t\t.style(\"fill-opacity\", \"0\")\r\n\t\t\t.merge($$.mainText)\r\n\t\t\t.text((d, i, j) => $$.dataLabelFormat(d.id)(d.value, d.id, i, j));\r\n\t},\r\n\r\n\t/**\r\n\t * Redraw chartText\r\n\t * @private\r\n\t * @param {Number} x Attribute\r\n\t * @param {Number} y Attribute\r\n\t * @param {Object} options.flow\r\n\t * @param {Boolean} indicates transition is enabled\r\n\t * @returns {Object} $$.mainText\r\n\t */\r\n\tredrawText(xForText, yForText, forFlow, withTransition) {\r\n\t\treturn [\r\n\t\t\t(withTransition ? this.mainText.transition() : this.mainText)\r\n\t\t\t\t.attr(\"x\", xForText)\r\n\t\t\t\t.attr(\"y\", yForText)\r\n\t\t\t\t.style(\"fill\", this.color)\r\n\t\t\t\t.style(\"fill-opacity\", forFlow ? 0 : this.opacityForText.bind(this))\r\n\t\t];\r\n\t},\r\n\r\n\t/**\r\n\t * Gets the getBoundingClientRect value of the element\r\n\t * @private\r\n\t * @param {String} text\r\n\t * @param {String} class\r\n\t * @param {HTMLElement} element\r\n\t * @returns {Object} value of element.getBoundingClientRect()\r\n\t */\r\n\tgetTextRect(text, cls, element) {\r\n\t\tconst dummy = d3Select(\"body\").append(\"div\")\r\n\t\t\t.classed(\"bb\", true);\r\n\r\n\t\tconst svg = dummy.append(\"svg\")\r\n\t\t\t.style(\"visibility\", \"hidden\")\r\n\t\t\t.style(\"position\", \"fixed\")\r\n\t\t\t.style(\"top\", \"0px\")\r\n\t\t\t.style(\"left\", \"0px\");\r\n\r\n\t\tconst font = d3Select(element).style(\"font\");\r\n\t\tlet rect;\r\n\r\n\t\tsvg.selectAll(\".dummy\")\r\n\t\t\t.data([text])\r\n\t\t\t.enter()\r\n\t\t\t.append(\"text\")\r\n\t\t\t.classed(!cls ? \"\" : cls, true)\r\n\t\t\t.style(\"font\", font)\r\n\t\t\t.text(text)\r\n\t\t\t.each(function() {\r\n\t\t\t\trect = this.getBoundingClientRect();\r\n\t\t\t});\r\n\r\n\t\tdummy.remove();\r\n\r\n\t\treturn rect;\r\n\t},\r\n\r\n\t/**\r\n\t * Gets the x or y coordinate of the text\r\n\t * @private\r\n\t * @param {Object} area Indices\r\n\t * @param {Object} bar Indices\r\n\t * @param {Object} line Indices\r\n\t * @param {Boolean} whether or not to x\r\n\t * @returns {Number} coordinates\r\n\t */\r\n\tgenerateXYForText(areaIndices, barIndices, lineIndices, forX) {\r\n\t\tconst $$ = this;\r\n\t\tconst getAreaPoints = $$.generateGetAreaPoints(areaIndices, false);\r\n\t\tconst getBarPoints = $$.generateGetBarPoints(barIndices, false);\r\n\t\tconst getLinePoints = $$.generateGetLinePoints(lineIndices, false);\r\n\t\tconst getter = forX ? $$.getXForText : $$.getYForText;\r\n\r\n\t\treturn function(d, i) {\r\n\t\t\tlet getPoints = $$.isBarType(d) ? getBarPoints : getLinePoints;\r\n\r\n\t\t\tgetPoints = $$.isAreaType(d) ? getAreaPoints : getPoints;\r\n\t\t\treturn getter.call($$, getPoints(d, i), d, this);\r\n\t\t};\r\n\t},\r\n\r\n\t/**\r\n\t * Gets the x coordinate of the text\r\n\t * @private\r\n\t * @param {Object} points\r\n\t * @param {Object} data\r\n\t * @param {HTMLElement} element\r\n\t * @returns {Number} x coordinate\r\n\t */\r\n\tgetXForText(points, d, textElement) {\r\n\t\tconst $$ = this;\r\n\t\tconst box = textElement.getBoundingClientRect();\r\n\t\tlet xPos;\r\n\t\tlet padding;\r\n\r\n\t\tif ($$.config.axis_rotated) {\r\n\t\t\tpadding = $$.isBarType(d) ? 4 : 6;\r\n\t\t\txPos = points[2][1] + padding * (d.value < 0 ? -1 : 1);\r\n\t\t} else {\r\n\t\t\txPos = $$.hasType(\"bar\") ? (points[2][0] + points[0][0]) / 2 : points[0][0];\r\n\t\t}\r\n\t\t// show labels regardless of the domain if value is null\r\n\t\tif (d.value === null) {\r\n\t\t\tif (xPos > $$.width) {\r\n\t\t\t\txPos = $$.width - box.width;\r\n\t\t\t} else if (xPos < 0) {\r\n\t\t\t\txPos = 4;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn xPos;\r\n\t},\r\n\r\n\t/**\r\n\t * Gets the y coordinate of the text\r\n\t * @private\r\n\t * @param {Object} points\r\n\t * @param {Object} data\r\n\t * @param {HTMLElement} element\r\n\t * @returns {Number} y coordinate\r\n\t */\r\n\tgetYForText(points, d, textElement) {\r\n\t\tconst $$ = this;\r\n\t\tconst box = textElement.getBoundingClientRect();\r\n\t\tlet yPos;\r\n\r\n\t\tif ($$.config.axis_rotated) {\r\n\t\t\tyPos = (points[0][0] + points[2][0] + box.height * 0.6) / 2;\r\n\t\t} else {\r\n\t\t\tyPos = points[2][1];\r\n\t\t\tif (d.value < 0 || (d.value === 0 && !$$.hasPositiveValue)) {\r\n\t\t\t\tyPos += box.height;\r\n\t\t\t\tif ($$.isBarType(d) && $$.isSafari()) {\r\n\t\t\t\t\tyPos -= 3;\r\n\t\t\t\t} else if (!$$.isBarType(d) && $$.isChrome()) {\r\n\t\t\t\t\tyPos += 3;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tyPos += $$.isBarType(d) ? -3 : -6;\r\n\t\t\t}\r\n\t\t}\r\n\t\t// show labels regardless of the domain if value is null\r\n\t\tif (d.value === null && !$$.config.axis_rotated) {\r\n\t\t\tif (yPos < box.height) {\r\n\t\t\t\tyPos = box.height;\r\n\t\t\t} else if (yPos > this.height) {\r\n\t\t\t\tyPos = this.height - 4;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn yPos;\r\n\t},\r\n});\r\n\n\n\n// WEBPACK FOOTER //\n// src/internals/text.js","/**\r\n * Copyright (c) 2017 NAVER Corp.\r\n * billboard.js project is licensed under the MIT license\r\n */\r\nimport ChartInternal from \"./ChartInternal\";\r\nimport {extend} from \"./util\";\r\n\r\nextend(ChartInternal.prototype, {\r\n\t/**\r\n\t * Initializes the title\r\n\t * @private\r\n\t */\r\n\tinitTitle() {\r\n\t\tconst $$ = this;\r\n\r\n\t\t$$.title = $$.svg.append(\"text\")\r\n\t\t\t.text($$.config.title_text)\r\n\t\t\t.attr(\"class\", $$.CLASS.title);\r\n\t},\r\n\r\n\t/**\r\n\t * Redraw title\r\n\t * @private\r\n\t */\r\n\tredrawTitle() {\r\n\t\tconst $$ = this;\r\n\r\n\t\t$$.title.attr(\"x\", $$.xForTitle.bind($$))\r\n\t\t\t.attr(\"y\", $$.yForTitle.bind($$));\r\n\t},\r\n\r\n\t/**\r\n\t * Returns the x attribute value of the title\r\n\t * @private\r\n\t * @returns {Number} x attribute value\r\n\t */\r\n\txForTitle() {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tconst position = config.title_position || \"left\";\r\n\t\tlet x;\r\n\r\n\t\tif (position.indexOf(\"right\") >= 0) {\r\n\t\t\tx = $$.currentWidth -\r\n\t\t\t\t$$.getTextRect($$.title.node().textContent, $$.CLASS.title, $$.title.node()).width -\r\n\t\t\t\tconfig.title_padding.right;\r\n\t\t} else if (position.indexOf(\"center\") >= 0) {\r\n\t\t\tx = ($$.currentWidth -\r\n\t\t\t\t$$.getTextRect($$.title.node().textContent, $$.CLASS.title, $$.title.node()).width) / 2;\r\n\t\t} else { // left\r\n\t\t\tx = config.title_padding.left;\r\n\t\t}\r\n\r\n\t\treturn x;\r\n\t},\r\n\r\n\t/**\r\n\t * Returns the y attribute value of the title\r\n\t * @private\r\n\t * @returns {Number} y attribute value\r\n\t */\r\n\tyForTitle() {\r\n\t\tconst $$ = this;\r\n\r\n\t\treturn $$.config.title_padding.top +\r\n\t\t\t$$.getTextRect($$.title.node().textContent, $$.CLASS.title, $$.title.node()).height;\r\n\t},\r\n\r\n\t/**\r\n\t * Get title padding\r\n\t * @private\r\n\t * @returns {Number} padding value\r\n\t */\r\n\tgetTitlePadding() {\r\n\t\tconst $$ = this;\r\n\r\n\t\treturn $$.yForTitle() + $$.config.title_padding.bottom;\r\n\t},\r\n});\r\n\n\n\n// WEBPACK FOOTER //\n// src/internals/title.js","/**\r\n * Copyright (c) 2017 NAVER Corp.\r\n * billboard.js project is licensed under the MIT license\r\n */\r\nimport {mouse as d3Mouse} from \"d3\";\r\nimport ChartInternal from \"./ChartInternal\";\r\nimport CLASS from \"../config/classes\";\r\nimport {extend, isValue, sanitise, isString} from \"./util\";\r\n\r\nextend(ChartInternal.prototype, {\r\n\t/**\r\n\t * Initializes the tooltip\r\n\t * @private\r\n\t */\r\n\tinitTooltip() {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tlet i;\r\n\r\n\t\t$$.tooltip = $$.selectChart\r\n\t\t\t.style(\"position\", \"relative\")\r\n\t\t\t.append(\"div\")\r\n\t\t\t.attr(\"class\", CLASS.tooltipContainer)\r\n\t\t\t.style(\"position\", \"absolute\")\r\n\t\t\t.style(\"pointer-events\", \"none\")\r\n\t\t\t.style(\"display\", \"none\");\r\n\r\n\t\t// Show tooltip if needed\r\n\t\tif (config.tooltip_init_show) {\r\n\t\t\tif ($$.isTimeSeries() && isString(config.tooltip_init_x)) {\r\n\t\t\t\tconfig.tooltip_init_x = $$.parseDate(config.tooltip_init_x);\r\n\r\n\t\t\t\tfor (i = 0; i < $$.data.targets[0].values.length; i++) {\r\n\t\t\t\t\tif (($$.data.targets[0].values[i].x - config.tooltip_init_x) === 0) { break; }\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconfig.tooltip_init_x = i;\r\n\t\t\t}\r\n\r\n\t\t\t$$.tooltip.html(config.tooltip_contents.call($$,\r\n\t\t\t\t$$.data.targets.map(d => $$.addName(d.values[config.tooltip_init_x])),\r\n\t\t\t\t\t$$.axis.getXAxisTickFormat(), $$.getYFormat($$.hasArcType()), $$.color));\r\n\r\n\t\t\t$$.tooltip.style(\"top\", config.tooltip_init_position.top)\r\n\t\t\t\t.style(\"left\", config.tooltip_init_position.left)\r\n\t\t\t\t.style(\"display\", \"block\");\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Returns the tooltip content(HTML string)\r\n\t * @private\r\n\t * @param {Object} data\r\n\t * @param {Function} default title format\r\n\t * @param {Function} default format for each data value in the tooltip.\r\n\t * @param {Object} $$.color(generateColor())\r\n\t * @returns {string} html\r\n\t */\r\n\tgetTooltipContent(d, defaultTitleFormat, defaultValueFormat, color) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tconst titleFormat = config.tooltip_format_title || defaultTitleFormat;\r\n\t\tconst nameFormat = config.tooltip_format_name || (name => name);\r\n\t\tconst valueFormat = config.tooltip_format_value || defaultValueFormat;\r\n\t\tconst orderAsc = $$.isOrderAsc();\r\n\t\tlet text;\r\n\t\tlet i;\r\n\t\tlet title;\r\n\t\tlet value;\r\n\t\tlet name;\r\n\t\tlet bgcolor;\r\n\r\n\t\tif (config.data_groups.length === 0) {\r\n\t\t\td.sort((a, b) => {\r\n\t\t\t\tconst v1 = a ? a.value : null;\r\n\t\t\t\tconst v2 = b ? b.value : null;\r\n\r\n\t\t\t\treturn orderAsc ? v1 - v2 : v2 - v1;\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\tconst ids = $$.orderTargets($$.data.targets).map(i2 => i2.id);\r\n\r\n\t\t\td.sort((a, b) => {\r\n\t\t\t\tlet v1 = a ? a.value : null;\r\n\t\t\t\tlet v2 = b ? b.value : null;\r\n\r\n\t\t\t\tif (v1 > 0 && v2 > 0) {\r\n\t\t\t\t\tv1 = a ? ids.indexOf(a.id) : null;\r\n\t\t\t\t\tv2 = b ? ids.indexOf(b.id) : null;\r\n\t\t\t\t}\r\n\t\t\t\treturn orderAsc ? v1 - v2 : v2 - v1;\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tfor (i = 0; i < d.length; i++) {\r\n\t\t\tif (!(d[i] && (d[i].value || d[i].value === 0))) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tif (!text) {\r\n\t\t\t\ttitle = sanitise(titleFormat ? titleFormat(d[i].x) : d[i].x);\r\n\t\t\t\ttext = (title || title === 0 ? `${title}` : \"\");\r\n\t\t\t\ttext = `${text}`;\r\n\t\t\t}\r\n\r\n\t\t\tvalue = sanitise(valueFormat(d[i].value, d[i].ratio, d[i].id, d[i].index, d));\r\n\r\n\t\t\tif (value !== undefined) {\r\n\t\t\t\t// Skip elements when their name is set to null\r\n\t\t\t\tif (d[i].name === null) { continue; }\r\n\t\t\t\tname = sanitise(nameFormat(d[i].name, d[i].ratio, d[i].id, d[i].index));\r\n\t\t\t\tbgcolor = $$.levelColor ? $$.levelColor(d[i].value) : color(d[i].id);\r\n\r\n\t\t\t\ttext += `` +\r\n\t\t\t\t\t`` +\r\n\t\t\t\t\t`` +\r\n\t\t\t\t\t``;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn `${text}
${name}${value}
`;\r\n\t},\r\n\t/**\r\n\t * Returns the position of the tooltip\r\n\t * @private\r\n\t * @param {Object} data\r\n\t * @param {String} width\r\n\t * @param {String} hHeight\r\n\t * @param {HTMLElement} element\r\n\t * @returns {Object} top, left value\r\n\t */\r\n\ttooltipPosition(dataToShow, tWidth, tHeight, element) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tconst forArc = $$.hasArcType();\r\n\t\tconst isTouch = ($$.inputType === \"touch\");\r\n\t\tconst mouse = d3Mouse(element);\r\n\t\tlet svgLeft;\r\n\t\tlet tooltipLeft;\r\n\t\tlet tooltipRight;\r\n\t\tlet tooltipTop;\r\n\t\tlet chartRight;\r\n\r\n\t\t// Determin tooltip position\r\n\t\tif (forArc) {\r\n\t\t\ttooltipLeft = isTouch ? mouse[0] :\r\n\t\t\t\t(($$.width - ($$.isLegendRight ? $$.getLegendWidth() : 0)) / 2) + mouse[0];\r\n\t\t\ttooltipTop = isTouch ? mouse[1] + 20 : ($$.height / 2) + mouse[1] + 20;\r\n\t\t} else {\r\n\t\t\tsvgLeft = $$.getSvgLeft(true);\r\n\r\n\t\t\tif (config.axis_rotated) {\r\n\t\t\t\ttooltipLeft = svgLeft + mouse[0] + 100;\r\n\t\t\t\ttooltipRight = tooltipLeft + tWidth;\r\n\t\t\t\tchartRight = $$.currentWidth - $$.getCurrentPaddingRight();\r\n\t\t\t\ttooltipTop = $$.x(dataToShow[0].x) + 20;\r\n\t\t\t} else {\r\n\t\t\t\ttooltipLeft = svgLeft + $$.getCurrentPaddingLeft(true) + $$.x(dataToShow[0].x) + 20;\r\n\t\t\t\ttooltipRight = tooltipLeft + tWidth;\r\n\t\t\t\tchartRight = svgLeft + $$.currentWidth - $$.getCurrentPaddingRight();\r\n\t\t\t\ttooltipTop = mouse[1] + 15;\r\n\t\t\t}\r\n\r\n\t\t\tif (tooltipRight > chartRight) {\r\n\t\t\t\t// 20 is needed for Firefox to keep tooltip width\r\n\t\t\t\ttooltipLeft -= tooltipRight - chartRight + 20;\r\n\t\t\t}\r\n\r\n\t\t\tif (tooltipTop + tHeight > $$.currentHeight) {\r\n\t\t\t\ttooltipTop -= tHeight + 30;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (tooltipTop < 0) {\r\n\t\t\ttooltipTop = 0;\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\ttop: tooltipTop,\r\n\t\t\tleft: tooltipLeft\r\n\t\t};\r\n\t},\r\n\t/**\r\n\t * Show the tooltip\r\n\t * @private\r\n\t * @param {Object} data\r\n\t * @param {HTMLElement} element\r\n\t */\r\n\tshowTooltip(selectedData, element) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\t\tconst forArc = $$.hasArcType();\r\n\t\tconst dataToShow = selectedData.filter(d => d && isValue(d.value));\r\n\t\tconst positionFunction = config.tooltip_position || $$.tooltipPosition;\r\n\r\n\t\tif (dataToShow.length === 0 || !config.tooltip_show) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t$$.tooltip.html(\r\n\t\t\tconfig.tooltip_contents.call(\r\n\t\t\t\t$$,\r\n\t\t\t\tselectedData,\r\n\t\t\t\t$$.axis.getXAxisTickFormat(),\r\n\t\t\t\t$$.getYFormat(forArc),\r\n\t\t\t\t$$.color\r\n\t\t\t))\r\n\t\t\t.style(\"display\", \"block\");\r\n\r\n\t\t// Get tooltip dimensions\r\n\t\tconst tWidth = $$.tooltip.property(\"offsetWidth\");\r\n\t\tconst tHeight = $$.tooltip.property(\"offsetHeight\");\r\n\t\tconst position = positionFunction.call(this, dataToShow, tWidth, tHeight, element);\r\n\r\n\t\t// Set tooltip\r\n\t\t$$.tooltip\r\n\t\t\t.style(\"top\", `${position.top}px`)\r\n\t\t\t.style(\"left\", `${position.left}px`);\r\n\t},\r\n\t/**\r\n\t * Hide the tooltip\r\n\t * @private\r\n\t */\r\n\thideTooltip() {\r\n\t\tthis.tooltip.style(\"display\", \"none\");\r\n\t},\r\n});\r\n\n\n\n// WEBPACK FOOTER //\n// src/internals/tooltip.js","/**\r\n * Copyright (c) 2017 NAVER Corp.\r\n * billboard.js project is licensed under the MIT license\r\n */\r\nimport ChartInternal from \"./ChartInternal\";\r\nimport {isString, extend} from \"./util\";\r\n\r\nextend(ChartInternal.prototype, {\r\n\tsetTargetType(targetIds, type) {\r\n\t\tconst $$ = this;\r\n\t\tconst config = $$.config;\r\n\r\n\t\t$$.mapToTargetIds(targetIds).forEach(id => {\r\n\t\t\t$$.withoutFadeIn[id] = (type === config.data_types[id]);\r\n\t\t\tconfig.data_types[id] = type;\r\n\t\t});\r\n\r\n\t\tif (!targetIds) {\r\n\t\t\tconfig.data_type = type;\r\n\t\t}\r\n\t},\r\n\r\n\thasType(type, targetsValue) {\r\n\t\tconst $$ = this;\r\n\t\tconst types = $$.config.data_types;\r\n\t\tconst targets = targetsValue || $$.data.targets;\r\n\t\tlet has = false;\r\n\r\n\t\tif (targets && targets.length) {\r\n\t\t\ttargets.forEach(target => {\r\n\t\t\t\tconst t = types[target.id];\r\n\r\n\t\t\t\tif ((t && t.indexOf(type) >= 0) || (!t && type === \"line\")) {\r\n\t\t\t\t\thas = true;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t} else if (Object.keys(types).length) {\r\n\t\t\tObject.keys(types).forEach(id => {\r\n\t\t\t\tif (types[id] === type) {\r\n\t\t\t\t\thas = true;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\thas = $$.config.data_type === type;\r\n\t\t}\r\n\r\n\t\treturn has;\r\n\t},\r\n\r\n\thasArcType(targets) {\r\n\t\treturn this.hasType(\"pie\", targets) ||\r\n\t\t\tthis.hasType(\"donut\", targets) ||\r\n\t\t\tthis.hasType(\"gauge\", targets);\r\n\t},\r\n\r\n\tisLineType(d) {\r\n\t\tconst config = this.config;\r\n\t\tconst id = isString(d) ? d : d.id;\r\n\r\n\t\treturn !config.data_types[id] ||\r\n\t\t\t[\"line\", \"spline\", \"area\", \"area-spline\", \"step\", \"area-step\"]\r\n\t\t\t\t.indexOf(config.data_types[id]) >= 0;\r\n\t},\r\n\r\n\tisStepType(d) {\r\n\t\tconst id = isString(d) ? d : d.id;\r\n\r\n\t\treturn [\"step\", \"area-step\"]\r\n\t\t\t.indexOf(this.config.data_types[id]) >= 0;\r\n\t},\r\n\r\n\tisSplineType(d) {\r\n\t\tconst id = isString(d) ? d : d.id;\r\n\r\n\t\treturn [\"spline\", \"area-spline\"]\r\n\t\t\t.indexOf(this.config.data_types[id]) >= 0;\r\n\t},\r\n\r\n\tisAreaType(d) {\r\n\t\tconst id = isString(d) ? d : d.id;\r\n\r\n\t\treturn [\"area\", \"area-spline\", \"area-step\"]\r\n\t\t\t.indexOf(this.config.data_types[id]) >= 0;\r\n\t},\r\n\r\n\tisBarType(d) {\r\n\t\tconst id = isString(d) ? d : d.id;\r\n\r\n\t\treturn this.config.data_types[id] === \"bar\";\r\n\t},\r\n\r\n\tisScatterType(d) {\r\n\t\tconst id = isString(d) ? d : d.id;\r\n\r\n\t\treturn this.config.data_types[id] === \"scatter\";\r\n\t},\r\n\r\n\tisPieType(d) {\r\n\t\tconst id = isString(d) ? d : d.id;\r\n\r\n\t\treturn this.config.data_types[id] === \"pie\";\r\n\t},\r\n\r\n\tisGaugeType(d) {\r\n\t\tconst id = isString(d) ? d : d.id;\r\n\r\n\t\treturn this.config.data_types[id] === \"gauge\";\r\n\t},\r\n\r\n\tisDonutType(d) {\r\n\t\tconst id = isString(d) ? d : d.id;\r\n\r\n\t\treturn this.config.data_types[id] === \"donut\";\r\n\t},\r\n\r\n\tisArcType(d) {\r\n\t\treturn this.isPieType(d) ||\r\n\t\t\tthis.isDonutType(d) ||\r\n\t\t\tthis.isGaugeType(d);\r\n\t},\r\n\r\n\tlineData(d) {\r\n\t\treturn this.isLineType(d) ? [d] : [];\r\n\t},\r\n\r\n\tarcData(d) {\r\n\t\treturn this.isArcType(d.data) ? [d] : [];\r\n\t},\r\n\r\n\tbarData(d) {\r\n\t\treturn this.isBarType(d) ? d.values : [];\r\n\t},\r\n\r\n\tlineOrScatterData(d) {\r\n\t\treturn this.isLineType(d) ||\r\n\t\t\tthis.isScatterType(d) ? d.values : [];\r\n\t},\r\n\r\n\tbarOrLineData(d) {\r\n\t\treturn this.isBarType(d) ||\r\n\t\t\tthis.isLineType(d) ? d.values : [];\r\n\t},\r\n\r\n\t// https://github.com/d3/d3-shape#curves\r\n\tisInterpolationType(type) {\r\n\t\treturn [\r\n\t\t\t\"basis\",\r\n\t\t\t\"basis-closed\",\r\n\t\t\t\"basis-open\",\r\n\t\t\t\"bundle\",\r\n\t\t\t\"cardinal\",\r\n\t\t\t\"cardinal-closed\",\r\n\t\t\t\"cardinal-open\",\r\n\t\t\t\"catmull-rom\",\r\n\t\t\t\"catmull-rom-closed\",\r\n\t\t\t\"catmull-rom-open\",\r\n\t\t\t\"linear\",\r\n\t\t\t\"linear-closed\",\r\n\t\t\t\"monotone-x\",\r\n\t\t\t\"monotone-y\",\r\n\t\t\t\"natural\"\r\n\t\t].indexOf(type) >= 0;\r\n\t}\r\n});\r\n\n\n\n// WEBPACK FOOTER //\n// src/internals/type.js","/**\r\n * Copyright (c) 2017 NAVER Corp.\r\n * billboard.js project is licensed under the MIT license\r\n */\r\nimport ChartInternal from \"./ChartInternal\";\r\nimport {extend} from \"./util\";\r\n\r\nextend(ChartInternal.prototype, {\r\n\tisSafari() {\r\n\t\tconst ua = window.navigator.userAgent;\r\n\r\n\t\treturn ua.indexOf(\"Safari\") >= 0 &&\r\n\t\t\tua.indexOf(\"Chrome\") < 0;\r\n\t},\r\n\r\n\tisChrome() {\r\n\t\treturn window.navigator.userAgent\r\n\t\t\t.indexOf(\"Chrome\") >= 0;\r\n\t}\r\n});\r\n\n\n\n// WEBPACK FOOTER //\n// src/internals/ua.js","// removed by extract-text-webpack-plugin\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/scss/main.scss\n// module id = 57\n// module chunks = 0 1","/**\r\n * Copyright (c) 2017 NAVER Corp.\r\n * billboard.js project is licensed under the MIT license\r\n */\r\n/**\r\n * Class to set options on generating chart.\r\n * - It's instantiated internally, not exposed for public.\r\n * @class Options\r\n * @see {@link bb.generate} to use these options on generating the chart\r\n */\r\nexport default class Options {\r\n\tconstructor() {\r\n\t\tthis.value = {\r\n\t\t\t/**\r\n\t\t\t * bindto The CSS selector or the element which the chart will be set to. D3 selection object can be specified. If other chart is set already, it will be replaced with the new one (only one chart can be set in one element).

\r\n\t\t\t * If this option is not specified, the chart will be generated but not be set. Instead, we can access the element by chart.element and set it by ourselves.
\r\n\t\t\t * > NOTE: When chart is not binded, bb starts observing if chart.element is binded by MutationObserver. In this case, polyfill is required in IE9 and IE10 becuase they do not support MutationObserver. On the other hand, if chart always will be binded, polyfill will not be required because MutationObserver will never be called.\r\n\t\t\t * @name bindto\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {String}\r\n\t\t\t * @default #chart\r\n\t\t\t * @example\r\n\t\t\t * bindto: \"#myContainer\"\r\n\t\t\t *\r\n\t\t\t * // or element\r\n\t\t\t * bindto: document.getElementById(\"myContainer\")\r\n\t\t\t *\r\n\t\t\t * // or D3 selection object\r\n\t\t\t * bindto: d3.select(\"#myContainer\")\r\n\t\t\t */\r\n\t\t\tbindto: \"#chart\",\r\n\r\n\t\t\t/**\r\n\t\t\t * Set svg element's class name\r\n\t\t\t * @name svg\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Object}\r\n\t\t\t * @property {String} [svg.classname] class name for svg element\r\n\t\t\t * @example\r\n\t\t\t * svg: {\r\n * classname: \"test_class\"\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\tsvg_classname: undefined,\r\n\r\n\t\t\t/**\r\n\t\t\t * The desired size of the chart element.\r\n\t\t\t * If value is not specified, the width of the chart will be calculated by the size of the parent element it's appended to.\r\n\t\t\t * @name size\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Object}\r\n\t\t\t * @property {Number} [size.width] width of the chart element\r\n\t\t\t * @property {Number} [size.height] height of the chart element\r\n\t\t\t * @example\r\n\t\t\t * size: {\r\n * width: 640,\r\n * height: 480\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\tsize_width: undefined,\r\n\t\t\tsize_height: undefined,\r\n\r\n\t\t\t/**\r\n\t\t\t * The padding of the chart element.\r\n\t\t\t * @name padding\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Object}\r\n\t\t\t * @property {Number} [padding.top] padding on the top of chart\r\n\t\t\t * @property {Number} [padding.right] padding on the right of chart\r\n\t\t\t * @property {Number} [padding.bottom] padding on the bottom of chart\r\n\t\t\t * @property {Number} [padding.left] padding on the left of chart\r\n\t\t\t * @example\r\n\t\t\t * padding: {\r\n * top: 20,\r\n * right: 20,\r\n * bottom: 20,\r\n * left: 20\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\tpadding_left: undefined,\r\n\t\t\tpadding_right: undefined,\r\n\t\t\tpadding_top: undefined,\r\n\t\t\tpadding_bottom: undefined,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set chart resize options\r\n\t\t\t * @name resize\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Object}\r\n\t\t\t * @property {Boolean} [resize.auto=true] Set chart resize automatically on viewport changes.\r\n\t\t\t * @example\r\n\t\t\t * resize: {\r\n\t\t\t * auto: false\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\tresize_auto: true,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set zoom options\r\n\t\t\t * @name zoom\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Object}\r\n\t\t\t * @property {Boolean} [zoom.enabled=false] Enable zooming.\r\n\t\t\t * @property {Boolean} [zoom.rescale=false] Enable to rescale after zooming.
\r\n\t\t\t * If true set, y domain will be updated according to the zoomed region.\r\n\t\t\t * @property {Array} [zoom.extent=[1, 10]] Change zoom extent.\r\n\t\t\t * @property {Function} [zoom.onzoom=function(){}] Set callback that is called when the chart is zooming.
\r\n\t\t\t * Specified function receives the zoomed domain.\r\n\t\t\t * @property {Function} [zoom.onzoomstart=function(){}] Set callback that is called when zooming starts.
\r\n\t\t\t * Specified function receives the zoom event.\r\n\t\t\t * @property {Function} [zoom.onzoomend=function(){}] Set callback that is called when zooming ends.
\r\n\t\t\t * Specified function receives the zoomed domain.\r\n\t\t\t * @example\r\n\t\t\t * zoom: {\r\n\t\t\t * enabled: true,\r\n\t\t\t * rescale: true,\r\n\t\t\t * extent: [1, 100] // enable more zooming\r\n\t\t\t * onzoom: function(domain) { ... },\r\n\t\t\t * onzoomstart: function(event) { ... },\r\n\t\t\t * onzoomend: function(domain) { ... }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\tzoom_enabled: false,\r\n\t\t\tzoom_extent: undefined,\r\n\t\t\tzoom_privileged: false,\r\n\t\t\tzoom_rescale: false,\r\n\t\t\tzoom_onzoom: () => {},\r\n\t\t\tzoom_onzoomstart: () => {},\r\n\t\t\tzoom_onzoomend: () => {},\r\n\t\t\tzoom_x_min: undefined,\r\n\t\t\tzoom_x_max: undefined,\r\n\r\n\t\t\t/**\r\n\t\t\t * Interaction options\r\n\t\t\t * @name interaction\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Object}\r\n\t\t\t * @property {Boolean} [interaction.enabled=true] Indicate if the chart should have interactions.
\r\n\t\t\t * If `false` is set, all of interactions (showing/hiding tooltip, selection, mouse events, etc) will be disabled.\r\n\t\t\t * @property {Boolean} [interaction.brighten=true]\r\n\t\t\t * @property {Boolean} [interaction.inputType.mouse=true] enable or disable mouse interaction\r\n\t\t\t * @property {Boolean} [interaction.inputType.touch=true] enable or disable touch interaction\r\n\t\t\t * @example\r\n\t\t\t * interaction: {\r\n * enabled: false,\r\n * inputType: {\r\n * mouse: true,\r\n * touch: false\r\n * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\tinteraction_brighten: true,\r\n\t\t\tinteraction_enabled: true,\r\n\t\t\tinteraction_inputType_mouse: true,\r\n\t\t\tinteraction_inputType_touch: true,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set a callback to execute when mouse/touch enters the chart.\r\n\t\t\t * @name onover\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Function}\r\n\t\t\t * @default function(){}\r\n\t\t\t * @example\r\n\t\t\t * onover: function() {\r\n\t\t\t * ...\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\tonover: () => {},\r\n\r\n\t\t\t/**\r\n\t\t\t * Set a callback to execute when mouse/touch leaves the chart.\r\n\t\t\t * @name onout\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Function}\r\n\t\t\t * @default function(){}\r\n\t\t\t * @example\r\n\t\t\t * onout: function() {\r\n\t\t\t * ...\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\tonout: () => {},\r\n\r\n\t\t\t/**\r\n\t\t\t * Set a callback to execute when user resizes the screen.\r\n\t\t\t * @name onresize\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Function}\r\n\t\t\t * @default function(){}\r\n\t\t\t * @example\r\n\t\t\t * onresize: function() {\r\n\t\t\t * ...\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\tonresize: () => {},\r\n\r\n\t\t\t/**\r\n\t\t\t * SSet a callback to execute when screen resize finished.\r\n\t\t\t * @name onresized\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Function}\r\n\t\t\t * @default function(){}\r\n\t\t\t * @example\r\n\t\t\t * onresized: function() {\r\n\t\t\t * ...\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\tonresized: () => {},\r\n\r\n\t\t\t/**\r\n\t\t\t * Set a callback to execute when the chart is initialized.\r\n\t\t\t * @name oninit\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Function}\r\n\t\t\t * @default function(){}\r\n\t\t\t * @example\r\n\t\t\t * oninit: function() {\r\n\t\t\t * ...\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\toninit: () => {},\r\n\r\n\t\t\t/**\r\n\t\t\t * Set a callback which is executed when the chart is rendered. Basically, this callback will be called in each time when the chart is redrawed.\r\n\t\t\t * @name onrendered\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Function}\r\n\t\t\t * @default function(){}\r\n\t\t\t * @example\r\n\t\t\t * onrendered: function() {\r\n\t\t\t * ...\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\tonrendered: () => {},\r\n\r\n\t\t\t/**\r\n\t\t\t * Set duration of transition (in milliseconds) for chart animation.

\r\n\t\t\t * NOTE:If `0 `or `null` set, transition will be skipped. So, this makes initial rendering faster especially in case you have a lot of data.\r\n\t\t\t * @name transition\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Object}\r\n\t\t\t * @property {Number} [transition.duration=350] duration in milliseconds\r\n\t\t\t * @example\r\n\t\t\t * transition: {\r\n\t\t\t * duration: 500\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\ttransition_duration: 350,\r\n\r\n\t\t\t/**\r\n\t\t\t * Specify the key of x values in the data.

\r\n\t\t\t * We can show the data with non-index x values by this option. This option is required when the type of x axis is timeseries. If this option is set on category axis, the values of the data on the key will be used for category names.\r\n\t\t\t * @name data:x\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {String}\r\n\t\t\t * @default undefined\r\n\t\t\t * @example\r\n\t\t\t * data: {\r\n * x: \"date\"\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\tdata_x: undefined,\r\n\r\n\t\t\t/**\r\n\t\t\t * Specify the keys of the x values for each data.

\r\n\t\t\t * This option can be used if we want to show the data that has different x values.\r\n\t\t\t * @name data:xs\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Object}\r\n\t\t\t * @default {}\r\n\t\t\t * @example\r\n\t\t\t * data: {\r\n * xs: {\r\n * data1: \"x1\",\r\n * data2: \"x2\"\r\n * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\tdata_xs: {},\r\n\r\n\t\t\t/**\r\n\t\t\t * Set a format to parse string specifed as x.\r\n\t\t\t * @name data:xFormat\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {String}\r\n\t\t\t * @default %Y-%m-%d\r\n\t\t\t * @example\r\n\t\t\t * data: {\r\n * xFormat: \"%Y-%m-%d %H:%M:%S\"\r\n\t\t\t * }\r\n\t\t\t * @see [D3's time specifier](https://npm.runkit.com/d3-time-format)\r\n\t\t\t */\r\n\t\t\tdata_xFormat: \"%Y-%m-%d\",\r\n\r\n\t\t\t/**\r\n\t\t\t * Set localtime format to parse x axis.\r\n\t\t\t * @name data:xLocaltime\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Boolean}\r\n\t\t\t * @default true\r\n\t\t\t * @example\r\n\t\t\t * data: {\r\n * xLocaltime: false\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\tdata_xLocaltime: true,\r\n\r\n\t\t\t/**\r\n\t\t\t * Sort on x axis.\r\n\t\t\t * @name data:xSort\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Boolean}\r\n\t\t\t * @default true\r\n\t\t\t * @example\r\n\t\t\t * data: {\r\n * xSort: false\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\tdata_xSort: true,\r\n\t\t\tdata_idConverter: id => id,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set custom data name.\r\n\t\t\t * @name data:names\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Object}\r\n\t\t\t * @default {}\r\n\t\t\t * @example\r\n\t\t\t * data: {\r\n * names: {\r\n * data1: \"Data Name 1\",\r\n * data2: \"Data Name 2\"\r\n * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\tdata_names: {},\r\n\r\n\t\t\t/**\r\n\t\t\t * Set custom data class.

\r\n\t\t\t * If this option is specified, the element g for the data has an additional class that has the prefix 'bb-target-' (eg. bb-target-additional-data1-class).\r\n\t\t\t * @name data:classes\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Object}\r\n\t\t\t * @default {}\r\n\t\t\t * @example\r\n\t\t\t * data: {\r\n * classes: {\r\n * data1: \"additional-data1-class\",\r\n * data2: \"additional-data2-class\"\r\n * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\tdata_classes: {},\r\n\r\n\t\t\t/**\r\n\t\t\t * Set groups for the data for stacking.\r\n\t\t\t * @name data:groups\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Array}\r\n\t\t\t * @default []\r\n\t\t\t * @example\r\n\t\t\t * data: {\r\n * groups: [\r\n * [\"data1\", \"data2\"],\r\n * [\"data3\"]\r\n * ]\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\tdata_groups: [],\r\n\r\n\t\t\t/**\r\n\t\t\t * Set y axis the data related to. y and y2 can be used.\r\n\t\t\t * @name data:axes\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Object}\r\n\t\t\t * @default {}\r\n\t\t\t * @example\r\n\t\t\t * data: {\r\n\t\t\t * axes: {\r\n\t\t\t * data1: \"y\",\r\n\t\t\t * data2: \"y2\"\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\tdata_axes: {},\r\n\r\n\t\t\t/**\r\n\t\t\t * Set chart type at once.

\r\n\t\t\t * If this option is specified, the type will be applied to every data. This setting can be overwritten by data.types.

\r\n\t\t\t * Available Values:\r\n\t\t\t * - line\r\n\t\t\t * - spline\r\n\t\t\t * - step\r\n\t\t\t * - area\r\n\t\t\t * - area-spline\r\n\t\t\t * - area-step\r\n\t\t\t * - bar\r\n\t\t\t * - scatter\r\n\t\t\t * - pie\r\n\t\t\t * - donut\r\n\t\t\t * - gauge\r\n\t\t\t * @name data:type\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {String}\r\n\t\t\t * @default line\r\n\t\t\t * @example\r\n\t\t\t * data: {\r\n\t\t\t * type: \"bar\"\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\tdata_type: undefined,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set chart type for each data.
\r\n\t\t\t * This setting overwrites data.type setting.\r\n\t\t\t * @name data:types\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Object}\r\n\t\t\t * @default {}\r\n\t\t\t * @example\r\n\t\t\t * data: {\r\n\t\t\t * types: {\r\n\t\t\t * data1: \"bar\",\r\n\t\t\t * data2: \"spline\"\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\tdata_types: {},\r\n\r\n\t\t\t/**\r\n\t\t\t * Show labels on each data points.\r\n\t\t\t * @name data:labels\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Boolean}\r\n\t\t\t * @default false\r\n\t\t\t * @example\r\n\t\t\t * data: {\r\n\t\t\t * labels: true\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\t/**\r\n\t\t\t * Set formatter function for data labels.
\r\n\t\t\t * The formatter function receives 4 arguments such as v, id, i, j and it must return a string that will be shown as the label. The arguments are:
\r\n\t\t\t * - `v` is the value of the data point where the label is shown.\r\n\t\t\t * - `id` is the id of the data where the label is shown.\r\n\t\t\t * - `i` is the index of the data point where the label is shown.\r\n\t\t\t * - `j` is the sub index of the data point where the label is shown.

\r\n\t\t\t * Formatter function can be defined for each data by specifying as an object and D3 formatter function can be set (ex. d3.format('$'))\r\n\t\t\t * @name data:labels:format\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Object}\r\n\t\t\t * @default {}\r\n\t\t\t * @example\r\n\t\t\t * data: {\r\n\t\t\t * labels: {\r\n\t\t\t * format: function(v, id, i, j) { ... }\r\n\t\t\t * // it's possible to set for each data\r\n\t\t\t * //format: {\r\n\t\t\t * // data1: function(v, id, i, j) { ... },\r\n\t\t\t * // ...\r\n\t\t\t * //}\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\tdata_labels: {},\r\n\r\n\t\t\t/**\r\n\t\t\t * This option changes the order of stacking the data and pieces of pie/donut. If `null` specified, it will be the order the data loaded. If function specified, it will be used to sort the data and it will recieve the data as argument.

\r\n\t\t\t * Available Values:\r\n\t\t\t * - desc\r\n\t\t\t * - asc\r\n\t\t\t * - function(data1, data2) { ... }\r\n\t\t\t * - null\r\n\t\t\t * @name data:order\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {String|Function}\r\n\t\t\t * @default desc\r\n\t\t\t * @example\r\n\t\t\t * data: {\r\n\t\t\t * lorder: \"asc\"\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\tdata_order: \"desc\",\r\n\r\n\t\t\t/**\r\n\t\t\t * Define regions for each data.

\r\n\t\t\t * The values must be an array for each data and it should include an object that has start, end, style. If start is not set, the start will be the first data point. If end is not set, the end will be the last data point.
\r\n\t\t\t * Currently this option supports only line chart and dashed style. If this option specified, the line will be dashed only in the regions.\r\n\t\t\t * @name data:regions\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Object}\r\n\t\t\t * @default {}\r\n\t\t\t * @example\r\n\t\t\t * data: {\r\n\t\t\t * regions: {\r\n\t\t\t * data1: [{\r\n\t\t\t * \"start\": 1,\r\n\t\t\t * \"end\": 2,\r\n\t\t\t * \"style\": \"dashed\"\r\n\t\t\t * }, {\r\n\t\t\t * \"start\":3\r\n\t\t\t * }],\r\n\t\t\t * ...\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\tdata_regions: {},\r\n\r\n\t\t\t/**\r\n\t\t\t * Set color converter function.

\r\n\t\t\t * This option should a function and the specified function receives color (e.g. '#ff0000') and d that has data parameters like id, value, index, etc. And it must return a string that represents color (e.g. '#00ff00').\r\n\t\t\t * @name data:color\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Function}\r\n\t\t\t * @default undefined\r\n\t\t\t * @example\r\n\t\t\t * data: {\r\n\t\t\t * color: function(color, d) { ... }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\tdata_color: undefined,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set color for each data.\r\n\t\t\t * @name data:colors\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Object}\r\n\t\t\t * @default {}\r\n\t\t\t * @example\r\n\t\t\t * data: {\r\n\t\t\t * colors: {\r\n\t\t\t * data1: \"#ff0000\",\r\n\t\t\t * ...\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\tdata_colors: {},\r\n\r\n\t\t\t/**\r\n\t\t\t * Hide each data when the chart appears.

\r\n\t\t\t * If true specified, all of data will be hidden. If multiple ids specified as an array, those will be hidden.\r\n\t\t\t * @name data:hide\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Boolean|Array}\r\n\t\t\t * @default false\r\n\t\t\t * @example\r\n\t\t\t * data: {\r\n\t\t\t * // all of data will be hidden\r\n\t\t\t * hide: true\r\n\t\t\t * // specified data will be hidden\r\n\t\t\t * hide: [\"data1\", ...]\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\tdata_hide: false,\r\n\t\t\tdata_filter: undefined,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set data selection enabled.

\r\n\t\t\t * If this option is set true, we can select the data points and get/set its state of selection by API (e.g. select, unselect, selected).\r\n\t\t\t * @name data:selection:enabled\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Boolean}\r\n\t\t\t * @default false\r\n\t\t\t * @example\r\n\t\t\t * data: {\r\n\t\t\t * selection: {\r\n\t\t\t * enabled: true\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\tdata_selection_enabled: false,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set grouped selection enabled.

\r\n\t\t\t * If this option set true, multiple data points that have same x value will be selected by one selection.\r\n\t\t\t * @name data:selection:grouped\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Boolean}\r\n\t\t\t * @default false\r\n\t\t\t * @example\r\n\t\t\t * data: {\r\n\t\t\t * selection: {\r\n\t\t\t * grouped: true\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\tdata_selection_grouped: false,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set a callback for each data point to determine if it's selectable or not.

\r\n\t\t\t * The callback will receive d as an argument and it has some parameters like id, value, index. This callback should return boolean.\r\n\t\t\t * @name data:selection:isselectable\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Function}\r\n\t\t\t * @default function() { return true; }\r\n\t\t\t * @example\r\n\t\t\t * data: {\r\n\t\t\t * selection: {\r\n\t\t\t * isselectable: function(d) { ... }\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\tdata_selection_isselectable: () => true,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set multiple data points selection enabled.

\r\n\t\t\t * If this option set true, multile data points can have the selected state at the same time. If false set, only one data point can have the selected state and the others will be unselected when the new data point is selected.\r\n\t\t\t * @name data:selection:multiple\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Boolean}\r\n\t\t\t * @default true\r\n\t\t\t * @example\r\n\t\t\t * data: {\r\n\t\t\t * selection: {\r\n\t\t\t * multiple: false\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\tdata_selection_multiple: true,\r\n\r\n\t\t\t/**\r\n\t\t\t * Enable to select data points by dragging.

\r\n\t\t\t * If this option set true, data points can be selected by dragging.\r\n\t\t\t * Note: If this option set true, scrolling on the chart will be disabled because dragging event will handle the event.\r\n\t\t\t * @name data:selection:draggable\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Boolean}\r\n\t\t\t * @default false\r\n\t\t\t * @example\r\n\t\t\t * data: {\r\n\t\t\t * selection: {\r\n\t\t\t * draggable: true\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\tdata_selection_draggable: false,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set a callback for click event on each data point.

\r\n\t\t\t * This callback will be called when each data point clicked and will receive d and element as the arguments. d is the data clicked and element is the element clicked. In this callback, this will be the Chart object.\r\n\t\t\t * @name data:onclick\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Function}\r\n\t\t\t * @default function() {}\r\n\t\t\t * @example\r\n\t\t\t * data: {\r\n\t\t\t * onclick: function(d, element) { ... }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\tdata_onclick: () => {},\r\n\r\n\t\t\t/**\r\n\t\t\t * Set a callback for mouse/touch over event on each data point.

\r\n\t\t\t * This callback will be called when mouse cursor or via touch moves onto each data point and will receive d as the argument. d is the data where mouse cursor moves onto. In this callback, this will be the Chart object.\r\n\t\t\t * @name data:onover\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Function}\r\n\t\t\t * @default function() {}\r\n\t\t\t * @example\r\n\t\t\t * data: {\r\n\t\t\t * onover: function(d) { ... }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\tdata_onover: () => {},\r\n\r\n\t\t\t/**\r\n\t\t\t * Set a callback for mouse/touch out event on each data point.

\r\n\t\t\t * This callback will be called when mouse cursor or via touch moves out each data point and will receive d as the argument. d is the data where mouse cursor moves out. In this callback, this will be the Chart object.\r\n\t\t\t * @name data:onout\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Function}\r\n\t\t\t * @default function() {}\r\n\t\t\t * @example\r\n\t\t\t * data: {\r\n\t\t\t * onout: function(d) { ... }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\tdata_onout: () => {},\r\n\r\n\t\t\t/**\r\n\t\t\t * Set a callback for on data selection.\r\n\t\t\t * @name data:onselected\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Function}\r\n\t\t\t * @default function() {}\r\n\t\t\t * @example\r\n\t\t\t * data: {\r\n\t\t\t * onselected: function(d) { ... }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\tdata_onselected: () => {},\r\n\r\n\t\t\t/**\r\n\t\t\t * Set a callback for on data un-selection.\r\n\t\t\t * @name data:onunselected\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Function}\r\n\t\t\t * @default function() {}\r\n\t\t\t * @example\r\n\t\t\t * data: {\r\n\t\t\t * onunselected: function(d) { ... }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\tdata_onunselected: () => {},\r\n\t\t\tdata_url: undefined,\r\n\t\t\tdata_headers: undefined,\r\n\t\t\tdata_json: undefined,\r\n\t\t\tdata_rows: undefined,\r\n\t\t\tdata_columns: undefined,\r\n\t\t\tdata_mimeType: undefined,\r\n\t\t\tdata_keys: undefined,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set text displayed when empty data.\r\n\t\t\t * @name data:empty:label:text\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {String}\r\n\t\t\t * @default \"\"\r\n\t\t\t * @example\r\n\t\t\t * data: {\r\n\t\t\t * empty: {\r\n\t\t\t * label: {\r\n\t\t\t * text: \"No Data\"\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\tdata_empty_label_text: \"\",\r\n\r\n\t\t\t/**\r\n\t\t\t * Set subchart options\r\n\t\t\t * @name subchart\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Object}\r\n\t\t\t * @property {Boolean} [subchart.show=false] Show sub chart on the bottom of the chart.\r\n\t\t\t * @property {Boolean} [subchart.size.height] Change the height of the subchart.\r\n\t\t\t * @property {Boolean} [subchart.onbrush] Set callback for brush event.
\r\n\t\t\t * Specified function receives the current zoomed x domain.\r\n\t\t\t * @example\r\n\t\t\t * subchart: {\r\n\t\t\t * show: true,\r\n\t\t\t * size: {\r\n\t\t\t * height: 20\r\n\t\t\t * },\r\n\t\t\t * onbrush: function(domain) { ... }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\tsubchart_show: false,\r\n\t\t\tsubchart_size_height: 60,\r\n\t\t\tsubchart_axis_x_show: true,\r\n\t\t\tsubchart_onbrush: () => {},\r\n\r\n\t\t\t/**\r\n\t\t\t * Set color of the data values\r\n\t\t\t * @name color\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Object}\r\n\t\t\t * @property {Array} [color.pattern] custom color pattern\r\n\t\t\t * @property {Object} [color.threshold] color threshold\r\n\t\t\t * @property {String} [color.threshold.unit] unit\r\n\t\t\t * @property {Array} [color.threshold.value] value\r\n\t\t\t * @property {Array} [color.threshold.max=100] max value\r\n\t\t\t * @example\r\n\t\t\t * color: {\r\n\t\t\t * pattern: [\"#1f77b4\", \"#aec7e8\", ...]\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\tcolor_pattern: [],\r\n\t\t\tcolor_threshold: {},\r\n\r\n\t\t\t/**\r\n\t\t\t * Legend options\r\n\t\t\t * @name legend\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Object}\r\n\t\t\t * @property {Boolean} [legend.show=true] Show or hide legend.\r\n\t\t\t * @property {Boolean} [legend.hide=false] Hide legend\r\n\t\t\t * If true given, all legend will be hidden. If string or array given, only the legend that has the id will be hidden.\r\n\t\t\t * @property {String} [legend.position=bottom] Change the position of legend.
\r\n\t\t\t * Available values are: `bottom`, `right` and `inset` are supported.\r\n\t\t\t * @property {Object} [legend.inset={anchor: 'top-left',x: 10,y: 0,step: undefined}] Change inset legend attributes.
\r\n\t\t\t * This option accepts object that has the keys anchor, x, y and step.\r\n\t\t\t * anchor decides the position of the legend. These anchors are available:\r\n\t\t\t * - top-left\r\n\t\t\t * - top-right\r\n\t\t\t * - bottom-left\r\n\t\t\t * - bottom-right\r\n\t\t\t * x and y set the position of the legend based on the anchor.
\r\n\t\t\t * step defines the max step the lagend has (e.g. If 2 set and legend has 3 legend item, the legend 2 columns).\r\n\t\t\t * @property {Function} [legend.item.onclick=undefined] Set click event handler to the legend item.\r\n\t\t\t * @property {Function} [legend.item.onover=undefined] Set mouse/touch over event handler to the legend item.\r\n\t\t\t * @property {Function} [legend.item.onout=undefined] Set mouse/touch out event handler to the legend item.\r\n\t\t\t * @example\r\n\t\t\t * legend: {\r\n\t\t\t * show: true,\r\n\t\t\t * hide: true,\r\n\t\t\t * //or hide: \"data1\"\r\n * //or hide: [\"data1\", \"data2\"]\r\n * position: \"bottom\", // bottom, right, inset\r\n\t\t\t * inset: {\r\n\t\t\t * anchor: \"top-right\" // top-left, top-right, bottom-left, bottom-right\r\n\t\t\t * x: 20,\r\n\t\t\t * y: 10,\r\n\t\t\t * step: 2\r\n\t\t\t * },\r\n\t\t\t * onclick: function(id) { ... },\r\n\t\t\t * onover: function(id) { ... },\r\n\t\t\t * onout: function(id) { ... }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\tlegend_show: true,\r\n\t\t\tlegend_hide: false,\r\n\t\t\tlegend_position: \"bottom\",\r\n\t\t\tlegend_inset_anchor: \"top-left\",\r\n\t\t\tlegend_inset_x: 10,\r\n\t\t\tlegend_inset_y: 0,\r\n\t\t\tlegend_inset_step: undefined,\r\n\t\t\tlegend_item_onclick: undefined,\r\n\t\t\tlegend_item_onover: undefined,\r\n\t\t\tlegend_item_onout: undefined,\r\n\t\t\tlegend_equally: false,\r\n\t\t\tlegend_padding: 0,\r\n\t\t\tlegend_item_tile_width: 10,\r\n\t\t\tlegend_item_tile_height: 10,\r\n\r\n\t\t\t/**\r\n\t\t\t * Switch x and y axis position.\r\n\t\t\t * @name axis:rotated\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Boolean}\r\n\t\t\t * @default false\r\n\t\t\t * @example\r\n\t\t\t * axis: {\r\n\t\t\t * rotated: true\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\taxis_rotated: false,\r\n\r\n\t\t\t/**\r\n\t\t\t * Show or hide x axis.\r\n\t\t\t * @name axis:x:show\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Boolean}\r\n\t\t\t * @default true\r\n\t\t\t * @example\r\n\t\t\t * axis: {\r\n\t\t\t * x: {\r\n\t\t\t * show: false\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\taxis_x_show: true,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set type of x axis.

\r\n\t\t\t * Available Values:\r\n\t\t\t * -timeseries\r\n\t\t\t * -category\r\n\t\t\t * -indexed\r\n\t\t\t * @name axis:x:type\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {String}\r\n\t\t\t * @default indexed\r\n\t\t\t * @example\r\n\t\t\t * axis: {\r\n\t\t\t * x: {\r\n\t\t\t * type: \"timeseries\"\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\taxis_x_type: \"indexed\",\r\n\r\n\t\t\t/**\r\n\t\t\t * Set how to treat the timezone of x values.
\r\n\t\t\t * If true, treat x value as localtime. If false, convert to UTC internally.\r\n\t\t\t * @name axis:x:localtime\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Boolean}\r\n\t\t\t * @default true\r\n\t\t\t * @example\r\n\t\t\t * axis: {\r\n\t\t\t * x: {\r\n\t\t\t * localtime: false\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\taxis_x_localtime: true,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set category names on category axis.\r\n\t\t\t * This must be an array that includes category names in string. If category names are included in the date by data.x option, this is not required.\r\n\t\t\t * @name axis:x:categories\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Array}\r\n\t\t\t * @default []\r\n\t\t\t * @example\r\n\t\t\t * axis: {\r\n\t\t\t * x: {\r\n\t\t\t * categories: [\"Category 1\", \"Category 2\", ...]\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\taxis_x_categories: [],\r\n\r\n\t\t\t/**\r\n\t\t\t * Centerise ticks on category axis.\r\n\t\t\t * @name axis:x:tick:centered\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Array}\r\n\t\t\t * @default false\r\n\t\t\t * @example\r\n\t\t\t * axis: {\r\n\t\t\t * x: {\r\n\t\t\t * tick: {\r\n\t\t\t * centered: true\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\taxis_x_tick_centered: false,\r\n\r\n\t\t\t/**\r\n\t\t\t * A function to format tick value. Format string is also available for timeseries data.\r\n\t\t\t * @name axis:x:tick:format\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Function}\r\n\t\t\t * @default undefined\r\n\t\t\t * @example\r\n\t\t\t * axis: {\r\n\t\t\t * x: {\r\n\t\t\t * tick: {\r\n\t\t\t * format: function(x) {\r\n\t\t\t * return x.getFullYear();\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\taxis_x_tick_format: undefined,\r\n\r\n\t\t\t/**\r\n\t\t\t * Setting for culling ticks.

\r\n\t\t\t * If true is set, the ticks will be culled, then only limitted tick text will be shown. This option does not hide the tick lines. If false is set, all of ticks will be shown.

\r\n\t\t\t * We can change the number of ticks to be shown by axis.x.tick.culling.max.\r\n\t\t\t * @name axis:x:tick:culling\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Function}\r\n\t\t\t * @default\r\n\t\t\t * - true for indexed axis and timeseries axis\r\n\t\t\t * - false for category axis\r\n\t\t\t * @example\r\n\t\t\t * axis: {\r\n\t\t\t * x: {\r\n\t\t\t * tick: {\r\n\t\t\t * culling: false\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\taxis_x_tick_culling: {},\r\n\r\n\t\t\t/**\r\n\t\t\t * The number of tick texts will be adjusted to less than this value.\r\n\t\t\t * @name axis:x:tick:culling:max\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Number}\r\n\t\t\t * @default 10\r\n\t\t\t * @example\r\n\t\t\t * axis: {\r\n\t\t\t * x: {\r\n\t\t\t * tick: {\r\n\t\t\t * culling: {\r\n\t\t\t * max: 5\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\taxis_x_tick_culling_max: 10,\r\n\r\n\t\t\t/**\r\n\t\t\t * The number of x axis ticks to show.

\r\n\t\t\t * This option hides tick lines together with tick text. If this option is used on timeseries axis, the ticks position will be determined precisely and not nicely positioned (e.g. it will have rough second value).\r\n\t\t\t * @name axis:x:tick:count\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Number}\r\n\t\t\t * @default undefined\r\n\t\t\t * @example\r\n\t\t\t * axis: {\r\n\t\t\t * x: {\r\n\t\t\t * tick: {\r\n\t\t\t * count: 5\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\taxis_x_tick_count: undefined,\r\n\r\n\t\t\t/**\r\n\t\t\t * Fit x axis ticks.

\r\n\t\t\t * If true set, the ticks will be positioned nicely. If false set, the ticks will be positioned according to x value of the data points.\r\n\t\t\t * @name axis:x:tick:fit\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Boolean}\r\n\t\t\t * @default true\r\n\t\t\t * @example\r\n\t\t\t * axis: {\r\n\t\t\t * x: {\r\n\t\t\t * tick: {\r\n\t\t\t * fit: false\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\taxis_x_tick_fit: true,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set the x values of ticks manually.

\r\n\t\t\t * If this option is provided, the position of the ticks will be determined based on those values. This option works with timeseries data and the x values will be parsed accoding to the type of the value and data.xFormat option.\r\n\t\t\t * @name axis:x:tick:values\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Array}\r\n\t\t\t * @default null\r\n\t\t\t * @example\r\n\t\t\t * axis: {\r\n\t\t\t * x: {\r\n\t\t\t * tick: {\r\n\t\t\t * values: [1, 2, 4, 8, 16, 32, ...]\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\taxis_x_tick_values: null,\r\n\r\n\t\t\t/**\r\n\t\t\t * Rotate x axis tick text.
\r\n\t\t\t * If you set negative value, it will rotate to opposite direction.\r\n\t\t\t * @name axis:x:tick:rotate\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Number}\r\n\t\t\t * @default 0\r\n\t\t\t * @example\r\n\t\t\t * axis: {\r\n\t\t\t * x: {\r\n\t\t\t * tick: {\r\n\t\t\t * rotate: 60\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\taxis_x_tick_rotate: 0,\r\n\r\n\t\t\t/**\r\n\t\t\t * Show x axis outer tick.\r\n\t\t\t * @name axis:x:tick:outer\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Boolean}\r\n\t\t\t * @default true\r\n\t\t\t * @example\r\n\t\t\t * axis: {\r\n\t\t\t * x: {\r\n\t\t\t * tick: {\r\n\t\t\t * outer: false\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\taxis_x_tick_outer: true,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set tick text to be multiline\r\n\t\t\t * @name axis:x:tick:multiline\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Boolean}\r\n\t\t\t * @default true\r\n\t\t\t * @example\r\n\t\t\t * axis: {\r\n\t\t\t * x: {\r\n\t\t\t * tick: {\r\n\t\t\t * multiline: false\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\taxis_x_tick_multiline: true,\r\n\r\n\r\n\t\t\t/**\r\n\t\t\t * Set tick width\r\n\t\t\t * @name axis:x:tick:width\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Number}\r\n\t\t\t * @default null\r\n\t\t\t * @example\r\n\t\t\t * axis: {\r\n\t\t\t * x: {\r\n\t\t\t * tick: {\r\n\t\t\t * width: 50\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\taxis_x_tick_width: null,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set max value of x axis range.\r\n\t\t\t * @name axis:x:max\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Number}\r\n\t\t\t * @default undefined\r\n\t\t\t * @example\r\n\t\t\t * axis: {\r\n\t\t\t * x: {\r\n\t\t\t * max: 100\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\taxis_x_max: undefined,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set min value of x axis range.\r\n\t\t\t * @name axis:x:min\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Number}\r\n\t\t\t * @default undefined\r\n\t\t\t * @example\r\n\t\t\t * axis: {\r\n\t\t\t * x: {\r\n\t\t\t * min: -100\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\taxis_x_min: undefined,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set padding for x axis.

\r\n\t\t\t * If this option is set, the range of x axis will increase/decrease according to the values. If no padding is needed in the ragen of x axis, 0 should be set. On category axis, this option will be ignored.\r\n\t\t\t * @name axis:x:padding\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Object}\r\n\t\t\t * @default {}\r\n\t\t\t * @example\r\n\t\t\t * axis: {\r\n\t\t\t * x: {\r\n\t\t\t * padding: {\r\n\t\t\t * left: 0,\r\n\t\t\t * right: 0\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\taxis_x_padding: {},\r\n\r\n\t\t\t/**\r\n\t\t\t * Set height of x axis.

\r\n\t\t\t * The height of x axis can be set manually by this option. If you need more space for x axis, please use this option for that. The unit is pixel.\r\n\t\t\t * @name axis:x:height\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Number}\r\n\t\t\t * @default undefined\r\n\t\t\t * @example\r\n\t\t\t * axis: {\r\n\t\t\t * x: {\r\n\t\t\t * height: 20\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\taxis_x_height: undefined,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set default extent for subchart and zoom. This can be an array or function that returns an array.\r\n\t\t\t * @name axis:x:extent\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Array}\r\n\t\t\t * @default undefined\r\n\t\t\t * @example\r\n\t\t\t * axis: {\r\n\t\t\t * x: {\r\n\t\t\t * // [[x0, y0], [x1, y1]], where [x0, y0] is the top-left corner and [x1, y1] is the bottom-right corner\r\n\t\t\t * // https://github.com/d3/d3-brush/blob/master/src/brush.js#L521\r\n\t\t\t * extent: [[0, 0], [200, 60]]\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\taxis_x_extent: undefined,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set label on x axis.

\r\n\t\t\t * You can set x axis label and change its position by this option. string and object can be passed and we can change the poisiton by passing object that has position key. Available position differs according to the axis direction (vertical or horizontal). If string set, the position will be the default.\r\n\t\t\t * - If it's horizontal axis:\r\n\t\t\t * - inner-right [default]\r\n\t\t\t * - inner-center\r\n\t\t\t * - inner-left\r\n\t\t\t * - outer-right\r\n\t\t\t * - outer-center\r\n\t\t\t * - outer-left\r\n\t\t\t * - If it's vertical axis:\r\n\t\t\t * - inner-top [default]\r\n\t\t\t * - inner-middle\r\n\t\t\t * - inner-bottom\r\n\t\t\t * - outer-top\r\n\t\t\t * - outer-middle\r\n\t\t\t * - outer-bottom\r\n\t\t\t * @name axis:x:label\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {String|Object}\r\n\t\t\t * @default undefined\r\n\t\t\t * @example\r\n\t\t\t * axis: {\r\n\t\t\t * x: {\r\n\t\t\t * label: \"Your X Axis\"\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t *\r\n\t\t\t * axis: {\r\n\t\t\t * x: {\r\n\t\t\t * label: {\r\n\t\t\t * text: \"Your X Axis\",\r\n\t\t\t * position: \"outer-center\"\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\taxis_x_label: {},\r\n\r\n\t\t\t/**\r\n\t\t\t * Show or hide y axis.\r\n\t\t\t * @name axis:y:show\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Boolean}\r\n\t\t\t * @default true\r\n\t\t\t * @example\r\n\t\t\t * axis: {\r\n\t\t\t * y: {\r\n\t\t\t * show: false\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\taxis_y_show: true,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set type of y axis.\r\n\t\t\t * Available Values:\r\n\t\t\t * -timeseries\r\n\t\t\t * -category\r\n\t\t\t * -indexed\r\n\t\t\t * @name axis:y:type\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {String}\r\n\t\t\t * @default undefined\r\n\t\t\t * @example\r\n\t\t\t * axis: {\r\n\t\t\t * y: {\r\n\t\t\t * type: \"timeseries\"\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\taxis_y_type: undefined,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set max value of y axis.\r\n\t\t\t * Note: Padding will be added based on this value, so if you don't need the padding, please set axis.y.padding to disable it (e.g. axis.y.padding = 0).\r\n\t\t\t * @name axis:y:max\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Number}\r\n\t\t\t * @default undefined\r\n\t\t\t * @example\r\n\t\t\t * axis: {\r\n\t\t\t * y: {\r\n\t\t\t * max: 1000\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\taxis_y_max: undefined,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set min value of y axis.\r\n\t\t\t * Note: Padding will be added based on this value, so if you don't need the padding, please set axis.y.padding to disable it (e.g. axis.y.padding = 0).\r\n\t\t\t * @name axis:y:min\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Number}\r\n\t\t\t * @default undefined\r\n\t\t\t * @example\r\n\t\t\t * axis: {\r\n\t\t\t * y: {\r\n\t\t\t * min: 1000\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\taxis_y_min: undefined,\r\n\r\n\t\t\t/**\r\n\t\t\t * Change the direction of y axis.

\r\n\t\t\t * If true set, the direction will be from the top to the bottom.\r\n\t\t\t * @name axis:y:inverted\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Boolean}\r\n\t\t\t * @default false\r\n\t\t\t * @example\r\n\t\t\t * axis: {\r\n\t\t\t * y: {\r\n\t\t\t * inverted: true\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\taxis_y_inverted: false,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set center value of y axis.\r\n\t\t\t * @name axis:y:center\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Number}\r\n\t\t\t * @default undefined\r\n\t\t\t * @example\r\n\t\t\t * axis: {\r\n\t\t\t * y: {\r\n\t\t\t * center: 0\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\taxis_y_center: undefined,\r\n\r\n\t\t\t/**\r\n\t\t\t * Show y axis inside of the chart.\r\n\t\t\t * @name axis:y:inner\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Boolean}\r\n\t\t\t * @default false\r\n\t\t\t * @example\r\n\t\t\t * axis: {\r\n\t\t\t * y: {\r\n\t\t\t * inner: true\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\taxis_y_inner: false,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set label on y axis.

\r\n\t\t\t * You can set y axis label and change its position by this option. This option works in the same way as axis.x.label.\r\n\t\t\t * @name axis:y:label\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {String|Object}\r\n\t\t\t * @default {}\r\n\t\t\t * @example\r\n\t\t\t * axis: {\r\n\t\t\t * y: {\r\n\t\t\t * label: \"Your Y Axis\"\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t *\r\n\t\t\t * axis: {\r\n\t\t\t * y: {\r\n\t\t\t * label: {\r\n\t\t\t * text: \"Your Y Axis\",\r\n\t\t\t * position: \"outer-middle\"\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\taxis_y_label: {},\r\n\r\n\t\t\t/**\r\n\t\t\t * Set formatter for y axis tick text.

\r\n\t\t\t * This option accepts d3.format object as well as a function you define.\r\n\t\t\t * @name axis:y:format\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Function}\r\n\t\t\t * @default undefined\r\n\t\t\t * @example\r\n\t\t\t * axis: {\r\n\t\t\t * x: {\r\n\t\t\t * tick: {\r\n\t\t\t * format: function(x) {\r\n\t\t\t * return x.getFullYear();\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\taxis_y_tick_format: undefined,\r\n\r\n\t\t\t/**\r\n\t\t\t * Show y axis outer tick.\r\n\t\t\t * @name axis:y:tick:outer\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Boolean}\r\n\t\t\t * @default true\r\n\t\t\t * @example\r\n\t\t\t * axis: {\r\n\t\t\t * y: {\r\n\t\t\t * tick: {\r\n\t\t\t * outer: false\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\taxis_y_tick_outer: true,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set y axis tick values manually.\r\n\t\t\t * @name axis:y:tick:values\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Array}\r\n\t\t\t * @default null\r\n\t\t\t * @example\r\n\t\t\t * axis: {\r\n\t\t\t * y: {\r\n\t\t\t * tick: {\r\n\t\t\t * values: [100, 1000, 10000]\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\taxis_y_tick_values: null,\r\n\t\t\taxis_y_tick_rotate: 0,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set the number of y axis ticks.

\r\n\t\t\t * Note: The position of the ticks will be calculated precisely, so the values on the ticks will not be rounded nicely. In the case, axis.y.tick.format or axis.y.tick.values will be helpful.\r\n\t\t\t * @name axis:y:tick:count\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Number}\r\n\t\t\t * @default undefined\r\n\t\t\t * @example\r\n\t\t\t * axis: {\r\n\t\t\t * y: {\r\n\t\t\t * tick: {\r\n\t\t\t * count: 5\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\taxis_y_tick_count: undefined,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set the number of y axis ticks.

\r\n\t\t\t * Note: The position of the ticks will be calculated precisely, so the values on the ticks will not be rounded nicely. In the case, axis.y.tick.format or axis.y.tick.values will be helpful.\r\n\t\t\t * @name axis:y:tick:time\r\n\t\t\t * @memberof Options\r\n\t\t\t * @private\r\n\t\t\t * @type {Object}\r\n\t\t\t * @property {Function} [time.value] D3's time interval function (https://github.com/d3/d3-time#intervals)\r\n\t\t\t * @example\r\n\t\t\t * axis: {\r\n\t\t\t * y: {\r\n\t\t\t * tick: {\r\n\t\t\t * time: {\r\n\t\t\t * // ticks at 15-minute intervals\r\n\t\t\t * // https://github.com/d3/d3-scale/blob/master/README.md#time_ticks\r\n\t\t\t * value: d3.timeMinute.every(15)\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\t// @TODO: not fully implemented yet\r\n\t\t\taxis_y_tick_time_value: undefined,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set padding for y axis.

\r\n\t\t\t * You can set padding for y axis to create more space on the edge of the axis. This option accepts object and it can include top and bottom. top, bottom will be treated as pixels.\r\n\t\t\t * @name axis:y:padding\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Object}\r\n\t\t\t * @default {}\r\n\t\t\t * @example\r\n\t\t\t * axis: {\r\n\t\t\t * y: {\r\n\t\t\t * padding: {\r\n\t\t\t * top: 0,\r\n\t\t\t * bottom: 0\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\taxis_y_padding: {},\r\n\r\n\t\t\t/**\r\n\t\t\t * Set default range of y axis.

\r\n\t\t\t * This option set the default value for y axis when there is no data on init.\r\n\t\t\t * @name axis:y:default\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Array}\r\n\t\t\t * @default undefined\r\n\t\t\t * @example\r\n\t\t\t * axis: {\r\n\t\t\t * y: {\r\n\t\t\t * default: [0, 1000]\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\taxis_y_default: undefined,\r\n\r\n\t\t\t/**\r\n\t\t\t * Show or hide y2 axis.\r\n\t\t\t * @name axis:y2:show\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Array}\r\n\t\t\t * @default false\r\n\t\t\t * @example\r\n\t\t\t * axis: {\r\n\t\t\t * y2: {\r\n\t\t\t * show: true\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\taxis_y2_show: false,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set max value of y2 axis.\r\n\t\t\t * @name axis:y2:max\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Number}\r\n\t\t\t * @default undefined\r\n\t\t\t * @example\r\n\t\t\t * axis: {\r\n\t\t\t * y2: {\r\n\t\t\t * max: 1000\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\taxis_y2_max: undefined,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set min value of y2 axis.\r\n\t\t\t * @name axis:y2:min\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Number}\r\n\t\t\t * @default undefined\r\n\t\t\t * @example\r\n\t\t\t * axis: {\r\n\t\t\t * y2: {\r\n\t\t\t * min: -1000\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\taxis_y2_min: undefined,\r\n\r\n\t\t\t/**\r\n\t\t\t * Change the direction of y2 axis.

\r\n\t\t\t * If true set, the direction will be from the top to the bottom.\r\n\t\t\t * @name axis:y2:inverted\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Boolean}\r\n\t\t\t * @default false\r\n\t\t\t * @example\r\n\t\t\t * axis: {\r\n\t\t\t * y2: {\r\n\t\t\t * inverted: true\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\taxis_y2_inverted: false,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set center value of y2 axis.\r\n\t\t\t * @name axis:y2:center\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Number}\r\n\t\t\t * @default undefined\r\n\t\t\t * @example\r\n\t\t\t * axis: {\r\n\t\t\t * y2: {\r\n\t\t\t * center: 0\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\taxis_y2_center: undefined,\r\n\r\n\t\t\t/**\r\n\t\t\t * Show y2 axis inside of the chart.\r\n\t\t\t * @name axis:y2:inner\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Boolean}\r\n\t\t\t * @default false\r\n\t\t\t * @example\r\n\t\t\t * axis: {\r\n\t\t\t * y2: {\r\n\t\t\t * inner: true\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\taxis_y2_inner: false,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set label on y2 axis.

\r\n\t\t\t * You can set y2 axis label and change its position by this option. This option works in the same way as axis.x.label.\r\n\t\t\t * @name axis:y2:label\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {String|Object}\r\n\t\t\t * @default {}\r\n\t\t\t * @example\r\n\t\t\t * axis: {\r\n\t\t\t * y2: {\r\n\t\t\t * label: \"Your Y2 Axis\"\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t *\r\n\t\t\t * axis: {\r\n\t\t\t * y2: {\r\n\t\t\t * label: {\r\n\t\t\t * text: \"Your Y2 Axis\",\r\n\t\t\t * position: \"outer-middle\"\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\taxis_y2_label: {},\r\n\r\n\t\t\t/**\r\n\t\t\t * Set formatter for y2 axis tick text.

\r\n\t\t\t * This option works in the same way as axis.y.format.\r\n\t\t\t * @name axis:y2:tick:format\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Function}\r\n\t\t\t * @default undefined\r\n\t\t\t * @example\r\n\t\t\t * axis: {\r\n\t\t\t * y2: {\r\n\t\t\t * tick: {\r\n\t\t\t * format: d3.format(\"$,\")\r\n\t\t\t * //or format: function(d) { return \"$\" + d; }\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\taxis_y2_tick_format: undefined,\r\n\r\n\t\t\t/**\r\n\t\t\t * Show or hide y2 axis outer tick.\r\n\t\t\t * @name axis:y2:tick:outer\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Boolean}\r\n\t\t\t * @default true\r\n\t\t\t * @example\r\n\t\t\t * axis: {\r\n\t\t\t * y2: {\r\n\t\t\t * tick: {\r\n\t\t\t * outer: false\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\taxis_y2_tick_outer: true,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set y2 axis tick values manually.\r\n\t\t\t * @name axis:y2:tick:values\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Array}\r\n\t\t\t * @default null\r\n\t\t\t * @example\r\n\t\t\t * axis: {\r\n\t\t\t * y2: {\r\n\t\t\t * tick: {\r\n\t\t\t * values: [100, 1000, 10000]\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\taxis_y2_tick_values: null,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set the number of y2 axis ticks.\r\n\t\t\t * Note: This works in the same way as axis.y.tick.count.\r\n\t\t\t * @name axis:y2:tick:count\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Number}\r\n\t\t\t * @default undefined\r\n\t\t\t * @example\r\n\t\t\t * axis: {\r\n\t\t\t * y2: {\r\n\t\t\t * tick: {\r\n\t\t\t * count: 5\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\taxis_y2_tick_count: undefined,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set the number of y2 axis ticks.\r\n\t\t\t * Note: This works in the same way as axis.y.tick.count.\r\n\t\t\t * @name axis:y2:padding\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Number}\r\n\t\t\t * @default {}\r\n\t\t\t * @example\r\n\t\t\t * axis: {\r\n\t\t\t * y2: {\r\n\t\t\t * padding: {\r\n\t\t\t * top: 100,\r\n\t\t\t * bottom: 100\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\taxis_y2_padding: {},\r\n\r\n\t\t\t/**\r\n\t\t\t * Set default range of y2 axis.

\r\n\t\t\t * This option set the default value for y2 axis when there is no data on init.\r\n\t\t\t * @name axis:y2:default\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Array}\r\n\t\t\t * @default undefined\r\n\t\t\t * @example\r\n\t\t\t * axis: {\r\n\t\t\t * y2: {\r\n\t\t\t * default: [0, 1000]\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\taxis_y2_default: undefined,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set related options\r\n\t\t\t * @name grid\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Object}\r\n\t\t\t * @property {Boolean} [x.show=false] Show grids along x axis.\r\n\t\t\t * @property {Boolean} [x.lines=[]] Show additional grid lines along x axis.
\r\n\t\t\t * This option accepts array including object that has value, text, position and class. text, position and class are optional. For position, start, middle and end (default) are available.\r\n\t\t\t * If x axis is category axis, value can be category name. If x axis is timeseries axis, value can be date string, Date object and unixtime integer.\r\n\t\t\t * @property {Boolean} [y.show=false] Show grids along x axis.\r\n\t\t\t * @property {Boolean} [y.lines=[]] Show additional grid lines along y axis.
\r\n\t\t\t * This option accepts array including object that has value, text, position and class.\r\n\t\t\t * @property {Boolean} [y.ticks=10]\r\n\t\t\t * @property {Boolean} [focus.show=true] Show grids when focus.\r\n\t\t\t * @property {Boolean} [lines.front=true]\r\n\t\t\t * @default undefined\r\n\t\t\t * @example\r\n\t\t\t * grid: {\r\n\t\t\t * x: {\r\n\t\t\t * show: true,\r\n\t\t\t * lines: [\r\n\t\t\t * {value: 2, text: \"Label on 2\"},\r\n\t\t\t * {value: 5, text: \"Label on 5\", class: \"label-5\"}\r\n\t\t\t * {value: 6, text: \"Label on 6\", position: \"start\"}\r\n\t\t\t * ]\r\n\t\t\t * },\r\n\t\t\t * \t y: {\r\n\t\t\t * show: true,\r\n\t\t\t * lines: [\r\n\t\t\t * {value: 100, text: \"Label on 100\"},\r\n\t\t\t * {value: 200, text: \"Label on 200\", class: \"label-200\"}\r\n\t\t\t * {value: 300, text: \"Label on 300\", position: 'middle'}\r\n\t\t\t * ],\r\n\t\t\t * ticks: 5\r\n\t\t\t * },\r\n\t\t\t * focus: {\r\n\t\t\t * show: false\r\n\t\t\t * },\r\n\t\t\t * lines: {\r\n\t\t\t * front: false\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\tgrid_x_show: false,\r\n\t\t\tgrid_x_type: \"tick\",\r\n\t\t\tgrid_x_lines: [],\r\n\t\t\tgrid_y_show: false,\r\n\t\t\tgrid_y_lines: [],\r\n\t\t\tgrid_y_ticks: 10,\r\n\t\t\tgrid_focus_show: true,\r\n\t\t\tgrid_lines_front: true,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set point options\r\n\t\t\t * @name point\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Object}\r\n\t\t\t * @property {Boolean} [point.show=true] Whether to show each point in line.\r\n\t\t\t * @property {Number} [point.r=2.5] The radius size of each point.\r\n\t\t\t * @property {Boolean} [point.focus.expand.enabled=true] Whether to expand each point on focus.\r\n\t\t\t * @property {Boolean} [point.focus.expand.r=point.r*1.75] The radius size of each point on focus.\r\n\t\t\t * @property {Number} [point.select.r=point.r*4] The radius size of each point on selected.\r\n\t\t\t * @example\r\n\t\t\t * point: {\r\n\t\t\t * show: false,\r\n\t\t\t * r: 5,\r\n\t\t\t * focus: {\r\n\t\t\t * expand: {\r\n\t\t\t * enabled: true,\r\n\t\t\t * r: 1\r\n\t\t\t * }\r\n\t\t\t * },\r\n\t\t\t * select: {\r\n\t\t\t * r: 3\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\tpoint_show: true,\r\n\t\t\tpoint_r: 2.5,\r\n\t\t\tpoint_sensitivity: 10,\r\n\t\t\tpoint_focus_expand_enabled: true,\r\n\t\t\tpoint_focus_expand_r: undefined,\r\n\t\t\tpoint_select_r: undefined,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set line options\r\n\t\t\t * @name line\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Object}\r\n\t\t\t * @property {Boolean} [line.connectNull=false] Set if null data point will be connected or not.
\r\n\t\t\t * If true set, the region of null data will be connected without any data point. If false set, the region of null data will not be connected and get empty.\r\n\t\t\t * @property {Boolean} [line.step_type=step] Change step type for step chart.
\r\n\t\t\t * Available values:\r\n\t\t\t * - step\r\n\t\t\t * - step-before\r\n\t\t\t * - step-after\r\n\t\t\t * @example\r\n\t\t\t * line: {\r\n\t\t\t * connectNull: true,\r\n\t\t\t * step: {\r\n\t\t\t * type: \"step-after\"\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\tline_connectNull: false,\r\n\t\t\tline_step_type: \"step\",\r\n\r\n\t\t\t/**\r\n\t\t\t * Set bar options\r\n\t\t\t * @name bar\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Object}\r\n\t\t\t * @property {Number} [bar.width] Change the width of bar chart.\r\n\t\t\t * @property {Number} [bar.width.ratio=0.6] Change the width of bar chart by ratio.\r\n\t\t\t * @property {Number} [bar.width.max]\r\n\t\t\t * @property {Boolean} [bar.zerobased=true] Set if min or max value will be 0 on bar chart.\r\n\t\t\t * @example\r\n\t\t\t * bar: {\r\n\t\t\t * width: 10,\r\n\t\t\t * // or\r\n\t\t\t * width: {\r\n\t\t\t * ratio: 0.2,\r\n\t\t\t * max: 200\r\n\t\t\t * },\r\n\t\t\t * zerobased: false\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\tbar_width: undefined,\r\n\t\t\tbar_width_ratio: 0.6,\r\n\t\t\tbar_width_max: undefined,\r\n\t\t\tbar_zerobased: true,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set area options\r\n\t\t\t * @name area\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Object}\r\n\t\t\t * @property {Boolean} [area.zerobased=true] Set if min or max value will be 0 on area chart.\r\n\t\t\t * @property {Boolean} [area.above=false]\r\n\t\t\t * @example\r\n\t\t\t * area: {\r\n\t\t\t * zerobased: false,\r\n\t\t\t * above: true\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\tarea_zerobased: true,\r\n\t\t\tarea_above: false,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set pie options\r\n\t\t\t * @name pie\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Object}\r\n\t\t\t * @property {Boolean} [pie.label.show=true] Show or hide label on each pie piece.\r\n\t\t\t * @property {Function} [pie.label.format] Set formatter for the label on each pie piece.\r\n\t\t\t * @property {Number} [pie.label.threshold=0.05] Set threshold to show/hide labels.\r\n\t\t\t * @property {Boolean} [pie.expand=true] Enable or disable expanding pie pieces.\r\n\t\t\t * @property {Number} [pie.padAngle=0] Set padding between data.\r\n\t\t\t * @example\r\n\t\t\t * pie: {\r\n\t\t\t * label: {\r\n\t\t\t * show: false,\r\n\t\t\t * format: function(value, ratio, id) {\r\n\t\t\t * return d3.format(\"$\")(value);\r\n\t\t\t * },\r\n\t\t\t * threshold: 0.1\r\n\t\t\t * },\r\n\t\t\t * expand: false,\r\n\t\t\t * padAngle: 0.1\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\tpie_label_show: true,\r\n\t\t\tpie_label_format: undefined,\r\n\t\t\tpie_label_threshold: 0.05,\r\n\t\t\tpie_label_ratio: undefined,\r\n\t\t\tpie_expand: {},\r\n\t\t\tpie_expand_duration: 50,\r\n\t\t\tpie_padAngle: 0,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set gauge options\r\n\t\t\t * @name gauge\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Object}\r\n\t\t\t * @property {Boolean} [gauge.fullCircle=false]\r\n\t\t\t * @property {Boolean} [gauge.label.show=true] Show or hide label on gauge.\r\n\t\t\t * @property {Function} [gauge.label.format] Set formatter for the label on gauge.\r\n\t\t\t * @property {Boolean} [gauge.expand=true] Enable or disable expanding gauge.\r\n\t\t\t * @property {Number} [gauge.expand.duration=50]\r\n\t\t\t * @property {Number} [gauge.min=0] Set min value of the gauge.\r\n\t\t\t * @property {Number} [gauge.max=100] Set max value of the gauge.\r\n\t\t\t * @property {Number} [gauge.startingAngle=-1 * Math.PI / 2]\r\n\t\t\t * @property {String} [gauge.units] Set units of the gauge.\r\n\t\t\t * @property {Number} [gauge.width] Set width of gauge chart.\r\n\t\t\t * @example\r\n\t\t\t * gauge: {\r\n\t\t\t * label: {\r\n\t\t\t * show: false,\r\n\t\t\t * format: function(value, ratio) {\r\n\t\t\t * return value;\r\n\t\t\t * }\r\n\t\t\t * },\r\n\t\t\t * expand: false,\r\n\t\t\t * min: -100,\r\n\t\t\t * max: 200,\r\n\t\t\t * units: \"%\",\r\n\t\t\t * width: 10\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\tgauge_fullCircle: false,\r\n\t\t\tgauge_label_show: true,\r\n\t\t\tgauge_label_format: undefined,\r\n\t\t\tgauge_min: 0,\r\n\t\t\tgauge_max: 100,\r\n\t\t\tgauge_startingAngle: -1 * Math.PI / 2,\r\n\t\t\tgauge_label_extents: undefined,\r\n\t\t\tgauge_units: undefined,\r\n\t\t\tgauge_width: undefined,\r\n\t\t\tgauge_expand: {},\r\n\t\t\tgauge_expand_duration: 50,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set donut options\r\n\t\t\t * @name donut\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Object}\r\n\t\t\t * @property {Boolean} [donut.label.show=true] Show or hide label on each donut piece.\r\n\t\t\t * @property {Function} [donut.label.format] Set formatter for the label on each donut piece.\r\n\t\t\t * @property {Number} [donut.label.threshold=0.05] Set threshold to show/hide labels.\r\n\t\t\t * @property {Boolean} [donut.expand=true] Enable or disable expanding donut pieces.\r\n\t\t\t * @property {Number} [donut.width] Set width of donut chart.\r\n\t\t\t * @property {String} [donut.title=\"\"] Set title of donut chart.\r\n\t\t\t * @property {Number} [donut.padAngle=0] Set padding between data.\r\n\t\t\t * @example\r\n\t\t\t * donut: {\r\n\t\t\t * label: {\r\n\t\t\t * show: false,\r\n\t\t\t * format: function(value, ratio, id) {\r\n\t\t\t * return d3.format(\"$\")(value);\r\n\t\t\t * },\r\n\t\t\t * threshold: 0.1\r\n\t\t\t * },\r\n\t\t\t * expand: false,\r\n\t\t\t * width: 10,\r\n\t\t\t * title: \"Donut Title\",\r\n\t\t\t * padAngle: 0.2\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\tdonut_label_show: true,\r\n\t\t\tdonut_label_format: undefined,\r\n\t\t\tdonut_label_threshold: 0.05,\r\n\t\t\tdonut_label_ratio: undefined,\r\n\t\t\tdonut_width: undefined,\r\n\t\t\tdonut_title: \"\",\r\n\t\t\tdonut_expand: {},\r\n\t\t\tdonut_expand_duration: 50,\r\n\t\t\tdonut_padAngle: 0,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set spline options\r\n\t\t\t * @name spline\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Object}\r\n\t\t\t * @property {String} [spline.interpolation.type=cardinal]\r\n\t\t\t * @example\r\n\t\t\t * spline: {\r\n\t\t\t * interpolation: {\r\n\t\t\t * type: \"cardinal\"\r\n\t\t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\tspline_interpolation_type: \"cardinal\",\r\n\r\n\t\t\t/**\r\n\t\t\t * Show rectangles inside the chart.

\r\n\t\t\t * This option accepts array including object that has axis, start, end and class. The keys start, end and class are optional.\r\n\t\t\t * axis must be x, y or y2. start and end should be the value where regions start and end. If not specified, the edge values will be used. If timeseries x axis, date string, Date object and unixtime integer can be used. If class is set, the region element will have it as class.\r\n\t\t\t * @name regions\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Array}\r\n\t\t\t * @default []\r\n\t\t\t * @example\r\n\t\t\t * regions: [\r\n\t\t\t *\t {\r\n\t\t\t *\t axis: \"x\",\r\n\t\t\t *\t start: 1,\r\n\t\t\t *\t end: 4,\r\n\t\t\t *\t class: \"region-1-4\"\r\n\t\t\t *\t }\r\n\t\t\t * ]\r\n\t\t\t */\r\n\t\t\tregions: [],\r\n\r\n\t\t\t/**\r\n\t\t\t * Tooltip options\r\n\t\t\t * @name tooltip\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Object}\r\n\t\t\t * @property {Boolean} [tooltip.show=true] Show or hide tooltip.
\r\n\t\t\t * @property {Boolean} [tooltip.grouped=true] Set if tooltip is grouped or not for the data points.\r\n\t\t\t * @property {Function} [tooltip.format.title] Set format for the title of tooltip.
\r\n\t\t\t * Specified function receives x of the data point to show.\r\n\t\t\t * @property {Function} [tooltip.format.name] Set format for the name of each data in tooltip.
\r\n\t\t\t * Specified function receives name, ratio, id and index of the data point to show. ratio will be undefined if the chart is not donut/pie/gauge.\r\n\t\t\t * @property {Function} [tooltip.format.value] Set format for the value of each data in tooltip.
\r\n\t\t\t * Specified function receives name, ratio, id and index of the data point to show. ratio will be undefined if the chart is not donut/pie/gauge.\r\n\t\t\t * If undefined returned, the row of that value will be skipped.\r\n\t\t\t * @property {function} [tooltip.position] Set custom position for the tooltip.
\r\n\t\t\t * This option can be used to modify the tooltip position by returning object that has top and left.\r\n\t\t\t * @property {function} [tooltip.contents] Set custom HTML for the tooltip.
\r\n\t\t\t * Specified function receives data, defaultTitleFormat, defaultValueFormat and color of the data point to show. If tooltip.grouped is true, data includes multiple data points.\r\n\t\t\t * @example\r\n\t\t\t * tooltip: {\r\n\t\t\t * show: true,\r\n\t\t\t * grouped: false,\r\n\t\t\t * format: {\r\n\t\t\t * title: function(x) { return \"Data \" + x; },\r\n\t\t\t * name: function(name, ratio, id, index) { return name; },\r\n\t\t\t * value: function(value, ratio, id, index) { return ratio; }\r\n\t\t\t * },\r\n\t\t\t * position: function(data, width, height, element) {\r\n\t\t\t * return {top: 0, left: 0}\r\n \t\t\t * },\r\n \t\t\t * contents: function(d, defaultTitleFormat, defaultValueFormat, color) {\r\n \t\t\t * return ... // formatted html as you want\r\n \t\t * }\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\ttooltip_show: true,\r\n\t\t\ttooltip_grouped: true,\r\n\t\t\ttooltip_format_title: undefined,\r\n\t\t\ttooltip_format_name: undefined,\r\n\t\t\ttooltip_format_value: undefined,\r\n\t\t\ttooltip_position: undefined,\r\n\t\t\ttooltip_contents: function(d, defaultTitleFormat, defaultValueFormat, color) {\r\n\t\t\t\treturn this.getTooltipContent ?\r\n\t\t\t\t\tthis.getTooltipContent(d, defaultTitleFormat, defaultValueFormat, color) : \"\";\r\n\t\t\t},\r\n\t\t\ttooltip_init_show: false,\r\n\t\t\ttooltip_init_x: 0,\r\n\t\t\ttooltip_init_position: {\r\n\t\t\t\ttop: \"0px\",\r\n\t\t\t\tleft: \"50px\"\r\n\t\t\t},\r\n\t\t\ttooltip_onshow: () => {},\r\n\t\t\ttooltip_onhide: () => {},\r\n\r\n\t\t\t/**\r\n\t\t\t * Set title options\r\n\t\t\t * @name title\r\n\t\t\t * @memberof Options\r\n\t\t\t * @type {Object}\r\n\t\t\t * @property {String} [title.text]\r\n\t\t\t * @property {Number} [title.padding.top=0]\r\n\t\t\t * @property {Number} [title.padding.right=0]\r\n\t\t\t * @property {Number} [title.padding.bottom=0]\r\n\t\t\t * @property {Number} [title.padding.left=0]\r\n\t\t\t * @property {String} [title.position=top-center]\r\n\t\t\t * @example\r\n\t\t\t * title: {\r\n\t\t\t * text: \"Title Text\",\r\n\t\t\t * padding: {\r\n\t\t\t * top: 10,\r\n\t\t\t * right: 10,\r\n\t\t\t * bottom: 10,\r\n\t\t\t * left: 10\r\n\t\t\t * },\r\n\t\t\t * position: \"top-center\"\r\n\t\t\t * }\r\n\t\t\t */\r\n\t\t\ttitle_text: undefined,\r\n\t\t\ttitle_padding: {\r\n\t\t\t\ttop: 0,\r\n\t\t\t\tright: 0,\r\n\t\t\t\tbottom: 0,\r\n\t\t\t\tleft: 0\r\n\t\t\t},\r\n\t\t\ttitle_position: \"top-center\"\r\n\t\t};\r\n\t}\r\n}\r\n\r\n\n\n\n// WEBPACK FOOTER //\n// src/config/Options.js","/**\r\n * Copyright (c) 2017 NAVER Corp.\r\n * billboard.js project is licensed under the MIT license\r\n */\r\nimport * as d3 from \"d3\";\r\nimport Chart from \"./internals/Chart\";\r\nimport ChartInternal from \"./internals/ChartInternal\";\r\nimport Axis from \"./axis/Axis\";\r\nimport * as util from \"./internals/util\";\r\nimport \"./scss/main.scss\";\r\n\r\n/**\r\n * @namespace bb\r\n * @version 1.0.0\r\n */\r\nconst bb = {\r\n\t/**\r\n\t * Version information\r\n\t * @property {String} version version\r\n\t * @example\r\n\t * \tbb.version; // \"1.0.0\"\r\n\t * @memberof bb\r\n\t */\r\n\tversion: \"1.0.0\",\r\n\t/**\r\n\t * generate charts\r\n\t * @param {Options} options chart options\r\n\t * @memberof bb\r\n\t * @return {Chart}\r\n\t * @see {@link Options} for different generation options\r\n\t * @see {@link Chart} for different methods API\r\n\t * @example\r\n\t * \r\n\t *
\r\n\t * @example\r\n\t * // generate chart with options\r\n\t * var chart = bb.generate({\r\n\t * \"bindto\": \"#LineChart\"\r\n\t * \"data\": {\r\n\t * \"columns\": [\r\n\t * [\"data1\", 30, 200, 100, 400, 150, 250],\r\n\t * [\"data2\", 50, 20, 10, 40, 15, 25]\r\n\t * ]\r\n\t * }\r\n\t * });\r\n\t *\r\n\t * // call some API\r\n\t * // ex) get the data of 'data1'\r\n\t * chart.data(\"data1\");\r\n\t */\r\n\tgenerate(config) {\r\n\t\treturn new Chart(config);\r\n\t},\r\n\tchart: {\r\n\t\tfn: Chart.prototype,\r\n\t\tinternal: {\r\n\t\t\tfn: ChartInternal.prototype,\r\n\t\t\taxis: {\r\n\t\t\t\tfn: Axis.prototype\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n};\r\n\r\nfor (const p in util) {\r\n\t!/^__/.test(p) && (ChartInternal.prototype[p] = util[p]);\r\n}\r\n\r\nrequire(\"./config/config.js\");\r\nrequire(\"./internals/scale.js\");\r\nrequire(\"./internals/domain.js\");\r\nrequire(\"./data/data.js\");\r\nrequire(\"./data/data.convert.js\");\r\nrequire(\"./data/data.load.js\");\r\nrequire(\"./internals/category.js\");\r\nrequire(\"./interactions/interaction.js\");\r\nrequire(\"./internals/size.js\");\r\nrequire(\"./internals/shape.js\");\r\nrequire(\"./internals/shape.line.js\");\r\nrequire(\"./internals/shape.bar.js\");\r\nrequire(\"./internals/text.js\");\r\nrequire(\"./internals/type.js\");\r\nrequire(\"./internals/grid.js\");\r\nrequire(\"./internals/tooltip.js\");\r\nrequire(\"./internals/legend.js\");\r\nrequire(\"./internals/title.js\");\r\nrequire(\"./internals/clip.js\");\r\nrequire(\"./internals/arc.js\");\r\nrequire(\"./internals/region.js\");\r\nrequire(\"./interactions/drag.js\");\r\nrequire(\"./internals/selection.js\");\r\nrequire(\"./interactions/subchart.js\");\r\nrequire(\"./interactions/zoom.js\");\r\nrequire(\"./internals/color.js\");\r\nrequire(\"./internals/format.js\");\r\nrequire(\"./internals/cache.js\");\r\nrequire(\"./internals/class.js\");\r\nrequire(\"./api/api.focus.js\");\r\nrequire(\"./api/api.show.js\");\r\nrequire(\"./api/api.zoom.js\");\r\nrequire(\"./api/api.load.js\");\r\nrequire(\"./api/api.flow.js\");\r\nrequire(\"./api/api.selection.js\");\r\nrequire(\"./api/api.transform.js\");\r\nrequire(\"./api/api.group.js\");\r\nrequire(\"./api/api.grid.js\");\r\nrequire(\"./api/api.region.js\");\r\nrequire(\"./api/api.data.js\");\r\nrequire(\"./api/api.category.js\");\r\nrequire(\"./api/api.color.js\");\r\nrequire(\"./api/api.x.js\");\r\nrequire(\"./api/api.axis.js\");\r\nrequire(\"./api/api.legend.js\");\r\nrequire(\"./api/api.chart.js\");\r\nrequire(\"./api/api.tooltip.js\");\r\nrequire(\"./axis/bb.axis.js\");\r\nrequire(\"./internals/ua.js\");\r\n\r\nexport {bb, d3};\r\n\n\n\n// WEBPACK FOOTER //\n// src/core.js","/**\r\n * Copyright (c) 2017 NAVER Corp.\r\n * billboard.js project is licensed under the MIT license\r\n */\r\n/* eslint-disable no-new-func, no-nested-ternary */\r\nconst win = typeof window !== \"undefined\" && window.Math === Math ? window : typeof self !== \"undefined\" && self.Math === Math ? self : Function(\"return this\")();\r\n/* eslint-enable no-new-func, no-nested-ternary */\r\n\r\nexport {win as window};\r\nexport const document = win.document;\r\n\n\n\n// WEBPACK FOOTER //\n// src/internals/browser.js"],"mappings":";;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;A;;;;;;;;;;;;;;;;;;AChEA;;;;AAUA;AAAA;AAAA;AAAA;AACA;AAAA;AADA;AAEA;AAAA;AAFA;AAGA;AAAA;AAHA;AAIA;AAAA;AAJA;AAKA;AAAA;AALA;AAMA;AAAA;AANA;AAOA;AAAA;AAPA;AAQA;AAAA;AARA;AAaA;AAAA;AAbA;AAcA;AAAA;AAdA;AAkBA;AACA;AAGA;AAFA;AAAA;AAGA;AAvBA;AAwBA;AAAA;AAxBA;AA+BA;;;;;;;AAOA;AAAA;AACA;AAEA;AACA;AACA;AAsBA;AAtBA;AACA;AAFA;AAOA;AACA;AAFA;AAOA;AACA;AAFA;AAOA;AACA;AAFA;AAMA;AAlEA;AAqEA;AAAA;AAAA;AAAA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AAJA;AAMA;AAhFA;AAoFA;AAAA;AACA;AAEA;AACA;AACA;AAMA;AACA;AAhGA;AAmGA;AACA;AAFA;AAWA;AACA;AAjFA;AACA;AACA;AAmDA;AACA;AACA;AA2BA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AAAA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAHA;AAMA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAIA;AAKA;AACA;AACA;AACA;AAOA;AACA;AACA;;;;;;AAMA;AAAA;AAAA;AAAA;AAQA;AAAA;AARA;AAqBA;AACA;AAAA;AACA;AAGA;AACA;AAgBA;AAbA;AACA;AACA;AAQA;AAIA;AACA;AA3CA;;;;;;;;AAQA;;;;;;;;;;;AAqCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;ACpOA;;;;;;;AAlBA;;;;AAyBA;AACA;AAAA;AACA;AAAA;AACA;AACA;AAKA;AACA;AACA;AACA;AACA;AAGA;AACA;AAGA;AAAA;AACA;AACA;AAGA;AAiBA;AAGA;AAAA;AAIA;AAwBA;AACA;AAQA;AACA;AA8BA;AACA;AACA;AAHA;AAgBA;AAGA;AAAA;AAAA;AAIA;AACA;AACA;AAgEA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AAAA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AAMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAcA;AAkDA;AACA;AACA;AACA;AACA;AALA;AAcA;AAGA;AAKA;AAGA;AAEA;AAAA;AAAA;AAAA;AAAA;AAMA;AACA;AACA;AACA;AACA;AAJA;AAMA;AAEA;AAGA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA;AAKA;AACA;AACA;AACA;AAJA;AAMA;AACA;AACA;AACA;AAJA;AASA;AACA;AACA;AACA;AAJA;AAMA;AACA;AACA;AACA;AAJA;AASA;AACA;AACA;AACA;AAJA;AA4CA;AAGA;AACA;AACA;AACA;AACA;AACA;AAkBA;AAGA;AACA;AACA;AACA;AAAA;AAIA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AAgGA;AACA;AAEA;AAEA;AACA;AAAA;AACA;AACA;AAEA;AACA;AACA;AACA;AAGA;AACA;AACA;AAKA;AACA;AAAA;AAAA;AAAA;AAAA;AACA;AAYA;AACA;AACA;AAmEA;AACA;AAAA;AAGA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAXA;AAoBA;AAeA;AAFA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAEA;AAgBA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AAMA;AA6BA;AAGA;AACA;AACA;AACA;AACA;AAJA;AAMA;AAGA;AACA;AAGA;AACA;AAGA;AAAA;AACA;AACA;AACA;AACA;AAGA;AACA;AAGA;AAAA;AAAA;AAAA;AACA;AACA;AA8BA;AACA;AAGA;AAEA;AAGA;AAEA;AAGA;AACA;AACA;AACA;AAGA;AACA;AAEA;AAMA;AAGA;AAAA;AACA;AACA;AAOA;AACA;AAGA;AAAA;AACA;AACA;AACA;AACA;AAGA;AACA;AAGA;AAAA;AAAA;AAAA;AAKA;AAsCA;AAGA;AACA;AACA;AAOA;AAGA;AAAA;AAAA;AAIA;AAoCA;AAGA;AACA;AACA;AAiBA;AAGA;AACA;AACA;AACA;AAMA;AACA;AACA;AAMA;AAQA;AACA;AACA;AACA;AACA;AACA;AANA;AAWA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAHA;AAKA;AAGA;AAAA;AAGA;AAGA;AACA;AAIA;AAKA;AAEA;AACA;AAIA;AACA;AAuBA;AACA;AAIA;AACA;AAAA;AAAA;AACA;AACA;AALA;AACA;AAkBA;AAZA;AACA;AAGA;AAEA;AACA;AAAA;AACA;AAEA;AAGA;AAGA;AACA;AACA;AACA;AAAA;AACA;AACA;AAAA;AACA;AACA;AAGA;AAAA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA;AACA;AACA;AACA;AACA;AAQA;AACA;AAzBA;AA2BA;AACA;AACA;AAQA;AAPA;AAKA;AAGA;AAGA;AAAA;AACA;AACA;AAaA;AACA;AAGA;AACA;AAWA;AACA;AAGA;AAAA;AAAA;AAAA;AACA;AACA;AAeA;AACA;;;AArtCA;;;;;;;ACzBA;;;;;;;;;;ACAA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AA3EA;AACA;AA6EA;;;;;;;;;;;;;;;;;;;AC1EA;;;;;;;;;;;;;;;AAeA;AACA;AACA;AAAA;AACA;AACA;AASA;AACA;AAIA;AACA;AACA;;;;;;;;AApBA;;;;;;;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;ACRA;;;;AAcA;AACA;AAAA;AAEA;AACA;AACA;AACA;AAAA;AAAA;AAIA;AAwBA;AAFA;AAUA;AAIA;AAAA;AAAA;AAGA;AACA;AACA;AACA;AACA;AACA;AANA;AAFA;AAAA;AACA;AACA;AA6BA;AAbA;AAAA;AAcA;AAGA;AAAA;AAAA;AACA;AAgBA;AACA;AAIA;AAAA;AAAA;AAGA;AACA;AACA;AAHA;AAFA;AACA;AAiBA;AACA;AAGA;AACA;AACA;AACA;AAGA;AAAA;AAAA;AACA;AACA;AAmBA;AAZA;AACA;AAOA;AAAA;AAKA;AACA;AACA;AAGA;AACA;AAMA;AACA;AAGA;AACA;AAGA;AACA;AAGA;AACA;AAGA;AAAA;AAAA;AACA;AAUA;AACA;AAGA;AAAA;AACA;AAOA;AACA;AAGA;AAAA;AAAA;AAIA;AAWA;AAGA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AARA;AAUA;AAGA;AACA;AAGA;AACA;AAGA;AACA;AAGA;AACA;AAMA;AACA;AAGA;AACA;AAGA;AACA;AAGA;AACA;AAGA;AAAA;AACA;AAaA;AACA;AAGA;AACA;AAYA;AACA;AAGA;AACA;AAYA;AACA;AAGA;AACA;AAGA;AACA;AAGA;AACA;AAGA;AACA;AAGA;AACA;AAGA;AACA;AAGA;AAAA;AAAA;AADA;AAcA;AAGA;AAAA;AADA;AASA;AAGA;AAAA;AADA;AASA;AAGA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AAGA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AAIA;AACA;AAGA;AACA;AAAA;AAAA;AAIA;AAiDA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAGA;AAAA;AAAA;AAAA;AAKA;AAiBA;AAGA;AACA;AAOA;AATA;AAWA;AAGA;AAAA;AACA;AACA;AACA;AACA;AAGA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AAMA;AACA;AACA;AACA;AACA;AACA;AAWA;AAIA;AACA;AACA;AACA;AAKA;AAHA;AAAA;AAIA;AAGA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAJA;AAMA;AAGA;AACA;AACA;AASA;;;AAnlBA;;;;;;;;;;;;;;;ACCA;AACA;AAaA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AAFA;AAAA;AACA;AAQA;AACA;AAOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AAFA;AACA;AAqBA;AAdA;AAAA;AAAA;AAAA;AAKA;AAIA;AAMA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAoEA;AACA;AACA;AAiBA;AACA;AACA;AAAA;AACA;AAMA;AACA;AACA;AAOA;AACA;AACA;AArCA;AAAA;AAAA;AAAA;AAAA;AADA;AAwCA;AACA;AACA;AACA;AACA;AAOA;AACA;AACA;AA1HA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAGA;AACA;AACA;AAAA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAKA;AAIA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAMA;AACA;AACA;AACA;AAMA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAKA;AACA;AACA;AAOA;AAAA;AAAA;AAAA;AAAA;AAAA;AAwEA;AACA;AAIA;AAAA;AACA;AACA;AAFA;AAAA;AAIA;AAQA;AAAA;AACA;AACA;AAAA;AACA;AAmHA;AAjJA;AACA;AACA;AAEA;AA+CA;AAMA;AA1BA;AAMA;AAGA;AACA;AAEA;AAMA;AAiGA;AAAA;AAGA;AACA;AACA;AAEA;AACA;AAKA;AAEA;AACA;AACA;AA5YA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AAqfA;AA1GA;AAQA;AAEA;AAMA;AACA;AACA;AACA;AAJA;AAQA;AAEA;AAQA;AAEA;AAQA;AAGA;AACA;AAGA;AACA;AACA;AAGA;AACA;AAGA;AACA;AACA;AACA;AACA;AAEA;AACA;AADA;AAQA;AAEA;AAQA;AAGA;AAEA;AACA;AAEA;AACA;AAGA;AACA;AACA;AACA;AACA;AAIA;AACA;AAGA;AACA;AApgBA;AACA;;;AAIA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;ACNA;;;;;;;AAPA;;;;AAcA;AACA;AAAA;AAAA;AACA;AACA;AAmBA;AALA;AACA;AAFA;AAOA;AAvBA;AAgCA;AACA;AACA;AAGA;AACA;AACA;AACA;AAHA;AAKA;AA1CA;AACA;AAwBA;;;;;;;;AAmBA;;;;;AAKA;;;;;;;;;;;;;AAaA;AACA;AACA;AACA;AAEA;AACA;AAIA;AAgBA;AAMA;AAgBA;AAMA;AAwBA;AAKA;AACA;AAFA;AACA;AAKA;AACA;;;;;;;;;ACjKA;AAAA;AAAA;AACA;;;AALA;;;;AAOA;AACA;;;;;;;;;;AAUA;AACA;AAAA;AACA;AACA;AAMA;AACA;AACA;AACA;AAAA;;;;;;;;;;;AAWA;AACA;AAAA;AADA;AAYA;AA9CA;;;;;;;;;ACHA;AAAA;AAAA;AAAA;AACA;;;AAGA;AACA;;;;;;;;;;;;;AAaA;AACA;AACA;AACA;AAIA;AACA;AACA;AAAA;;;;;;;;AAQA;AACA;AACA;AACA;AACA;AAHA;AAKA;AACA;AACA;AAAA;;;;;;;;AAQA;AACA;AACA;AA2BA;AAHA;AACA;AAGA;AA7EA;;;;;;;;;;;;ACJA;AAAA;AAAA;AACA;;;AALA;;;;AAOA;AACA;;;;;;;;;AASA;AACA;AACA;AACA;AACA;AAdA;;;;;;;;;ACHA;AAAA;AAAA;AACA;;;AAEA;;;;;;;;;;;;;;;;AAPA;;;;AAuBA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;;;;;;;;;;;;;;;;AAgBA;AACA;AACA;AAaA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAEA;AACA;AACA;AACA;AACA;AAoBA;AACA;AAmBA;AACA;AAmBA;AACA;;;;;;;;;AClIA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;;;AASA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AASA;AACA;AASA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AAEA;AACA;AAQA;AAMA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAIA;AAAA;AACA;AACA;AACA;AAMA;AACA;AACA;AACA;AAJA;AASA;AAKA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAJA;AACA;AAOA;AACA;AAKA;AAGA;AAGA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAIA;AACA;AAgCA;AACA;AACA;AACA;AACA;AACA;AALA;AAOA;AACA;AACA;AACA;AAXA;AAaA;AApMA;AAwMA;;;;;;;AAOA;AACA;AAAA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AA8BA;AACA;AAIA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AAyBA;AACA;AACA;AACA;AACA;AAAA;AACA;AAEA;AAgCA;AAAA;AAAA;AAAA;AACA;AACA;AAGA;AACA;AACA;AACA;AAKA;AAcA;AACA;AACA;AACA;AAmDA;AACA;AACA;AA7MA;;;;;;;;;;;;ACjNA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;;;AALA;;;;AASA;AACA;;;;;;;;;;;;;;;;;AAiBA;AACA;AAAA;AAAA;AAMA;AAWA;AAAA;AACA;AACA;AACA;AAAA;;;;;;;;;;;;;;;;;AAiBA;AACA;AAAA;AAAA;AAMA;AAOA;AAAA;AAEA;AACA;AACA;AAAA;;;;;;;;;;;;;;;;;AAiBA;AACA;AAAA;AAAA;AAEA;AACA;AACA;AASA;AACA;AAMA;AAhHA;;;;;;;;;ACLA;AAAA;AAAA;AACA;;;AAEA;;;;;;;;;;;;;AAPA;;;;AAoBA;AACA;AAAA;AADA;AAYA;AACA;AACA;;;;;;;;;;;;;;;;;;;AAmBA;AACA;AAIA;AAsBA;AACA;AACA;AACA;AAAA;;;;;;;;;;;;;AAaA;AACA;AAAA;AADA;AAYA;AACA;AACA;;;;;;;;;;;;;;;;;;;AAmBA;AACA;AAIA;AAsBA;AACA;AAGA;AACA;AAFA;;;;;;;;;AC3JA;AAAA;AAAA;AACA;;;AALA;;;;AAOA;AACA;;;;;;;;;;;;AAYA;AACA;AAAA;AADA;AAYA;AAzBA;;;;;;;;;ACHA;AAAA;AAAA;AACA;;;AAEA;;;AAPA;;;;AAUA;AACA;AACA;;;;;;;;;;;;;;;;;;;AAmBA;AACA;AACA;AACA;AAEA;AAsBA;AACA;AACA;AAEA;;;;;;;;;AC1DA;AAAA;AAAA;AACA;;;AALA;;;;AAOA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BA;AACA;AAAA;AACA;AAEA;AACA;AACA;AA6BA;AAnCA;AAcA;AACA;AAUA;AACA;AAMA;AACA;AAcA;AAAA;AACA;AAPA;AAWA;AACA;AACA;AAAA;;;;;;;;;;;;;;;;;;AAkBA;AACA;AAAA;AAGA;AAOA;AACA;AACA;AACA;AAHA;AAOA;AACA;AAxHA;;;;;;;;;ACHA;AAAA;AAAA;AAAA;AAAA;AACA;;;AAGA;;;;;;;;;;;;;;AAcA;AACA;AAAA;AADA;AAYA;AACA;AACA;;;;;;;;;;;;;;;;;;;;AApCA;;;;AAwDA;AACA;AAAA;AADA;AAYA;AAsBA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA;AAAA;AACA;AACA;AAoBA;AAfA;AACA;AAFA;AAQA;AAGA;AAGA;AAGA;;;;;;;;;ACpHA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;;;AALA;;;;AASA;AACA;;;;;;;;;;;;;;;AAeA;AACA;AAAA;AACA;AACA;AAQA;AAJA;AACA;AACA;AAAA;AAGA;AACA;AACA;AAAA;;;;;;;;;;;;AAYA;AACA;AAAA;AAGA;AAOA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AAKA;AACA;AAWA;AACA;AACA;AACA;AAAA;;;;;;;;;;;AAWA;AACA;AAAA;AAGA;AAOA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AAKA;AACA;AAOA;AACA;AAjHA;;;;;;;;;ACLA;AAAA;AAAA;AACA;;;AALA;;;;AAOA;AACA;;;;;;;;AAQA;AAAA;AAAA;AAAA;AAKA;AACA;AAAA;AACA;AACA;AAGA;AACA;AAMA;AACA;AACA;AAHA;AAKA;AACA;AACA;AAAA;;;;;;;;AAQA;AAAA;AAAA;AAAA;AAIA;AACA;AAAA;AACA;AACA;AAGA;AACA;AAMA;AACA;AACA;AAHA;AAKA;AACA;AACA;AAAA;;;;;;;;AAQA;AAAA;AAAA;AAAA;AAIA;AACA;AAEA;AACA;AAhFA;;;;;;;;;ACHA;AAAA;AAAA;AACA;;;AAEA;;;AAPA;;;;AAUA;AACA;AACA;;;;;;;AAOA;AACA;AAAA;AAAA;AACA;AACA;AAEA;AACA;AA6BA;AAUA;AAGA;;;;;;;;;AC/DA;AAAA;AAAA;AAAA;AAAA;AACA;;;AAGA;AACA;;;;;;;;;;;;;;;;;AAiBA;AACA;AAAA;AAIA;AACA;AAxBA;AA4BA;;;;;;;AAOA;AACA;AAAA;AAAA;AAIA;AAMA;AAnBA;;;;;;;;;;;;AC/BA;AAAA;AAAA;AACA;;;AALA;;;;AAOA;AACA;;;;;;;;;;;;;;AAcA;AACA;AACA;AAUA;AALA;AACA;AAFA;AAOA;AACA;AACA;AAAA;;;;;;;;;;;;;;;;;AAiBA;AACA;AACA;AAUA;AALA;AACA;AAFA;AAOA;AA5DA;;;;;;;;;ACHA;AAAA;AAAA;AAAA;AACA;;;AAOA;;;;;;;;;;;;;AAaA;AACA;AAAA;AAAA;AACA;AACA;AAEA;AACA;AAIA;AAHA;AAAA;AAIA;AACA;AACA;AAEA;AACA;AAAA;AAAA;AAKA;AAIA;AACA;AACA;AACA;AACA;AAFA;AAMA;AAGA;AACA;AACA;AACA;;;;;;;;;;AAhEA;;;;AA0EA;AACA;AACA;AACA;AAEA;AAUA;AAAA;AACA;AACA;AACA;AACA;AAKA;AACA;AAUA;AAAA;AACA;AACA;AACA;AACA;AAKA;AACA;AAoBA;AAKA;AACA;AAFA;AACA;AAKA;AACA;AAGA;AACA;;;;;;;;AAQA;AACA;AACA;AACA;AAOA;AACA;AAFA;AAIA;AAvBA;;;;;;;;;;;;;;;;;;;AChJA;AACA;AACA;AACA;AACA;AAIA;AACA;AACA;AAAA;AACA;AACA;AACA;AAKA;AACA;AACA;AAFA;AAWA;AACA;AAjBA;AAAA;AAAA;AAAA;AAkBA;AACA;AAOA;AACA;AAxCA;;;;;;;;;;;;ACJA;AAAA;AAAA;AAAA;AACA;;;AAUA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAGA;AACA;AACA;AADA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AADA;AACA;AADA;AACA;AAIA;AACA;AACA;AACA;AACA;AAGA;AACA;AAEA;AASA;AACA;AAEA;AACA;AAAA;AACA;AACA;AAUA;AANA;AACA;AAMA;AAEA;AACA;AAAA;AACA;AACA;AAUA;AANA;AACA;AAMA;AAEA;AAAA;AAAA;AAAA;AAAA;AACA;AAgCA;AACA;AAhBA;AAAA;AACA;AADA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AADA;AAEA;AAKA;AACA;AACA;AAGA;AAAA;AAIA;AAEA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AAAA;AACA;AADA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AADA;AACA;AAAA;AAGA;AACA;AAAA;AACA;AANA;AAQA;AACA;AAEA;AACA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AAIA;AAEA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AAGA;AAMA;AAGA;AACA;AAEA;AACA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAMA;AACA;AACA;AACA;AAMA;AAAA;AAEA;AAAA;AAUA;AAAA;AAEA;AAKA;AAGA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AAIA;AACA;AAgBA;AACA;AAAA;AAAA;AA3BA;AA6BA;AACA;AACA;AACA;AACA;AAmCA;AAnCA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AAKA;AACA;AAEA;AAAA;AACA;AASA;AAAA;AAKA;AACA;AAGA;AAhRA;;;;;;;;;;;;;;;;;;;;;;;ACfA;;;;AAcA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AAGA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AAAA;AAAA;AACA;AAQA;AAJA;AAGA;AAEA;AAEA;AACA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAAA;AAAA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAAA;AACA;AAMA;AACA;AAEA;AACA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAGA;AACA;AAEA;AACA;AAAA;AACA;AASA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAHA;AAKA;AAEA;AACA;AACA;AACA;AAGA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAAA;AAAA;AACA;AAEA;AACA;AAAA;AAAA;AACA;AAaA;AARA;AAIA;AAKA;AAEA;AACA;AACA;AAAA;AACA;AAAA;AAEA;AAEA;AACA;AAAA;AAAA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AAAA;AACA;AACA;AACA;AAKA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AAAA;AAAA;AACA;AAEA;AACA;AAAA;AAEA;AAAA;AAAA;AAAA;AACA;AAGA;AADA;AAAA;AAAA;AAAA;AACA;AAAA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAAA;AAAA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAAA;AAAA;AACA;AAEA;AACA;AACA;AAOA;AALA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AAGA;AAQA;AACA;AAEA;AACA;AAAA;AAAA;AACA;AAEA;AACA;AAAA;AAAA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AAAA;AAAA;AAAA;AAeA;AACA;AATA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AAEA;AACA;AAKA;AAEA;AACA;AAAA;AAAA;AAAA;AAAA;AACA;AAEA;AACA;AAAA;AAAA;AACA;AAEA;AACA;AAAA;AACA;AACA;AACA;AAAA;AAAA;AAHA;AAAA;AAKA;AAEA;AACA;AACA;AACA;AAHA;AASA;AAEA;AACA;AAAA;AACA;AAYA;AALA;AAAA;AAEA;AACA;AAGA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAAA;AAAA;AACA;AACA;AAEA;AAIA;AAIA;AACA;AAEA;AACA;AAAA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AAAA;AAAA;AACA;AAGA;AACA;AACA;AAqBA;AArBA;AAAA;AAEA;AACA;AACA;AAGA;AAIA;AAAA;AAEA;AACA;AACA;AAIA;AAGA;AAEA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AAKA;AACA;AAEA;AACA;AAAA;AACA;AACA;AACA;AACA;AAGA;AACA;AAcA;AAVA;AACA;AACA;AAHA;AAMA;AACA;AACA;AAHA;AAOA;AAEA;AACA;AAAA;AAAA;AADA;AASA;AACA;AAGA;AA/dA;;;;;;;;;ACVA;AAAA;AAAA;AAAA;AAAA;AACA;;;AAGA;AACA;AACA;AAAA;AAGA;AAQA;AACA;AACA;AACA;AAIA;AAEA;AACA;AACA;AACA;AAEA;AAWA;AAEA;AACA;AACA;AACA;AAIA;AACA;AAUA;AAEA;AACA;AAAA;AAAA;AACA;AACA;AASA;AAZA;AAUA;AAAA;AAQA;AAAA;AAQA;AAMA;AAAA;AACA;AACA;AA9FA;;;;;;;;;;;;ACJA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;;;AALA;;;;AAWA;AACA;;;;;;AAMA;AACA;AAAA;AAAA;AAKA;AAEA;AACA;AAJA;AAKA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASA;AAQA;AAAA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AASA;AAcA;AACA;AAEA;AAMA;AA1DA;AA2DA;AACA;AACA;AAAA;;;;;;AAMA;AACA;AAAA;AAIA;AADA;AAQA;AACA;AACA;AAAA;;;;;AAKA;AACA;AAAA;AAIA;AADA;AAUA;AAhHA;;;;;;;;;ACPA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;;;AALA;;;;AAcA;AACA;;;;;AAKA;AACA;AACA;AACA;AAIA;AACA;AACA;AAAA;;;;AAIA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAOA;AACA;AACA;AAEA;AACA;AACA;AA4BA;AArBA;AASA;AAAA;AAaA;AACA;AACA;AACA;AACA;AAJA;AAOA;AACA;AAMA;AACA;AAfA;AAAA;AAmBA;AAAA;AAAA;AAAA;AACA;AAGA;AACA;AACA;AACA;AAIA;AACA;AACA;AAGA;AACA;AACA;AAGA;AAAA;AAGA;AAKA;AACA;AAjDA;AAoDA;AACA;AACA;AACA;AACA;AAGA;AACA;AAGA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AAKA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;;;;;AAKA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AAMA;AAOA;AAAA;AACA;AACA;AACA;AAKA;AAAA;AACA;AACA;AACA;AAJA;AAYA;AAGA;AAAA;AAAA;AACA;AACA;AAEA;AALA;AAeA;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAIA;AACA;AACA;AAKA;AAEA;AACA;AAAA;AAAA;AAIA;AAAA;AAFA;AAIA;AAWA;AAYA;AACA;AAAA;AAEA;AAWA;AACA;AAEA;AACA;AAAA;AAAA;AACA;AAyBA;AAtBA;AACA;AAEA;AAAA;AAAA;AACA;AACA;AAOA;AACA;AAKA;AAKA;AAAA;AAAA;AACA;AACA;AAzBA;AA4CA;AACA;AACA;AAAA;;;;AAIA;AACA;AACA;AACA;AAKA;AACA;AACA;AAAA;;;;;;;AAOA;AACA;AAAA;AAAA;AACA;AACA;AAEA;AAIA;AAEA;AACA;AACA;AACA;AACA;AACA;AAQA;AAAA;AAfA;AAgBA;AAEA;AAEA;AACA;AACA;AAAA;AAGA;AAPA;AAgBA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAGA;AAAA;AATA;AAUA;AAEA;AACA;AAIA;AACA;AACA;AAAA;AAKA;AACA;AAIA;AAAA;AACA;AAAA;AACA;AAAA;AAGA;AACA;AACA;AAAA;;;;;;;AAOA;AACA;AAAA;AAAA;AACA;AACA;AAEA;AAQA;AACA;AAEA;AAKA;AAEA;AACA;AACA;AAAA;AACA;AAaA;AAXA;AACA;AAGA;AAAA;AAGA;AAQA;AAKA;AApBA;AAsBA;AAIA;AAAA;AACA;AAAA;AACA;AAAA;AAGA;AACA;AACA;AAAA;;;;;;;AAOA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYA;AACA;AAtgBA;;;;;;;;;ACVA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;;;AALA;;;;AAcA;AACA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AAIA;AACA;AAKA;AAJA;AAAA;AAKA;AAIA;AAAA;AAGA;AAeA;AAGA;AACA;AACA;AACA;AACA;AAAA;;;;AAIA;AACA;AAAA;AAAA;AAIA;AACA;AACA;AAAA;AACA;AACA;AA8BA;AACA;AACA;AAAA;;;;;AAKA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AAOA;AACA;AACA;AAAA;AACA;AACA;AAQA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AAOA;AACA;AAUA;AACA;AACA;AACA;AAAA;;;;;AAKA;AACA;AACA;AACA;AAkBA;AACA;AACA;AAAA;;;;;;;AAOA;AACA;AACA;AAEA;AAOA;AACA;AACA;AAAA;;;;;AAKA;AACA;AACA;AACA;AAiBA;AACA;AACA;AAAA;;;;;;;AAOA;AACA;AACA;AAEA;AAOA;AACA;AACA;AAAA;;;;;AAKA;AACA;AACA;AACA;AAkBA;AACA;AAGA;AACA;AAAA;;;;;;;AAOA;AACA;AACA;AAEA;AAQA;AACA;AACA;AAAA;;;;;;;;;;;AAWA;AAEA;AAAA;AACA;AACA;AAGA;AACA;AASA;AACA;AACA;AAEA;AACA;AAAA;AAAA;AAIA;AAOA;AAEA;AACA;AAAA;;;;AAIA;AACA;AAAA;AAGA;AACA;AACA;AACA;AACA;AACA;AALA;AASA;AACA;AACA;AAAA;;;;;;AAMA;AACA;AAAA;AAGA;AASA;AACA;AACA;AAAA;;;;;AAKA;AACA;AAAA;AAAA;AACA;AACA;AAOA;AACA;AA1ZA;;;;;;;;;ACVA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;;;AALA;;;;AAcA;AACA;;;;AAIA;AACA;AAAA;AAAA;AAIA;AAIA;AAMA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAOA;AAGA;AACA;AACA;AACA;AAGA;AAAA;AACA;AAGA;AACA;AAGA;AACA;AACA;AAIA;AACA;AACA;AACA;AAAA;;;;;AAKA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AAGA;AACA;AACA;AACA;AAAA;;;;AAIA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AAAA;;;;AAIA;AACA;AAAA;AACA;AACA;AACA;AAGA;AAAA;AAAA;AAAA;AAHA;AAyBA;AACA;AACA;AACA;AACA;AALA;AAxBA;AAqCA;AA1IA;;;;;;;;;ACVA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;;;AALA;;;;AAeA;AACA;AACA;AAAA;AAGA;AAEA;AAAA;AAAA;AAAA;AAKA;AACA;AACA;AAAA;AAAA;AAIA;AAMA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AADA;AAgBA;AAOA;AAuBA;AAEA;AACA;AAAA;AAAA;AAMA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AA0BA;AACA;AAEA;AACA;AAAA;AAAA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAJA;AAMA;AAEA;AACA;AACA;AACA;AAGA;AAAA;AAAA;AAAA;AACA;AACA;AAGA;AAGA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AAAA;AACA;AACA;AACA;AACA;AAEA;AAMA;AACA;AAGA;AACA;AACA;AACA;AAWA;AAGA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AAGA;AAAA;AATA;AAaA;AAEA;AACA;AAAA;AADA;AAaA;AAEA;AACA;AAAA;AACA;AACA;AACA;AAGA;AAEA;AACA;AAAA;AAAA;AACA;AAQA;AACA;AACA;AAEA;AACA;AAAA;AAAA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAAA;AAAA;AACA;AAQA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQA;AAAA;AARA;AAaA;AAWA;AAEA;AACA;AACA;AACA;AASA;AAEA;AACA;AAMA;AAEA;AAIA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA;AAtBA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AAuIA;AAvGA;AAAA;AACA;AAAA;AAIA;AAKA;AAIA;AAAA;AAEA;AACA;AAEA;AAAA;AACA;AAGA;AAAA;AAAA;AAIA;AARA;AAWA;AAEA;AAAA;AAGA;AAAA;AAGA;AANA;AASA;AAEA;AAAA;AAGA;AACA;AAEA;AAAA;AAGA;AAOA;AAEA;AACA;AAIA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAMA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAGA;AApFA;AAuFA;AACA;AAGA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AAGA;AAAA;AAAA;AAAA;AAAA;AAMA;AAVA;AAYA;AAEA;AAAA;AAGA;AAAA;AAAA;AAAA;AAAA;AAMA;AATA;AAWA;AAEA;AAAA;AAAA;AAAA;AAAA;AAMA;AACA;AACA;AACA;AACA;AAGA;AAAA;AAGA;AAAA;AAGA;AAAA;AAQA;AACA;AACA;AACA;AAHA;AACA;AAKA;AACA;AAaA;AAEA;AACA;AACA;AACA;AAgBA;AAEA;AACA;AACA;AA5lBA;;;;;;;;;ACXA;AAAA;AAAA;AACA;;;AALA;;;;AAOA;AACA;AACA;AACA;AAKA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AAKA;AACA;AAxBA;;;;;;;;;ACHA;AAAA;AAAA;AACA;;;AALA;;;;AAOA;AACA;;;;;;AAMA;AACA;AACA;AACA;AACA;AAXA;;;;;;;;;ACHA;AAAA;AAAA;AAAA;AAAA;AACA;;;AAIA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAAA;AACA;AACA;AAKA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AAAA;AACA;AACA;AACA;AACA;AAAA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AACA;AAxIA;;;;;;;;;;;;ACLA;AAAA;AAAA;AACA;;;AALA;;;;AAOA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAGA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AAAA;AAAA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAvFA;;;;;;;;;ACHA;AAAA;AAAA;AAAA;AACA;;;AAMA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AAMA;AACA;AAAA;AACA;AAEA;AACA;AACA;AAaA;AAEA;AACA;AAEA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AAQA;AACA;AACA;AACA;AAGA;AACA;AAAA;AACA;AACA;AAEA;AACA;AACA;AA1DA;;;;;;;;;;;;;;;;;;;;;ACHA;AAKA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AASA;AAKA;AAAA;AACA;AAcA;AACA;AALA;AACA;AAYA;AAIA;AAIA;AAAA;AAAA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AASA;AAIA;AAAA;AAcA;AACA;AAJA;AACA;AAWA;AAIA;AAIA;AAAA;AAAA;AACA;AACA;AACA;AAAA;AAAA;AAEA;AAAA;AAFA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAcA;AACA;AACA;AAIA;AACA;AACA;AAEA;AACA;AACA;AAUA;AAAA;AAtCA;AACA;AACA;AAkDA;AAAA;AAAA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAGA;AAEA;AACA;AAKA;AACA;AACA;AAkBA;AACA;AACA;AACA;AAEA;AACA;AAAA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AACA;AAEA;AACA;AAAA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AACA;AAEA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AA0BA;AACA;AAEA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA;AACA;AAmBA;AACA;AAEA;AACA;AAAA;AACA;AACA;AAaA;AACA;AACA;AAAA;AACA;AACA;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAAA;AAAA;AACA;AACA;AAYA;AACA;AA3UA;;;;;;;;;;;;;;;;;;;;ACbA;;;;AAOA;AACA;AAAA;AAAA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AAOA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAAA;AAAA;AAEA;AAAA;AAFA;AACA;AAIA;AACA;AACA;AAWA;AANA;AAAA;AAOA;AAvDA;;;;;;;;;ACZA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;;;AALA;;;;AAYA;AACA;AACA;AAAA;AAGA;AAwBA;AAEA;AACA;AACA;AACA;AAQA;AAEA;AACA;AAAA;AAAA;AAAA;AAKA;AACA;AACA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AAJA;AAMA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AACA;AAJA;AAoBA;AACA;AACA;AACA;AACA;AAAA;AAIA;AACA;AAEA;AAEA;AACA;AAAA;AAAA;AAIA;AAkBA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAAA;AAAA;AACA;AACA;AAEA;AACA;AACA;AACA;AAiBA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAyBA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAUA;AACA;AACA;AACA;AAeA;AAAA;AAGA;AAEA;AACA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AAgBA;AAFA;AAAA;AAMA;AAEA;AACA;AAAA;AAAA;AAEA;AAAA;AAFA;AAAA;AAMA;AACA;AAGA;AAYA;AAEA;AACA;AACA;AAEA;AACA;AAAA;AAGA;AAKA;AAEA;AACA;AAAA;AAAA;AACA;AACA;AAIA;AACA;AAAA;AAAA;AACA;AACA;AAEA;AAGA;AAGA;AAAA;AAGA;AACA;AAEA;AACA;AACA;AACA;AAOA;AANA;AAIA;AAGA;AAAA;AAAA;AACA;AAEA;AACA;AAAA;AAAA;AAAA;AAIA;AACA;AALA;AAAA;AASA;AAaA;AA9VA;;;;;;;;;ACRA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;;;AALA;;;;AAaA;AACA;;;;AAIA;AACA;AACA;AAFA;AAWA;AACA;AAEA;AACA;AACA;AAAA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AAHA;AAKA;AACA;AACA;AAAA;;;;;;AAMA;AACA;AAAA;AAAA;AAIA;AAGA;AAJA;AASA;AACA;AAEA;AACA;AACA;AALA;AAQA;AACA;AAAA;;;;;AAKA;AACA;AACA;AACA;AAEA;AACA;AACA;AAAA;;;;;AAKA;AACA;AACA;AACA;AACA;AAAA;;;;;AAKA;AACA;AACA;AACA;AACA;AAAA;;;;;AAKA;AACA;AACA;AACA;AACA;AAAA;;;;;AAKA;AACA;AACA;AACA;AAGA;AACA;AAAA;;;;;AAKA;AACA;AAAA;AACA;AASA;AACA;AACA;AAAA;;;;;;AAMA;AACA;AACA;AACA;AACA;AAAA;;;;;;AAMA;AACA;AACA;AACA;AAAA;;;;;;AAMA;AACA;AAAA;AAGA;AACA;AAAA;AAKA;AACA;AACA;AACA;AACA;AACA;AAAA;;;;AAIA;AACA;AACA;AACA;AAKA;AACA;AACA;AACA;AAAA;;;;;AAKA;AACA;AAAA;AAGA;AAaA;AACA;AACA;AACA;AAAA;;;;;AAKA;AACA;AAAA;AAGA;AAQA;AACA;AAAA;;;;AAIA;AACA;AACA;AACA;AAAA;;;;;;;AAOA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBA;AAAA;AArBA;AAAA;AAAA;AAAA;AA8BA;AACA;AA/BA;AAiCA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAcA;AAYA;AACA;AAfA;AACA;AACA;AAqBA;AACA;AAOA;AACA;AACA;AASA;AACA;AACA;AACA;AAAA;AACA;AAAA;AAKA;AAAA;AAOA;AApFA;AAsFA;AAMA;AAAA;AACA;AAAA;AAEA;AAAA;AACA;AAAA;AAEA;AAAA;AACA;AAAA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AAAA;AADA;AAEA;AAAA;AAFA;AAGA;AAAA;AAHA;AAIA;AAAA;AAJA;AAKA;AAAA;AALA;AAMA;AAAA;AANA;AAaA;AAAA;AACA;AAAA;AAGA;AAYA;AAEA;AAQA;AAEA;AAMA;AACA;AAxCA;AAyCA;AACA;AAAA;AAEA;AACA;AACA;AACA;AA4BA;AAEA;AAAA;AAFA;AAIA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAAA;AACA;AAAA;AACA;AACA;AAEA;AACA;AAEA;AAeA;AAAA;AAaA;AApfA;;;;;;;;;ACTA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;;;AALA;;;;AASA;AACA;AACA;AACA;AACA;AAGA;AAEA;AACA;AAAA;AACA;AACA;AACA;AACA;AAqBA;AAEA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AAYA;AAEA;AAAA;AAGA;AAGA;AAEA;AAEA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AAeA;AACA;AAEA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AAeA;AACA;AAEA;AACA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AAeA;AACA;AAEA;AACA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AAiBA;AACA;AAEA;AACA;AACA;AAxJA;;;;;;;;;ACLA;AAAA;AAAA;AAAA;AACA;;;AAMA;AACA;AACA;AAGA;AAEA;AACA;AAAA;AAAA;AAAA;AAAA;AACA;AAKA;AACA;AACA;AAcA;AACA;AAfA;AAAA;AAEA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AA2BA;AAnBA;AACA;AAKA;AACA;AAFA;AAWA;AAIA;AAEA;AACA;AACA;AAKA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;;;;;AAKA;AACA;AAAA;AAAA;AACA;AACA;AAEA;AACA;AAWA;AAAA;AAIA;AAAA;AA4BA;AAlIA;;;;;;;;;;;;ACPA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;;;AALA;;;;AAYA;AACA;;;;;;;AAOA;AACA;AAAA;AAAA;AAAA;AAAA;AAMA;AAQA;AAAA;AAGA;AAAA;AACA;AAAA;AAIA;AACA;AACA;AAAA;;;;;;;AAOA;AACA;AACA;AACA;AAOA;AACA;AACA;AAAA;;;;;;;;AAQA;AACA;AACA;AACA;AACA;AAAA;;;;;;AAMA;AACA;AACA;AACA;AAGA;AAAA;AAEA;AACA;AACA;AAAA;;;;;;AAMA;AACA;AACA;AACA;AAGA;AAAA;AAEA;AACA;AACA;AAAA;;;;;;;;AAQA;AACA;AACA;AACA;AACA;AAAA;;;;;;;AAOA;AACA;AAAA;AACA;AAYA;AACA;AACA;AACA;AAAA;;;;;;;AAOA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAMA;AACA;AACA;AACA;AACA;AAOA;AACA;AACA;AAGA;AACA;AACA;AAEA;AACA;AAvKA;;;;;;;;;ACRA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;;;AALA;;;;AAWA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQA;AAAA;AARA;AACA;AACA;AAYA;AACA;AAEA;AAAA;AACA;AAEA;AACA;AAAA;AAAA;AAAA;AAAA;AAIA;AAAA;AAEA;AAcA;AAEA;AACA;AAMA;AAEA;AACA;AAAA;AAAA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAAA;AACA;AACA;AACA;AAGA;AAEA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AAAA;AAAA;AACA;AACA;AAEA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AAOA;AACA;AACA;AAEA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AAOA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AAGA;AACA;AAGA;AACA;AAMA;AACA;AAEA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AAcA;AACA;AAjKA;;;;;;;;;ACPA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;;;AALA;;;;AA4BA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAmBA;AAZA;AAIA;AACA;AAAA;AACA;AAGA;AACA;AAGA;AAEA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAAA;AAAA;AAEA;AAAA;AACA;AACA;AAAA;AACA;AAAA;AAAA;AAAA;AACA;AA0BA;AArBA;AACA;AACA;AASA;AAGA;AAMA;AAEA;AACA;AAEA;AACA;AAAA;AAAA;AACA;AAYA;AACA;AAEA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAhBA;AAkBA;AAEA;AACA;AAAA;AACA;AAKA;AACA;AApIA;;;;;;;;;ACxBA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;;;AALA;;;;AAcA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWA;AAAA;AAXA;AACA;AACA;AAgBA;AACA;AASA;AAAA;AAIA;AAAA;AAIA;AAGA;AACA;AACA;AAIA;AAEA;AACA;AACA;AACA;AAgBA;AAAA;AAEA;AAEA;AACA;AAMA;AAEA;AACA;AAAA;AAAA;AAAA;AAAA;AAIA;AAAA;AAJA;AAKA;AAAA;AALA;AACA;AACA;AAcA;AAHA;AAAA;AAIA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAsBA;AACA;AACA;AAEA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AAMA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AAGA;AACA;AAGA;AACA;AAGA;AACA;AAJA;AAMA;AACA;AAEA;AACA;AAiBA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AAmBA;AACA;AACA;AACA;AACA;AAnDA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BA;AACA;AAeA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AACA;AAkCA;AACA;AA3BA;AAAA;AAAA;AAAA;AAAA;AACA;AAUA;AACA;AAGA;AACA;AAMA;AACA;AAKA;AACA;AACA;AAkBA;AACA;AAEA;AACA;AACA;AACA;AAaA;AACA;AAKA;AAEA;AACA;AAMA;AAEA;AACA;AAAA;AAAA;AAAA;AAAA;AAIA;AAAA;AAJA;AAKA;AAAA;AALA;AAOA;AAAA;AAPA;AACA;AACA;AAqBA;AAHA;AAAA;AAIA;AAAA;AAAA;AAAA;AACA;AAgBA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AAMA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AAGA;AACA;AACA;AAGA;AACA;AAIA;AAJA;AAMA;AACA;AAEA;AACA;AACA;AACA;AAWA;AAEA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AAmBA;AACA;AAOA;AAMA;AAEA;AACA;AAGA;AAEA;AACA;AAAA;AAAA;AAIA;AAKA;AACA;AAGA;AACA;AAEA;AAEA;AACA;AAAA;AACA;AACA;AACA;AAEA;AAEA;AACA;AAAA;AAGA;AAMA;AAEA;AACA;AAAA;AAGA;AACA;AAAA;AAGA;AAEA;AACA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AAAA;AACA;AACA;AACA;AAEA;AAEA;AACA;AAAA;AACA;AACA;AACA;AAEA;AAEA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AAGA;AACA;AAEA;AACA;AACA;AAjhBA;;;;;;;;;ACVA;AAAA;AAAA;AAAA;AAAA;AACA;;;AAGA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AAAA;AAAA;AACA;AACA;AAGA;AACA;AAEA;AACA;AAAA;AAAA;AACA;AACA;AAOA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAEA;AACA;AAAA;AAAA;AACA;AACA;AAaA;AACA;AAEA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AAiBA;AACA;AAEA;AAAA;AAKA;AACA;AACA;AACA;AAKA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AAUA;AACA;AAEA;AACA;AAAA;AACA;AACA;AACA;AAEA;AAEA;AACA;AAAA;AAAA;AACA;AACA;AAoBA;AAvBA;AAwCA;AAEA;AACA;AACA;AAtLA;;;;;;;;;;;;ACJA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;;;AALA;;;;AAYA;AACA;;;;AAIA;AACA;AACA;AACA;AAGA;AACA;AACA;AAAA;;;;;AAKA;AACA;AAAA;AAAA;AAAA;AAAA;AAMA;AAAA;AANA;AAYA;AAEA;AACA;AACA;AAAA;;;;;AAKA;AACA;AAAA;AAAA;AAAA;AAKA;AAYA;AAAA;AAEA;AAAA;AAGA;AAAA;AACA;AACA;AACA;AAAA;;;;;;;;;AASA;AACA;AAOA;AACA;AACA;AAAA;;;;;;;;AAQA;AACA;AAAA;AAAA;AAAA;AACA;AAwBA;AALA;AACA;AAKA;AACA;AACA;AAAA;;;;;;;;;AASA;AACA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AAIA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;;;;;;;;AAQA;AACA;AAAA;AAAA;AAAA;AACA;AAkBA;AACA;AACA;AACA;AAAA;;;;;;;;AAQA;AACA;AAAA;AAAA;AACA;AA0BA;AACA;AAtNA;;;;;;;;;ACRA;AAAA;AAAA;AACA;;;AALA;;;;AAOA;AACA;;;;AAIA;AACA;AACA;AACA;AAGA;AACA;AACA;AAAA;;;;AAIA;AACA;AACA;AACA;AAEA;AACA;AACA;AAAA;;;;;AAKA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AAcA;AACA;AACA;AACA;AAAA;;;;;AAKA;AACA;AACA;AACA;AAEA;AACA;AACA;AAAA;;;;;AAKA;AACA;AACA;AACA;AACA;AAtEA;;;;;;;;;ACHA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;;;AALA;;;;AASA;AACA;;;;AAIA;AACA;AAAA;AAAA;AACA;AACA;AAUA;AACA;AACA;AACA;AAEA;AACA;AAGA;AACA;AACA;AACA;AACA;AAAA;AAMA;AACA;AACA;AAAA;;;;;;;;;AASA;AACA;AAAA;AAAA;AAAA;AAGA;AAAA;AAHA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AAWA;AAEA;AAAA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AACA;AACA;AACA;AAAA;AACA;AAMA;AACA;AACA;AACA;AACA;AAcA;AACA;AACA;AAOA;AACA;AAEA;AACA;AACA;AAAA;;;;;;;;;AASA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAUA;AACA;AACA;AAgCA;AACA;AACA;AAFA;AAIA;AACA;AAAA;;;;;;AAMA;AACA;AAAA;AAAA;AAAA;AAGA;AAAA;AAHA;AACA;AACA;AAIA;AAIA;AACA;AACA;AAQA;AACA;AAAA;AAAA;AAKA;AApBA;AACA;AAkBA;AAIA;AACA;AAAA;;;;AAIA;AACA;AACA;AAvNA;;;;;;;;;ACLA;AAAA;AAAA;AACA;;;AALA;;;;AAOA;AACA;AACA;AAAA;AAGA;AACA;AAEA;AAKA;AAEA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AAqBA;AAhBA;AACA;AAFA;AAMA;AAGA;AAGA;AAMA;AAEA;AACA;AAGA;AAEA;AACA;AAAA;AACA;AACA;AACA;AAGA;AAEA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AAGA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AAAA;AACA;AACA;AAiBA;AA3JA;;;;;;;;;ACHA;AAAA;AAAA;AACA;;;AALA;;;;AAOA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AAXA;;;;;;ACPA;;;;;;;;;;;;;;;;ACAA;;;;AAIA;;;;;;AAMA;AACA;AAEA;;;;;;;;;;;;;;;;;AAiBA;AACA;AACA;;;;;;;;;;;AAWA;AACA;AACA;;;;;;;;;;;;;;AAcA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;AAiBA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AAWA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;AAyBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;AAmBA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AAWA;AACA;AACA;;;;;;;;;;;AAWA;AACA;AACA;;;;;;;;;;;AAWA;AACA;AACA;;;;;;;;;;;AAWA;AACA;AACA;;;;;;;;;;;AAWA;AACA;AACA;;;;;;;;;;;AAWA;AACA;AACA;;;;;;;;;;;;AAYA;AACA;AACA;;;;;;;;;;;;AAYA;AACA;AACA;;;;;;;;;;;;;;;AAeA;AACA;AACA;;;;;;;;;;;;AAYA;AACA;AACA;;;;;;;;;;;AAWA;AACA;AACA;;;;;;;;;;;AAWA;AACA;AAAA;AAAA;AACA;AACA;;;;;;;;;;;;;;AAcA;AACA;AACA;;;;;;;;;;;;;;;AAeA;AACA;AACA;;;;;;;;;;;;;;AAcA;AACA;AACA;;;;;;;;;;;;;;AAcA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;AAwBA;AACA;AACA;;;;;;;;;;;;;;;AAeA;AACA;AACA;;;;;;;;;;;AAWA;;;;;;;;;;;;;;;;;;;;;;;;AAwBA;AACA;AACA;;;;;;;;;;;;;;;;AAgBA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;AAsBA;AACA;AACA;;;;;;;;;;;;AAYA;AACA;AACA;;;;;;;;;;;;;;AAcA;AACA;AACA;;;;;;;;;;;;;;;AAeA;AACA;AACA;AACA;;;;;;;;;;;;;;AAcA;AACA;AACA;;;;;;;;;;;;;;AAcA;AACA;AACA;;;;;;;;;;;;;;AAcA;AAAA;AAAA;AACA;AACA;;;;;;;;;;;;;;AAcA;AACA;AACA;;;;;;;;;;;;;;;AAeA;AACA;AACA;;;;;;;;;;;;AAYA;AACA;AACA;;;;;;;;;;;;AAYA;AACA;AACA;;;;;;;;;;;;AAYA;AACA;AACA;;;;;;;;;;;AAWA;AACA;AACA;;;;;;;;;;;AAWA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;AAeA;AACA;AACA;;;;;;;;;;;;;;;;;;AAkBA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;AAeA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AAWA;AACA;AACA;;;;;;;;;;;;;AAaA;AACA;AACA;;;;;;;;;;;;;;;;;AAiBA;AACA;AACA;;;;;;;;;;;;;;AAcA;AACA;AACA;;;;;;;;;;;;;;AAcA;AACA;AACA;;;;;;;;;;;;;;;AAeA;AACA;AACA;;;;;;;;;;;;;;;;;AAiBA;AACA;AACA;;;;;;;;;;;;;;;;;;;AAmBA;AACA;AACA;;;;;;;;;;;;;;;;;AAiBA;AACA;AACA;;;;;;;;;;;;;;;;AAgBA;AACA;AACA;;;;;;;;;;;;;;;;AAgBA;AACA;AACA;;;;;;;;;;;;;;;;AAgBA;AACA;AACA;;;;;;;;;;;;;;;;AAgBA;AACA;AACA;;;;;;;;;;;;;;;AAeA;AACA;AACA;;;;;;;;;;;;;;;AAeA;AACA;AAEA;;;;;;;;;;;;;;;AAeA;AACA;AACA;;;;;;;;;;;;;AAaA;AACA;AACA;;;;;;;;;;;;;AAaA;AACA;AACA;;;;;;;;;;;;;;;;;AAiBA;AACA;AACA;;;;;;;;;;;;;;AAcA;AACA;AACA;;;;;;;;;;;;;;;AAeA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqCA;AACA;AACA;;;;;;;;;;;;;AAaA;AACA;AACA;;;;;;;;;;;;;;;;;AAiBA;AACA;AACA;;;;;;;;;;;;;;AAcA;AACA;AACA;;;;;;;;;;;;;;AAcA;AACA;AACA;;;;;;;;;;;;;;AAcA;AACA;AACA;;;;;;;;;;;;;AAaA;AACA;AACA;;;;;;;;;;;;;AAaA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;AAuBA;AACA;AACA;;;;;;;;;;;;;;;;;;AAkBA;AACA;AACA;;;;;;;;;;;;;;;AAeA;AACA;AACA;;;;;;;;;;;;;;;AAeA;AACA;AACA;AACA;;;;;;;;;;;;;;;;AAgBA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;AAqBA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;AAiBA;AACA;AACA;;;;;;;;;;;;;;AAcA;AACA;AACA;;;;;;;;;;;;;AAaA;AACA;AACA;;;;;;;;;;;;;AAaA;AACA;AACA;;;;;;;;;;;;;AAaA;AACA;AACA;;;;;;;;;;;;;;AAcA;AACA;AACA;;;;;;;;;;;;;AAaA;AACA;AACA;;;;;;;;;;;;;AAaA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;AAuBA;AACA;AACA;;;;;;;;;;;;;;;;;AAiBA;AACA;AACA;;;;;;;;;;;;;;;AAeA;AACA;AACA;;;;;;;;;;;;;;;AAeA;AACA;AACA;;;;;;;;;;;;;;;;AAgBA;AACA;AACA;;;;;;;;;;;;;;;;;AAiBA;AACA;AACA;;;;;;;;;;;;;;AAcA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;AAyBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;AAoBA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;AAoBA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;AAaA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;AAuBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;AAaA;AACA;AACA;;;;;;;;;;;;;;;;;;AAkBA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAFA;AAIA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;AAuBA;AACA;AACA;AACA;AACA;AACA;AAJA;AAMA;AAhiEA;AAkiEA;AACA;AAriEA;;;;;;;;;;;;;ACNA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAIA;AACA;;;;;AACA;;;;AAXA;;;;AAeA;AACA;;;;;;;AAOA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AADA;AAFA;AAFA;AAtCA;AACA;AAgDA;AACA;AAGA;AAkDA;AAAA;;;;;;;;;;ACtHA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;;;;A","sourceRoot":""} \ No newline at end of file diff --git a/dist/billboard.min.css b/dist/billboard.min.css new file mode 100644 index 000000000..609fd46bc --- /dev/null +++ b/dist/billboard.min.css @@ -0,0 +1 @@ +.bb svg{font:10px sans-serif;-webkit-tap-highlight-color:transparent}.bb line,.bb path{fill:none;stroke:#000}.bb text{-webkit-user-select:none;-moz-user-select:none;user-select:none}.bb-bars path,.bb-event-rect,.bb-legend-item-tile,.bb-xgrid-focus,.bb-ygrid{shape-rendering:crispEdges}.bb-chart-arc path{stroke:#fff}.bb-chart-arc text{fill:#fff;font-size:13px}.bb-grid line{stroke:#aaa}.bb-grid text{fill:#aaa}.bb-xgrid,.bb-ygrid{stroke-dasharray:3 3}.bb-text.bb-empty{fill:gray;font-size:2em}.bb-line{stroke-width:1px}.bb-circle._expanded_{stroke-width:1px;stroke:#fff}.bb-selected-circle{fill:#fff;stroke-width:2px}.bb-bar{stroke-width:0}.bb-bar._expanded_{fill-opacity:.75}.bb-target.bb-focused{opacity:1}.bb-target.bb-focused path.bb-line,.bb-target.bb-focused path.bb-step{stroke-width:2px}.bb-target.bb-defocused{opacity:.3!important}.bb-region{fill:#4682b4;fill-opacity:.1}.bb-brush .extent{fill-opacity:.1}.bb-legend-item{font-size:12px}.bb-legend-item-hidden{opacity:.15}.bb-legend-background{opacity:.75;fill:#fff;stroke:#d3d3d3;stroke-width:1}.bb-title{font:14px sans-serif}.bb-tooltip-container{z-index:1}.bb-tooltip{border-collapse:collapse;border-spacing:0;background-color:#fff;empty-cells:show;opacity:.9;box-shadow:7px 7px 12px -9px #777}.bb-tooltip tr{border:1px solid #ccc}.bb-tooltip th{background-color:#aaa;font-size:14px;padding:2px 5px;text-align:left;color:#fff}.bb-tooltip td{font-size:13px;padding:3px 6px;background-color:#fff;border-left:1px dotted #999}.bb-tooltip td>span{display:inline-block;width:10px;height:10px;margin-right:6px}.bb-tooltip td.value{text-align:right}.bb-area{stroke-width:0;opacity:.2}.bb-chart-arcs-title{dominant-baseline:middle;font-size:1.3em}.bb-chart-arcs .bb-chart-arcs-background{fill:#e0e0e0;stroke:none}.bb-chart-arcs .bb-chart-arcs-gauge-unit{fill:#000;font-size:16px}.bb-chart-arcs .bb-chart-arcs-gauge-max,.bb-chart-arcs .bb-chart-arcs-gauge-min{fill:#777}.bb-chart-arc .bb-gauge-value{fill:#000} \ No newline at end of file diff --git a/dist/billboard.min.css.map b/dist/billboard.min.css.map new file mode 100644 index 000000000..92abdf5c6 --- /dev/null +++ b/dist/billboard.min.css.map @@ -0,0 +1 @@ +{"version":3,"file":"billboard.min.css","sources":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","sourceRoot":""} \ No newline at end of file diff --git a/dist/billboard.min.js b/dist/billboard.min.js new file mode 100644 index 000000000..7576ba37b --- /dev/null +++ b/dist/billboard.min.js @@ -0,0 +1,11 @@ +/*! + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + * + * billboard.js, JavaScript chart library + * http://naver.github.io/billboard.js/ + * + * @version 1.0.0 + */ +!function(t,e){if("object"==typeof exports&&"object"==typeof module)module.exports=e(require("d3"));else if("function"==typeof define&&define.amd)define(["d3"],e);else{var i=e("object"==typeof exports?require("d3"):t.d3);for(var n in i)("object"==typeof exports?exports:t)[n]=i[n]}}(this,function(t){return function(t){function __webpack_require__(i){if(e[i])return e[i].exports;var n=e[i]={i:i,l:!1,exports:{}};return t[i].call(n.exports,n,n.exports,__webpack_require__),n.l=!0,n.exports}var e={};return __webpack_require__.m=t,__webpack_require__.c=e,__webpack_require__.i=function(t){return t},__webpack_require__.d=function(t,e,i){__webpack_require__.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:i})},__webpack_require__.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return __webpack_require__.d(e,"a",e),e},__webpack_require__.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},__webpack_require__.p="",__webpack_require__(__webpack_require__.s=59)}([function(t,e,i){"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}function extend(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=arguments[1],i=void 0;for(i in e)t[i]=e[i];return t}function addEvent(t,e,i,n){if(L){var r=n||!1;"object"===(void 0===n?"undefined":(0,a.default)(n))&&(r=!!D&&n),t.addEventListener(e,i,r)}else t.attachEvent?t.attachEvent("on"+e,i):t["on"+e]=i}function removeEvent(t,e,i){t.removeEventListener?t.removeEventListener(e,i,!1):t.detachEvent?t.detachEvent("on"+e,i):t["on"+e]=null}e.__esModule=!0,e.isObject=e.isArray=e.merge=e.getRectSegList=e.removeEvent=e.addEvent=e.extend=e.brushEmpty=e.getBrushSelection=e.isEmpty=e.diffDomain=e.getPathBox=e.sanitise=e.hasValue=e.isString=e.getOption=e.asHalfPixel=e.isFunction=e.ceil10=e.notEmpty=e.isUndefined=e.isDefined=e.isValue=void 0;var n=i(5),a=_interopRequireDefault(n),r=i(2),o=i(3),s=_interopRequireDefault(o),l=function(t){return t||0===t},d=function(t){return"function"==typeof t},u=function(t){return"string"==typeof t},c=function(t){return void 0===t},f=function(t){return void 0!==t},g=function(t){return 10*Math.ceil(t/10)},h=function(t){return Math.ceil(t)+.5},p=function(t){return t[1]-t[0]},x=function(t){return void 0===t||null===t||u(t)&&0===t.length||"object"===(void 0===t?"undefined":(0,a.default)(t))&&0===Object.keys(t).length},_=function(t){return!x(t)},v=function(t,e,i){return f(t[e])?t[e]:i},m=function(t,e){var i=!1;return Object.keys(t).forEach(function(n){return t[n]===e&&(i=!0)}),i},y=function(t){return"string"==typeof t?t.replace(//g,">"):t},b=function(t){var e=t.getBBox(),i=[];return i.push({x:e.x,y:e.y+e.height}),i.push({x:e.x,y:e.y}),i.push({x:e.x+e.width,y:e.y}),i.push({x:e.x+e.width,y:e.y+e.height}),i},T=function(t){var e=t.getBoundingClientRect(),i=b(t);return{x:i[0].x,y:Math.min(i[0].y,i[1].y),width:e.width,height:e.height}},A=function(){var t=null,e=r.event;return e&&"BrushEvent"===e.constructor.name?t=e.selection:this.context&&(t=this.context.select("."+s.default.brush).node())&&(t=(0,r.brushSelection)(t)),t},w=function(){var t=this.getBrushSelection();return!t||t[0]===t[1]},L=!!("addEventListener"in document),D=function(){var t=!1;try{L&&Object.defineProperty&&document.addEventListener("test",null,Object.defineProperty({},"passive",{get:function(){t=!0}}))}catch(t){}return t}(),S=function(t){return t&&t.constructor===Array},C=function(t){return t&&!t.nodeType&&"object"===(void 0===t?"undefined":(0,a.default)(t))&&!S(t)},R=function(t){for(var e=arguments.length,i=Array(e>1?e-1:0),n=1;n0&&void 0!==arguments[0]?arguments[0]:{},e=arguments[1],i=this,n=i.main,a=i.config,o=i.getShapeIndices(i.isAreaType),s=i.getShapeIndices(i.isBarType),l=i.getShapeIndices(i.isLineType),c=void 0,f=void 0,g=i.hasArcType(),h=i.filterTargetsToShow(i.data.targets),p=i.xv.bind(i),x=void 0,_=void 0,v=void 0,m=(0,u.getOption)(t,"withY",!0),y=(0,u.getOption)(t,"withSubchart",!0),b=(0,u.getOption)(t,"withTransition",!0),T=(0,u.getOption)(t,"withTransform",!1),A=(0,u.getOption)(t,"withUpdateXDomain",!1),w=(0,u.getOption)(t,"withUpdateOrgXDomain",!1),L=(0,u.getOption)(t,"withTrimXDomain",!0),D=(0,u.getOption)(t,"withUpdateXAxis",A),S=(0,u.getOption)(t,"withLegend",!1),C=(0,u.getOption)(t,"withEventRect",!0),R=(0,u.getOption)(t,"withDimension",!0),I=(0,u.getOption)(t,"withTransitionForExit",b),F=(0,u.getOption)(t,"withTransitionForAxis",b),X=b?a.transition_duration:0,k=I?X:0,M=F?X:0,E=e||i.axis.generateTransitions(M);if("touch"===i.inputType&&i.hideTooltip(),S&&a.legend_show?i.updateLegend(i.mapToIds(i.data.targets),t,E):R&&i.updateDimension(!0),i.isCategorized()&&0===h.length&&i.x.domain([0,i.axes.x.selectAll(".tick").size()]),h.length?(i.updateXDomain(h,A,w,L),!a.axis_x_tick_values&&(x=i.axis.updateXAxisTickValues(h))):(i.xAxis.tickValues([]),i.subXAxis.tickValues([])),a.zoom_rescale&&!t.flow&&(v=i.x.orgDomain()),i.y.domain(i.getYDomain(h,"y",v)),i.y2.domain(i.getYDomain(h,"y2",v)),!a.axis_y_tick_values&&a.axis_y_tick_count&&i.yAxis.tickValues(i.axis.generateTickValues(i.y.domain(),a.axis_y_tick_count,i.isTimeSeriesY())),!a.axis_y2_tick_values&&a.axis_y2_tick_count&&i.y2Axis.tickValues(i.axis.generateTickValues(i.y2.domain(),a.axis_y2_tick_count)),i.axis.redraw(E,g),i.axis.updateLabels(b),(A||D)&&h.length)if(a.axis_x_tick_culling&&x){for(var O=1;O=0&&(0,r.select)(this).style("display",e%_?"none":"block")})}else i.svg.selectAll("."+d.default.axisX+" .tick text").style("display","block");var Y=i.generateDrawArea?i.generateDrawArea(o,!1):void 0,z=i.generateDrawBar?i.generateDrawBar(s):void 0,P=i.generateDrawLine?i.generateDrawLine(l,!1):void 0,B=i.generateXYForText(o,s,l,!0),q=i.generateXYForText(o,s,l,!1);m&&(i.subY.domain(i.getYDomain(h,"y")),i.subY2.domain(i.getYDomain(h,"y2"))),i.updateXgridFocus(),n.select("text."+d.default.text+"."+d.default.empty).attr("x",i.width/2).attr("y",i.height/2).text(a.data_empty_label_text).transition().style("opacity",h.length?0:1),i.updateGrid(X),i.updateRegion(X),i.updateBar(k),i.updateLine(k),i.updateArea(k),i.updateCircle(),i.hasDataLabel()&&i.updateText(k),i.redrawTitle&&i.redrawTitle(),i.redrawArc&&i.redrawArc(X,k,T),a.subchart_show&&i.redrawSubchart&&i.redrawSubchart(y,E,X,k,o,s,l),n.selectAll("."+d.default.selectedCircles).filter(i.isBarType.bind(i)).selectAll("circle").remove(),a.interaction_enabled&&!t.flow&&C&&(i.redrawEventRect(),i.updateZoom&&i.updateZoom()),i.updateCircleY();var V=(i.config.axis_rotated?i.circleY:i.circleX).bind(i),W=(i.config.axis_rotated?i.circleX:i.circleY).bind(i);t.flow&&(f=i.generateFlow({targets:h,flow:t.flow,duration:t.flow.duration,drawBar:z,drawLine:P,drawArea:Y,cx:V,cy:W,xv:p,xForText:B,yForText:q})),(X||f)&&i.isTabVisible()?(0,r.transition)().duration(X).each(function(){c=i.generateWait(),[i.redrawBar(z,!0),i.redrawLine(P,!0),i.redrawArea(Y,!0),i.redrawCircle(V,W,!0,f),i.redrawText(B,q,t.flow,!0),i.redrawRegion(!0),i.redrawGrid(!0)].reduce(function(t,e){return e.forEach(function(e){t.push(e)}),t},[]).forEach(function(t){c.add(t)})}).call(c,function(){f&&f(),a.onrendered&&a.onrendered.call(i)}):(i.redrawBar(z),i.redrawLine(P),i.redrawArea(Y),i.redrawCircle(V,W),i.redrawText(B,q,t.flow),i.redrawRegion(),i.redrawGrid(),a.onrendered&&a.onrendered.call(i)),i.mapToIds(i.data.targets).forEach(function(t){i.withoutFadeIn[t]=!0})},ChartInternal.prototype.updateAndRedraw=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=this,i=e.config,n=void 0;t.withTransition=(0,u.getOption)(t,"withTransition",!0),t.withTransform=(0,u.getOption)(t,"withTransform",!1),t.withLegend=(0,u.getOption)(t,"withLegend",!1),t.withUpdateXDomain=!0,t.withUpdateOrgXDomain=!0,t.withTransitionForExit=!1,t.withTransitionForTransform=(0,u.getOption)(t,"withTransitionForTransform",t.withTransition),e.updateSizes(),t.withLegend&&i.legend_show||(n=e.axis.generateTransitions(t.withTransitionForAxis?i.transition_duration:0),e.updateScales(),e.updateSvgSize(),e.transformAll(t.withTransitionForTransform,n)),e.redraw(t,n)},ChartInternal.prototype.redrawWithoutRescale=function(){this.redraw({withY:!1,withSubchart:!1,withEventRect:!1,withTransitionForAxis:!1})},ChartInternal.prototype.isTimeSeries=function(){return"timeseries"===this.config.axis_x_type},ChartInternal.prototype.isCategorized=function(){return this.config.axis_x_type.indexOf("categor")>=0},ChartInternal.prototype.isCustomX=function(){var t=this,e=t.config;return!t.isTimeSeries()&&(e.data_x||(0,u.notEmpty)(e.data_xs))},ChartInternal.prototype.isTimeSeriesY=function(){return"timeseries"===this.config.axis_y_type},ChartInternal.prototype.getTranslate=function(t){var e=this,i=e.config,n=void 0,a=void 0;return"main"===t?(n=(0,u.asHalfPixel)(e.margin.left),a=(0,u.asHalfPixel)(e.margin.top)):"context"===t?(n=(0,u.asHalfPixel)(e.margin2.left),a=(0,u.asHalfPixel)(e.margin2.top)):"legend"===t?(n=e.margin3.left,a=e.margin3.top):"x"===t?(n=0,a=i.axis_rotated?0:e.height):"y"===t?(n=0,a=i.axis_rotated?e.height:0):"y2"===t?(n=i.axis_rotated?0:e.width,a=i.axis_rotated?1:0):"subx"===t?(n=0,a=i.axis_rotated?0:e.height2):"arc"===t&&(n=e.arcWidth/2,a=e.arcHeight/2),"translate("+n+", "+a+")"},ChartInternal.prototype.initialOpacity=function(t){return null!==t.value&&this.withoutFadeIn[t.id]?"1":"0"},ChartInternal.prototype.initialOpacityForCircle=function(t){return null!==t.value&&this.withoutFadeIn[t.id]?this.opacityForCircle(t):"0"},ChartInternal.prototype.opacityForCircle=function(t){var e=this.config.point_show?"1":"0";return(0,u.isValue)(t.value)?this.isScatterType(t)?"0.5":e:"0"},ChartInternal.prototype.opacityForText=function(){return this.hasDataLabel()?"1":"0"},ChartInternal.prototype.xx=function(t){return this.config.zoom_enabled&&this.zoomScale?t?this.zoomScale(t.x):null:t?this.x(t.x):null},ChartInternal.prototype.xv=function(t){var e=this,i=t.value;return e.isTimeSeries()?i=e.parseDate(t.value):e.isCategorized()&&"string"==typeof t.value&&(i=e.config.axis_x_categories.indexOf(t.value)),Math.ceil(e.x(i))},ChartInternal.prototype.yv=function(t){var e=this,i=t.axis&&"y2"===t.axis?e.y2:e.y;return Math.ceil(i(t.value))},ChartInternal.prototype.subxx=function(t){return t?this.subX(t.x):null},ChartInternal.prototype.transformMain=function(t,e){var i=this,n=void 0,a=void 0,r=void 0;e&&e.axisX?n=e.axisX:(n=i.main.select("."+d.default.axisX),t&&(n=n.transition())),e&&e.axisY?a=e.axisY:(a=i.main.select("."+d.default.axisY),t&&(a=a.transition())),e&&e.axisY2?r=e.axisY2:(r=i.main.select("."+d.default.axisY2),t&&(r=r.transition())),(t?i.main.transition():i.main).attr("transform",i.getTranslate("main")),n.attr("transform",i.getTranslate("x")),a.attr("transform",i.getTranslate("y")),r.attr("transform",i.getTranslate("y2")),i.main.select("."+d.default.chartArcs).attr("transform",i.getTranslate("arc"))},ChartInternal.prototype.transformAll=function(t,e){var i=this;i.transformMain(t,e),i.config.subchart_show&&i.transformContext(t,e),i.legend&&i.transformLegend(t)},ChartInternal.prototype.updateSvgSize=function(){var t=this,e=t.svg.select("."+d.default.brush+" .overlay"),i=e.size()?e.attr("height"):0;t.svg.attr("width",t.currentWidth).attr("height",t.currentHeight),t.svg.selectAll(["#"+t.clipId,"#"+t.clipIdForGrid]).select("rect").attr("width",t.width).attr("height",t.height),t.svg.select("#"+t.clipIdForXAxis).select("rect").attr("x",t.getXAxisClipX.bind(t)).attr("y",t.getXAxisClipY.bind(t)).attr("width",t.getXAxisClipWidth.bind(t)).attr("height",t.getXAxisClipHeight.bind(t)),t.svg.select("#"+t.clipIdForYAxis).select("rect").attr("x",t.getYAxisClipX.bind(t)).attr("y",t.getYAxisClipY.bind(t)).attr("width",t.getYAxisClipWidth.bind(t)).attr("height",t.getYAxisClipHeight.bind(t)),t.svg.select("#"+t.clipIdForSubchart).select("rect").attr("width",t.width).attr("height",i),t.svg.select("."+d.default.zoomRect).attr("width",t.width).attr("height",t.height),t.selectChart.style("max-height",t.currentHeight+"px"),t.brush&&t.brush.scale(t.subX,i)},ChartInternal.prototype.updateDimension=function(t){var e=this;t||(e.config.axis_rotated?(e.axes.x.call(e.xAxis),e.axes.subx.call(e.subXAxis)):(e.axes.y.call(e.yAxis),e.axes.y2.call(e.y2Axis))),e.updateSizes(),e.updateScales(t),e.updateSvgSize(),e.transformAll(!1)},ChartInternal.prototype.observeInserted=function(t){var e=this;if("undefined"==typeof MutationObserver)return void(console&&console.error&&console.error("MutationObserver not defined."));var i=new MutationObserver(function(n){n.forEach(function(n){"childList"===n.type&&n.previousSibling&&(i.disconnect(),e.intervalForObserveInserted=window.setInterval(function(){t.node().parentNode&&(window.clearInterval(e.intervalForObserveInserted),e.updateDimension(),e.brush&&e.brush.update(),e.config.oninit.call(e),e.redraw({withTransform:!0,withUpdateXDomain:!0,withUpdateOrgXDomain:!0,withTransition:!1,withTransitionForTransform:!1,withLegend:!0}),t.transition().style("opacity","1"))},10))})});i.observe(t.node(),{attributes:!0,childList:!0,characterData:!0})},ChartInternal.prototype.bindResize=function(){var t=this,e=t.config;t.resizeFunction=t.generateResize(),t.resizeFunction.add(function(){e.onresize.call(t)}),e.resize_auto&&t.resizeFunction.add(function(){void 0!==t.resizeTimeout&&window.clearTimeout(t.resizeTimeout),t.resizeTimeout=window.setTimeout(function(){delete t.resizeTimeout,t.api.flush()},100)}),t.resizeFunction.add(function(){e.onresized.call(t)}),(0,u.addEvent)(window,"resize",t.resizeFunction)},ChartInternal.prototype.generateResize=function(){function callResizeFunctions(){t.forEach(function(t){return t()})}var t=[];return callResizeFunctions.add=function(e){t.push(e)},callResizeFunctions.remove=function(e){for(var i=0;i2){for(o=c-2,a=t[0],r=t[t.length-1],s=(r-a)/(o+1),n=[a],d=0;d0&&e[0]>0&&e.unshift(e[0]-(e[1]-e[0])),e}function copyScale(){var i=e.copy();if(t.isCategory||!i.domain().length){var n=e.domain();i.domain([n[0],n[1]-1])}return i}function textFormatted(t){var e=u?u(t):t;return void 0===e?"":e}function getSizeFor1Char(t){if(o)return o;var e={h:11.5,w:5.5};return t.select("text").text(textFormatted).each(function(t){var i=this.getBoundingClientRect(),n=textFormatted(t),a=i.height,r=n?i.width/n.length:void 0;a&&r&&(e.h=a,e.w=r)}).text(""),o=e,e}function transitionise(e){return t.withoutTransition?e:e.transition(p)}function axis(a){a.each(function(){function splitTickText(e,i){function split(t,e){o=void 0;for(var i=1;i0?1:-1):F}(M)).style("text-anchor",function(t){return t?t>0?"start":"end":"middle"}(M)).attr("transform",function(t){return t?"rotate("+t+")":""}(M)),C.attr("x",0).attr("dy",tspanDy).attr("dx",function(t){return t?8*Math.sin(Math.PI*(t/180)):0}(M)),A.attr("d","M"+b[0]+","+s+"V0H"+b[1]+"V"+s)):"top"===i?(v=axisX,w.attr("y2",-n),D.attr("y",-F),L.attr("x2",0).attr("y2",-n),S.attr("x",0).attr("y",-F),k.style("text-anchor","middle"),C.attr("x",0).attr("dy","0em"),A.attr("d","M"+b[0]+","+-s+"V0H"+b[1]+"V"+-s)):"left"===i?(v=axisY,w.attr("x2",-n),D.attr("x",-F),L.attr("x2",-n).attr("y1",y).attr("y2",y),S.attr("x",-F).attr("y",f),k.style("text-anchor","end"),C.attr("x",-F).attr("dy",tspanDy),A.attr("d","M"+-s+","+b[0]+"H0V"+b[1]+"H"+-s)):"right"===i&&(v=axisY,w.attr("x2",n),D.attr("x",F),L.attr("x2",n).attr("y2",0),S.attr("x",F).attr("y",0),k.style("text-anchor","start"),C.attr("x",F).attr("dy",tspanDy),A.attr("d","M"+s+","+b[0]+"H0V"+b[1]+"H"+s)),u.bandwidth){var E=u,O=E.bandwidth()/2;o=function(t){return E(t)+O},u=o}else o.bandwidth?o=u:x.call(v,u);p.call(v,o),_.call(v,u)})}var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=(0,r.scaleLinear)(),i="bottom",n=6,s=t.withOuterTick?6:0,l=3,d=null,u=void 0,c=void 0,f=0,g=!0,h=void 0,p=void 0;return axis.scale=function(t){return arguments.length?(e=t,axis):e},axis.orient=function(t){return arguments.length?(i=t in{top:1,right:1,bottom:1,left:1}?t+"":"bottom",axis):i},axis.tickFormat=function(t){return arguments.length?(u=t,axis):u},axis.tickCentered=function(t){return arguments.length?(h=t,axis):h},axis.tickOffset=function(){return f},axis.tickInterval=function(){var e=void 0;if(t.isCategory)e=2*f;else{e=(axis.g.select("path.domain").node().getTotalLength()-2*s)/axis.g.selectAll("line").size()}return e===1/0?0:e},axis.ticks=function(){for(var t=arguments.length,e=Array(t),i=0;i1&&(n.axis_x_categories[t]=e,i.redraw()),n.axis_x_categories[t]},categories:function(t){var e=this.internal,i=e.config;return arguments.length?(i.axis_x_categories=t,e.redraw(),i.axis_x_categories):i.axis_x_categories}})},function(t,e,i){"use strict";var n=i(4),a=function(t){return t&&t.__esModule?t:{"default":t}}(n),r=i(60),o=i(0);(0,o.extend)(a.default.prototype,{resize:function(t){var e=this.internal.config;e.size_width=t?t.width:null,e.size_height=t?t.height:null,this.flush()},flush:function(){this.internal.updateAndRedraw({withLegend:!0,withTransition:!1,withTransitionForTransform:!1})},destroy:function(){var t=this.internal;return r.window.clearInterval(t.intervalForObserveInserted),void 0!==t.resizeTimeout&&r.window.clearTimeout(t.resizeTimeout),(0,o.removeEvent)(r.window,"resize",t.resizeFunction),t.selectChart.classed("bb",!1).html(""),Object.keys(t).forEach(function(e){t[e]=null}),null}})},function(t,e,i){"use strict";var n=i(4),a=function(t){return t&&t.__esModule?t:{"default":t}}(n);(0,i(0).extend)(a.default.prototype,{color:function(t){return this.internal.color(t)}})},function(t,e,i){"use strict";var n=i(4),a=function(t){return t&&t.__esModule?t:{"default":t}}(n),r=i(0),o=function(t){var e=this.internal.data.targets;return void 0===t?e:e.filter(function(e){return[].concat(t).indexOf(e.id)>=0})};o.shown=function(t){return this.internal.filterTargetsToShow(this.data(t))},o.values=function(t){var e=null;if(t){var i=this.data(t);i&&i[0]&&(e=i[0].values.map(function(t){return t.value}))}return e},o.names=function(t){return this.internal.clearLegendItemTextBoxCache(),this.internal.updateDataAttributes("names",t)},o.colors=function(t){return this.internal.updateDataAttributes("colors",t)},o.axes=function(t){return this.internal.updateDataAttributes("axes",t)},(0,r.extend)(a.default.prototype,{data:o})},function(t,e,i){"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}var n=i(2),a=i(4),r=_interopRequireDefault(a),o=i(1),s=_interopRequireDefault(o),l=i(0),d=i(3),u=_interopRequireDefault(d);(0,l.extend)(r.default.prototype,{flow:function(t){var e=this.internal,i=[],n=e.getMaxDataCount(),a=void 0,r=void 0,o=0,s=0,d=void 0,u=void 0;if(t.json)a=e.convertJsonToData(t.json,t.keys);else if(t.rows)a=e.convertRowsToData(t.rows);else{if(!t.columns)return;a=e.convertColumnsToData(t.columns)}var c=e.convertDataToTargets(a,!0);e.data.targets.forEach(function(t){var n=!1,a=void 0,r=void 0;for(a=0;a1?f.values[f.values.length-1].x-g.x:g.x-e.getXDomain(e.data.targets)[0]:1,r=[g.x-d,g.x],e.updateXDomain(null,!0,!0,!1,r)),e.updateTargets(e.data.targets),e.redraw({flow:{index:g.index,length:o,duration:(0,l.isValue)(t.duration)?t.duration:e.config.transition_duration,done:t.done,orgDataCount:n},withLegend:!0,withTransition:n>1,withTrimXDomain:!1,withUpdateXAxis:!0})}}),(0,l.extend)(s.default.prototype,{generateFlow:function(t){var e=this,i=e.config;return function(){var a=t.targets,r=t.flow,o=t.drawBar,s=t.drawLine,d=t.drawArea,c=t.cx,f=t.cy,g=t.xv,h=t.xForText,p=t.yForText,x=t.duration,_=void 0,v=1,m=r.index,y=r.length,b=e.getValueOnIndex(e.data.targets[0].values,m),T=e.getValueOnIndex(e.data.targets[0].values,m+y),A=e.x.domain(),w=r.duration||x,L=r.done||function(){},D=e.generateWait(),S=e.xgrid||(0,n.selectAll)([]),C=e.xgridLines||(0,n.selectAll)([]),R=e.mainRegion||(0,n.selectAll)([]),I=e.mainText||(0,n.selectAll)([]),F=e.mainBar||(0,n.selectAll)([]),X=e.mainLine||(0,n.selectAll)([]),k=e.mainArea||(0,n.selectAll)([]),M=e.mainCircle||(0,n.selectAll)([]);e.flowing=!0,e.data.targets.forEach(function(t){t.values.splice(0,y)});var E=e.updateXDomain(a,!0,!0);e.updateXGrid&&e.updateXGrid(!0),r.orgDataCount?_=1===r.orgDataCount||(b&&b.x)===(T&&T.x)?e.x(A[0])-e.x(E[0]):e.isTimeSeries()?e.x(A[0])-e.x(E[0]):e.x(b.x)-e.x(T.x):1===e.data.targets[0].values.length?e.isTimeSeries()?(b=e.getValueOnIndex(e.data.targets[0].values,0),T=e.getValueOnIndex(e.data.targets[0].values,e.data.targets[0].values.length-1),_=e.x(b.x)-e.x(T.x)):_=(0,l.diffDomain)(E)/2:_=e.x(A[0])-e.x(E[0]),v=(0,l.diffDomain)(A)/(0,l.diffDomain)(E);var O="translate("+_+",0) scale("+v+",1)";e.hideXGridFocus();var Y=(0,n.transition)().ease(n.easeLinear).duration(w);D.add([e.axes.x.transition(Y).call(e.xAxis.setTransition(Y)),F.transition(Y).attr("transform",O),X.transition(Y).attr("transform",O),k.transition(Y).attr("transform",O),M.transition(Y).attr("transform",O),I.transition(Y).attr("transform",O),R.filter(e.isRegionOnX).transition(Y).attr("transform",O),S.transition(Y).attr("transform",O),C.transition(Y).attr("transform",O)]),Y.call(D,function(){var t=void 0,n=[],a=[],r=[];if(y){for(t=0;t=0&&(e=!0)}),!e)}),i.regions},(0,s.extend)(a.default.prototype,{regions:l})},function(t,e,i){"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}var n=i(2),a=i(4),r=_interopRequireDefault(a),o=i(0),s=i(3),l=_interopRequireDefault(s);(0,o.extend)(r.default.prototype,{selected:function(t){var e=this.internal,i=[];return e.main.selectAll("."+(l.default.shapes+e.getTargetSelectorSuffix(t))).selectAll("."+l.default.shape).filter(function(){return(0,n.select)(this).classed(l.default.SELECTED)}).each(function(t){return i.push(t)}),i},select:function(t,e,i){var a=this.internal,r=a.config;r.data_selection_enabled&&a.main.selectAll("."+l.default.shapes).selectAll("."+l.default.shape).each(function(s,d){var u=(0,n.select)(this),c=s.data?s.data.id:s.id,f=a.getToggle(this,s).bind(a),g=r.data_selection_grouped||!t||t.indexOf(c)>=0,h=!e||e.indexOf(d)>=0,p=u.classed(l.default.SELECTED);u.classed(l.default.line)||u.classed(l.default.area)||(g&&h?r.data_selection_isselectable(s)&&!p&&f(!0,u.classed(l.default.SELECTED,!0),s,d):(0,o.isDefined)(i)&&i&&p&&f(!1,u.classed(l.default.SELECTED,!1),s,d))})},unselect:function(t,e){var i=this.internal,a=i.config;a.data_selection_enabled&&i.main.selectAll("."+l.default.shapes).selectAll("."+l.default.shape).each(function(r,o){var s=(0,n.select)(this),d=r.data?r.data.id:r.id,u=i.getToggle(this,r).bind(i),c=a.data_selection_grouped||!t||t.indexOf(d)>=0,f=!e||e.indexOf(o)>=0,g=s.classed(l.default.SELECTED);s.classed(l.default.line)||s.classed(l.default.area)||c&&f&&a.data_selection_isselectable(r)&&g&&u(!1,s.classed(l.default.SELECTED,!1),r,o)})}})},function(t,e,i){"use strict";var n=i(4),a=function(t){return t&&t.__esModule?t:{"default":t}}(n);(0,i(0).extend)(a.default.prototype,{show:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=this.internal,n=i.mapToTargetIds(t);i.removeHiddenTargetIds(n);var a=i.svg.selectAll(i.selectorTargets(n));a.transition().style("opacity","1","important").call(i.endall,function(){a.style("opacity",null).style("opacity","1")}),e.withLegend&&i.showLegend(n),i.redraw({withUpdateOrgXDomain:!0,withUpdateXDomain:!0,withLegend:!0})},hide:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=this.internal,n=i.mapToTargetIds(t);i.addHiddenTargetIds(n);var a=i.svg.selectAll(i.selectorTargets(n));a.transition().style("opacity","0","important").call(i.endall,function(){a.style("opacity",null).style("opacity","0")}),e.withLegend&&i.hideLegend(n),i.redraw({withUpdateOrgXDomain:!0,withUpdateXDomain:!0,withLegend:!0})},toggle:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=this,n=this.internal;n.mapToTargetIds(t).forEach(function(t){n.isTargetToShow(t)?i.hide(t,e):i.show(t,e)})}})},function(t,e,i){"use strict";var n=i(4),a=function(t){return t&&t.__esModule?t:{"default":t}}(n),r=i(0),o=function(){};o.show=function(t){var e=this.internal,i=void 0,n=void 0;t.mouse&&(n=t.mouse),t.data?e.isMultipleX()?(n=[e.x(t.data.x),e.getYScale(t.data.id)(t.data.value)],i=null):i=(0,r.isValue)(t.data.index)?t.data.index:e.getIndexByX(t.data.x):void 0===t.x?void 0!==t.index&&(i=t.index):i=e.getIndexByX(t.x),e.dispatchEvent("mouseover",i,n),e.dispatchEvent("mousemove",i,n),e.config.tooltip_onshow.call(e,t.data)},o.hide=function(){this.internal.dispatchEvent("mouseout",0),this.internal.config.tooltip_onhide.call(this)},(0,r.extend)(a.default.prototype,{tooltip:o})},function(t,e,i){"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}var n=i(4),a=_interopRequireDefault(n),r=i(1),o=_interopRequireDefault(r),s=i(0);(0,s.extend)(a.default.prototype,{transform:function(t,e){var i=this.internal,n=["pie","donut"].indexOf(t)>=0?{withTransform:!0}:null;i.transformTo(e,t,n)}}),(0,s.extend)(o.default.prototype,{transformTo:function(t,e,i){var n=this,a=!n.hasArcType(),r=i||{withTransitionForAxis:a};r.withTransitionForTransform=!1,n.transiting=!1,n.setTargetType(t,e),n.updateTargets(n.data.targets),n.updateAndRedraw(r)}})},function(t,e,i){"use strict";var n=i(4),a=function(t){return t&&t.__esModule?t:{"default":t}}(n);(0,i(0).extend)(a.default.prototype,{x:function(t){var e=this.internal;return arguments.length&&(e.updateTargetX(e.data.targets,t),e.redraw({withUpdateOrgXDomain:!0,withUpdateXDomain:!0})),e.data.xs},xs:function(t){var e=this.internal;return arguments.length&&(e.updateTargetXs(e.data.targets,t),e.redraw({withUpdateOrgXDomain:!0,withUpdateXDomain:!0})),e.data.xs}})},function(t,e,i){"use strict";var n=i(2),a=i(4),r=function(t){return t&&t.__esModule?t:{"default":t}}(a),o=i(0),s=function(t){var e=this.internal,i=t,a=void 0;if(i){if(e.isTimeSeries()&&(i=i.map(function(t){return e.parseDate(t)})),e.config.subchart_show){var r=e.zoomScale||e.x;e.brush.getSelection().call(e.brush.move,[r(i[0]),r(i[1])]),a=i}else{var o=e.x.orgDomain(),s=(o[1]-o[0])/(i[1]-i[0]),l=e.isTimeSeries()?0-s*e.x(i[0].getTime()):i[0]-s*e.x(i[0]);e.zoom.updateTransformScale(n.zoomIdentity.translate(l,0).scale(s)),a=e.zoomScale.domain()}e.redraw({withTransition:!0,withY:e.config.zoom_rescale}),e.config.zoom_onzoom.call(this,e.x.orgDomain())}else a=(e.zoomScale||e.x).domain();return a};s.enable=function(t){var e=this.internal;e.config.zoom_enabled=t,e.updateAndRedraw()},s.max=function(t){var e=this.internal,i=e.config;if(0!==t&&!t)return i.zoom_x_max;i.zoom_x_max=(0,n.max)([e.orgXDomain[1],t])},s.min=function(t){var e=this.internal,i=e.config;if(0!==t&&!t)return i.zoom_x_min;i.zoom_x_min=(0,n.min)([e.orgXDomain[0],t])},s.range=function(t){if(!arguments.length)return{max:this.domain.max(),min:this.domain.min()};(0,o.isDefined)(t.max)&&this.domain.max(t.max),(0,o.isDefined)(t.min)&&this.domain.min(t.min)},(0,o.extend)(r.default.prototype,{zoom:s,unzoom:function(){var t=this.internal;t.config.subchart_show?t.brush.getSelection().call(t.brush.move,null):t.zoom.updateTransformScale(n.zoomIdentity),t.redraw({withTransition:!0,withY:t.config.zoom_rescale})}})},function(t,e,i){"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}var n=i(5),a=_interopRequireDefault(n),r=i(58),o=_interopRequireDefault(r),s=i(1),l=_interopRequireDefault(s),d=i(0);(0,d.extend)(l.default.prototype,{getOptions:function(){var t=new o.default;return(0,d.merge)(t.value,this.additionalConfig)},additionalConfig:{},loadConfig:function(t){function find(){var t=n.shift();return t&&i&&"object"===(void 0===i?"undefined":(0,a.default)(i))&&t in i?(i=i[t],find()):t?void 0:i}var e=this.config,i=void 0,n=void 0,r=void 0;Object.keys(e).forEach(function(a){i=t,n=a.split("_"),r=find(),(0,d.isDefined)(r)&&(e[a]=r)})}})},function(t,e,i){"use strict";var n=i(2),a=i(1),r=function(t){return t&&t.__esModule?t:{"default":t}}(a),o=i(0);(0,o.extend)(r.default.prototype,{convertUrlToData:function(t){var e=this,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"csv",a=arguments[2],r=arguments[3],o=arguments[4],s=i,l=(0,n.request)(t);if(a)for(var d=Object.keys(a),u=Array.isArray(d),c=0,d=u?d:d[Symbol.iterator]();;){var f;if(u){if(c>=d.length)break;f=d[c++]}else{if(c=d.next(),c.done)break;f=c.value}var g=f;l.header(g,a[g])}l.get(function(t,i){var n=void 0;if(!i)throw new Error(t.responseURL+" "+t.status+" ("+t.statusText+")");var a=i.response||i.responseText;n="json"===s?e.convertJsonToData(JSON.parse(a),r):"tsv"===s?e.convertTsvToData(a):e.convertCsvToData(a),o.call(e,n)})},convertCsvToData:function(t){var e=(0,n.csvParseRows)(t),i=void 0;return 1===e.length?(i=[{}],e[0].forEach(function(t){i[0][t]=null})):i=(0,n.csvParse)(t),i},convertTsvToData:function(t){var e=(0,n.tsvParseRows)(t),i=void 0;return 1===e.length?(i=[{}],e[0].forEach(function(t){i[0][t]=null})):i=(0,n.tsvParse)(t),i},convertJsonToData:function(t,e){var i=this,n=[],a=void 0,r=void 0;return e?(e.x?(a=e.value.concat(e.x),this.config.data_x=e.x):a=e.value,n.push(a),t.forEach(function(t){for(var e=[],r=void 0,s=a,l=Array.isArray(s),d=0,s=l?s:s[Symbol.iterator]();;){var u;if(l){if(d>=s.length)break;u=s[d++]}else{if(d=s.next(),d.done)break;u=d.value}var c=u;r=i.findValueInJson(t,c),(0,o.isUndefined)(r)&&(r=null),e.push(r)}n.push(e)}),r=this.convertRowsToData(n)):(Object.keys(t).forEach(function(e){return n.push([e].concat(t[e]))}),r=this.convertColumnsToData(n)),r},findValueInJson:function(t,e){for(var i=e.replace(/\[(\w+)\]/g,".$1"),n=i.replace(/^\./,"").split("."),a=t,r=n,o=Array.isArray(r),s=0,r=o?r:r[Symbol.iterator]();;){var l;if(o){if(s>=r.length)break;l=r[s++]}else{if(s=r.next(),s.done)break;l=s.value}var d=l;if(!(d in a)){a=void 0;break}a=a[d]}return a},convertRowsToData:function(t){var e=t[0],i=[],n={},a=void 0,r=void 0;for(a=1;a=0?i.data.xs[n]=(e&&a.data.xs[n]?a.data.xs[n]:[]).concat(t.map(function(t){return t[s]}).filter(o.isValue).map(function(t,e){return a.generateTargetX(t,n,e)})):r.data_x?i.data.xs[n]=i.getOtherTargetXs():(0,o.notEmpty)(r.data_xs)&&(a.data.xs[n]=a.getXValuesOfXKey(s,a.data.targets)):a.data.xs[n]=t.map(function(t,e){return e})}),s.forEach(function(t){if(!a.data.xs[t])throw new Error('x is not defined for id = "'+t+'".')});var d=s.map(function(e,i){var n=r.data_idConverter(e);return{id:n,id_org:e,values:t.map(function(t,s){var l=a.getXKey(e),d=t[l],u=null===t[e]||isNaN(t[e])?null:+t[e],c=void 0;return a.isCustomX()&&a.isCategorized()&&0===i&&!(0,o.isUndefined)(d)?(0===i&&0===s&&(r.axis_x_categories=[]),-1===(c=r.axis_x_categories.indexOf(d))&&(c=r.axis_x_categories.length,r.axis_x_categories.push(d))):c=a.generateTargetX(d,e,s),((0,o.isUndefined)(t[e])||a.data.xs[e].length<=s)&&(c=void 0),{x:c,value:u,id:n}}).filter(function(t){return(0,o.isDefined)(t.x)})}});return d.forEach(function(t){var e=void 0;r.data_xSort&&(t.values=t.values.sort(function(t,e){return(t.x||0===t.x?t.x:1/0)-(e.x||0===e.x?e.x:1/0)})),e=0,t.values.forEach(function(t){t.index=e++}),a.data.xs[t.id].sort(function(t,e){return t-e})}),a.hasNegativeValue=a.hasNegativeValueInTargets(d),a.hasPositiveValue=a.hasPositiveValueInTargets(d),r.data_type&&a.setTargetType(a.mapToIds(d).filter(function(t){return!(t in r.data_types)}),r.data_type),d.forEach(function(t){a.addCache(t.id_org,t)}),d}})},function(t,e,i){"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}var n=i(5),a=_interopRequireDefault(n),r=i(2),o=i(3),s=_interopRequireDefault(o),l=i(1),d=_interopRequireDefault(l),u=i(0);(0,u.extend)(d.default.prototype,{isX:function(t){var e=this,i=e.config,n=i.data_x&&t===i.data_x,a=(0,u.notEmpty)(i.data_xs)&&(0,u.hasValue)(i.data_xs,t);return n||a},isNotX:function(t){return!this.isX(t)},getXKey:function(t){var e=this,i=e.config;return i.data_x?i.data_x:(0,u.notEmpty)(i.data_xs)?i.data_xs[t]:null},getXValuesOfXKey:function(t,e){var i=this,n=e&&(0,u.notEmpty)(e)?i.mapToIds(e):[],a=void 0;return n.forEach(function(e){i.getXKey(e)===t&&(a=i.data.xs[e])}),a},getIndexByX:function(t){var e=this,i=e.filterByX(e.data.targets,t);return i.length?i[0].index:null},getXValue:function(t,e){var i=this;return t in i.data.xs&&i.data.xs[t]&&(0,u.isValue)(i.data.xs[t][e])?i.data.xs[t][e]:e},getOtherTargetXs:function(){var t=this,e=Object.keys(t.data.xs);return e.length?t.data.xs[e[0]]:null},getOtherTargetX:function(t){var e=this.getOtherTargetXs();return e&&t1},isMultipleX:function(){return(0,u.notEmpty)(this.config.data_xs)||!this.config.data_xSort||this.hasType("scatter")},addName:function(t){var e=this,i=void 0;return t&&(i=e.config.data_names[t.id],t.name=void 0===i?t.id:i),t},getValueOnIndex:function(t,e){var i=t.filter(function(t){return t.index===e});return i.length?i[0]:null},updateTargetX:function(t,e){var i=this;t.forEach(function(t){t.values.forEach(function(n,a){n.x=i.generateTargetX(e[a],t.id,a)}),i.data.xs[t.id]=e})},updateTargetXs:function(t,e){var i=this;t.forEach(function(t){e[t.id]&&i.updateTargetX([t],e[t.id])})},generateTargetX:function(t,e,i){var n=this;return n.isTimeSeries()?t?n.parseDate(t):n.parseDate(n.getXValue(e,i)):n.isCustomX()&&!n.isCategorized()?(0,u.isValue)(t)?+t:n.getXValue(e,i):i},cloneTarget:function(t){return{id:t.id,id_org:t.id_org,values:t.values.map(function(t){return{x:t.x,value:t.value,id:t.id}})}},updateXs:function(){var t=this;t.data.targets.length&&(t.xs=[],t.data.targets[0].values.forEach(function(e){t.xs[e.index]=e.x}))},getPrevX:function(t){var e=this.xs[t-1];return void 0===e?null:e},getNextX:function(t){var e=this.xs[t+1];return void 0===e?null:e},getMaxDataCount:function(){var t=this;return(0,r.max)(t.data.targets,function(t){return t.values.length})},getMaxDataCountTarget:function(t){var e=t.length,i=0,n=void 0;return e>1?t.forEach(function(t){t.values.length>i&&(n=t,i=t.values.length)}):n=e?t[0]:null,n},getEdgeX:function(t){return t.length?[(0,r.min)(t,function(t){return t.values[0].x}),(0,r.max)(t,function(t){return t.values[t.values.length-1].x})]:[0,0]},mapToIds:function(t){return t.map(function(t){return t.id})},mapToTargetIds:function(t){var e=this;return t?[].concat(t):e.mapToIds(e.data.targets)},hasTarget:function(t,e){var i=this.mapToIds(t),n=void 0;for(n=0;ne?1:t>=e?0:NaN})},addHiddenTargetIds:function(t){this.hiddenTargetIds=this.hiddenTargetIds.concat(t)},removeHiddenTargetIds:function(t){this.hiddenTargetIds=this.hiddenTargetIds.filter(function(e){return t.indexOf(e)<0})},addHiddenLegendIds:function(t){this.hiddenLegendIds=this.hiddenLegendIds.concat(t)},removeHiddenLegendIds:function(t){this.hiddenLegendIds=this.hiddenLegendIds.filter(function(e){return t.indexOf(e)<0})},getValuesAsIdKeyed:function(t){var e={};return t.forEach(function(t){e[t.id]=[],t.values.forEach(function(i){e[t.id].push(i.value)})}),e},checkValueInTargets:function(t,e){var i=Object.keys(t),n=void 0,a=void 0,r=void 0;for(n=0;n0})},isOrderDesc:function(){var t=this.config;return"string"==typeof t.data_order&&"desc"===t.data_order.toLowerCase()},isOrderAsc:function(){var t=this.config;return"string"==typeof t.data_order&&"asc"===t.data_order.toLowerCase()},orderTargets:function(t){var e=this,i=e.config,n=e.isOrderAsc(),a=e.isOrderDesc();return n||a?t.sort(function(t,e){var i=function(t,e){return t+Math.abs(e.value)},a=t.values.reduce(i,0),r=e.values.reduce(i,0);return n?r-a:a-r}):(0,u.isFunction)(i.data_order)&&t.sort(i.data_order),t},filterByX:function(t,e){return(0,r.merge)(t.map(function(t){return t.values})).filter(function(t){return t.x-e==0})},filterRemoveNull:function(t){return t.filter(function(t){return(0,u.isValue)(t.value)})},filterByXDomain:function(t,e){return t.map(function(t){return{id:t.id,id_org:t.id_org,values:t.values.filter(function(t){return e[0]<=t.x&&t.x<=e[1]})}})},hasDataLabel:function(){var t=this.config;return!("boolean"!=typeof t.data_labels||!t.data_labels)||"object"===(0,a.default)(t.data_labels)&&(0,u.notEmpty)(t.data_labels)},getDataLabelLength:function(t,e,i){var n=this,a=[0,0];return n.selectChart.select("svg").selectAll(".dummy").data([t,e]).enter().append("text").text(function(t){return n.dataLabelFormat(t.id)(t)}).each(function(t,e){a[e]=1.3*this.getBoundingClientRect()[i]}).remove(),a},isNoneArc:function(t){return this.hasTarget(this.data.targets,t.id)},isArc:function(t){return"data"in t&&this.hasTarget(this.data.targets,t.data.id)},findSameXOfValues:function(t,e){var i=t[e].x,n=[],a=void 0;for(a=e-1;a>=0&&i===t[a].x;a--)n.push(t[a]);for(a=e;a0;i--)e[i]=e[i-1];return e[0]={x:e[0].x-1,value:e[0].value,id:e[0].id},e[t.length+1]={x:e[t.length].x+1,value:e[t.length].value,id:e[t.length].id},e},updateDataAttributes:function(t,e){var i=this,n=i.config,a=n["data_"+t];return void 0===e?a:(Object.keys(e).forEach(function(t){a[t]=e[t]}),i.redraw({withLegend:!0}),a)}})},function(t,e,i){"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}var n=i(3),a=_interopRequireDefault(n),r=i(1),o=_interopRequireDefault(r);(0,i(0).extend)(o.default.prototype,{load:function(t,e){var i=this,n=t;n&&(e.filter&&(n=n.filter(e.filter)),(e.type||e.types)&&n.forEach(function(t){var n=e.types&&e.types[t.id]?e.types[t.id]:e.type;i.setTargetType(t.id,n)}),i.data.targets.forEach(function(t){for(var e=0;e.375?1.175-36/e.radius:.8)*e.radius/s:0),u="translate("+r*d+","+o*d+")"),u},getArcRatio:function(t){var e=this,i=e.config,n=Math.PI*(e.hasType("gauge")&&!i.gauge_fullCircle?1:2);return t?(t.endAngle-t.startAngle)/n:null},convertToArcData:function(t){return this.addName({id:t.data.id,value:t.value,ratio:this.getArcRatio(t),index:t.index})},textForArcLabel:function(t){var e=this;if(!e.shouldShowArcLabel())return"";var i=e.updateAngle(t),n=i?i.value:null,a=e.getArcRatio(i),r=t.data.id;if(!e.hasType("gauge")&&!e.meetsArcLabelThreshold(a))return"";var o=e.getArcLabelFormat();return o?o(n,a,r):e.defaultArcValueFormat(n,a)},textForGaugeMinMax:function(t,e){var i=this.getGaugeLabelExtents();return i?i(t,e):t},expandArc:function(t){var e=this,i=void 0;if(e.transiting)return void(i=window.setInterval(function(){e.transiting||(window.clearInterval(i),e.legend.selectAll(".bb-legend-item-focused").size()>0&&e.expandArc(t))},10));var a=e.mapToTargetIds(t);e.svg.selectAll(e.selectorTargets(a,"."+s.default.chartArc)).each(function(t){e.shouldExpand(t.data.id)&&(0,n.select)(this).selectAll("path").transition().duration(e.expandDuration(t.data.id)).attr("d",e.svgArcExpanded).transition().duration(2*e.expandDuration(t.data.id)).attr("d",e.svgArcExpandedSub).each(function(t){e.isDonutType(t.data)})})},unexpandArc:function(t){var e=this;if(!e.transiting){var i=e.mapToTargetIds(t);e.svg.selectAll(e.selectorTargets(i,"."+s.default.chartArc)).selectAll("path").transition().duration(function(t){return e.expandDuration(t.data.id)}).attr("d",e.svgArc),e.svg.selectAll(""+s.default.arc).style("opacity","1")}},expandDuration:function(t){var e=this,i=e.config;return e.isDonutType(t)?i.donut_expand_duration:e.isGaugeType(t)?i.gauge_expand_duration:e.isPieType(t)?i.pie_expand_duration:50},shouldExpand:function(t){var e=this,i=e.config;return e.isDonutType(t)&&i.donut_expand||e.isGaugeType(t)&&i.gauge_expand||e.isPieType(t)&&i.pie_expand},shouldShowArcLabel:function(){var t=this,e=t.config,i=!0;return t.hasType("donut")?i=e.donut_label_show:t.hasType("pie")&&(i=e.pie_label_show),i},meetsArcLabelThreshold:function(t){var e=this,i=e.config;return t>=(e.hasType("donut")?i.donut_label_threshold:i.pie_label_threshold)},getArcLabelFormat:function(){var t=this,e=t.config,i=e.pie_label_format;return t.hasType("gauge")?i=e.gauge_label_format:t.hasType("donut")&&(i=e.donut_label_format),i},getGaugeLabelExtents:function(){return this.config.gauge_label_extents},getArcTitle:function(){var t=this;return t.hasType("donut")?t.config.donut_title:""},updateTargetsForArc:function(t){var e=this,i=e.main,n=e.classChartArc.bind(e),a=e.classArcs.bind(e),r=e.classFocus.bind(e),o=i.select("."+s.default.chartArcs).selectAll("."+s.default.chartArc).data(e.pie(t)).attr("class",function(t){return n(t)+r(t.data)}),l=o.enter().append("g").attr("class",n);l.append("g").attr("class",a).merge(o),l.append("text").attr("dy",e.hasType("gauge")?"-.1em":".35em").style("opacity","0").style("text-anchor","middle").style("pointer-events","none")},initArc:function(){var t=this;t.arcs=t.main.select("."+s.default.chart).append("g").attr("class",s.default.chartArcs).attr("transform",t.getTranslate("arc")),t.arcs.append("text").attr("class",s.default.chartArcsTitle).style("text-anchor","middle").text(t.getArcTitle())},redrawArc:function(t,e,i){function selectArc(t,e,i){a.expandArc(i),a.api.focus(i),a.toggleFocusLegend(i,!0),a.showTooltip([e],t)}function unselectArc(t){var e=t&&t.id||void 0;a.unexpandArc(e),a.api.revert(),a.revertLegend(),a.hideTooltip()}var a=this,r=a.config,o=a.main,l="touch"===a.inputType,d="mouse"===a.inputType,u=o.selectAll("."+s.default.arcs).selectAll("."+s.default.arc).data(a.arcData.bind(a));if(u.exit().transition().duration(e).style("opacity","0").remove(),u=u.enter().append("path").attr("class",a.classArc.bind(a)).style("fill",function(t){return a.color(t.data)}).style("cursor",function(t){return r.interaction_enabled&&(r.data_selection_isselectable(t)?"pointer":null)}).style("opacity","0").each(function(t){a.isGaugeType(t.data)&&(t.startAngle=r.gauge_startingAngle,t.endAngle=r.gauge_startingAngle),this._current=t}).merge(u),u.attr("transform",function(t){return!a.isGaugeType(t.data)&&i?"scale(0)":""}).style("opacity",function(t){return t===this._current?"0":"1"}).on(d?"mouseover":void 0,r.interaction_enabled?function(t){if(!a.transiting){var e=a.updateAngle(t),i=e?a.convertToArcData(e):null;selectArc(this,i,i&&i.id||void 0),a.config.data_onover(i,this)}}:null).on(d?"mouseout":void 0,r.interaction_enabled?function(t){if(!a.transiting){var e=a.updateAngle(t),i=e?a.convertToArcData(e):null;unselectArc(),a.config.data_onout(i,this)}}:null).on(d?"mousemove":void 0,r.interaction_enabled?function(t){var e=a.updateAngle(t),i=e?a.convertToArcData(e):null;a.showTooltip([i],this)}:null).on(d?"click":void 0,r.interaction_enabled?function(t,e){var i=a.updateAngle(t),n=void 0;i&&(n=a.convertToArcData(i),a.toggleShape&&a.toggleShape(this,n,e),a.config.data_onclick.call(a.api,n,this))}:null).each(function(){a.transiting=!0}).transition().duration(t).attrTween("d",function(t){var e=a.updateAngle(t);if(!e)return function(){return"M 0 0"};isNaN(this._current.startAngle)&&(this._current.startAngle=0),isNaN(this._current.endAngle)&&(this._current.endAngle=this._current.startAngle);var i=(0,n.interpolate)(this._current,e);return this._current=i(0),function(e){var n=i(e);return n.data=t.data,a.getArc(n,!0)}}).attr("transform",i?"scale(1)":"").style("fill",function(t){return a.levelColor?a.levelColor(t.data.values[0].value):a.color(t.data.id)}).style("opacity","1").call(a.endall,function(){a.transiting=!1}),l&&r.interaction_enabled&&a.hasArcType()){var c=function(){var t=n.event.changedTouches[0];return(0,n.select)(document.elementFromPoint(t.clientX,t.clientY))};a.svg.on("touchstart",function(){if(!a.transiting){var t=c(),e=t.datum(),i=e&&e.data&&e.data.id?a.updateAngle(e):null,n=i?a.convertToArcData(i):null,r=n&&n.id||void 0;void 0===r?unselectArc():selectArc(this,n,r),a.config.data_onover(n,this)}}).on("touchend",function(){if(!a.transiting){var t=c(),e=t.datum(),i=e&&e.data&&e.data.id?a.updateAngle(e):null,n=i?a.convertToArcData(i):null,r=n&&n.id||void 0;void 0===r?unselectArc():selectArc(this,n,r),a.config.data_onout(n,this)}}).on("touchmove",function(){var t=c(),e=t.datum(),i=e&&e.data&&e.data.id?a.updateAngle(e):null,n=i?a.convertToArcData(i):null,r=n&&n.id||void 0;void 0===r?unselectArc():selectArc(this,n,r)})}o.selectAll("."+s.default.chartArc).select("text").style("opacity","0").attr("class",function(t){return a.isGaugeType(t.data)?s.default.gaugeValue:""}).text(a.textForArcLabel.bind(a)).attr("transform",a.transformForArcLabel.bind(a)).style("font-size",function(t){return a.isGaugeType(t.data)?Math.round(a.radius/5)+"px":""}).transition().duration(t).style("opacity",function(t){return a.isTargetToShow(t.data.id)&&a.isArcType(t.data)?"1":"0"}),o.select("."+s.default.chartArcsTitle).style("opacity",a.hasType("donut")||a.hasType("gauge")?"1":"0"),a.hasType("gauge")&&(a.arcs.select("."+s.default.chartArcsBackground).attr("d",function(){var t={data:[{value:r.gauge_max}],startAngle:r.gauge_startingAngle,endAngle:-1*r.gauge_startingAngle};return a.getArc(t,!0,!0)}),a.arcs.select("."+s.default.chartArcsGaugeUnit).attr("dy",".75em").text(r.gauge_label_show?r.gauge_units:""),a.arcs.select("."+s.default.chartArcsGaugeMin).attr("dx",-1*(a.innerRadius+(a.radius-a.innerRadius)/(r.gauge_fullCircle?1:2))+"px").attr("dy","1.2em").text(r.gauge_label_show?a.textForGaugeMinMax(r.gauge_min,!1):""),a.arcs.select("."+s.default.chartArcsGaugeMax).attr("dx",a.innerRadius+(a.radius-a.innerRadius)/(r.gauge_fullCircle?1:2)+"px").attr("dy","1.2em").text(r.gauge_label_show?a.textForGaugeMinMax(r.gauge_max,!0):""))},initGauge:function(){var t=this.arcs;this.hasType("gauge")&&(t.append("path").attr("class",s.default.chartArcsBackground),t.append("text").attr("class",s.default.chartArcsGaugeUnit).style("text-anchor","middle").style("pointer-events","none"),t.append("text").attr("class",s.default.chartArcsGaugeMin).style("text-anchor","middle").style("pointer-events","none"),t.append("text").attr("class",s.default.chartArcsGaugeMax).style("text-anchor","middle").style("pointer-events","none"))},getGaugeLabelHeight:function(){return this.config.gauge_label_show?20:0}})},function(t,e,i){"use strict";var n=i(1),a=function(t){return t&&t.__esModule?t:{"default":t}}(n);(0,i(0).extend)(a.default.prototype,{hasCaches:function(t){for(var e=0;e=0?o.default.focused:"")},classDefocused:function(t){return" "+(this.defocusedTargetIds.indexOf(t.id)>=0?o.default.defocused:"")},classChartText:function(t){return o.default.chartText+this.classTarget(t.id)},classChartLine:function(t){return o.default.chartLine+this.classTarget(t.id)},classChartBar:function(t){return o.default.chartBar+this.classTarget(t.id)},classChartArc:function(t){return o.default.chartArc+this.classTarget(t.data.id)},getTargetSelectorSuffix:function(t){return t||0===t?("-"+t).replace(/[\s?!@#$%^&*()_=+,.<>'":;\[\]\/|~`{}\\]/g,"-"):""},selectorTarget:function(t,e){return(e||"")+"."+(o.default.target+this.getTargetSelectorSuffix(t))},selectorTargets:function(t,e){var i=this,n=t||[];return n.length?n.map(function(t){return i.selectorTarget(t,e)}):null},selectorLegend:function(t){return"."+(o.default.legendItem+this.getTargetSelectorSuffix(t))},selectorLegends:function(t){var e=this;return t&&t.length?t.map(function(t){return e.selectorLegend(t)}):null}})},function(t,e,i){"use strict";var n=i(1),a=function(t){return t&&t.__esModule?t:{"default":t}}(n);(0,i(0).extend)(a.default.prototype,{getClipPath:function(t){return"url("+(window.navigator.appVersion.toLowerCase().indexOf("msie 9.")>=0?"":document.URL.split("#")[0])+"#"+t+")"},appendClip:function(t,e){return t.append("clipPath").attr("id",e).append("rect")},getAxisClipX:function(t){var e=Math.max(30,this.margin.left);return t?-(1+e):-(e-1)},getAxisClipY:function(t){return t?-20:-this.margin.top},getXAxisClipX:function(){var t=this;return t.getAxisClipX(!t.config.axis_rotated)},getXAxisClipY:function(){var t=this;return t.getAxisClipY(!t.config.axis_rotated)},getYAxisClipX:function(){var t=this;return t.config.axis_y_inner?-1:t.getAxisClipX(t.config.axis_rotated)},getYAxisClipY:function(){var t=this;return t.getAxisClipY(t.config.axis_rotated)},getAxisClipWidth:function(t){var e=this,i=Math.max(30,e.margin.left),n=Math.max(30,e.margin.right);return t?e.width+2+i+n:e.margin.left+20},getAxisClipHeight:function(t){return(t?this.margin.bottom:this.margin.top+this.height)+20},getXAxisClipWidth:function(){var t=this;return t.getAxisClipWidth(!t.config.axis_rotated)},getXAxisClipHeight:function(){var t=this;return t.getAxisClipHeight(!t.config.axis_rotated)},getYAxisClipWidth:function(){var t=this;return t.getAxisClipWidth(t.config.axis_rotated)+(t.config.axis_y_inner?20:0)},getYAxisClipHeight:function(){var t=this;return t.getAxisClipHeight(t.config.axis_rotated)}})},function(t,e,i){"use strict";var n=i(2),a=i(1),r=function(t){return t&&t.__esModule?t:{"default":t}}(a),o=i(0);(0,o.extend)(r.default.prototype,{generateColor:function(){var t=this,e=t.config,i=e.data_colors,a=e.data_color,r=[],s=(0,o.notEmpty)(e.color_pattern)?e.color_pattern:(0,n.scaleOrdinal)(n.schemeCategory10).range();return function(t){var e=t.id||t.data&&t.data.id||t,n=void 0;return i[e]instanceof Function?n=i[e](t):i[e]?n=i[e]:(r.indexOf(e)<0&&r.push(e),n=s[r.indexOf(e)%s.length],i[e]=n),a instanceof Function?a(n,t):n}},generateLevelColor:function(){var t=this,e=t.config,i=e.color_pattern,n=e.color_threshold,a="value"===n.unit,r=n.max||100,s=n.values&&n.values.length?n.values:[];return(0,o.notEmpty)(n)?function(t){for(var e=i[i.length-1],n=0;n0)for(c=e.hasNegativeValueInTargets(t),o=0;o=0}),0!==d.length)for(l=d[0],c&&a[l]&&a[l].forEach(function(t,e){a[l][e]=t<0?t:0}),s=1;s0)&&(a[l][i]+=+t)});return(0,r.min)(Object.keys(a).map(function(t){return(0,r.min)(a[t])}))},getYDomainMax:function(t){var e=this,i=e.config,n=e.mapToIds(t),a=e.getValuesAsIdKeyed(t),o=void 0,s=void 0,l=void 0,d=void 0,u=void 0,c=void 0;if(i.data_groups.length>0)for(c=e.hasPositiveValueInTargets(t),o=0;o=0}),0!==d.length)for(l=d[0],c&&a[l]&&a[l].forEach(function(t,e){a[l][e]=t>0?t:0}),s=1;s=0&&c>=0,m=u<=0&&c<=0;((0,l.isValue)(s)&&v||(0,l.isValue)(d)&&m)&&(g=!1),g&&(v&&(u=0),m&&(c=0));var y=Math.abs(c-u),b=.1*y,T=.1*y;if(void 0!==f){var A=Math.max(Math.abs(u),Math.abs(c));c=f+A,u=f-A}if(p){_=n.getDataLabelLength(u,c,"width");var w=(0,l.diffDomain)(n.y.range()),L=[_[0]/w,_[1]/w];b+=y*(L[1]/(1-L[0]-L[1])),T+=y*(L[0]/(1-L[0]-L[1]))}else x&&(_=n.getDataLabelLength(u,c,"height"),b+=n.axis.convertPixelsToAxisPadding(_[1],y),T+=n.axis.convertPixelsToAxisPadding(_[0],y));"y"===e&&(0,l.notEmpty)(a.axis_y_padding)&&(b=n.axis.getPadding(a.axis_y_padding,"top",b,y),T=n.axis.getPadding(a.axis_y_padding,"bottom",T,y)),"y2"===e&&(0,l.notEmpty)(a.axis_y2_padding)&&(b=n.axis.getPadding(a.axis_y2_padding,"top",b,y),T=n.axis.getPadding(a.axis_y2_padding,"bottom",T,y)),g&&(v&&(T=u),m&&(b=-c));var D=[u-T,c+b];return h?D.reverse():D},getXDomainMin:function(t){var e=this,i=e.config;return(0,l.isDefined)(i.axis_x_min)?e.isTimeSeries()?this.parseDate(i.axis_x_min):i.axis_x_min:(0,r.min)(t,function(t){return(0,r.min)(t.values,function(t){return t.x})})},getXDomainMax:function(t){var e=this,i=e.config;return(0,l.isDefined)(i.axis_x_max)?e.isTimeSeries()?this.parseDate(i.axis_x_max):i.axis_x_max:(0,r.max)(t,function(t){return(0,r.max)(t.values,function(t){return t.x})})},getXDomainPadding:function(t){var e=this,i=e.config,n=t[1]-t[0],r=void 0,o=void 0,s=void 0,d=void 0;return e.isCategorized()?o=0:e.hasType("bar")?(r=e.getMaxDataCount(),o=r>1?n/(r-1)/2:.5):o=.01*n,"object"===(0,a.default)(i.axis_x_padding)&&(0,l.notEmpty)(i.axis_x_padding)?(s=(0,l.isValue)(i.axis_x_padding.left)?i.axis_x_padding.left:o,d=(0,l.isValue)(i.axis_x_padding.right)?i.axis_x_padding.right:o):"number"==typeof i.axis_x_padding?(s=i.axis_x_padding,d=i.axis_x_padding):(s=o,d=o),{left:s,right:d}},getXDomain:function(t){var e=this,i=[e.getXDomainMin(t),e.getXDomainMax(t)],n=i[0],a=i[1],r=e.getXDomainPadding(i),o=0,s=0;return n-a!=0||e.isCategorized()||(e.isTimeSeries()?(n=new Date(.5*n.getTime()),a=new Date(1.5*a.getTime())):(n=0===n?1:.5*n,a=0===a?-1:1.5*a)),(n||0===n)&&(o=e.isTimeSeries()?new Date(n.getTime()-r.left):n-r.left),(a||0===a)&&(s=e.isTimeSeries()?new Date(a.getTime()+r.right):a+r.right),[o,s]},updateXDomain:function(t,e,i,n,a){var o=this,s=o.config;if(i&&(o.x.domain(a||(0,r.extent)(o.getXDomain(t))),o.orgXDomain=o.x.domain(),s.zoom_enabled&&o.zoom.updateScaleExtent(),o.subX.domain(o.x.domain()),o.brush&&o.brush.scale(o.subX)),e){var l=a||!o.brush||o.brushEmpty()?o.orgXDomain:o.getBrushSelection().map(function(t){return o.subX.invert(t)});o.x.domain(l),s.zoom_enabled&&o.zoom.updateScaleExtent()}return n&&o.x.domain(o.trimXDomain(o.x.orgDomain())),o.x.domain()},trimXDomain:function(t){var e=this.getZoomDomain(),i=e[0],n=e[1];return t[0]<=i&&(t[1]=+t[1]+(i-t[0]),t[0]=i),n<=t[1]&&(t[0]=+t[0]-(t[1]-n),t[1]=n),t}})},function(t,e,i){"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}var n=i(5),a=_interopRequireDefault(n),r=i(1),o=_interopRequireDefault(r),s=i(0),l=function(t,e,i){var n=t.config,a="axis_"+e+"_tick_format";return(n[a]?n[a]:t.defaultValueFormat)(i)};(0,s.extend)(o.default.prototype,{getYFormat:function(t){var e=this,i=e.yFormat,n=e.y2Format;return t&&!e.hasType("gauge")&&(i=e.defaultArcValueFormat,n=e.defaultArcValueFormat),function(t,a,r){return("y2"===e.axis.getId(r)?n:i).call(e,t,a)}},yFormat:function(t){return l(this,"y",t)},y2Format:function(t){return l(this,"y2",t)},defaultValueFormat:function(t){return(0,s.isValue)(t)?+t:""},defaultArcValueFormat:function(t,e){return(100*e).toFixed(1)+"%"},dataLabelFormat:function(t){var e=this,i=e.config.data_labels,n=function(t){return(0,s.isValue)(t)?+t:""};return"function"==typeof i.format?i.format:"object"===(0,a.default)(i.format)?i.format[t]?!0===i.format[t]?n:i.format[t]:function(){return""}:n}})},function(t,e,i){"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}var n=i(2),a=i(1),r=_interopRequireDefault(a),o=i(3),s=_interopRequireDefault(o),l=i(0);(0,l.extend)(r.default.prototype,{initGrid:function(){var t=this,e=t.config;t.grid=t.main.append("g").attr("clip-path",t.clipPathForGrid).attr("class",s.default.grid),e.grid_x_show&&t.grid.append("g").attr("class",s.default.xgrids),e.grid_y_show&&t.grid.append("g").attr("class",s.default.ygrids),e.grid_focus_show&&t.grid.append("g").attr("class",s.default.xgridFocus).append("line").attr("class",s.default.xgridFocus),t.xgrid=(0,n.selectAll)([]),e.grid_lines_front||t.initGridLines()},initGridLines:function(){var t=this;t.gridLines=t.main.append("g").attr("clip-path",t.clipPathForGrid).attr("class",s.default.grid+" "+s.default.gridLines),t.gridLines.append("g").attr("class",s.default.xgridLines),t.gridLines.append("g").attr("class",s.default.ygridLines),t.xgridLines=(0,n.selectAll)([])},updateXGrid:function(t){var e=this,i=e.config,a=e.generateGridData(i.grid_x_type,e.x),r=e.isCategorized()?e.xAxis.tickOffset():0;e.xgridAttr=i.axis_rotated?{x1:0,x2:e.width,y1:function(t){return e.x(t)-r},y2:function(t){return e.x(t)-r}}:{x1:function(t){return e.x(t)+r},x2:function(t){return e.x(t)+r},y1:0,y2:e.height},e.xgrid=e.main.select("."+s.default.xgrids).selectAll("."+s.default.xgrid).data(a),e.xgrid.exit().remove(),e.xgrid=e.xgrid.enter().append("line").attr("class",s.default.xgrid).merge(e.xgrid),t||e.xgrid.each(function(){var t=(0,n.select)(this);Object.keys(e.xgridAttr).forEach(function(n){t.attr(n,e.xgridAttr[n]).style("opacity",function(){return t.attr(i.axis_rotated?"y1":"x1")===(i.axis_rotated?e.height:0)?"0":"1"})})})},updateYGrid:function(){var t=this,e=t.config,i=t.yAxis.tickValues()||t.y.ticks(e.grid_y_ticks);t.ygrid=t.main.select("."+s.default.ygrids).selectAll("."+s.default.ygrid).data(i),t.ygrid.exit().remove(),t.ygrid=t.ygrid.enter().append("line").attr("class",s.default.ygrid).merge(t.ygrid),t.ygrid.attr("x1",e.axis_rotated?t.y:0).attr("x2",e.axis_rotated?t.y:t.width).attr("y1",e.axis_rotated?0:t.y).attr("y2",e.axis_rotated?t.height:t.y),t.smoothLines(t.ygrid,"grid")},gridTextAnchor:function(t){return t.position?t.position:"end"},gridTextDx:function(t){return"start"===t.position?4:"middle"===t.position?0:-4},xGridTextX:function(t){return"start"===t.position?-this.height:"middle"===t.position?-this.height/2:0},yGridTextX:function(t){return"start"===t.position?0:"middle"===t.position?this.width/2:this.width},updateGrid:function(t){var e=this,i=e.main,n=e.config;e.grid.style("visibility",e.hasArcType()?"hidden":"visible"),i.select("line."+s.default.xgridFocus).style("visibility","hidden"),n.grid_x_show&&e.updateXGrid(),e.xgridLines=i.select("."+s.default.xgridLines).selectAll("."+s.default.xgridLine).data(n.grid_x_lines),e.xgridLines.exit().transition().duration(t).style("opacity","0").remove();var a=e.xgridLines.enter().append("g").attr("class",function(t){return s.default.xgridLine+(t.class?" "+t.class:"")});a.append("line").style("opacity","0"),a.append("text").attr("text-anchor",e.gridTextAnchor).attr("transform",n.axis_rotated?"":"rotate(-90)").attr("dx",e.gridTextDx).attr("dy",-5).style("opacity","0"),e.xgridLines=a.merge(e.xgridLines),n.grid_y_show&&e.updateYGrid(),e.ygridLines=i.select("."+s.default.ygridLines).selectAll("."+s.default.ygridLine).data(n.grid_y_lines),e.ygridLines.exit().transition().duration(t).style("opacity","0").remove();var r=e.ygridLines.enter().append("g").attr("class",function(t){return s.default.ygridLine+(t.class?" "+t.class:"")});r.append("line").style("opacity","0"),r.append("text").attr("text-anchor",e.gridTextAnchor).attr("transform",n.axis_rotated?"rotate(-90)":"").attr("dx",e.gridTextDx).attr("dy",-5).style("opacity","0"),e.ygridLines=r.merge(e.ygridLines);var o=e.yv.bind(e);e.ygridLines.select("line").transition().duration(t).attr("x1",n.axis_rotated?o:0).attr("x2",n.axis_rotated?o:e.width).attr("y1",n.axis_rotated?0:o).attr("y2",n.axis_rotated?e.height:o).transition().style("opacity","1"),e.ygridLines.select("text").transition().duration(t).attr("x",n.axis_rotated?e.xGridTextX.bind(e):e.yGridTextX.bind(e)).attr("y",o).text(function(t){return t.text}).transition().style("opacity","1")},redrawGrid:function(t){var e=this,i=e.config.axis_rotated,n=e.xv.bind(e),a=e.xgridLines.select("line"),r=e.xgridLines.select("text");return a=(t?a.transition():a).attr("x1",i?0:n).attr("x2",i?e.width:n).attr("y1",i?n:0).attr("y2",i?n:e.height),r=(t?r.transition():r).attr("x",i?e.yGridTextX.bind(e):e.xGridTextX.bind(e)).attr("y",n).text(function(t){return t.text}),[(t?a.transition():a).style("opacity","1"),(t?r.transition():r).style("opacity","1")]},showXGridFocus:function(t){var e=this,i=e.config,n=t.filter(function(t){return t&&(0,l.isValue)(t.value)}),a=e.main.selectAll("line."+s.default.xgridFocus),r=e.xx.bind(e);!i.tooltip_show||e.hasType("scatter")||e.hasArcType()||(a.style("visibility","visible").data([n[0]]).attr(i.axis_rotated?"y1":"x1",r).attr(i.axis_rotated?"y2":"x2",r),e.smoothLines(a,"grid"))},hideXGridFocus:function(){this.main.select("line."+s.default.xgridFocus).style("visibility","hidden")},updateXgridFocus:function(){var t=this,e=t.config;t.main.select("line."+s.default.xgridFocus).attr("x1",e.axis_rotated?0:-10).attr("x2",e.axis_rotated?t.width:-10).attr("y1",e.axis_rotated?-10:0).attr("y2",e.axis_rotated?-10:t.height)},generateGridData:function(t,e){var i=this,n=i.main.select("."+s.default.axisX).selectAll(".tick").size(),a=[];if("year"===t)for(var r=i.getXDomain(),o=r[0].getFullYear(),l=r[1].getFullYear(),d=o;d<=l;d++)a.push(new Date(d+"-01-01 00:00:00"));else a=e.ticks(10),a.length>n&&(a=a.filter(function(t){return(t+"").indexOf(".")<0}));return a},getGridFilterToRemove:function(t){return t?function(e){var i=!1;return[].concat(t).forEach(function(t){("value"in t&&e.value===t.value||"class"in t&&e.class===t.class)&&(i=!0)}),i}:function(){return!0}},removeGridLines:function(t,e){var i=this,n=i.config,a=i.getGridFilterToRemove(t),r=function(t){return!a(t)},o=e?s.default.xgridLines:s.default.ygridLines,l=e?s.default.xgridLine:s.default.ygridLine;i.main.select("."+o).selectAll("."+l).filter(a).transition().duration(n.transition_duration).style("opacity","0").remove(),e?n.grid_x_lines=n.grid_x_lines.filter(r):n.grid_y_lines=n.grid_y_lines.filter(r)}})},function(t,e,i){"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}var n=i(2),a=i(1),r=_interopRequireDefault(a),o=i(3),s=_interopRequireDefault(o),l=i(0);(0,l.extend)(r.default.prototype,{initLegend:function(){var t=this;return t.legendItemTextBox={},t.legendHasRendered=!1,t.legend=t.svg.append("g").attr("transform",t.getTranslate("legend")),t.config.legend_show?void t.updateLegendWithDefaults():(t.legend.style("visibility","hidden"),void(t.hiddenLegendIds=t.mapToIds(t.data.targets)))},updateLegendWithDefaults:function(){var t=this;t.updateLegend(t.mapToIds(t.data.targets),{withTransform:!1,withTransitionForTransform:!1,withTransition:!1})},updateSizeForLegend:function(t,e){var i=this,n=i.config,a={top:i.isLegendTop?i.getCurrentPaddingTop()+n.legend_inset_y+5.5:i.currentHeight-t-i.getCurrentPaddingBottom()-n.legend_inset_y,left:i.isLegendLeft?i.getCurrentPaddingLeft()+n.legend_inset_x+.5:i.currentWidth-e-i.getCurrentPaddingRight()-n.legend_inset_x+.5};i.margin3={top:i.isLegendRight?0:i.isLegendInset?a.top:i.currentHeight-t,right:NaN,bottom:0,left:i.isLegendRight?i.currentWidth-e:i.isLegendInset?a.left:0}},transformLegend:function(t){var e=this;(t?e.legend.transition():e.legend).attr("transform",e.getTranslate("legend"))},updateLegendStep:function(t){this.legendStep=t},updateLegendItemWidth:function(t){this.legendItemWidth=t},updateLegendItemHeight:function(t){this.legendItemHeight=t},getLegendWidth:function(){var t=this;return t.config.legend_show?t.isLegendRight||t.isLegendInset?t.legendItemWidth*(t.legendStep+1):t.currentWidth:0},getLegendHeight:function(){var t=this,e=0;return t.config.legend_show&&(e=t.isLegendRight?t.currentHeight:Math.max(20,t.legendItemHeight)*(t.legendStep+1)),e},opacityForLegend:function(t){return t.classed(s.default.legendItemHidden)?null:"1"},opacityForUnfocusedLegend:function(t){return t.classed(s.default.legendItemHidden)?null:"0.3"},toggleFocusLegend:function(t,e){var i=this,a=i.mapToTargetIds(t);i.legend.selectAll("."+s.default.legendItem).filter(function(t){return a.indexOf(t)>=0}).classed(s.default.legendItemFocused,e).transition().duration(100).style("opacity",function(){return(e?i.opacityForLegend:i.opacityForUnfocusedLegend).call(i,(0,n.select)(this))})},revertLegend:function(){var t=this;t.legend.selectAll("."+s.default.legendItem).classed(s.default.legendItemFocused,!1).transition().duration(100).style("opacity",function(){return t.opacityForLegend((0,n.select)(this))})},showLegend:function(t){var e=this,i=e.config;i.legend_show||(i.legend_show=!0,e.legend.style("visibility","visible"),!e.legendHasRendered&&e.updateLegendWithDefaults()),e.removeHiddenLegendIds(t),e.legend.selectAll(e.selectorLegends(t)).style("visibility","visible").transition().style("opacity",function(){return e.opacityForLegend((0,n.select)(this))})},hideLegend:function(t){var e=this,i=e.config;i.legend_show&&(0,l.isEmpty)(t)&&(i.legend_show=!1,e.legend.style("visibility","hidden")),e.addHiddenLegendIds(t),e.legend.selectAll(e.selectorLegends(t)).style("opacity","0").style("visibility","hidden")},clearLegendItemTextBoxCache:function(){this.legendItemTextBox={}},updateLegend:function(t,e,i){var a=this,r=a.config,o=r.legend_item_tile_width+5,d="touch"===a.inputType,u=0,c=0,f=void 0,g=void 0,h=0,p={},x={},_={},v=[0],m={},y=0,b=void 0,T=t.filter(function(t){return!(0,l.isDefined)(r.data_names[t])||null!==r.data_names[t]}),A=e||{},w=(0,l.getOption)(A,"withTransition",!0),L=(0,l.getOption)(A,"withTransitionForTransform",!0),D=function(t,e){return a.legendItemTextBox[e]||(a.legendItemTextBox[e]=a.getTextRect(t.textContent,s.default.legendItem,t)),a.legendItemTextBox[e]},S=function(t,e,i){var n=i===T.length-1,s=D(t,e),l=s.width+o+(!n||a.isLegendRight||a.isLegendInset?10:0)+r.legend_padding,d=s.height+4,f=a.isLegendRight||a.isLegendInset?d:l,g=a.isLegendRight||a.isLegendInset?a.getLegendHeight():a.getLegendWidth(),b=void 0,A=function(t,e){e||(b=(g-h-f)/2)<10&&(b=(g-f)/2,h=0,y++),m[t]=y,v[y]=a.isLegendInset?10:b,p[t]=h,h+=f};if(0===i&&(h=0,y=0,u=0,c=0),r.legend_show&&!a.isLegendToShow(e))return x[e]=0,_[e]=0,m[e]=0,void(p[e]=0);x[e]=l,_[e]=d,(!u||l>=u)&&(u=l),(!c||d>=c)&&(c=d);var w=a.isLegendRight||a.isLegendInset?c:u;r.legend_equally?(Object.keys(x).forEach(function(t){return x[t]=u}),Object.keys(_).forEach(function(t){return _[t]=c}),b=(g-w*T.length)/2,b<10?(h=0,y=0,T.forEach(function(t){return A(t)})):A(e,!0)):A(e)};a.isLegendInset&&(y=r.legend_inset_step?r.legend_inset_step:T.length,a.updateLegendStep(y)),a.isLegendRight?(f=function(t){return u*m[t]},g=function(t){return v[m[t]]+p[t]}):a.isLegendInset?(f=function(t){return u*m[t]+10},g=function(t){return v[m[t]]+p[t]}):(f=function(t){return v[m[t]]+p[t]},g=function(t){return c*m[t]});var C=function(t,e){return f(t,e)+4+r.legend_item_tile_width},R=function(t,e){return g(t,e)+9},I=function(t,e){return f(t,e)},F=function(t,e){return g(t,e)-5},X=function(t,e){return f(t,e)-2},k=function(t,e){return f(t,e)-2+r.legend_item_tile_width},M=function(t,e){return g(t,e)+4},E=a.legend.selectAll("."+s.default.legendItem).data(T).enter().append("g").attr("class",function(t){return a.generateClass(s.default.legendItem,t)}).style("visibility",function(t){return a.isLegendToShow(t)?"visible":"hidden"}).style("cursor","pointer").on(d?"touchstart":"click",function(t){r.legend_item_onclick?r.legend_item_onclick.call(a,t):n.event.altKey?(a.api.hide(),a.api.show(t)):(a.api.toggle(t),a.isTargetToShow(t)?a.api.focus(t):a.api.revert()),d&&a.hideTooltip()}).on(d?void 0:"mouseover",function(t){r.legend_item_onover?r.legend_item_onover.call(a,t):((0,n.select)(this).classed(s.default.legendItemFocused,!0),!a.transiting&&a.isTargetToShow(t)&&a.api.focus(t))}).on(d?"touchend":"mouseout",function(t){r.legend_item_onout?r.legend_item_onout.call(a,t):((0,n.select)(this).classed(s.default.legendItemFocused,!1),a.api.revert())});E.append("text").text(function(t){return(0,l.isDefined)(r.data_names[t])?r.data_names[t]:t}).each(function(t,e){S(this,t,e)}).style("pointer-events","none").attr("x",a.isLegendRight||a.isLegendInset?C:-200).attr("y",a.isLegendRight||a.isLegendInset?-200:R),E.append("rect").attr("class",s.default.legendItemEvent).style("fill-opacity","0").attr("x",a.isLegendRight||a.isLegendInset?I:-200).attr("y",a.isLegendRight||a.isLegendInset?-200:F),E.append("line").attr("class",s.default.legendItemTile).style("stroke",a.color).style("pointer-events","none").attr("x1",a.isLegendRight||a.isLegendInset?X:-200).attr("y1",a.isLegendRight||a.isLegendInset?-200:M).attr("x2",a.isLegendRight||a.isLegendInset?k:-200).attr("y2",a.isLegendRight||a.isLegendInset?-200:M).attr("stroke-width",r.legend_item_tile_height),b=a.legend.select("."+s.default.legendBackground+" rect"),a.isLegendInset&&u>0&&0===b.size()&&(b=a.legend.insert("g","."+s.default.legendItem).attr("class",s.default.legendBackground).append("rect"));var O=a.legend.selectAll("text").data(T).text(function(t){return(0,l.isDefined)(r.data_names[t])?r.data_names[t]:t}).each(function(t,e){S(this,t,e)});(w?O.transition():O).attr("x",C).attr("y",R);var Y=a.legend.selectAll("rect."+s.default.legendItemEvent).data(T);(w?Y.transition():Y).attr("width",function(t){return x[t]}).attr("height",function(t){return _[t]}).attr("x",I).attr("y",F);var z=a.legend.selectAll("line."+s.default.legendItemTile).data(T);(w?z.transition():z).style("stroke",a.color).attr("x1",X).attr("y1",M).attr("x2",k).attr("y2",M),b&&(w?b.transition():b).attr("height",a.getLegendHeight()-12).attr("width",u*(y+1)+10),a.legend.selectAll("."+s.default.legendItem).classed(s.default.legendItemHidden,function(t){return!a.isTargetToShow(t)}),a.updateLegendItemWidth(u),a.updateLegendItemHeight(c),a.updateLegendStep(y),a.updateSizes(),a.updateScales(),a.updateSvgSize(),a.transformAll(L,i),a.legendHasRendered=!0}})},function(t,e,i){"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}var n=i(2),a=i(1),r=_interopRequireDefault(a),o=i(3),s=_interopRequireDefault(o),l=i(0);(0,l.extend)(r.default.prototype,{initRegion:function(){var t=this;t.region=t.main.append("g").attr("clip-path",t.clipPath).attr("class",s.default.regions)},updateRegion:function(t){var e=this,i=e.config;e.region.style("visibility",e.hasArcType()?"hidden":"visible"),e.mainRegion=e.main.select("."+s.default.regions).selectAll("."+s.default.region).data(i.regions),e.mainRegion.exit().transition().duration(t).style("opacity","0").remove(),e.mainRegion=e.mainRegion.enter().append("g").merge(e.mainRegion).attr("class",e.classRegion.bind(e)),e.mainRegion.append("rect").style("fill-opacity","0")},redrawRegion:function(t){var e=this,i=e.regionX.bind(e),a=e.regionY.bind(e),r=e.regionWidth.bind(e),o=e.regionHeight.bind(e),s=e.mainRegion.select("rect");return s=(t?s.transition():s).attr("x",i).attr("y",a).attr("width",r).attr("height",o),[(t?s.transition():s).style("fill-opacity",function(t){return(0,l.isValue)(t.opacity)?t.opacity:"0.1"}).on("end",function(){(0,n.select)(this.parentNode).selectAll("rect:not([x])").remove()})]},regionX:function(t){var e=this,i=e.config,n="y"===t.axis?e.y:e.y2;return"y"===t.axis||"y2"===t.axis?i.axis_rotated&&"start"in t?n(t.start):0:i.axis_rotated?0:"start"in t?e.x(e.isTimeSeries()?e.parseDate(t.start):t.start):0},regionY:function(t){var e=this,i=e.config,n="y"===t.axis?e.y:e.y2;return"y"===t.axis||"y2"===t.axis?i.axis_rotated?0:"end"in t?n(t.end):0:i.axis_rotated&&"start"in t?e.x(e.isTimeSeries()?e.parseDate(t.start):t.start):0},regionWidth:function(t){var e=this,i=e.config,n="y"===t.axis?e.y:e.y2,a=e.regionX(t),r=void 0;return r="y"===t.axis||"y2"===t.axis?i.axis_rotated&&"end"in t?n(t.end):e.width:i.axis_rotated?e.width:"end"in t?e.x(e.isTimeSeries()?e.parseDate(t.end):t.end):e.width,rn.bar_width_max?n.bar_width_max:a},getBars:function(t,e){var i=this,n=(0,l.isValue)(t)?"-"+t:"";return(e?i.main.selectAll("."+r.default.bars+i.getTargetSelectorSuffix(e)):i.main).selectAll("."+r.default.bar+n)},expandBars:function(t,e,i){var n=this;i&&n.unexpandBars(),n.getBars(t,e).classed(r.default.EXPANDED,!0)},unexpandBars:function(t){this.getBars(t).classed(r.default.EXPANDED,!1)},generateDrawBar:function(t,e){var i=this,n=i.config,a=i.generateGetBarPoints(t,e);return function(t,e){var i=a(t,e),r=n.axis_rotated?1:0,o=n.axis_rotated?0:1;return"M "+i[0][r]+","+i[0][o]+"\n\t\t\tL "+i[1][r]+","+i[1][o]+"\n\t\t\tL "+i[2][r]+","+i[2][o]+"\n\t\t\tL "+i[3][r]+","+i[3][o]+" z"}},generateGetBarPoints:function(t,e){var i=this,n=e?i.subXAxis:i.xAxis,a=t.__max__+1,r=i.getBarW(n,a),o=i.getShapeX(r,a,t,!!e),s=i.getShapeY(!!e),l=i.getShapeOffset(i.isBarType,t,!!e),d=e?i.getSubYScale:i.getYScale;return function(t,e){var n=d.call(i,t.id)(0),a=l(t,e)||n,u=o(t),c=s(t);return i.config.axis_rotated&&(t.value>0&&c=0&&(d+=s(a[u].value)-l))}),d}},isWithinShape:function(t,e){var i=this,a=(0,n.select)(t),o=void 0;return i.isTargetToShow(e.id)?"circle"===t.nodeName?o=i.isStepType(e)?i.isWithinStep(t,i.getYScale(e.id)(e.value)):i.isWithinCircle(t,1.5*i.pointSelectR(e)):"path"===t.nodeName&&(o=!a.classed(r.default.bar)||i.isWithinBar(t)):o=!1,o},getInterpolate:function(t){var e=this,i=e.getInterpolateType(t);return{basis:n.curveBasis,"basis-closed":n.curveBasisClosed,"basis-open":n.curveBasisOpen,bundle:n.curveBundle,cardinal:n.curveCardinal,"cardinal-closed":n.curveCardinalClosed,"cardinal-open":n.curveCardinalOpen,"catmull-rom":n.curveCatmullRom,"catmull-rom-closed":n.curveCatmullRomClosed,"catmull-rom-open":n.curveCatmullRomOpen,"monotone-x":n.curveMonotoneX,"monotone-y":n.curveMonotoneY,natural:n.curveNatural,"linear-closed":n.curveLinearClosed,linear:n.curveLinear,step:n.curveStep}[i]},getInterpolateType:function(t){var e=this,i=e.isInterpolationType(e.config.spline_interpolation_type)?e.config.spline_interpolation_type:"cardinal";return i=e.isSplineType(t)?i:e.isStepType(t)?e.config.line_step_type:"linear"}})},function(t,e,i){"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}var n=i(2),a=i(3),r=_interopRequireDefault(a),o=i(1),s=_interopRequireDefault(o),l=i(0);(0,l.extend)(s.default.prototype,{initLine:function(){this.main.select("."+r.default.chart).append("g").attr("class",r.default.chartLines)},updateTargetsForLine:function(t){var e=this,i=e.config,n=e.classChartLine.bind(e),a=e.classLines.bind(e),o=e.classAreas.bind(e),s=e.classCircles.bind(e),l=e.classFocus.bind(e),d=e.main.select("."+r.default.chartLines).selectAll("."+r.default.chartLine).data(t).attr("class",function(t){return n(t)+l(t)}),u=d.enter().append("g").attr("class",n).style("opacity","0").style("pointer-events","none");u.append("g").attr("class",a),u.append("g").attr("class",o),u.append("g").attr("class",function(t){return e.generateClass(r.default.selectedCircles,t.id)}),u.append("g").attr("class",s).style("cursor",function(t){return i.data_selection_isselectable(t)?"pointer":null}),t.forEach(function(t){e.main.selectAll("."+r.default.selectedCircles+e.getTargetSelectorSuffix(t.id)).selectAll(""+r.default.selectedCircle).each(function(e){e.value=t.values[e.index].value})})},updateLine:function(t){var e=this;e.mainLine=e.main.selectAll("."+r.default.lines).selectAll("."+r.default.line).data(e.lineData.bind(e)),e.mainLine.exit().transition().duration(t).style("opacity","0").remove(),e.mainLine=e.mainLine.enter().append("path").attr("class",e.classLine.bind(e)).style("stroke",e.color).merge(e.mainLine).style("opacity",e.initialOpacity.bind(e)).style("shape-rendering",function(t){return e.isStepType(t)?"crispEdges":""}).attr("transform",null)},redrawLine:function(t,e){return[(e?this.mainLine.transition(Math.random().toString()):this.mainLine).attr("d",t).style("stroke",this.color).style("opacity","1")]},generateDrawLine:function(t,e){var i=this,a=i.config,r=i.generateGetLinePoints(t,e),o=e?i.getSubYScale:i.getYScale,s=function(t){return(e?i.subxx:i.xx).call(i,t)},l=function(t,e){return a.data_groups.length>0?r(t,e)[0][1]:o.call(i,t.id)(t.value)},d=(0,n.line)();return d=a.axis_rotated?d.x(l).y(s):d.x(s).y(l),a.line_connectNull||(d=d.defined(function(t){return null!==t.value})),function(t){var n=e?i.x:i.subX,r=o.call(i,t.id),s=a.line_connectNull?i.filterRemoveNull(t.values):t.values,l=0,u=0,c=void 0;return i.isLineType(t)?a.data_regions[t.id]?c=i.lineWithRegions(s,n,r,a.data_regions[t.id]):(i.isStepType(t)&&(s=i.convertValuesToStep(s)),c=d.curve(i.getInterpolate(t))(s)):(s[0]&&(l=n(s[0].x),u=r(s[0].value)),c=a.axis_rotated?"M "+u+" "+l:"M "+l+" "+u),c||"M 0 0"}},generateGetLinePoints:function(t,e){var i=this,n=i.config,a=t.__max__+1,r=i.getShapeX(0,a,t,!!e),o=i.getShapeY(!!e),s=i.getShapeOffset(i.isLineType,t,!!e),l=e?i.getSubYScale:i.getYScale;return function(t,e){var a=l.call(i,t.id)(0),d=s(t,e)||a,u=r(t),c=o(t);return n.axis_rotated&&(t.value>0&&c0?r(t,e)[0][1]:o.call(i,t.id)(i.getAreaBaseValue(t.id))},d=function(t,e){return a.data_groups.length>0?r(t,e)[1][1]:o.call(i,t.id)(t.value)},u=(0,n.area)();return u=a.axis_rotated?u.x0(l).x1(d).y(s):u.x(s).y0(a.area_above?0:l).y1(d),a.line_connectNull||(u=u.defined(function(t){return null!==t.value})),function(t){var e=a.line_connectNull?i.filterRemoveNull(t.values):t.values,n=0,r=0,o=void 0;return i.isAreaType(t)?(i.isStepType(t)&&(e=i.convertValuesToStep(e)),o=u.curve(i.getInterpolate(t))(e)):(e[0]&&(n=i.x(e[0].x),r=i.getYScale(t.id)(e[0].value)),o=a.axis_rotated?"M "+r+" "+n:"M "+n+" "+r),o||"M 0 0"}},getAreaBaseValue:function(){return 0},generateGetAreaPoints:function(t,e){var i=this,n=i.config,a=t.__max__+1,r=i.getShapeX(0,a,t,!!e),o=i.getShapeY(!!e),s=i.getShapeOffset(i.isAreaType,t,!!e),l=e?i.getSubYScale:i.getYScale;return function(t,e){var a=l.call(i,t.id)(0),d=s(t,e)||a,u=r(t),c=o(t);return n.axis_rotated&&(t.value>0&&c0?(e=t.getShapeIndices(t.isLineType),i=t.generateGetLinePoints(e),t.circleY=function(t,e){return i(t,e)[0][1]}):t.circleY=function(e){return t.getYScale(e.id)(e.value)}},getCircles:function(t,e){var i=this,n=(0,l.isValue)(t)?"-"+t:"";return(e?i.main.selectAll("."+r.default.circles+i.getTargetSelectorSuffix(e)):i.main).selectAll("."+r.default.circle+n)},expandCircles:function(t,e,i){var n=this,a=n.pointExpandedR.bind(n);i&&n.unexpandCircles(),n.getCircles(t,e).classed(r.default.EXPANDED,!0).attr("r",a)},unexpandCircles:function(t){var e=this,i=e.pointR.bind(e);e.getCircles(t).filter(function(){return(0,n.select)(this).classed(r.default.EXPANDED)}).classed(r.default.EXPANDED,!1).attr("r",i)},pointR:function(t){var e=this,i=e.config;return e.isStepType(t)?0:(0,l.isFunction)(i.point_r)?i.point_r(t):i.point_r},pointExpandedR:function(t){var e=this,i=e.config;return i.point_focus_expand_enabled?i.point_focus_expand_r?i.point_focus_expand_r:1.75*e.pointR(t):e.pointR(t)},pointSelectR:function(t){var e=this,i=e.config;return(0,l.isFunction)(i.point_select_r)?i.point_select_r(t):i.point_select_r?i.point_select_r:4*e.pointR(t)},isWithinCircle:function(t,e){var i=(0,n.mouse)(t),a=(0,n.select)(t),r=+a.attr("cx"),o=+a.attr("cy");return Math.sqrt(Math.pow(r-i[0],2)+Math.pow(o-i[1],2))0?i:320/(t.hasType("gauge")&&!e.gauge_fullCircle?2:1)},getCurrentPaddingTop:function(){var t=this,e=t.config,i=(0,s.isValue)(e.padding_top)?e.padding_top:0;return t.title&&t.title.node()&&(i+=t.getTitlePadding()),i},getCurrentPaddingBottom:function(){var t=this.config;return(0,s.isValue)(t.padding_bottom)?t.padding_bottom:0},getCurrentPaddingLeft:function(t){var e=this,i=e.config;return(0,s.isValue)(i.padding_left)?i.padding_left:i.axis_rotated?i.axis_x_show?Math.max((0,s.ceil10)(e.getAxisWidthByAxisId("x",t)),40):1:!i.axis_y_show||i.axis_y_inner?e.axis.getYAxisLabelPosition().isOuter?30:1:(0,s.ceil10)(e.getAxisWidthByAxisId("y",t))},getCurrentPaddingRight:function(){var t=this,e=t.config,i=t.isLegendRight?t.getLegendWidth()+20:0;return(0,s.isValue)(e.padding_right)?e.padding_right+1:e.axis_rotated?10+i:!e.axis_y2_show||e.axis_y2_inner?2+i+(t.axis.getY2AxisLabelPosition().isOuter?20:0):(0,s.ceil10)(t.getAxisWidthByAxisId("y2"))+i},getParentRectValue:function(t){for(var e=this.selectChart.node(),i=void 0;e&&"BODY"!==e.tagName;){try{i=e.getBoundingClientRect()[t]}catch(n){"width"===t&&(i=e.offsetWidth)}if(i)break;e=e.parentNode}return i},getParentWidth:function(){return this.getParentRectValue("width")},getParentHeight:function(){var t=this.selectChart.style("height");return t.indexOf("px")>0?+t.replace("px",""):0},getSvgLeft:function(t){var e=this,i=e.config,n=i.axis_rotated||!i.axis_rotated&&!i.axis_y_inner,a=i.axis_rotated?o.default.axisX:o.default.axisY,r=e.main.select("."+a).node(),s=r&&n?r.getBoundingClientRect():{right:0},l=e.selectChart.node().getBoundingClientRect(),d=e.hasArcType(),u=s.right-l.left-(d?0:e.getCurrentPaddingLeft(t));return u>0?u:0},getAxisWidthByAxisId:function(t,e){var i=this,n=i.axis.getLabelPositionById(t);return i.axis.getMaxTickWidth(t,e)+(n.isInner?20:40)},getHorizontalAxisHeight:function(t){var e=this,i=e.config,n=30;return"x"!==t||i.axis_x_show?"x"===t&&i.axis_x_height?i.axis_x_height:"y"!==t||i.axis_y_show?"y2"!==t||i.axis_y2_show?("x"===t&&!i.axis_rotated&&i.axis_x_tick_rotate&&(n=30+e.axis.getMaxTickWidth(t)*Math.cos(Math.PI*(90-i.axis_x_tick_rotate)/180)),"y"===t&&i.axis_rotated&&i.axis_y_tick_rotate&&(n=30+e.axis.getMaxTickWidth(t)*Math.cos(Math.PI*(90-i.axis_y_tick_rotate)/180)),n+(e.axis.getLabelPositionById(t).isInner?0:10)+("y2"===t?-10:0)):e.rotated_padding_top:!i.legend_show||e.isLegendRight||e.isLegendInset?1:10:8},getEventRectWidth:function(){return Math.max(0,this.xAxis.tickInterval())}})},function(t,e,i){"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}var n=i(2),a=i(1),r=_interopRequireDefault(a),o=i(3),s=_interopRequireDefault(o);(0,i(0).extend)(r.default.prototype,{initText:function(){var t=this;t.main.select("."+s.default.chart).append("g").attr("class",s.default.chartTexts),t.mainText=(0,n.selectAll)([])},updateTargetsForText:function(t){var e=this,i=e.classChartText.bind(e),n=e.classTexts.bind(e),a=e.classFocus.bind(e);e.main.select("."+s.default.chartTexts).selectAll("."+s.default.chartText).data(t).attr("class",function(t){return i(t)+a(t)}).enter().append("g").attr("class",i).style("opacity","0").style("pointer-events","none").append("g").attr("class",n)},updateText:function(t){var e=this,i=e.config,n=e.barOrLineData.bind(e),a=e.classText.bind(e);e.mainText=e.main.selectAll("."+s.default.texts).selectAll("."+s.default.text).data(n),e.mainText.exit().transition().duration(t).style("fill-opacity","0").remove(),e.mainText=e.mainText.enter().append("text").attr("class",a).attr("text-anchor",function(t){return i.axis_rotated?t.value<0?"end":"start":"middle"}).style("stroke","none").style("fill",function(t){return e.color(t)}).style("fill-opacity","0").merge(e.mainText).text(function(t,i,n){return e.dataLabelFormat(t.id)(t.value,t.id,i,n)})},redrawText:function(t,e,i,n){return[(n?this.mainText.transition():this.mainText).attr("x",t).attr("y",e).style("fill",this.color).style("fill-opacity",i?0:this.opacityForText.bind(this))]},getTextRect:function(t,e,i){var a=(0,n.select)("body").append("div").classed("bb",!0),r=a.append("svg").style("visibility","hidden").style("position","fixed").style("top","0px").style("left","0px"),o=(0,n.select)(i).style("font"),s=void 0;return r.selectAll(".dummy").data([t]).enter().append("text").classed(e||"",!0).style("font",o).text(t).each(function(){s=this.getBoundingClientRect()}),a.remove(),s},generateXYForText:function(t,e,i,n){var a=this,r=a.generateGetAreaPoints(t,!1),o=a.generateGetBarPoints(e,!1),s=a.generateGetLinePoints(i,!1),l=n?a.getXForText:a.getYForText;return function(t,e){var i=a.isBarType(t)?o:s;return i=a.isAreaType(t)?r:i,l.call(a,i(t,e),t,this)}},getXForText:function(t,e,i){var n=this,a=i.getBoundingClientRect(),r=void 0,o=void 0;return n.config.axis_rotated?(o=n.isBarType(e)?4:6,r=t[2][1]+o*(e.value<0?-1:1)):r=n.hasType("bar")?(t[2][0]+t[0][0])/2:t[0][0],null===e.value&&(r>n.width?r=n.width-a.width:r<0&&(r=4)),r},getYForText:function(t,e,i){var n=this,a=i.getBoundingClientRect(),r=void 0;return n.config.axis_rotated?r=(t[0][0]+t[2][0]+.6*a.height)/2:(r=t[2][1],e.value<0||0===e.value&&!n.hasPositiveValue?(r+=a.height,n.isBarType(e)&&n.isSafari()?r-=3:!n.isBarType(e)&&n.isChrome()&&(r+=3)):r+=n.isBarType(e)?-3:-6),null!==e.value||n.config.axis_rotated||(rthis.height&&(r=this.height-4)),r}})},function(t,e,i){"use strict";var n=i(1),a=function(t){return t&&t.__esModule?t:{"default":t}}(n);(0,i(0).extend)(a.default.prototype,{initTitle:function(){var t=this;t.title=t.svg.append("text").text(t.config.title_text).attr("class",t.CLASS.title)},redrawTitle:function(){var t=this;t.title.attr("x",t.xForTitle.bind(t)).attr("y",t.yForTitle.bind(t))},xForTitle:function(){var t=this,e=t.config,i=e.title_position||"left";return i.indexOf("right")>=0?t.currentWidth-t.getTextRect(t.title.node().textContent,t.CLASS.title,t.title.node()).width-e.title_padding.right:i.indexOf("center")>=0?(t.currentWidth-t.getTextRect(t.title.node().textContent,t.CLASS.title,t.title.node()).width)/2:e.title_padding.left},yForTitle:function(){var t=this;return t.config.title_padding.top+t.getTextRect(t.title.node().textContent,t.CLASS.title,t.title.node()).height},getTitlePadding:function(){var t=this;return t.yForTitle()+t.config.title_padding.bottom}})},function(t,e,i){"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}var n=i(2),a=i(1),r=_interopRequireDefault(a),o=i(3),s=_interopRequireDefault(o),l=i(0);(0,l.extend)(r.default.prototype,{initTooltip:function(){var t=this,e=t.config,i=void 0;if(t.tooltip=t.selectChart.style("position","relative").append("div").attr("class",s.default.tooltipContainer).style("position","absolute").style("pointer-events","none").style("display","none"),e.tooltip_init_show){if(t.isTimeSeries()&&(0,l.isString)(e.tooltip_init_x)){for(e.tooltip_init_x=t.parseDate(e.tooltip_init_x),i=0;i0&&n>0&&(i=t?_.indexOf(t.id):null,n=e?_.indexOf(e.id):null),u?i-n:n-i})}for(f=0;f'+g+"":"",c=''+c),void 0!==(h=(0,l.sanitise)(d(t[f].value,t[f].ratio,t[f].id,t[f].index,t))))){if(null===t[f].name)continue;p=(0,l.sanitise)(s(t[f].name,t[f].ratio,t[f].id,t[f].index)),x=a.levelColor?a.levelColor(t[f].value):n(t[f].id),c+='"}return c+"
'+p+''+h+"
"},tooltipPosition:function(t,e,i,a){var r=this,o=r.config,s=r.hasArcType(),l="touch"===r.inputType,d=(0,n.mouse)(a),u=void 0,c=void 0,f=void 0,g=void 0,h=void 0;return s?(c=l?d[0]:(r.width-(r.isLegendRight?r.getLegendWidth():0))/2+d[0],g=l?d[1]+20:r.height/2+d[1]+20):(u=r.getSvgLeft(!0),o.axis_rotated?(c=u+d[0]+100,f=c+e,h=r.currentWidth-r.getCurrentPaddingRight(),g=r.x(t[0].x)+20):(c=u+r.getCurrentPaddingLeft(!0)+r.x(t[0].x)+20,f=c+e,h=u+r.currentWidth-r.getCurrentPaddingRight(),g=d[1]+15),f>h&&(c-=f-h+20),g+i>r.currentHeight&&(g-=i+30)),g<0&&(g=0),{top:g,left:c}},showTooltip:function(t,e){var i=this,n=i.config,a=i.hasArcType(),r=t.filter(function(t){return t&&(0,l.isValue)(t.value)}),o=n.tooltip_position||i.tooltipPosition;if(0!==r.length&&n.tooltip_show){i.tooltip.html(n.tooltip_contents.call(i,t,i.axis.getXAxisTickFormat(),i.getYFormat(a),i.color)).style("display","block");var s=i.tooltip.property("offsetWidth"),d=i.tooltip.property("offsetHeight"),u=o.call(this,r,s,d,e);i.tooltip.style("top",u.top+"px").style("left",u.left+"px")}},hideTooltip:function(){this.tooltip.style("display","none")}})},function(t,e,i){"use strict";var n=i(1),a=function(t){return t&&t.__esModule?t:{"default":t}}(n),r=i(0);(0,r.extend)(a.default.prototype,{setTargetType:function(t,e){var i=this,n=i.config;i.mapToTargetIds(t).forEach(function(t){i.withoutFadeIn[t]=e===n.data_types[t],n.data_types[t]=e}),t||(n.data_type=e)},hasType:function(t,e){var i=this,n=i.config.data_types,a=e||i.data.targets,r=!1;return a&&a.length?a.forEach(function(e){var i=n[e.id];(i&&i.indexOf(t)>=0||!i&&"line"===t)&&(r=!0)}):Object.keys(n).length?Object.keys(n).forEach(function(e){n[e]===t&&(r=!0)}):r=i.config.data_type===t,r},hasArcType:function(t){return this.hasType("pie",t)||this.hasType("donut",t)||this.hasType("gauge",t)},isLineType:function(t){var e=this.config,i=(0,r.isString)(t)?t:t.id;return!e.data_types[i]||["line","spline","area","area-spline","step","area-step"].indexOf(e.data_types[i])>=0},isStepType:function(t){var e=(0,r.isString)(t)?t:t.id;return["step","area-step"].indexOf(this.config.data_types[e])>=0},isSplineType:function(t){var e=(0,r.isString)(t)?t:t.id;return["spline","area-spline"].indexOf(this.config.data_types[e])>=0},isAreaType:function(t){var e=(0,r.isString)(t)?t:t.id;return["area","area-spline","area-step"].indexOf(this.config.data_types[e])>=0},isBarType:function(t){var e=(0,r.isString)(t)?t:t.id;return"bar"===this.config.data_types[e]},isScatterType:function(t){var e=(0,r.isString)(t)?t:t.id;return"scatter"===this.config.data_types[e]},isPieType:function(t){var e=(0,r.isString)(t)?t:t.id;return"pie"===this.config.data_types[e]},isGaugeType:function(t){var e=(0,r.isString)(t)?t:t.id;return"gauge"===this.config.data_types[e]},isDonutType:function(t){var e=(0,r.isString)(t)?t:t.id;return"donut"===this.config.data_types[e]},isArcType:function(t){return this.isPieType(t)||this.isDonutType(t)||this.isGaugeType(t)},lineData:function(t){return this.isLineType(t)?[t]:[]},arcData:function(t){return this.isArcType(t.data)?[t]:[]},barData:function(t){return this.isBarType(t)?t.values:[]},lineOrScatterData:function(t){return this.isLineType(t)||this.isScatterType(t)?t.values:[]},barOrLineData:function(t){return this.isBarType(t)||this.isLineType(t)?t.values:[]},isInterpolationType:function(t){return["basis","basis-closed","basis-open","bundle","cardinal","cardinal-closed","cardinal-open","catmull-rom","catmull-rom-closed","catmull-rom-open","linear","linear-closed","monotone-x","monotone-y","natural"].indexOf(t)>=0}})},function(t,e,i){"use strict";var n=i(1),a=function(t){return t&&t.__esModule?t:{"default":t}}(n);(0,i(0).extend)(a.default.prototype,{isSafari:function(){var t=window.navigator.userAgent;return t.indexOf("Safari")>=0&&t.indexOf("Chrome")<0},isChrome:function(){return window.navigator.userAgent.indexOf("Chrome")>=0}})},function(t,e){},function(t,e,i){"use strict";e.__esModule=!0;var n=i(6),a=function(t){return t&&t.__esModule?t:{"default":t}}(n),r=function Options(){(0,a.default)(this,Options),this.value={bindto:"#chart",svg_classname:void 0,size_width:void 0,size_height:void 0,padding_left:void 0,padding_right:void 0,padding_top:void 0,padding_bottom:void 0,resize_auto:!0,zoom_enabled:!1,zoom_extent:void 0,zoom_privileged:!1,zoom_rescale:!1,zoom_onzoom:function(){},zoom_onzoomstart:function(){},zoom_onzoomend:function(){},zoom_x_min:void 0,zoom_x_max:void 0,interaction_brighten:!0,interaction_enabled:!0,interaction_inputType_mouse:!0,interaction_inputType_touch:!0,onover:function(){},onout:function(){},onresize:function(){},onresized:function(){},oninit:function(){},onrendered:function(){},transition_duration:350,data_x:void 0,data_xs:{},data_xFormat:"%Y-%m-%d",data_xLocaltime:!0,data_xSort:!0,data_idConverter:function(t){return t},data_names:{},data_classes:{},data_groups:[],data_axes:{},data_type:void 0,data_types:{},data_labels:{},data_order:"desc",data_regions:{},data_color:void 0,data_colors:{},data_hide:!1,data_filter:void 0,data_selection_enabled:!1,data_selection_grouped:!1,data_selection_isselectable:function(){return!0},data_selection_multiple:!0,data_selection_draggable:!1,data_onclick:function(){},data_onover:function(){},data_onout:function(){},data_onselected:function(){},data_onunselected:function(){},data_url:void 0,data_headers:void 0,data_json:void 0,data_rows:void 0,data_columns:void 0,data_mimeType:void 0,data_keys:void 0,data_empty_label_text:"",subchart_show:!1,subchart_size_height:60,subchart_axis_x_show:!0,subchart_onbrush:function(){},color_pattern:[],color_threshold:{},legend_show:!0,legend_hide:!1,legend_position:"bottom",legend_inset_anchor:"top-left",legend_inset_x:10,legend_inset_y:0,legend_inset_step:void 0,legend_item_onclick:void 0,legend_item_onover:void 0,legend_item_onout:void 0,legend_equally:!1,legend_padding:0,legend_item_tile_width:10,legend_item_tile_height:10,axis_rotated:!1,axis_x_show:!0,axis_x_type:"indexed",axis_x_localtime:!0,axis_x_categories:[],axis_x_tick_centered:!1,axis_x_tick_format:void 0,axis_x_tick_culling:{},axis_x_tick_culling_max:10,axis_x_tick_count:void 0,axis_x_tick_fit:!0,axis_x_tick_values:null,axis_x_tick_rotate:0,axis_x_tick_outer:!0,axis_x_tick_multiline:!0,axis_x_tick_width:null,axis_x_max:void 0,axis_x_min:void 0,axis_x_padding:{},axis_x_height:void 0,axis_x_extent:void 0,axis_x_label:{},axis_y_show:!0,axis_y_type:void 0,axis_y_max:void 0,axis_y_min:void 0,axis_y_inverted:!1,axis_y_center:void 0,axis_y_inner:!1,axis_y_label:{},axis_y_tick_format:void 0,axis_y_tick_outer:!0,axis_y_tick_values:null,axis_y_tick_rotate:0,axis_y_tick_count:void 0,axis_y_tick_time_value:void 0,axis_y_padding:{},axis_y_default:void 0,axis_y2_show:!1,axis_y2_max:void 0,axis_y2_min:void 0,axis_y2_inverted:!1,axis_y2_center:void 0,axis_y2_inner:!1,axis_y2_label:{},axis_y2_tick_format:void 0,axis_y2_tick_outer:!0,axis_y2_tick_values:null,axis_y2_tick_count:void 0,axis_y2_padding:{},axis_y2_default:void 0,grid_x_show:!1,grid_x_type:"tick",grid_x_lines:[],grid_y_show:!1,grid_y_lines:[],grid_y_ticks:10,grid_focus_show:!0,grid_lines_front:!0,point_show:!0,point_r:2.5,point_sensitivity:10,point_focus_expand_enabled:!0,point_focus_expand_r:void 0,point_select_r:void 0,line_connectNull:!1,line_step_type:"step",bar_width:void 0,bar_width_ratio:.6,bar_width_max:void 0,bar_zerobased:!0,area_zerobased:!0,area_above:!1,pie_label_show:!0,pie_label_format:void 0,pie_label_threshold:.05,pie_label_ratio:void 0,pie_expand:{},pie_expand_duration:50,pie_padAngle:0,gauge_fullCircle:!1,gauge_label_show:!0,gauge_label_format:void 0,gauge_min:0,gauge_max:100,gauge_startingAngle:-1*Math.PI/2,gauge_label_extents:void 0,gauge_units:void 0,gauge_width:void 0,gauge_expand:{},gauge_expand_duration:50,donut_label_show:!0,donut_label_format:void 0,donut_label_threshold:.05,donut_label_ratio:void 0,donut_width:void 0,donut_title:"",donut_expand:{},donut_expand_duration:50,donut_padAngle:0,spline_interpolation_type:"cardinal",regions:[],tooltip_show:!0,tooltip_grouped:!0,tooltip_format_title:void 0,tooltip_format_name:void 0,tooltip_format_value:void 0,tooltip_position:void 0,tooltip_contents:function(t,e,i,n){return this.getTooltipContent?this.getTooltipContent(t,e,i,n):""},tooltip_init_show:!1,tooltip_init_x:0,tooltip_init_position:{top:"0px",left:"50px"},tooltip_onshow:function(){},tooltip_onhide:function(){},title_text:void 0,title_padding:{top:0,right:0,bottom:0,left:0},title_position:"top-center"}};e.default=r,t.exports=e.default},function(t,e,i){"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}function _interopRequireWildcard(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e.default=t,e}e.__esModule=!0,e.d3=e.bb=void 0;var n=i(2),a=_interopRequireWildcard(n),r=i(4),o=_interopRequireDefault(r),s=i(1),l=_interopRequireDefault(s),d=i(7),u=_interopRequireDefault(d),c=i(0),f=_interopRequireWildcard(c);i(57);var g={version:"1.0.0",generate:function(t){return new o.default(t)},chart:{fn:o.default.prototype,internal:{fn:l.default.prototype,axis:{fn:u.default.prototype}}}};for(var h in f)/^__/.test(h)||(l.default.prototype[h]=f[h]);i(27),i(46),i(41),i(29),i(28),i(30),i(37),i(32),i(51),i(49),i(50),i(48),i(52),i(55),i(43),i(54),i(44),i(53),i(39),i(35),i(45),i(31),i(47),i(33),i(34),i(40),i(42),i(36),i(38),i(15),i(22),i(26),i(19),i(14),i(21),i(24),i(17),i(16),i(20),i(13),i(10),i(12),i(25),i(9),i(18),i(11),i(23),i(8),i(56),e.bb=g,e.d3=a},function(t,e,i){"use strict";e.__esModule=!0;var n="undefined"!=typeof window&&window.Math===Math?window:"undefined"!=typeof self&&self.Math===Math?self:Function("return this")();e.window=n;e.document=n.document}])}); +//# sourceMappingURL=billboard.min.js.map \ No newline at end of file diff --git a/dist/billboard.min.js.map b/dist/billboard.min.js.map new file mode 100644 index 000000000..a990a7505 --- /dev/null +++ b/dist/billboard.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"billboard.min.js","sources":["webpack:///billboard.min.js"],"mappings":";;;;;;;;;AAAA","sourceRoot":""} \ No newline at end of file diff --git a/dist/billboard.pkgd.js b/dist/billboard.pkgd.js new file mode 100644 index 000000000..22424e0c7 --- /dev/null +++ b/dist/billboard.pkgd.js @@ -0,0 +1,26951 @@ +/*! + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + * + * billboard.js, JavaScript chart library + * http://naver.github.io/billboard.js/ + * + * @version 1.0.0 + * + * All-in-one packaged file for ease use of 'billboard.js' with below dependency. + * - d3 + */ +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define([], factory); + else { + var a = factory(); + for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i]; + } +})(this, function() { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // identity function for calling harmony imports with the correct context +/******/ __webpack_require__.i = function(value) { return value; }; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { +/******/ configurable: false, +/******/ enumerable: true, +/******/ get: getter +/******/ }); +/******/ } +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = 59); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +exports.__esModule = !0; +exports.isObject = exports.isArray = exports.merge = exports.getRectSegList = exports.removeEvent = exports.addEvent = exports.extend = exports.brushEmpty = exports.getBrushSelection = exports.isEmpty = exports.diffDomain = exports.getPathBox = exports.sanitise = exports.hasValue = exports.isString = exports.getOption = exports.asHalfPixel = exports.isFunction = exports.ceil10 = exports.notEmpty = exports.isUndefined = exports.isDefined = exports.isValue = undefined; + +var _typeof2 = __webpack_require__(5), + _typeof3 = _interopRequireDefault(_typeof2), + _d = __webpack_require__(2), + _classes = __webpack_require__(3), + _classes2 = _interopRequireDefault(_classes); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +var isValue = function (v) { + return v || v === 0; +}, + isFunction = function (o) { + return typeof o === "function"; +}, + isString = function (o) { + return typeof o === "string"; +}, + isUndefined = function (v) { + return typeof v === "undefined"; +}, + isDefined = function (v) { + return typeof v !== "undefined"; +}, + ceil10 = function (v) { + return Math.ceil(v / 10) * 10; +}, + asHalfPixel = function (n) { + return Math.ceil(n) + 0.5; +}, + diffDomain = function (d) { + return d[1] - d[0]; +}, + isEmpty = function (o) { + return typeof o === "undefined" || o === null || isString(o) && o.length === 0 || (typeof o === "undefined" ? "undefined" : (0, _typeof3.default)(o)) === "object" && Object.keys(o).length === 0; +}, + notEmpty = function (o) { + return !isEmpty(o); +}, + getOption = function (options, key, defaultValue) { + return isDefined(options[key]) ? options[key] : defaultValue; +}, + hasValue = function (dict, value) { + var found = !1; + + return Object.keys(dict).forEach(function (key) { + return dict[key] === value && (found = !0); + }), found; +}, + sanitise = function (str) { + return typeof str === "string" ? str.replace(//g, ">") : str; +}, + getRectSegList = function (path) { + /* + * seg1 ---------- seg2 + * | | + * | | + * | | + * seg0 ---------- seg3 + * */ + var bbox = path.getBBox(), + list = []; + + // seg0 + + + return list.push({ + x: bbox.x, + y: bbox.y + bbox.height + }), list.push({ + x: bbox.x, + y: bbox.y + }), list.push({ + x: bbox.x + bbox.width, + y: bbox.y + }), list.push({ + x: bbox.x + bbox.width, + y: bbox.y + bbox.height + }), list; +}, + getPathBox = function (path) { + var box = path.getBoundingClientRect(), + items = getRectSegList(path), + minX = items[0].x, + minY = Math.min(items[0].y, items[1].y); + + + return { + x: minX, + y: minY, + width: box.width, + height: box.height + }; +}, + getBrushSelection = function () { + var selection = null, + event = _d.event; + + // check from event + + + return event && event.constructor.name === "BrushEvent" ? selection = event.selection : this.context && (selection = this.context.select("." + _classes2.default.brush).node()) && (selection = (0, _d.brushSelection)(selection)), selection; +}, + brushEmpty = function () { + var selection = this.getBrushSelection(); + + return !selection || selection[0] === selection[1]; +}; + +// substitution of SVGPathSeg API polyfill + + +// return brush selection array + + +function extend() { + var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, + source = arguments[1], + p = void 0; + + + for (p in source) target[p] = source[p]; + return target; +} + +var SUPPORT_ADDEVENTLISTENER = !!("addEventListener" in document), + SUPPORT_PASSIVE = function () { + var supportsPassiveOption = !1; + + try { + SUPPORT_ADDEVENTLISTENER && Object.defineProperty && document.addEventListener("test", null, Object.defineProperty({}, "passive", { + get: function get() { + supportsPassiveOption = !0; + } + })); + } catch (e) {} + return supportsPassiveOption; +}(); + + +function addEvent(element, type, handler, eventListenerOptions) { + if (SUPPORT_ADDEVENTLISTENER) { + var options = eventListenerOptions || !1; + + (typeof eventListenerOptions === "undefined" ? "undefined" : (0, _typeof3.default)(eventListenerOptions)) === "object" && (options = !!SUPPORT_PASSIVE && eventListenerOptions), element.addEventListener(type, handler, options); + } else element.attachEvent ? element.attachEvent("on" + type, handler) : element["on" + type] = handler; +} + +function removeEvent(element, type, handler) { + element.removeEventListener ? element.removeEventListener(type, handler, !1) : element.detachEvent ? element.detachEvent("on" + type, handler) : element["on" + type] = null; +} + +/** + * Check if is array + * @param arr * + * @returns {Boolean} + * @private + */ +var isArray = function (arr) { + return arr && arr.constructor === Array; +}, + isObject = function (obj) { + return obj && !obj.nodeType && (typeof obj === "undefined" ? "undefined" : (0, _typeof3.default)(obj)) === "object" && !isArray(obj); +}, + merge = function (target) { + for (var _len = arguments.length, objectN = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) objectN[_key - 1] = arguments[_key]; + + if (!objectN.length || objectN.length === 1 && !objectN[0]) return target; + + var source = objectN.shift(); + + return isObject(target) && isObject(source) && Object.keys(source).forEach(function (key) { + var value = source[key]; + + isObject(value) ? (!target[key] && (target[key] = {}), target[key] = merge(target[key], value)) : target[key] = isArray(value) ? value.concat() : value; + }), extend.apply(undefined, [target].concat(objectN)); +}; + +/** + * Check if is object + * @param {Object} obj + * @returns {Boolean} + * @private + */ + + +/** + * Merge object returning new object + * @param {Object} target + * @param {Object} objectN + * @returns {Object} merged target object + * @private + * @example + * var target = { a: 1 }; + * utils.extend(target, { b: 2, c: 3 }); + * target; // { a: 1, b: 2, c: 3 }; + */ +exports.isValue = isValue; +exports.isDefined = isDefined; +exports.isUndefined = isUndefined; +exports.notEmpty = notEmpty; +exports.ceil10 = ceil10; +exports.isFunction = isFunction; +exports.asHalfPixel = asHalfPixel; +exports.getOption = getOption; +exports.isString = isString; +exports.hasValue = hasValue; +exports.sanitise = sanitise; +exports.getPathBox = getPathBox; +exports.diffDomain = diffDomain; +exports.isEmpty = isEmpty; +exports.getBrushSelection = getBrushSelection; +exports.brushEmpty = brushEmpty; +exports.extend = extend; +exports.addEvent = addEvent; +exports.removeEvent = removeEvent; +exports.getRectSegList = getRectSegList; +exports.merge = merge; +exports.isArray = isArray; +exports.isObject = isObject; + +/***/ }), +/* 1 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +exports.__esModule = !0; + +var _classCallCheck2 = __webpack_require__(6), + _classCallCheck3 = _interopRequireDefault(_classCallCheck2), + _d = __webpack_require__(2), + _Axis = __webpack_require__(7), + _Axis2 = _interopRequireDefault(_Axis), + _classes = __webpack_require__(3), + _classes2 = _interopRequireDefault(_classes), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Internal chart class. + * - Note: Instantiated internally, not exposed for public. + * @class ChartInternal + * @ignore + * @private +*/ +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +var ChartInternal = function () { + function ChartInternal(api) { + (0, _classCallCheck3.default)(this, ChartInternal); + + var $$ = this; + + $$.api = api, $$.config = $$.getOptions(), $$.data = {}, $$.cache = {}, $$.axes = {}; + } + + return ChartInternal.prototype.beforeInit = function beforeInit() { + // can do something + }, ChartInternal.prototype.afterInit = function afterInit() { + // can do something + }, ChartInternal.prototype.init = function init() { + var $$ = this, + config = $$.config; + + + if ($$.initParams(), config.data_url) $$.convertUrlToData(config.data_url, config.data_mimeType, config.data_headers, config.data_keys, $$.initWithData);else if (config.data_json) $$.initWithData($$.convertJsonToData(config.data_json, config.data_keys));else if (config.data_rows) $$.initWithData($$.convertRowsToData(config.data_rows));else if (config.data_columns) $$.initWithData($$.convertColumnsToData(config.data_columns));else throw Error("url or json or rows or columns is required."); + }, ChartInternal.prototype.initParams = function initParams() { + var $$ = this, + config = $$.config; + $$.clipId = "bb-" + +new Date() + "-clip", $$.clipIdForXAxis = $$.clipId + "-xaxis", $$.clipIdForYAxis = $$.clipId + "-yaxis", $$.clipIdForGrid = $$.clipId + "-grid", $$.clipIdForSubchart = $$.clipId + "-subchart", $$.clipPath = $$.getClipPath($$.clipId), $$.clipPathForXAxis = $$.getClipPath($$.clipIdForXAxis), $$.clipPathForYAxis = $$.getClipPath($$.clipIdForYAxis), $$.clipPathForGrid = $$.getClipPath($$.clipIdForGrid), $$.clipPathForSubchart = $$.getClipPath($$.clipIdForSubchart), $$.dragStart = null, $$.dragging = !1, $$.flowing = !1, $$.cancelClick = !1, $$.mouseover = !1, $$.transiting = !1, $$.color = $$.generateColor(), $$.levelColor = $$.generateLevelColor(), $$.dataTimeFormat = config.data_xLocaltime ? _d.timeParse : _d.utcParse, $$.axisTimeFormat = config.axis_x_localtime ? _d.timeFormat : _d.utcFormat, $$.defaultAxisTimeFormat = function (d) { + var specifier = d.getMilliseconds() && ".%L" || d.getSeconds() && ".:%S" || d.getMinutes() && "%I:%M" || d.getHours() && "%I %p" || d.getDay() && d.getDate() !== 1 && "%-m/%-d" || d.getDate() !== 1 && "%b %d" || d.getMonth() && "%-m/%-d" || "%Y/%-m/%-d"; + + return $$.axisTimeFormat(specifier)(d); + }, $$.hiddenTargetIds = [], $$.hiddenLegendIds = [], $$.focusedTargetIds = [], $$.defocusedTargetIds = [], $$.xOrient = config.axis_rotated ? "left" : "bottom", $$.yOrient = config.axis_rotated ? config.axis_y_inner ? "top" : "bottom" : config.axis_y_inner ? "right" : "left", $$.y2Orient = config.axis_rotated ? config.axis_y2_inner ? "bottom" : "top" : config.axis_y2_inner ? "left" : "right", $$.subXOrient = config.axis_rotated ? "left" : "bottom", $$.isLegendRight = config.legend_position === "right", $$.isLegendInset = config.legend_position === "inset", $$.isLegendTop = config.legend_inset_anchor === "top-left" || config.legend_inset_anchor === "top-right", $$.isLegendLeft = config.legend_inset_anchor === "top-left" || config.legend_inset_anchor === "bottom-left", $$.legendStep = 0, $$.legendItemWidth = 0, $$.legendItemHeight = 0, $$.currentMaxTickWidths = { + x: 0, + y: 0, + y2: 0 + }, $$.rotated_padding_left = 30, $$.rotated_padding_right = config.axis_rotated && !config.axis_x_show ? 0 : 30, $$.rotated_padding_top = 5, $$.withoutFadeIn = {}, $$.intervalForObserveInserted = undefined, $$.inputType = $$.convertInputType(), $$.axes.subx = (0, _d.selectAll)([]); + }, ChartInternal.prototype.initWithData = function initWithData(data) { + var $$ = this, + config = $$.config, + binding = !0; + $$.axis = new _Axis2.default($$), $$.initPie && $$.initPie(), $$.initBrush && $$.initBrush(), $$.initZoom && $$.initZoom(), $$.selectChart = config.bindto ? typeof config.bindto.node === "function" ? config.bindto : (0, _d.select)(config.bindto) : (0, _d.selectAll)([]), $$.selectChart.empty() && ($$.selectChart = (0, _d.select)(document.createElement("div")).style("opacity", "0"), $$.observeInserted($$.selectChart), binding = !1), $$.selectChart.html("").classed("bb", !0), $$.data.xs = {}, $$.data.targets = $$.convertDataToTargets(data), config.data_filter && ($$.data.targets = $$.data.targets.filter(config.data_filter)), config.data_hide && $$.addHiddenTargetIds(config.data_hide === !0 ? $$.mapToIds($$.data.targets) : config.data_hide), config.legend_hide && $$.addHiddenLegendIds(config.legend_hide === !0 ? $$.mapToIds($$.data.targets) : config.legend_hide), $$.hasType("gauge") && (config.legend_show = !1), $$.updateSizes(), $$.updateScales(), $$.x.domain((0, _d.extent)($$.getXDomain($$.data.targets))), $$.y.domain($$.getYDomain($$.data.targets, "y")), $$.y2.domain($$.getYDomain($$.data.targets, "y2")), $$.subX.domain($$.x.domain()), $$.subY.domain($$.y.domain()), $$.subY2.domain($$.y2.domain()), $$.orgXDomain = $$.x.domain(); + + + // -- Basic Elements -- + + var isTouch = $$.inputType === "touch"; + + // Define svg + $$.svg = $$.selectChart.append("svg").style("overflow", "hidden").on(isTouch ? "touchstart" : "mouseenter", function () { + return config.onover.call($$); + }).on(isTouch ? "touchend" : "mouseleave", function () { + return config.onout.call($$); + }), $$.config.svg_classname && $$.svg.attr("class", $$.config.svg_classname); + + + // Define defs + var defs = $$.svg.append("defs"); + + $$.clipChart = $$.appendClip(defs, $$.clipId), $$.clipXAxis = $$.appendClip(defs, $$.clipIdForXAxis), $$.clipYAxis = $$.appendClip(defs, $$.clipIdForYAxis), $$.clipGrid = $$.appendClip(defs, $$.clipIdForGrid), $$.clipSubchart = $$.appendClip(defs, $$.clipIdForSubchart), $$.updateSvgSize(); + + + // Set initialized scales to brush and zoom + // if ($$.brush) { $$.brush.scale($$.subX); } + // if (config.zoom_enabled) { $$.zoom.scale($$.x); } + + // Define regions + var main = $$.svg.append("g").attr("transform", $$.getTranslate("main")); + + $$.main = main, config.subchart_show && $$.initSubchart && $$.initSubchart(), $$.initTooltip && $$.initTooltip(), $$.initLegend && $$.initLegend(), $$.initTitle && $$.initTitle(), main.append("text").attr("class", _classes2.default.text + " " + _classes2.default.empty).attr("text-anchor", "middle" // horizontal centering of text at x position in all browsers. + ).attr("dominant-baseline", "middle"), $$.initRegion(), $$.initGrid(), main.append("g").attr("clip-path", $$.clipPath).attr("class", _classes2.default.chart), config.grid_lines_front && $$.initGridLines(), $$.initEventRect(), $$.initChartElements(), main.insert("rect", config.zoom_privileged ? null : "g." + _classes2.default.regions).attr("class", _classes2.default.zoomRect).attr("width", $$.width).attr("height", $$.height).style("opacity", "0").on("dblclick.zoom", null), config.axis_x_extent && $$.brush.scale($$.getDefaultExtent()), $$.axis.init(), $$.updateTargets($$.data.targets), binding && ($$.updateDimension(), $$.config.oninit.call($$), $$.redraw({ + withTransition: !1, + withTransform: !0, + withUpdateXDomain: !0, + withUpdateOrgXDomain: !0, + withTransitionForAxis: !1 + })), $$.bindResize(), $$.api.element = $$.selectChart.node(); + }, ChartInternal.prototype.initChartElements = function initChartElements() { + this.initBar && this.initBar(), this.initLine && this.initLine(), this.initArc && this.initArc(), this.initGauge && this.initGauge(), this.initText && this.initText(); + }, ChartInternal.prototype.smoothLines = function smoothLines(el, type) { + type === "grid" && el.each(function () { + var g = (0, _d.select)(this), + x1 = g.attr("x1"), + x2 = g.attr("x2"), + y1 = g.attr("y1"), + y2 = g.attr("y2"); + g.attr({ + "x1": Math.ceil(x1), + "x2": Math.ceil(x2), + "y1": Math.ceil(y1), + "y2": Math.ceil(y2) + }); + }); + }, ChartInternal.prototype.updateSizes = function updateSizes() { + var $$ = this, + config = $$.config, + legendHeight = $$.legend ? $$.getLegendHeight() : 0, + legendWidth = $$.legend ? $$.getLegendWidth() : 0, + legendHeightForBottom = $$.isLegendRight || $$.isLegendInset ? 0 : legendHeight, + hasArc = $$.hasArcType(), + xAxisHeight = config.axis_rotated || hasArc ? 0 : $$.getHorizontalAxisHeight("x"), + subchartHeight = config.subchart_show && !hasArc ? config.subchart_size_height + xAxisHeight : 0; + $$.currentWidth = $$.getCurrentWidth(), $$.currentHeight = $$.getCurrentHeight(), $$.margin = config.axis_rotated ? { + top: $$.getHorizontalAxisHeight("y2") + $$.getCurrentPaddingTop(), + right: hasArc ? 0 : $$.getCurrentPaddingRight(), + bottom: $$.getHorizontalAxisHeight("y") + legendHeightForBottom + $$.getCurrentPaddingBottom(), + left: subchartHeight + (hasArc ? 0 : $$.getCurrentPaddingLeft()) + } : { + top: 4 + $$.getCurrentPaddingTop(), // for top tick text + right: hasArc ? 0 : $$.getCurrentPaddingRight(), + bottom: xAxisHeight + subchartHeight + legendHeightForBottom + $$.getCurrentPaddingBottom(), + left: hasArc ? 0 : $$.getCurrentPaddingLeft() + }, $$.margin2 = config.axis_rotated ? { + top: $$.margin.top, + right: NaN, + bottom: 20 + legendHeightForBottom, + left: $$.rotated_padding_left + } : { + top: $$.currentHeight - subchartHeight - legendHeightForBottom, + right: NaN, + bottom: xAxisHeight + legendHeightForBottom, + left: $$.margin.left + }, $$.margin3 = { + top: 0, + right: NaN, + bottom: 0, + left: 0 + }, $$.updateSizeForLegend && $$.updateSizeForLegend(legendHeight, legendWidth), $$.width = $$.currentWidth - $$.margin.left - $$.margin.right, $$.height = $$.currentHeight - $$.margin.top - $$.margin.bottom, $$.width < 0 && ($$.width = 0), $$.height < 0 && ($$.height = 0), $$.width2 = config.axis_rotated ? $$.margin.left - $$.rotated_padding_left - $$.rotated_padding_right : $$.width, $$.height2 = config.axis_rotated ? $$.height : $$.currentHeight - $$.margin2.top - $$.margin2.bottom, $$.width2 < 0 && ($$.width2 = 0), $$.height2 < 0 && ($$.height2 = 0), $$.arcWidth = $$.width - ($$.isLegendRight ? legendWidth + 10 : 0), $$.arcHeight = $$.height - ($$.isLegendRight ? 0 : 10), $$.hasType("gauge") && !config.gauge_fullCircle && ($$.arcHeight += $$.height - $$.getGaugeLabelHeight()), $$.updateRadius && $$.updateRadius(), $$.isLegendRight && hasArc && ($$.margin3.left = $$.arcWidth / 2 + $$.radiusExpanded * 1.1); + }, ChartInternal.prototype.updateTargets = function updateTargets(targets) { + var $$ = this; + + // -- Main -- + + // -- Text -- // + $$.updateTargetsForText(targets), $$.updateTargetsForBar(targets), $$.updateTargetsForLine(targets), $$.hasArcType() && $$.updateTargetsForArc && $$.updateTargetsForArc(targets), $$.updateTargetsForSubchart && $$.updateTargetsForSubchart(targets), $$.showTargets(); + }, ChartInternal.prototype.showTargets = function showTargets() { + var $$ = this; + + $$.svg.selectAll("." + _classes2.default.target).filter(function (d) { + return $$.isTargetToShow(d.id); + }).transition().duration($$.config.transition_duration).style("opacity", "1"); + }, ChartInternal.prototype.redraw = function redraw() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, + transitionsValue = arguments[1], + $$ = this, + main = $$.main, + config = $$.config, + areaIndices = $$.getShapeIndices($$.isAreaType), + barIndices = $$.getShapeIndices($$.isBarType), + lineIndices = $$.getShapeIndices($$.isLineType), + waitForDraw = void 0, + flow = void 0, + hideAxis = $$.hasArcType(), + targetsToShow = $$.filterTargetsToShow($$.data.targets), + xv = $$.xv.bind($$), + tickValues = void 0, + intervalForCulling = void 0, + xDomainForZoom = void 0, + withY = (0, _util.getOption)(options, "withY", !0), + withSubchart = (0, _util.getOption)(options, "withSubchart", !0), + withTransition = (0, _util.getOption)(options, "withTransition", !0), + withTransform = (0, _util.getOption)(options, "withTransform", !1), + withUpdateXDomain = (0, _util.getOption)(options, "withUpdateXDomain", !1), + withUpdateOrgXDomain = (0, _util.getOption)(options, "withUpdateOrgXDomain", !1), + withTrimXDomain = (0, _util.getOption)(options, "withTrimXDomain", !0), + withUpdateXAxis = (0, _util.getOption)(options, "withUpdateXAxis", withUpdateXDomain), + withLegend = (0, _util.getOption)(options, "withLegend", !1), + withEventRect = (0, _util.getOption)(options, "withEventRect", !0), + withDimension = (0, _util.getOption)(options, "withDimension", !0), + withTransitionForExit = (0, _util.getOption)(options, "withTransitionForExit", withTransition), + withTransitionForAxis = (0, _util.getOption)(options, "withTransitionForAxis", withTransition), + duration = withTransition ? config.transition_duration : 0, + durationForExit = withTransitionForExit ? duration : 0, + durationForAxis = withTransitionForAxis ? duration : 0, + transitions = transitionsValue || $$.axis.generateTransitions(durationForAxis); + + + // show/hide if manual culling needed + if ($$.inputType === "touch" && $$.hideTooltip(), withLegend && config.legend_show ? $$.updateLegend($$.mapToIds($$.data.targets), options, transitions) : withDimension && $$.updateDimension(!0), $$.isCategorized() && targetsToShow.length === 0 && $$.x.domain([0, $$.axes.x.selectAll(".tick").size()]), targetsToShow.length ? ($$.updateXDomain(targetsToShow, withUpdateXDomain, withUpdateOrgXDomain, withTrimXDomain), !config.axis_x_tick_values && (tickValues = $$.axis.updateXAxisTickValues(targetsToShow))) : ($$.xAxis.tickValues([]), $$.subXAxis.tickValues([])), config.zoom_rescale && !options.flow && (xDomainForZoom = $$.x.orgDomain()), $$.y.domain($$.getYDomain(targetsToShow, "y", xDomainForZoom)), $$.y2.domain($$.getYDomain(targetsToShow, "y2", xDomainForZoom)), !config.axis_y_tick_values && config.axis_y_tick_count && $$.yAxis.tickValues($$.axis.generateTickValues($$.y.domain(), config.axis_y_tick_count, $$.isTimeSeriesY())), !config.axis_y2_tick_values && config.axis_y2_tick_count && $$.y2Axis.tickValues($$.axis.generateTickValues($$.y2.domain(), config.axis_y2_tick_count)), $$.axis.redraw(transitions, hideAxis), $$.axis.updateLabels(withTransition), (withUpdateXDomain || withUpdateXAxis) && targetsToShow.length) if (config.axis_x_tick_culling && tickValues) { + for (var _i = 1; _i < tickValues.length; _i++) if (tickValues.length / _i < config.axis_x_tick_culling_max) { + intervalForCulling = _i; + + break; + } + + $$.svg.selectAll("." + _classes2.default.axisX + " .tick text").each(function (e) { + var index = tickValues.indexOf(e); + + index >= 0 && (0, _d.select)(this).style("display", index % intervalForCulling ? "none" : "block"); + }); + } else $$.svg.selectAll("." + _classes2.default.axisX + " .tick text").style("display", "block"); + + // setup drawer - MEMO: these must be called after axis updated + var drawArea = $$.generateDrawArea ? $$.generateDrawArea(areaIndices, !1) : undefined, + drawBar = $$.generateDrawBar ? $$.generateDrawBar(barIndices) : undefined, + drawLine = $$.generateDrawLine ? $$.generateDrawLine(lineIndices, !1) : undefined, + xForText = $$.generateXYForText(areaIndices, barIndices, lineIndices, !0), + yForText = $$.generateXYForText(areaIndices, barIndices, lineIndices, !1); + + withY && ($$.subY.domain($$.getYDomain(targetsToShow, "y")), $$.subY2.domain($$.getYDomain(targetsToShow, "y2"))), $$.updateXgridFocus(), main.select("text." + _classes2.default.text + "." + _classes2.default.empty).attr("x", $$.width / 2).attr("y", $$.height / 2).text(config.data_empty_label_text).transition().style("opacity", targetsToShow.length ? 0 : 1), $$.updateGrid(duration), $$.updateRegion(duration), $$.updateBar(durationForExit), $$.updateLine(durationForExit), $$.updateArea(durationForExit), $$.updateCircle(), $$.hasDataLabel() && $$.updateText(durationForExit), $$.redrawTitle && $$.redrawTitle(), $$.redrawArc && $$.redrawArc(duration, durationForExit, withTransform), config.subchart_show && $$.redrawSubchart && $$.redrawSubchart(withSubchart, transitions, duration, durationForExit, areaIndices, barIndices, lineIndices), main.selectAll("." + _classes2.default.selectedCircles).filter($$.isBarType.bind($$)).selectAll("circle").remove(), config.interaction_enabled && !options.flow && withEventRect && ($$.redrawEventRect(), $$.updateZoom && $$.updateZoom()), $$.updateCircleY(); + + + // generate circle x/y functions depending on updated params + var cx = ($$.config.axis_rotated ? $$.circleY : $$.circleX).bind($$), + cy = ($$.config.axis_rotated ? $$.circleX : $$.circleY).bind($$); + options.flow && (flow = $$.generateFlow({ + targets: targetsToShow, + flow: options.flow, + duration: options.flow.duration, + drawBar: drawBar, + drawLine: drawLine, + drawArea: drawArea, + cx: cx, + cy: cy, + xv: xv, + xForText: xForText, + yForText: yForText + })), (duration || flow) && $$.isTabVisible() ? (0, _d.transition)().duration(duration).each(function () { + waitForDraw = $$.generateWait(), [$$.redrawBar(drawBar, !0), $$.redrawLine(drawLine, !0), $$.redrawArea(drawArea, !0), $$.redrawCircle(cx, cy, !0, flow), $$.redrawText(xForText, yForText, options.flow, !0), $$.redrawRegion(!0), $$.redrawGrid(!0)].reduce(function (acc, t1) { + return t1.forEach(function (t2) { + acc.push(t2); + }), acc; + }, []).forEach(function (t) { + waitForDraw.add(t); + }); + }).call(waitForDraw, function () { + flow && flow(), config.onrendered && config.onrendered.call($$); + }) : ($$.redrawBar(drawBar), $$.redrawLine(drawLine), $$.redrawArea(drawArea), $$.redrawCircle(cx, cy), $$.redrawText(xForText, yForText, options.flow), $$.redrawRegion(), $$.redrawGrid(), config.onrendered && config.onrendered.call($$)), $$.mapToIds($$.data.targets).forEach(function (id) { + $$.withoutFadeIn[id] = !0; + }); + }, ChartInternal.prototype.updateAndRedraw = function updateAndRedraw() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, + $$ = this, + config = $$.config, + transitions = void 0; + options.withTransition = (0, _util.getOption)(options, "withTransition", !0), options.withTransform = (0, _util.getOption)(options, "withTransform", !1), options.withLegend = (0, _util.getOption)(options, "withLegend", !1), options.withUpdateXDomain = !0, options.withUpdateOrgXDomain = !0, options.withTransitionForExit = !1, options.withTransitionForTransform = (0, _util.getOption)(options, "withTransitionForTransform", options.withTransition), $$.updateSizes(), options.withLegend && config.legend_show || (transitions = $$.axis.generateTransitions(options.withTransitionForAxis ? config.transition_duration : 0), $$.updateScales(), $$.updateSvgSize(), $$.transformAll(options.withTransitionForTransform, transitions)), $$.redraw(options, transitions); + }, ChartInternal.prototype.redrawWithoutRescale = function redrawWithoutRescale() { + this.redraw({ + withY: !1, + withSubchart: !1, + withEventRect: !1, + withTransitionForAxis: !1 + }); + }, ChartInternal.prototype.isTimeSeries = function isTimeSeries() { + return this.config.axis_x_type === "timeseries"; + }, ChartInternal.prototype.isCategorized = function isCategorized() { + return this.config.axis_x_type.indexOf("categor") >= 0; + }, ChartInternal.prototype.isCustomX = function isCustomX() { + var $$ = this, + config = $$.config; + + + return !$$.isTimeSeries() && (config.data_x || (0, _util.notEmpty)(config.data_xs)); + }, ChartInternal.prototype.isTimeSeriesY = function isTimeSeriesY() { + return this.config.axis_y_type === "timeseries"; + }, ChartInternal.prototype.getTranslate = function getTranslate(target) { + var $$ = this, + config = $$.config, + x = void 0, + y = void 0; + + + return target === "main" ? (x = (0, _util.asHalfPixel)($$.margin.left), y = (0, _util.asHalfPixel)($$.margin.top)) : target === "context" ? (x = (0, _util.asHalfPixel)($$.margin2.left), y = (0, _util.asHalfPixel)($$.margin2.top)) : target === "legend" ? (x = $$.margin3.left, y = $$.margin3.top) : target === "x" ? (x = 0, y = config.axis_rotated ? 0 : $$.height) : target === "y" ? (x = 0, y = config.axis_rotated ? $$.height : 0) : target === "y2" ? (x = config.axis_rotated ? 0 : $$.width, y = config.axis_rotated ? 1 : 0) : target === "subx" ? (x = 0, y = config.axis_rotated ? 0 : $$.height2) : target === "arc" && (x = $$.arcWidth / 2, y = $$.arcHeight / 2), "translate(" + x + ", " + y + ")"; + }, ChartInternal.prototype.initialOpacity = function initialOpacity(d) { + return d.value !== null && this.withoutFadeIn[d.id] ? "1" : "0"; + }, ChartInternal.prototype.initialOpacityForCircle = function initialOpacityForCircle(d) { + return d.value !== null && this.withoutFadeIn[d.id] ? this.opacityForCircle(d) : "0"; + }, ChartInternal.prototype.opacityForCircle = function opacityForCircle(d) { + var opacity = this.config.point_show ? "1" : "0"; + + return (0, _util.isValue)(d.value) ? this.isScatterType(d) ? "0.5" : opacity : "0"; + }, ChartInternal.prototype.opacityForText = function opacityForText() { + return this.hasDataLabel() ? "1" : "0"; + }, ChartInternal.prototype.xx = function xx(d) { + return this.config.zoom_enabled && this.zoomScale ? d ? this.zoomScale(d.x) : null : d ? this.x(d.x) : null; + }, ChartInternal.prototype.xv = function xv(d) { + var $$ = this, + value = d.value; + + + return $$.isTimeSeries() ? value = $$.parseDate(d.value) : $$.isCategorized() && typeof d.value === "string" && (value = $$.config.axis_x_categories.indexOf(d.value)), Math.ceil($$.x(value)); + }, ChartInternal.prototype.yv = function yv(d) { + var $$ = this, + yScale = d.axis && d.axis === "y2" ? $$.y2 : $$.y; + + + return Math.ceil(yScale(d.value)); + }, ChartInternal.prototype.subxx = function subxx(d) { + return d ? this.subX(d.x) : null; + }, ChartInternal.prototype.transformMain = function transformMain(withTransition, transitions) { + var $$ = this, + xAxis = void 0, + yAxis = void 0, + y2Axis = void 0; + transitions && transitions.axisX ? xAxis = transitions.axisX : (xAxis = $$.main.select("." + _classes2.default.axisX), withTransition && (xAxis = xAxis.transition())), transitions && transitions.axisY ? yAxis = transitions.axisY : (yAxis = $$.main.select("." + _classes2.default.axisY), withTransition && (yAxis = yAxis.transition())), transitions && transitions.axisY2 ? y2Axis = transitions.axisY2 : (y2Axis = $$.main.select("." + _classes2.default.axisY2), withTransition && (y2Axis = y2Axis.transition())), (withTransition ? $$.main.transition() : $$.main).attr("transform", $$.getTranslate("main")), xAxis.attr("transform", $$.getTranslate("x")), yAxis.attr("transform", $$.getTranslate("y")), y2Axis.attr("transform", $$.getTranslate("y2")), $$.main.select("." + _classes2.default.chartArcs).attr("transform", $$.getTranslate("arc")); + }, ChartInternal.prototype.transformAll = function transformAll(withTransition, transitions) { + var $$ = this; + + $$.transformMain(withTransition, transitions), $$.config.subchart_show && $$.transformContext(withTransition, transitions), $$.legend && $$.transformLegend(withTransition); + }, ChartInternal.prototype.updateSvgSize = function updateSvgSize() { + var $$ = this, + brush = $$.svg.select("." + _classes2.default.brush + " .overlay"), + brushHeight = brush.size() ? brush.attr("height") : 0; + $$.svg.attr("width", $$.currentWidth).attr("height", $$.currentHeight), $$.svg.selectAll(["#" + $$.clipId, "#" + $$.clipIdForGrid]).select("rect").attr("width", $$.width).attr("height", $$.height), $$.svg.select("#" + $$.clipIdForXAxis).select("rect").attr("x", $$.getXAxisClipX.bind($$)).attr("y", $$.getXAxisClipY.bind($$)).attr("width", $$.getXAxisClipWidth.bind($$)).attr("height", $$.getXAxisClipHeight.bind($$)), $$.svg.select("#" + $$.clipIdForYAxis).select("rect").attr("x", $$.getYAxisClipX.bind($$)).attr("y", $$.getYAxisClipY.bind($$)).attr("width", $$.getYAxisClipWidth.bind($$)).attr("height", $$.getYAxisClipHeight.bind($$)), $$.svg.select("#" + $$.clipIdForSubchart).select("rect").attr("width", $$.width).attr("height", brushHeight), $$.svg.select("." + _classes2.default.zoomRect).attr("width", $$.width).attr("height", $$.height), $$.selectChart.style("max-height", $$.currentHeight + "px"), $$.brush && $$.brush.scale($$.subX, brushHeight); + }, ChartInternal.prototype.updateDimension = function updateDimension(withoutAxis) { + var $$ = this; + + withoutAxis || ($$.config.axis_rotated ? ($$.axes.x.call($$.xAxis), $$.axes.subx.call($$.subXAxis)) : ($$.axes.y.call($$.yAxis), $$.axes.y2.call($$.y2Axis))), $$.updateSizes(), $$.updateScales(withoutAxis), $$.updateSvgSize(), $$.transformAll(!1); + }, ChartInternal.prototype.observeInserted = function observeInserted(selection) { + var $$ = this; + + if (typeof MutationObserver === "undefined") return void (console && console.error && console.error("MutationObserver not defined.")); + + var observer = new MutationObserver(function (mutations) { + mutations.forEach(function (mutation) { + mutation.type === "childList" && mutation.previousSibling && (observer.disconnect(), $$.intervalForObserveInserted = window.setInterval(function () { + selection.node().parentNode && (window.clearInterval($$.intervalForObserveInserted), $$.updateDimension(), $$.brush && $$.brush.update(), $$.config.oninit.call($$), $$.redraw({ + withTransform: !0, + withUpdateXDomain: !0, + withUpdateOrgXDomain: !0, + withTransition: !1, + withTransitionForTransform: !1, + withLegend: !0 + }), selection.transition().style("opacity", "1")); + }, 10)); + }); + }); + + observer.observe(selection.node(), { + attributes: !0, + childList: !0, + characterData: !0 + }); + }, ChartInternal.prototype.bindResize = function bindResize() { + var $$ = this, + config = $$.config; + $$.resizeFunction = $$.generateResize(), $$.resizeFunction.add(function () { + config.onresize.call($$); + }), config.resize_auto && $$.resizeFunction.add(function () { + $$.resizeTimeout !== undefined && window.clearTimeout($$.resizeTimeout), $$.resizeTimeout = window.setTimeout(function () { + delete $$.resizeTimeout, $$.api.flush(); + }, 100); + }), $$.resizeFunction.add(function () { + config.onresized.call($$); + }), (0, _util.addEvent)(window, "resize", $$.resizeFunction); + }, ChartInternal.prototype.generateResize = function generateResize() { + + function callResizeFunctions() { + resizeFunctions.forEach(function (f) { + return f(); + }); + } + + var resizeFunctions = []; + + return callResizeFunctions.add = function (f) { + resizeFunctions.push(f); + }, callResizeFunctions.remove = function (f) { + for (var i = 0; i < resizeFunctions.length; i++) if (resizeFunctions[i] === f) { + resizeFunctions.splice(i, 1); + + break; + } + }, callResizeFunctions; + }, ChartInternal.prototype.endall = function endall(transition, callback) { + var n = 0; + + transition.each(function () { + return ++n; + }).on("end", function () { + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) args[_key] = arguments[_key]; + + --n || callback.apply.apply(callback, [this].concat(args)); + }); + }, ChartInternal.prototype.generateWait = function generateWait() { + var transitionsToWait = [], + f = function (transition, callback) { + + function loop() { + var done = 0; + + transitionsToWait.forEach(function (t) { + if (t.empty()) return void (done += 1); + + try { + t.transition(); + } catch (e) { + done += 1; + } + }), done === transitionsToWait.length ? (clearTimeout(timer), callback && callback()) : timer = setTimeout(loop, 20); + } + + var timer = void 0;loop(); + }; + + + return f.add = function (transition) { + Array.isArray(transition) ? transitionsToWait = [].concat(transitionsToWait, transition) : transitionsToWait.push(transition); + }, f; + }, ChartInternal.prototype.parseDate = function parseDate(date) { + var $$ = this, + parsedDate = void 0; + + + return date instanceof Date ? parsedDate = date : typeof date === "string" ? parsedDate = $$.dataTimeFormat($$.config.data_xFormat)(date) : typeof date === "number" && !isNaN(date) && (parsedDate = new Date(+date)), (!parsedDate || isNaN(+parsedDate)) && console && console.error && console.error("Failed to parse x '" + date + "' to Date object"), parsedDate; + }, ChartInternal.prototype.isTabVisible = function isTabVisible() { + var hidden = void 0; + + return typeof document.hidden === "undefined" ? typeof document.mozHidden === "undefined" ? typeof document.msHidden === "undefined" ? typeof document.webkitHidden !== "undefined" && (hidden = "webkitHidden") : hidden = "msHidden" : hidden = "mozHidden" : hidden = "hidden", !document[hidden]; + }, ChartInternal.prototype.convertInputType = function convertInputType() { + var $$ = this, + config = $$.config, + hasMouse = !!config.interaction_inputType_mouse && !!("onmouseover" in window), + hasTouch = void 0; + + + return config.interaction_inputType_touch ? (hasTouch = "ontouchstart" in window || window.DocumentTouch && document instanceof window.DocumentTouch, /PhantomJS/.test(window.navigator.userAgent) && (hasTouch = !1)) : hasTouch = !1, hasTouch && "touch" || hasMouse && "mouse" || null; + }, ChartInternal; +}(); + +exports.default = ChartInternal; +module.exports = exports["default"]; + +/***/ }), +/* 2 */ +/***/ (function(module, exports, __webpack_require__) { + +// https://d3js.org Version 4.9.1. Copyright 2017 Mike Bostock. +(function (global, factory) { + true ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (factory((global.d3 = global.d3 || {}))); +}(this, (function (exports) { 'use strict'; + +var version = "4.9.1"; + +var ascending = function(a, b) { + return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; +}; + +var bisector = function(compare) { + if (compare.length === 1) compare = ascendingComparator(compare); + return { + left: function(a, x, lo, hi) { + if (lo == null) lo = 0; + if (hi == null) hi = a.length; + while (lo < hi) { + var mid = lo + hi >>> 1; + if (compare(a[mid], x) < 0) lo = mid + 1; + else hi = mid; + } + return lo; + }, + right: function(a, x, lo, hi) { + if (lo == null) lo = 0; + if (hi == null) hi = a.length; + while (lo < hi) { + var mid = lo + hi >>> 1; + if (compare(a[mid], x) > 0) hi = mid; + else lo = mid + 1; + } + return lo; + } + }; +}; + +function ascendingComparator(f) { + return function(d, x) { + return ascending(f(d), x); + }; +} + +var ascendingBisect = bisector(ascending); +var bisectRight = ascendingBisect.right; +var bisectLeft = ascendingBisect.left; + +var pairs = function(array, f) { + if (f == null) f = pair; + var i = 0, n = array.length - 1, p = array[0], pairs = new Array(n < 0 ? 0 : n); + while (i < n) pairs[i] = f(p, p = array[++i]); + return pairs; +}; + +function pair(a, b) { + return [a, b]; +} + +var cross = function(values0, values1, reduce) { + var n0 = values0.length, + n1 = values1.length, + values = new Array(n0 * n1), + i0, + i1, + i, + value0; + + if (reduce == null) reduce = pair; + + for (i0 = i = 0; i0 < n0; ++i0) { + for (value0 = values0[i0], i1 = 0; i1 < n1; ++i1, ++i) { + values[i] = reduce(value0, values1[i1]); + } + } + + return values; +}; + +var descending = function(a, b) { + return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN; +}; + +var number = function(x) { + return x === null ? NaN : +x; +}; + +var variance = function(values, valueof) { + var n = values.length, + m = 0, + i = -1, + mean = 0, + value, + delta, + sum = 0; + + if (valueof == null) { + while (++i < n) { + if (!isNaN(value = number(values[i]))) { + delta = value - mean; + mean += delta / ++m; + sum += delta * (value - mean); + } + } + } + + else { + while (++i < n) { + if (!isNaN(value = number(valueof(values[i], i, values)))) { + delta = value - mean; + mean += delta / ++m; + sum += delta * (value - mean); + } + } + } + + if (m > 1) return sum / (m - 1); +}; + +var deviation = function(array, f) { + var v = variance(array, f); + return v ? Math.sqrt(v) : v; +}; + +var extent = function(values, valueof) { + var n = values.length, + i = -1, + value, + min, + max; + + if (valueof == null) { + while (++i < n) { // Find the first comparable value. + if ((value = values[i]) != null && value >= value) { + min = max = value; + while (++i < n) { // Compare the remaining values. + if ((value = values[i]) != null) { + if (min > value) min = value; + if (max < value) max = value; + } + } + } + } + } + + else { + while (++i < n) { // Find the first comparable value. + if ((value = valueof(values[i], i, values)) != null && value >= value) { + min = max = value; + while (++i < n) { // Compare the remaining values. + if ((value = valueof(values[i], i, values)) != null) { + if (min > value) min = value; + if (max < value) max = value; + } + } + } + } + } + + return [min, max]; +}; + +var array = Array.prototype; + +var slice = array.slice; +var map = array.map; + +var constant = function(x) { + return function() { + return x; + }; +}; + +var identity = function(x) { + return x; +}; + +var sequence = function(start, stop, step) { + start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step; + + var i = -1, + n = Math.max(0, Math.ceil((stop - start) / step)) | 0, + range = new Array(n); + + while (++i < n) { + range[i] = start + i * step; + } + + return range; +}; + +var e10 = Math.sqrt(50); +var e5 = Math.sqrt(10); +var e2 = Math.sqrt(2); + +var ticks = function(start, stop, count) { + var reverse = stop < start, + i = -1, + n, + ticks, + step; + + if (reverse) n = start, start = stop, stop = n; + + if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) return []; + + if (step > 0) { + start = Math.ceil(start / step); + stop = Math.floor(stop / step); + ticks = new Array(n = Math.ceil(stop - start + 1)); + while (++i < n) ticks[i] = (start + i) * step; + } else { + start = Math.floor(start * step); + stop = Math.ceil(stop * step); + ticks = new Array(n = Math.ceil(start - stop + 1)); + while (++i < n) ticks[i] = (start - i) / step; + } + + if (reverse) ticks.reverse(); + + return ticks; +}; + +function tickIncrement(start, stop, count) { + var step = (stop - start) / Math.max(0, count), + power = Math.floor(Math.log(step) / Math.LN10), + error = step / Math.pow(10, power); + return power >= 0 + ? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power) + : -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1); +} + +function tickStep(start, stop, count) { + var step0 = Math.abs(stop - start) / Math.max(0, count), + step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)), + error = step0 / step1; + if (error >= e10) step1 *= 10; + else if (error >= e5) step1 *= 5; + else if (error >= e2) step1 *= 2; + return stop < start ? -step1 : step1; +} + +var sturges = function(values) { + return Math.ceil(Math.log(values.length) / Math.LN2) + 1; +}; + +var histogram = function() { + var value = identity, + domain = extent, + threshold = sturges; + + function histogram(data) { + var i, + n = data.length, + x, + values = new Array(n); + + for (i = 0; i < n; ++i) { + values[i] = value(data[i], i, data); + } + + var xz = domain(values), + x0 = xz[0], + x1 = xz[1], + tz = threshold(values, x0, x1); + + // Convert number of thresholds into uniform thresholds. + if (!Array.isArray(tz)) { + tz = tickStep(x0, x1, tz); + tz = sequence(Math.ceil(x0 / tz) * tz, Math.floor(x1 / tz) * tz, tz); // exclusive + } + + // Remove any thresholds outside the domain. + var m = tz.length; + while (tz[0] <= x0) tz.shift(), --m; + while (tz[m - 1] > x1) tz.pop(), --m; + + var bins = new Array(m + 1), + bin; + + // Initialize bins. + for (i = 0; i <= m; ++i) { + bin = bins[i] = []; + bin.x0 = i > 0 ? tz[i - 1] : x0; + bin.x1 = i < m ? tz[i] : x1; + } + + // Assign data to bins by value, ignoring any outside the domain. + for (i = 0; i < n; ++i) { + x = values[i]; + if (x0 <= x && x <= x1) { + bins[bisectRight(tz, x, 0, m)].push(data[i]); + } + } + + return bins; + } + + histogram.value = function(_) { + return arguments.length ? (value = typeof _ === "function" ? _ : constant(_), histogram) : value; + }; + + histogram.domain = function(_) { + return arguments.length ? (domain = typeof _ === "function" ? _ : constant([_[0], _[1]]), histogram) : domain; + }; + + histogram.thresholds = function(_) { + return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), histogram) : threshold; + }; + + return histogram; +}; + +var threshold = function(values, p, valueof) { + if (valueof == null) valueof = number; + if (!(n = values.length)) return; + if ((p = +p) <= 0 || n < 2) return +valueof(values[0], 0, values); + if (p >= 1) return +valueof(values[n - 1], n - 1, values); + var n, + i = (n - 1) * p, + i0 = Math.floor(i), + value0 = +valueof(values[i0], i0, values), + value1 = +valueof(values[i0 + 1], i0 + 1, values); + return value0 + (value1 - value0) * (i - i0); +}; + +var freedmanDiaconis = function(values, min, max) { + values = map.call(values, number).sort(ascending); + return Math.ceil((max - min) / (2 * (threshold(values, 0.75) - threshold(values, 0.25)) * Math.pow(values.length, -1 / 3))); +}; + +var scott = function(values, min, max) { + return Math.ceil((max - min) / (3.5 * deviation(values) * Math.pow(values.length, -1 / 3))); +}; + +var max = function(values, valueof) { + var n = values.length, + i = -1, + value, + max; + + if (valueof == null) { + while (++i < n) { // Find the first comparable value. + if ((value = values[i]) != null && value >= value) { + max = value; + while (++i < n) { // Compare the remaining values. + if ((value = values[i]) != null && value > max) { + max = value; + } + } + } + } + } + + else { + while (++i < n) { // Find the first comparable value. + if ((value = valueof(values[i], i, values)) != null && value >= value) { + max = value; + while (++i < n) { // Compare the remaining values. + if ((value = valueof(values[i], i, values)) != null && value > max) { + max = value; + } + } + } + } + } + + return max; +}; + +var mean = function(values, valueof) { + var n = values.length, + m = n, + i = -1, + value, + sum = 0; + + if (valueof == null) { + while (++i < n) { + if (!isNaN(value = number(values[i]))) sum += value; + else --m; + } + } + + else { + while (++i < n) { + if (!isNaN(value = number(valueof(values[i], i, values)))) sum += value; + else --m; + } + } + + if (m) return sum / m; +}; + +var median = function(values, valueof) { + var n = values.length, + i = -1, + value, + numbers = []; + + if (valueof == null) { + while (++i < n) { + if (!isNaN(value = number(values[i]))) { + numbers.push(value); + } + } + } + + else { + while (++i < n) { + if (!isNaN(value = number(valueof(values[i], i, values)))) { + numbers.push(value); + } + } + } + + return threshold(numbers.sort(ascending), 0.5); +}; + +var merge = function(arrays) { + var n = arrays.length, + m, + i = -1, + j = 0, + merged, + array; + + while (++i < n) j += arrays[i].length; + merged = new Array(j); + + while (--n >= 0) { + array = arrays[n]; + m = array.length; + while (--m >= 0) { + merged[--j] = array[m]; + } + } + + return merged; +}; + +var min = function(values, valueof) { + var n = values.length, + i = -1, + value, + min; + + if (valueof == null) { + while (++i < n) { // Find the first comparable value. + if ((value = values[i]) != null && value >= value) { + min = value; + while (++i < n) { // Compare the remaining values. + if ((value = values[i]) != null && min > value) { + min = value; + } + } + } + } + } + + else { + while (++i < n) { // Find the first comparable value. + if ((value = valueof(values[i], i, values)) != null && value >= value) { + min = value; + while (++i < n) { // Compare the remaining values. + if ((value = valueof(values[i], i, values)) != null && min > value) { + min = value; + } + } + } + } + } + + return min; +}; + +var permute = function(array, indexes) { + var i = indexes.length, permutes = new Array(i); + while (i--) permutes[i] = array[indexes[i]]; + return permutes; +}; + +var scan = function(values, compare) { + if (!(n = values.length)) return; + var n, + i = 0, + j = 0, + xi, + xj = values[j]; + + if (compare == null) compare = ascending; + + while (++i < n) { + if (compare(xi = values[i], xj) < 0 || compare(xj, xj) !== 0) { + xj = xi, j = i; + } + } + + if (compare(xj, xj) === 0) return j; +}; + +var shuffle = function(array, i0, i1) { + var m = (i1 == null ? array.length : i1) - (i0 = i0 == null ? 0 : +i0), + t, + i; + + while (m) { + i = Math.random() * m-- | 0; + t = array[m + i0]; + array[m + i0] = array[i + i0]; + array[i + i0] = t; + } + + return array; +}; + +var sum = function(values, valueof) { + var n = values.length, + i = -1, + value, + sum = 0; + + if (valueof == null) { + while (++i < n) { + if (value = +values[i]) sum += value; // Note: zero and null are equivalent. + } + } + + else { + while (++i < n) { + if (value = +valueof(values[i], i, values)) sum += value; + } + } + + return sum; +}; + +var transpose = function(matrix) { + if (!(n = matrix.length)) return []; + for (var i = -1, m = min(matrix, length), transpose = new Array(m); ++i < m;) { + for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n;) { + row[j] = matrix[j][i]; + } + } + return transpose; +}; + +function length(d) { + return d.length; +} + +var zip = function() { + return transpose(arguments); +}; + +var slice$1 = Array.prototype.slice; + +var identity$1 = function(x) { + return x; +}; + +var top = 1; +var right = 2; +var bottom = 3; +var left = 4; +var epsilon = 1e-6; + +function translateX(x) { + return "translate(" + (x + 0.5) + ",0)"; +} + +function translateY(y) { + return "translate(0," + (y + 0.5) + ")"; +} + +function center(scale) { + var offset = Math.max(0, scale.bandwidth() - 1) / 2; // Adjust for 0.5px offset. + if (scale.round()) offset = Math.round(offset); + return function(d) { + return scale(d) + offset; + }; +} + +function entering() { + return !this.__axis; +} + +function axis(orient, scale) { + var tickArguments = [], + tickValues = null, + tickFormat = null, + tickSizeInner = 6, + tickSizeOuter = 6, + tickPadding = 3, + k = orient === top || orient === left ? -1 : 1, + x = orient === left || orient === right ? "x" : "y", + transform = orient === top || orient === bottom ? translateX : translateY; + + function axis(context) { + var values = tickValues == null ? (scale.ticks ? scale.ticks.apply(scale, tickArguments) : scale.domain()) : tickValues, + format = tickFormat == null ? (scale.tickFormat ? scale.tickFormat.apply(scale, tickArguments) : identity$1) : tickFormat, + spacing = Math.max(tickSizeInner, 0) + tickPadding, + range = scale.range(), + range0 = range[0] + 0.5, + range1 = range[range.length - 1] + 0.5, + position = (scale.bandwidth ? center : identity$1)(scale.copy()), + selection = context.selection ? context.selection() : context, + path = selection.selectAll(".domain").data([null]), + tick = selection.selectAll(".tick").data(values, scale).order(), + tickExit = tick.exit(), + tickEnter = tick.enter().append("g").attr("class", "tick"), + line = tick.select("line"), + text = tick.select("text"); + + path = path.merge(path.enter().insert("path", ".tick") + .attr("class", "domain") + .attr("stroke", "#000")); + + tick = tick.merge(tickEnter); + + line = line.merge(tickEnter.append("line") + .attr("stroke", "#000") + .attr(x + "2", k * tickSizeInner)); + + text = text.merge(tickEnter.append("text") + .attr("fill", "#000") + .attr(x, k * spacing) + .attr("dy", orient === top ? "0em" : orient === bottom ? "0.71em" : "0.32em")); + + if (context !== selection) { + path = path.transition(context); + tick = tick.transition(context); + line = line.transition(context); + text = text.transition(context); + + tickExit = tickExit.transition(context) + .attr("opacity", epsilon) + .attr("transform", function(d) { return isFinite(d = position(d)) ? transform(d) : this.getAttribute("transform"); }); + + tickEnter + .attr("opacity", epsilon) + .attr("transform", function(d) { var p = this.parentNode.__axis; return transform(p && isFinite(p = p(d)) ? p : position(d)); }); + } + + tickExit.remove(); + + path + .attr("d", orient === left || orient == right + ? "M" + k * tickSizeOuter + "," + range0 + "H0.5V" + range1 + "H" + k * tickSizeOuter + : "M" + range0 + "," + k * tickSizeOuter + "V0.5H" + range1 + "V" + k * tickSizeOuter); + + tick + .attr("opacity", 1) + .attr("transform", function(d) { return transform(position(d)); }); + + line + .attr(x + "2", k * tickSizeInner); + + text + .attr(x, k * spacing) + .text(format); + + selection.filter(entering) + .attr("fill", "none") + .attr("font-size", 10) + .attr("font-family", "sans-serif") + .attr("text-anchor", orient === right ? "start" : orient === left ? "end" : "middle"); + + selection + .each(function() { this.__axis = position; }); + } + + axis.scale = function(_) { + return arguments.length ? (scale = _, axis) : scale; + }; + + axis.ticks = function() { + return tickArguments = slice$1.call(arguments), axis; + }; + + axis.tickArguments = function(_) { + return arguments.length ? (tickArguments = _ == null ? [] : slice$1.call(_), axis) : tickArguments.slice(); + }; + + axis.tickValues = function(_) { + return arguments.length ? (tickValues = _ == null ? null : slice$1.call(_), axis) : tickValues && tickValues.slice(); + }; + + axis.tickFormat = function(_) { + return arguments.length ? (tickFormat = _, axis) : tickFormat; + }; + + axis.tickSize = function(_) { + return arguments.length ? (tickSizeInner = tickSizeOuter = +_, axis) : tickSizeInner; + }; + + axis.tickSizeInner = function(_) { + return arguments.length ? (tickSizeInner = +_, axis) : tickSizeInner; + }; + + axis.tickSizeOuter = function(_) { + return arguments.length ? (tickSizeOuter = +_, axis) : tickSizeOuter; + }; + + axis.tickPadding = function(_) { + return arguments.length ? (tickPadding = +_, axis) : tickPadding; + }; + + return axis; +} + +function axisTop(scale) { + return axis(top, scale); +} + +function axisRight(scale) { + return axis(right, scale); +} + +function axisBottom(scale) { + return axis(bottom, scale); +} + +function axisLeft(scale) { + return axis(left, scale); +} + +var noop = {value: function() {}}; + +function dispatch() { + for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) { + if (!(t = arguments[i] + "") || (t in _)) throw new Error("illegal type: " + t); + _[t] = []; + } + return new Dispatch(_); +} + +function Dispatch(_) { + this._ = _; +} + +function parseTypenames(typenames, types) { + return typenames.trim().split(/^|\s+/).map(function(t) { + var name = "", i = t.indexOf("."); + if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i); + if (t && !types.hasOwnProperty(t)) throw new Error("unknown type: " + t); + return {type: t, name: name}; + }); +} + +Dispatch.prototype = dispatch.prototype = { + constructor: Dispatch, + on: function(typename, callback) { + var _ = this._, + T = parseTypenames(typename + "", _), + t, + i = -1, + n = T.length; + + // If no callback was specified, return the callback of the given type and name. + if (arguments.length < 2) { + while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t; + return; + } + + // If a type was specified, set the callback for the given type and name. + // Otherwise, if a null callback was specified, remove callbacks of the given name. + if (callback != null && typeof callback !== "function") throw new Error("invalid callback: " + callback); + while (++i < n) { + if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback); + else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null); + } + + return this; + }, + copy: function() { + var copy = {}, _ = this._; + for (var t in _) copy[t] = _[t].slice(); + return new Dispatch(copy); + }, + call: function(type, that) { + if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2]; + if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type); + for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args); + }, + apply: function(type, that, args) { + if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type); + for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args); + } +}; + +function get(type, name) { + for (var i = 0, n = type.length, c; i < n; ++i) { + if ((c = type[i]).name === name) { + return c.value; + } + } +} + +function set(type, name, callback) { + for (var i = 0, n = type.length; i < n; ++i) { + if (type[i].name === name) { + type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1)); + break; + } + } + if (callback != null) type.push({name: name, value: callback}); + return type; +} + +var xhtml = "http://www.w3.org/1999/xhtml"; + +var namespaces = { + svg: "http://www.w3.org/2000/svg", + xhtml: xhtml, + xlink: "http://www.w3.org/1999/xlink", + xml: "http://www.w3.org/XML/1998/namespace", + xmlns: "http://www.w3.org/2000/xmlns/" +}; + +var namespace = function(name) { + var prefix = name += "", i = prefix.indexOf(":"); + if (i >= 0 && (prefix = name.slice(0, i)) !== "xmlns") name = name.slice(i + 1); + return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name; +}; + +function creatorInherit(name) { + return function() { + var document = this.ownerDocument, + uri = this.namespaceURI; + return uri === xhtml && document.documentElement.namespaceURI === xhtml + ? document.createElement(name) + : document.createElementNS(uri, name); + }; +} + +function creatorFixed(fullname) { + return function() { + return this.ownerDocument.createElementNS(fullname.space, fullname.local); + }; +} + +var creator = function(name) { + var fullname = namespace(name); + return (fullname.local + ? creatorFixed + : creatorInherit)(fullname); +}; + +var nextId = 0; + +function local$1() { + return new Local; +} + +function Local() { + this._ = "@" + (++nextId).toString(36); +} + +Local.prototype = local$1.prototype = { + constructor: Local, + get: function(node) { + var id = this._; + while (!(id in node)) if (!(node = node.parentNode)) return; + return node[id]; + }, + set: function(node, value) { + return node[this._] = value; + }, + remove: function(node) { + return this._ in node && delete node[this._]; + }, + toString: function() { + return this._; + } +}; + +var matcher = function(selector) { + return function() { + return this.matches(selector); + }; +}; + +if (typeof document !== "undefined") { + var element = document.documentElement; + if (!element.matches) { + var vendorMatches = element.webkitMatchesSelector + || element.msMatchesSelector + || element.mozMatchesSelector + || element.oMatchesSelector; + matcher = function(selector) { + return function() { + return vendorMatches.call(this, selector); + }; + }; + } +} + +var matcher$1 = matcher; + +var filterEvents = {}; + +exports.event = null; + +if (typeof document !== "undefined") { + var element$1 = document.documentElement; + if (!("onmouseenter" in element$1)) { + filterEvents = {mouseenter: "mouseover", mouseleave: "mouseout"}; + } +} + +function filterContextListener(listener, index, group) { + listener = contextListener(listener, index, group); + return function(event) { + var related = event.relatedTarget; + if (!related || (related !== this && !(related.compareDocumentPosition(this) & 8))) { + listener.call(this, event); + } + }; +} + +function contextListener(listener, index, group) { + return function(event1) { + var event0 = exports.event; // Events can be reentrant (e.g., focus). + exports.event = event1; + try { + listener.call(this, this.__data__, index, group); + } finally { + exports.event = event0; + } + }; +} + +function parseTypenames$1(typenames) { + return typenames.trim().split(/^|\s+/).map(function(t) { + var name = "", i = t.indexOf("."); + if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i); + return {type: t, name: name}; + }); +} + +function onRemove(typename) { + return function() { + var on = this.__on; + if (!on) return; + for (var j = 0, i = -1, m = on.length, o; j < m; ++j) { + if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) { + this.removeEventListener(o.type, o.listener, o.capture); + } else { + on[++i] = o; + } + } + if (++i) on.length = i; + else delete this.__on; + }; +} + +function onAdd(typename, value, capture) { + var wrap = filterEvents.hasOwnProperty(typename.type) ? filterContextListener : contextListener; + return function(d, i, group) { + var on = this.__on, o, listener = wrap(value, i, group); + if (on) for (var j = 0, m = on.length; j < m; ++j) { + if ((o = on[j]).type === typename.type && o.name === typename.name) { + this.removeEventListener(o.type, o.listener, o.capture); + this.addEventListener(o.type, o.listener = listener, o.capture = capture); + o.value = value; + return; + } + } + this.addEventListener(typename.type, listener, capture); + o = {type: typename.type, name: typename.name, value: value, listener: listener, capture: capture}; + if (!on) this.__on = [o]; + else on.push(o); + }; +} + +var selection_on = function(typename, value, capture) { + var typenames = parseTypenames$1(typename + ""), i, n = typenames.length, t; + + if (arguments.length < 2) { + var on = this.node().__on; + if (on) for (var j = 0, m = on.length, o; j < m; ++j) { + for (i = 0, o = on[j]; i < n; ++i) { + if ((t = typenames[i]).type === o.type && t.name === o.name) { + return o.value; + } + } + } + return; + } + + on = value ? onAdd : onRemove; + if (capture == null) capture = false; + for (i = 0; i < n; ++i) this.each(on(typenames[i], value, capture)); + return this; +}; + +function customEvent(event1, listener, that, args) { + var event0 = exports.event; + event1.sourceEvent = exports.event; + exports.event = event1; + try { + return listener.apply(that, args); + } finally { + exports.event = event0; + } +} + +var sourceEvent = function() { + var current = exports.event, source; + while (source = current.sourceEvent) current = source; + return current; +}; + +var point = function(node, event) { + var svg = node.ownerSVGElement || node; + + if (svg.createSVGPoint) { + var point = svg.createSVGPoint(); + point.x = event.clientX, point.y = event.clientY; + point = point.matrixTransform(node.getScreenCTM().inverse()); + return [point.x, point.y]; + } + + var rect = node.getBoundingClientRect(); + return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop]; +}; + +var mouse = function(node) { + var event = sourceEvent(); + if (event.changedTouches) event = event.changedTouches[0]; + return point(node, event); +}; + +function none() {} + +var selector = function(selector) { + return selector == null ? none : function() { + return this.querySelector(selector); + }; +}; + +var selection_select = function(select) { + if (typeof select !== "function") select = selector(select); + + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) { + if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) { + if ("__data__" in node) subnode.__data__ = node.__data__; + subgroup[i] = subnode; + } + } + } + + return new Selection(subgroups, this._parents); +}; + +function empty$1() { + return []; +} + +var selectorAll = function(selector) { + return selector == null ? empty$1 : function() { + return this.querySelectorAll(selector); + }; +}; + +var selection_selectAll = function(select) { + if (typeof select !== "function") select = selectorAll(select); + + for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + subgroups.push(select.call(node, node.__data__, i, group)); + parents.push(node); + } + } + } + + return new Selection(subgroups, parents); +}; + +var selection_filter = function(match) { + if (typeof match !== "function") match = matcher$1(match); + + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) { + if ((node = group[i]) && match.call(node, node.__data__, i, group)) { + subgroup.push(node); + } + } + } + + return new Selection(subgroups, this._parents); +}; + +var sparse = function(update) { + return new Array(update.length); +}; + +var selection_enter = function() { + return new Selection(this._enter || this._groups.map(sparse), this._parents); +}; + +function EnterNode(parent, datum) { + this.ownerDocument = parent.ownerDocument; + this.namespaceURI = parent.namespaceURI; + this._next = null; + this._parent = parent; + this.__data__ = datum; +} + +EnterNode.prototype = { + constructor: EnterNode, + appendChild: function(child) { return this._parent.insertBefore(child, this._next); }, + insertBefore: function(child, next) { return this._parent.insertBefore(child, next); }, + querySelector: function(selector) { return this._parent.querySelector(selector); }, + querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); } +}; + +var constant$1 = function(x) { + return function() { + return x; + }; +}; + +var keyPrefix = "$"; // Protect against keys like “__proto__”. + +function bindIndex(parent, group, enter, update, exit, data) { + var i = 0, + node, + groupLength = group.length, + dataLength = data.length; + + // Put any non-null nodes that fit into update. + // Put any null nodes into enter. + // Put any remaining data into enter. + for (; i < dataLength; ++i) { + if (node = group[i]) { + node.__data__ = data[i]; + update[i] = node; + } else { + enter[i] = new EnterNode(parent, data[i]); + } + } + + // Put any non-null nodes that don’t fit into exit. + for (; i < groupLength; ++i) { + if (node = group[i]) { + exit[i] = node; + } + } +} + +function bindKey(parent, group, enter, update, exit, data, key) { + var i, + node, + nodeByKeyValue = {}, + groupLength = group.length, + dataLength = data.length, + keyValues = new Array(groupLength), + keyValue; + + // Compute the key for each node. + // If multiple nodes have the same key, the duplicates are added to exit. + for (i = 0; i < groupLength; ++i) { + if (node = group[i]) { + keyValues[i] = keyValue = keyPrefix + key.call(node, node.__data__, i, group); + if (keyValue in nodeByKeyValue) { + exit[i] = node; + } else { + nodeByKeyValue[keyValue] = node; + } + } + } + + // Compute the key for each datum. + // If there a node associated with this key, join and add it to update. + // If there is not (or the key is a duplicate), add it to enter. + for (i = 0; i < dataLength; ++i) { + keyValue = keyPrefix + key.call(parent, data[i], i, data); + if (node = nodeByKeyValue[keyValue]) { + update[i] = node; + node.__data__ = data[i]; + nodeByKeyValue[keyValue] = null; + } else { + enter[i] = new EnterNode(parent, data[i]); + } + } + + // Add any remaining nodes that were not bound to data to exit. + for (i = 0; i < groupLength; ++i) { + if ((node = group[i]) && (nodeByKeyValue[keyValues[i]] === node)) { + exit[i] = node; + } + } +} + +var selection_data = function(value, key) { + if (!value) { + data = new Array(this.size()), j = -1; + this.each(function(d) { data[++j] = d; }); + return data; + } + + var bind = key ? bindKey : bindIndex, + parents = this._parents, + groups = this._groups; + + if (typeof value !== "function") value = constant$1(value); + + for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) { + var parent = parents[j], + group = groups[j], + groupLength = group.length, + data = value.call(parent, parent && parent.__data__, j, parents), + dataLength = data.length, + enterGroup = enter[j] = new Array(dataLength), + updateGroup = update[j] = new Array(dataLength), + exitGroup = exit[j] = new Array(groupLength); + + bind(parent, group, enterGroup, updateGroup, exitGroup, data, key); + + // Now connect the enter nodes to their following update node, such that + // appendChild can insert the materialized enter node before this node, + // rather than at the end of the parent node. + for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) { + if (previous = enterGroup[i0]) { + if (i0 >= i1) i1 = i0 + 1; + while (!(next = updateGroup[i1]) && ++i1 < dataLength); + previous._next = next || null; + } + } + } + + update = new Selection(update, parents); + update._enter = enter; + update._exit = exit; + return update; +}; + +var selection_exit = function() { + return new Selection(this._exit || this._groups.map(sparse), this._parents); +}; + +var selection_merge = function(selection) { + + for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) { + for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) { + if (node = group0[i] || group1[i]) { + merge[i] = node; + } + } + } + + for (; j < m0; ++j) { + merges[j] = groups0[j]; + } + + return new Selection(merges, this._parents); +}; + +var selection_order = function() { + + for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) { + for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) { + if (node = group[i]) { + if (next && next !== node.nextSibling) next.parentNode.insertBefore(node, next); + next = node; + } + } + } + + return this; +}; + +var selection_sort = function(compare) { + if (!compare) compare = ascending$1; + + function compareNode(a, b) { + return a && b ? compare(a.__data__, b.__data__) : !a - !b; + } + + for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) { + if (node = group[i]) { + sortgroup[i] = node; + } + } + sortgroup.sort(compareNode); + } + + return new Selection(sortgroups, this._parents).order(); +}; + +function ascending$1(a, b) { + return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; +} + +var selection_call = function() { + var callback = arguments[0]; + arguments[0] = this; + callback.apply(null, arguments); + return this; +}; + +var selection_nodes = function() { + var nodes = new Array(this.size()), i = -1; + this.each(function() { nodes[++i] = this; }); + return nodes; +}; + +var selection_node = function() { + + for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) { + for (var group = groups[j], i = 0, n = group.length; i < n; ++i) { + var node = group[i]; + if (node) return node; + } + } + + return null; +}; + +var selection_size = function() { + var size = 0; + this.each(function() { ++size; }); + return size; +}; + +var selection_empty = function() { + return !this.node(); +}; + +var selection_each = function(callback) { + + for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) { + for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) { + if (node = group[i]) callback.call(node, node.__data__, i, group); + } + } + + return this; +}; + +function attrRemove(name) { + return function() { + this.removeAttribute(name); + }; +} + +function attrRemoveNS(fullname) { + return function() { + this.removeAttributeNS(fullname.space, fullname.local); + }; +} + +function attrConstant(name, value) { + return function() { + this.setAttribute(name, value); + }; +} + +function attrConstantNS(fullname, value) { + return function() { + this.setAttributeNS(fullname.space, fullname.local, value); + }; +} + +function attrFunction(name, value) { + return function() { + var v = value.apply(this, arguments); + if (v == null) this.removeAttribute(name); + else this.setAttribute(name, v); + }; +} + +function attrFunctionNS(fullname, value) { + return function() { + var v = value.apply(this, arguments); + if (v == null) this.removeAttributeNS(fullname.space, fullname.local); + else this.setAttributeNS(fullname.space, fullname.local, v); + }; +} + +var selection_attr = function(name, value) { + var fullname = namespace(name); + + if (arguments.length < 2) { + var node = this.node(); + return fullname.local + ? node.getAttributeNS(fullname.space, fullname.local) + : node.getAttribute(fullname); + } + + return this.each((value == null + ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === "function" + ? (fullname.local ? attrFunctionNS : attrFunction) + : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value)); +}; + +var defaultView = function(node) { + return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node + || (node.document && node) // node is a Window + || node.defaultView; // node is a Document +}; + +function styleRemove(name) { + return function() { + this.style.removeProperty(name); + }; +} + +function styleConstant(name, value, priority) { + return function() { + this.style.setProperty(name, value, priority); + }; +} + +function styleFunction(name, value, priority) { + return function() { + var v = value.apply(this, arguments); + if (v == null) this.style.removeProperty(name); + else this.style.setProperty(name, v, priority); + }; +} + +var selection_style = function(name, value, priority) { + return arguments.length > 1 + ? this.each((value == null + ? styleRemove : typeof value === "function" + ? styleFunction + : styleConstant)(name, value, priority == null ? "" : priority)) + : styleValue(this.node(), name); +}; + +function styleValue(node, name) { + return node.style.getPropertyValue(name) + || defaultView(node).getComputedStyle(node, null).getPropertyValue(name); +} + +function propertyRemove(name) { + return function() { + delete this[name]; + }; +} + +function propertyConstant(name, value) { + return function() { + this[name] = value; + }; +} + +function propertyFunction(name, value) { + return function() { + var v = value.apply(this, arguments); + if (v == null) delete this[name]; + else this[name] = v; + }; +} + +var selection_property = function(name, value) { + return arguments.length > 1 + ? this.each((value == null + ? propertyRemove : typeof value === "function" + ? propertyFunction + : propertyConstant)(name, value)) + : this.node()[name]; +}; + +function classArray(string) { + return string.trim().split(/^|\s+/); +} + +function classList(node) { + return node.classList || new ClassList(node); +} + +function ClassList(node) { + this._node = node; + this._names = classArray(node.getAttribute("class") || ""); +} + +ClassList.prototype = { + add: function(name) { + var i = this._names.indexOf(name); + if (i < 0) { + this._names.push(name); + this._node.setAttribute("class", this._names.join(" ")); + } + }, + remove: function(name) { + var i = this._names.indexOf(name); + if (i >= 0) { + this._names.splice(i, 1); + this._node.setAttribute("class", this._names.join(" ")); + } + }, + contains: function(name) { + return this._names.indexOf(name) >= 0; + } +}; + +function classedAdd(node, names) { + var list = classList(node), i = -1, n = names.length; + while (++i < n) list.add(names[i]); +} + +function classedRemove(node, names) { + var list = classList(node), i = -1, n = names.length; + while (++i < n) list.remove(names[i]); +} + +function classedTrue(names) { + return function() { + classedAdd(this, names); + }; +} + +function classedFalse(names) { + return function() { + classedRemove(this, names); + }; +} + +function classedFunction(names, value) { + return function() { + (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names); + }; +} + +var selection_classed = function(name, value) { + var names = classArray(name + ""); + + if (arguments.length < 2) { + var list = classList(this.node()), i = -1, n = names.length; + while (++i < n) if (!list.contains(names[i])) return false; + return true; + } + + return this.each((typeof value === "function" + ? classedFunction : value + ? classedTrue + : classedFalse)(names, value)); +}; + +function textRemove() { + this.textContent = ""; +} + +function textConstant(value) { + return function() { + this.textContent = value; + }; +} + +function textFunction(value) { + return function() { + var v = value.apply(this, arguments); + this.textContent = v == null ? "" : v; + }; +} + +var selection_text = function(value) { + return arguments.length + ? this.each(value == null + ? textRemove : (typeof value === "function" + ? textFunction + : textConstant)(value)) + : this.node().textContent; +}; + +function htmlRemove() { + this.innerHTML = ""; +} + +function htmlConstant(value) { + return function() { + this.innerHTML = value; + }; +} + +function htmlFunction(value) { + return function() { + var v = value.apply(this, arguments); + this.innerHTML = v == null ? "" : v; + }; +} + +var selection_html = function(value) { + return arguments.length + ? this.each(value == null + ? htmlRemove : (typeof value === "function" + ? htmlFunction + : htmlConstant)(value)) + : this.node().innerHTML; +}; + +function raise() { + if (this.nextSibling) this.parentNode.appendChild(this); +} + +var selection_raise = function() { + return this.each(raise); +}; + +function lower() { + if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild); +} + +var selection_lower = function() { + return this.each(lower); +}; + +var selection_append = function(name) { + var create = typeof name === "function" ? name : creator(name); + return this.select(function() { + return this.appendChild(create.apply(this, arguments)); + }); +}; + +function constantNull() { + return null; +} + +var selection_insert = function(name, before) { + var create = typeof name === "function" ? name : creator(name), + select = before == null ? constantNull : typeof before === "function" ? before : selector(before); + return this.select(function() { + return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null); + }); +}; + +function remove() { + var parent = this.parentNode; + if (parent) parent.removeChild(this); +} + +var selection_remove = function() { + return this.each(remove); +}; + +var selection_datum = function(value) { + return arguments.length + ? this.property("__data__", value) + : this.node().__data__; +}; + +function dispatchEvent(node, type, params) { + var window = defaultView(node), + event = window.CustomEvent; + + if (typeof event === "function") { + event = new event(type, params); + } else { + event = window.document.createEvent("Event"); + if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail; + else event.initEvent(type, false, false); + } + + node.dispatchEvent(event); +} + +function dispatchConstant(type, params) { + return function() { + return dispatchEvent(this, type, params); + }; +} + +function dispatchFunction(type, params) { + return function() { + return dispatchEvent(this, type, params.apply(this, arguments)); + }; +} + +var selection_dispatch = function(type, params) { + return this.each((typeof params === "function" + ? dispatchFunction + : dispatchConstant)(type, params)); +}; + +var root = [null]; + +function Selection(groups, parents) { + this._groups = groups; + this._parents = parents; +} + +function selection() { + return new Selection([[document.documentElement]], root); +} + +Selection.prototype = selection.prototype = { + constructor: Selection, + select: selection_select, + selectAll: selection_selectAll, + filter: selection_filter, + data: selection_data, + enter: selection_enter, + exit: selection_exit, + merge: selection_merge, + order: selection_order, + sort: selection_sort, + call: selection_call, + nodes: selection_nodes, + node: selection_node, + size: selection_size, + empty: selection_empty, + each: selection_each, + attr: selection_attr, + style: selection_style, + property: selection_property, + classed: selection_classed, + text: selection_text, + html: selection_html, + raise: selection_raise, + lower: selection_lower, + append: selection_append, + insert: selection_insert, + remove: selection_remove, + datum: selection_datum, + on: selection_on, + dispatch: selection_dispatch +}; + +var select = function(selector) { + return typeof selector === "string" + ? new Selection([[document.querySelector(selector)]], [document.documentElement]) + : new Selection([[selector]], root); +}; + +var selectAll = function(selector) { + return typeof selector === "string" + ? new Selection([document.querySelectorAll(selector)], [document.documentElement]) + : new Selection([selector == null ? [] : selector], root); +}; + +var touch = function(node, touches, identifier) { + if (arguments.length < 3) identifier = touches, touches = sourceEvent().changedTouches; + + for (var i = 0, n = touches ? touches.length : 0, touch; i < n; ++i) { + if ((touch = touches[i]).identifier === identifier) { + return point(node, touch); + } + } + + return null; +}; + +var touches = function(node, touches) { + if (touches == null) touches = sourceEvent().touches; + + for (var i = 0, n = touches ? touches.length : 0, points = new Array(n); i < n; ++i) { + points[i] = point(node, touches[i]); + } + + return points; +}; + +function nopropagation() { + exports.event.stopImmediatePropagation(); +} + +var noevent = function() { + exports.event.preventDefault(); + exports.event.stopImmediatePropagation(); +}; + +var dragDisable = function(view) { + var root = view.document.documentElement, + selection$$1 = select(view).on("dragstart.drag", noevent, true); + if ("onselectstart" in root) { + selection$$1.on("selectstart.drag", noevent, true); + } else { + root.__noselect = root.style.MozUserSelect; + root.style.MozUserSelect = "none"; + } +}; + +function yesdrag(view, noclick) { + var root = view.document.documentElement, + selection$$1 = select(view).on("dragstart.drag", null); + if (noclick) { + selection$$1.on("click.drag", noevent, true); + setTimeout(function() { selection$$1.on("click.drag", null); }, 0); + } + if ("onselectstart" in root) { + selection$$1.on("selectstart.drag", null); + } else { + root.style.MozUserSelect = root.__noselect; + delete root.__noselect; + } +} + +var constant$2 = function(x) { + return function() { + return x; + }; +}; + +function DragEvent(target, type, subject, id, active, x, y, dx, dy, dispatch) { + this.target = target; + this.type = type; + this.subject = subject; + this.identifier = id; + this.active = active; + this.x = x; + this.y = y; + this.dx = dx; + this.dy = dy; + this._ = dispatch; +} + +DragEvent.prototype.on = function() { + var value = this._.on.apply(this._, arguments); + return value === this._ ? this : value; +}; + +// Ignore right-click, since that should open the context menu. +function defaultFilter$1() { + return !exports.event.button; +} + +function defaultContainer() { + return this.parentNode; +} + +function defaultSubject(d) { + return d == null ? {x: exports.event.x, y: exports.event.y} : d; +} + +var drag = function() { + var filter = defaultFilter$1, + container = defaultContainer, + subject = defaultSubject, + gestures = {}, + listeners = dispatch("start", "drag", "end"), + active = 0, + mousedownx, + mousedowny, + mousemoving, + touchending, + clickDistance2 = 0; + + function drag(selection$$1) { + selection$$1 + .on("mousedown.drag", mousedowned) + .on("touchstart.drag", touchstarted) + .on("touchmove.drag", touchmoved) + .on("touchend.drag touchcancel.drag", touchended) + .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); + } + + function mousedowned() { + if (touchending || !filter.apply(this, arguments)) return; + var gesture = beforestart("mouse", container.apply(this, arguments), mouse, this, arguments); + if (!gesture) return; + select(exports.event.view).on("mousemove.drag", mousemoved, true).on("mouseup.drag", mouseupped, true); + dragDisable(exports.event.view); + nopropagation(); + mousemoving = false; + mousedownx = exports.event.clientX; + mousedowny = exports.event.clientY; + gesture("start"); + } + + function mousemoved() { + noevent(); + if (!mousemoving) { + var dx = exports.event.clientX - mousedownx, dy = exports.event.clientY - mousedowny; + mousemoving = dx * dx + dy * dy > clickDistance2; + } + gestures.mouse("drag"); + } + + function mouseupped() { + select(exports.event.view).on("mousemove.drag mouseup.drag", null); + yesdrag(exports.event.view, mousemoving); + noevent(); + gestures.mouse("end"); + } + + function touchstarted() { + if (!filter.apply(this, arguments)) return; + var touches$$1 = exports.event.changedTouches, + c = container.apply(this, arguments), + n = touches$$1.length, i, gesture; + + for (i = 0; i < n; ++i) { + if (gesture = beforestart(touches$$1[i].identifier, c, touch, this, arguments)) { + nopropagation(); + gesture("start"); + } + } + } + + function touchmoved() { + var touches$$1 = exports.event.changedTouches, + n = touches$$1.length, i, gesture; + + for (i = 0; i < n; ++i) { + if (gesture = gestures[touches$$1[i].identifier]) { + noevent(); + gesture("drag"); + } + } + } + + function touchended() { + var touches$$1 = exports.event.changedTouches, + n = touches$$1.length, i, gesture; + + if (touchending) clearTimeout(touchending); + touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed! + for (i = 0; i < n; ++i) { + if (gesture = gestures[touches$$1[i].identifier]) { + nopropagation(); + gesture("end"); + } + } + } + + function beforestart(id, container, point, that, args) { + var p = point(container, id), s, dx, dy, + sublisteners = listeners.copy(); + + if (!customEvent(new DragEvent(drag, "beforestart", s, id, active, p[0], p[1], 0, 0, sublisteners), function() { + if ((exports.event.subject = s = subject.apply(that, args)) == null) return false; + dx = s.x - p[0] || 0; + dy = s.y - p[1] || 0; + return true; + })) return; + + return function gesture(type) { + var p0 = p, n; + switch (type) { + case "start": gestures[id] = gesture, n = active++; break; + case "end": delete gestures[id], --active; // nobreak + case "drag": p = point(container, id), n = active; break; + } + customEvent(new DragEvent(drag, type, s, id, n, p[0] + dx, p[1] + dy, p[0] - p0[0], p[1] - p0[1], sublisteners), sublisteners.apply, sublisteners, [type, that, args]); + }; + } + + drag.filter = function(_) { + return arguments.length ? (filter = typeof _ === "function" ? _ : constant$2(!!_), drag) : filter; + }; + + drag.container = function(_) { + return arguments.length ? (container = typeof _ === "function" ? _ : constant$2(_), drag) : container; + }; + + drag.subject = function(_) { + return arguments.length ? (subject = typeof _ === "function" ? _ : constant$2(_), drag) : subject; + }; + + drag.on = function() { + var value = listeners.on.apply(listeners, arguments); + return value === listeners ? drag : value; + }; + + drag.clickDistance = function(_) { + return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2); + }; + + return drag; +}; + +var define = function(constructor, factory, prototype) { + constructor.prototype = factory.prototype = prototype; + prototype.constructor = constructor; +}; + +function extend(parent, definition) { + var prototype = Object.create(parent.prototype); + for (var key in definition) prototype[key] = definition[key]; + return prototype; +} + +function Color() {} + +var darker = 0.7; +var brighter = 1 / darker; + +var reI = "\\s*([+-]?\\d+)\\s*"; +var reN = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*"; +var reP = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*"; +var reHex3 = /^#([0-9a-f]{3})$/; +var reHex6 = /^#([0-9a-f]{6})$/; +var reRgbInteger = new RegExp("^rgb\\(" + [reI, reI, reI] + "\\)$"); +var reRgbPercent = new RegExp("^rgb\\(" + [reP, reP, reP] + "\\)$"); +var reRgbaInteger = new RegExp("^rgba\\(" + [reI, reI, reI, reN] + "\\)$"); +var reRgbaPercent = new RegExp("^rgba\\(" + [reP, reP, reP, reN] + "\\)$"); +var reHslPercent = new RegExp("^hsl\\(" + [reN, reP, reP] + "\\)$"); +var reHslaPercent = new RegExp("^hsla\\(" + [reN, reP, reP, reN] + "\\)$"); + +var named = { + aliceblue: 0xf0f8ff, + antiquewhite: 0xfaebd7, + aqua: 0x00ffff, + aquamarine: 0x7fffd4, + azure: 0xf0ffff, + beige: 0xf5f5dc, + bisque: 0xffe4c4, + black: 0x000000, + blanchedalmond: 0xffebcd, + blue: 0x0000ff, + blueviolet: 0x8a2be2, + brown: 0xa52a2a, + burlywood: 0xdeb887, + cadetblue: 0x5f9ea0, + chartreuse: 0x7fff00, + chocolate: 0xd2691e, + coral: 0xff7f50, + cornflowerblue: 0x6495ed, + cornsilk: 0xfff8dc, + crimson: 0xdc143c, + cyan: 0x00ffff, + darkblue: 0x00008b, + darkcyan: 0x008b8b, + darkgoldenrod: 0xb8860b, + darkgray: 0xa9a9a9, + darkgreen: 0x006400, + darkgrey: 0xa9a9a9, + darkkhaki: 0xbdb76b, + darkmagenta: 0x8b008b, + darkolivegreen: 0x556b2f, + darkorange: 0xff8c00, + darkorchid: 0x9932cc, + darkred: 0x8b0000, + darksalmon: 0xe9967a, + darkseagreen: 0x8fbc8f, + darkslateblue: 0x483d8b, + darkslategray: 0x2f4f4f, + darkslategrey: 0x2f4f4f, + darkturquoise: 0x00ced1, + darkviolet: 0x9400d3, + deeppink: 0xff1493, + deepskyblue: 0x00bfff, + dimgray: 0x696969, + dimgrey: 0x696969, + dodgerblue: 0x1e90ff, + firebrick: 0xb22222, + floralwhite: 0xfffaf0, + forestgreen: 0x228b22, + fuchsia: 0xff00ff, + gainsboro: 0xdcdcdc, + ghostwhite: 0xf8f8ff, + gold: 0xffd700, + goldenrod: 0xdaa520, + gray: 0x808080, + green: 0x008000, + greenyellow: 0xadff2f, + grey: 0x808080, + honeydew: 0xf0fff0, + hotpink: 0xff69b4, + indianred: 0xcd5c5c, + indigo: 0x4b0082, + ivory: 0xfffff0, + khaki: 0xf0e68c, + lavender: 0xe6e6fa, + lavenderblush: 0xfff0f5, + lawngreen: 0x7cfc00, + lemonchiffon: 0xfffacd, + lightblue: 0xadd8e6, + lightcoral: 0xf08080, + lightcyan: 0xe0ffff, + lightgoldenrodyellow: 0xfafad2, + lightgray: 0xd3d3d3, + lightgreen: 0x90ee90, + lightgrey: 0xd3d3d3, + lightpink: 0xffb6c1, + lightsalmon: 0xffa07a, + lightseagreen: 0x20b2aa, + lightskyblue: 0x87cefa, + lightslategray: 0x778899, + lightslategrey: 0x778899, + lightsteelblue: 0xb0c4de, + lightyellow: 0xffffe0, + lime: 0x00ff00, + limegreen: 0x32cd32, + linen: 0xfaf0e6, + magenta: 0xff00ff, + maroon: 0x800000, + mediumaquamarine: 0x66cdaa, + mediumblue: 0x0000cd, + mediumorchid: 0xba55d3, + mediumpurple: 0x9370db, + mediumseagreen: 0x3cb371, + mediumslateblue: 0x7b68ee, + mediumspringgreen: 0x00fa9a, + mediumturquoise: 0x48d1cc, + mediumvioletred: 0xc71585, + midnightblue: 0x191970, + mintcream: 0xf5fffa, + mistyrose: 0xffe4e1, + moccasin: 0xffe4b5, + navajowhite: 0xffdead, + navy: 0x000080, + oldlace: 0xfdf5e6, + olive: 0x808000, + olivedrab: 0x6b8e23, + orange: 0xffa500, + orangered: 0xff4500, + orchid: 0xda70d6, + palegoldenrod: 0xeee8aa, + palegreen: 0x98fb98, + paleturquoise: 0xafeeee, + palevioletred: 0xdb7093, + papayawhip: 0xffefd5, + peachpuff: 0xffdab9, + peru: 0xcd853f, + pink: 0xffc0cb, + plum: 0xdda0dd, + powderblue: 0xb0e0e6, + purple: 0x800080, + rebeccapurple: 0x663399, + red: 0xff0000, + rosybrown: 0xbc8f8f, + royalblue: 0x4169e1, + saddlebrown: 0x8b4513, + salmon: 0xfa8072, + sandybrown: 0xf4a460, + seagreen: 0x2e8b57, + seashell: 0xfff5ee, + sienna: 0xa0522d, + silver: 0xc0c0c0, + skyblue: 0x87ceeb, + slateblue: 0x6a5acd, + slategray: 0x708090, + slategrey: 0x708090, + snow: 0xfffafa, + springgreen: 0x00ff7f, + steelblue: 0x4682b4, + tan: 0xd2b48c, + teal: 0x008080, + thistle: 0xd8bfd8, + tomato: 0xff6347, + turquoise: 0x40e0d0, + violet: 0xee82ee, + wheat: 0xf5deb3, + white: 0xffffff, + whitesmoke: 0xf5f5f5, + yellow: 0xffff00, + yellowgreen: 0x9acd32 +}; + +define(Color, color, { + displayable: function() { + return this.rgb().displayable(); + }, + toString: function() { + return this.rgb() + ""; + } +}); + +function color(format) { + var m; + format = (format + "").trim().toLowerCase(); + return (m = reHex3.exec(format)) ? (m = parseInt(m[1], 16), new Rgb((m >> 8 & 0xf) | (m >> 4 & 0x0f0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1)) // #f00 + : (m = reHex6.exec(format)) ? rgbn(parseInt(m[1], 16)) // #ff0000 + : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0) + : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%) + : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1) + : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1) + : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%) + : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1) + : named.hasOwnProperty(format) ? rgbn(named[format]) + : format === "transparent" ? new Rgb(NaN, NaN, NaN, 0) + : null; +} + +function rgbn(n) { + return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1); +} + +function rgba(r, g, b, a) { + if (a <= 0) r = g = b = NaN; + return new Rgb(r, g, b, a); +} + +function rgbConvert(o) { + if (!(o instanceof Color)) o = color(o); + if (!o) return new Rgb; + o = o.rgb(); + return new Rgb(o.r, o.g, o.b, o.opacity); +} + +function rgb(r, g, b, opacity) { + return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity); +} + +function Rgb(r, g, b, opacity) { + this.r = +r; + this.g = +g; + this.b = +b; + this.opacity = +opacity; +} + +define(Rgb, rgb, extend(Color, { + brighter: function(k) { + k = k == null ? brighter : Math.pow(brighter, k); + return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); + }, + darker: function(k) { + k = k == null ? darker : Math.pow(darker, k); + return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); + }, + rgb: function() { + return this; + }, + displayable: function() { + return (0 <= this.r && this.r <= 255) + && (0 <= this.g && this.g <= 255) + && (0 <= this.b && this.b <= 255) + && (0 <= this.opacity && this.opacity <= 1); + }, + toString: function() { + var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a)); + return (a === 1 ? "rgb(" : "rgba(") + + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + ", " + + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + ", " + + Math.max(0, Math.min(255, Math.round(this.b) || 0)) + + (a === 1 ? ")" : ", " + a + ")"); + } +})); + +function hsla(h, s, l, a) { + if (a <= 0) h = s = l = NaN; + else if (l <= 0 || l >= 1) h = s = NaN; + else if (s <= 0) h = NaN; + return new Hsl(h, s, l, a); +} + +function hslConvert(o) { + if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity); + if (!(o instanceof Color)) o = color(o); + if (!o) return new Hsl; + if (o instanceof Hsl) return o; + o = o.rgb(); + var r = o.r / 255, + g = o.g / 255, + b = o.b / 255, + min = Math.min(r, g, b), + max = Math.max(r, g, b), + h = NaN, + s = max - min, + l = (max + min) / 2; + if (s) { + if (r === max) h = (g - b) / s + (g < b) * 6; + else if (g === max) h = (b - r) / s + 2; + else h = (r - g) / s + 4; + s /= l < 0.5 ? max + min : 2 - max - min; + h *= 60; + } else { + s = l > 0 && l < 1 ? 0 : h; + } + return new Hsl(h, s, l, o.opacity); +} + +function hsl(h, s, l, opacity) { + return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity); +} + +function Hsl(h, s, l, opacity) { + this.h = +h; + this.s = +s; + this.l = +l; + this.opacity = +opacity; +} + +define(Hsl, hsl, extend(Color, { + brighter: function(k) { + k = k == null ? brighter : Math.pow(brighter, k); + return new Hsl(this.h, this.s, this.l * k, this.opacity); + }, + darker: function(k) { + k = k == null ? darker : Math.pow(darker, k); + return new Hsl(this.h, this.s, this.l * k, this.opacity); + }, + rgb: function() { + var h = this.h % 360 + (this.h < 0) * 360, + s = isNaN(h) || isNaN(this.s) ? 0 : this.s, + l = this.l, + m2 = l + (l < 0.5 ? l : 1 - l) * s, + m1 = 2 * l - m2; + return new Rgb( + hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2), + hsl2rgb(h, m1, m2), + hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2), + this.opacity + ); + }, + displayable: function() { + return (0 <= this.s && this.s <= 1 || isNaN(this.s)) + && (0 <= this.l && this.l <= 1) + && (0 <= this.opacity && this.opacity <= 1); + } +})); + +/* From FvD 13.37, CSS Color Module Level 3 */ +function hsl2rgb(h, m1, m2) { + return (h < 60 ? m1 + (m2 - m1) * h / 60 + : h < 180 ? m2 + : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60 + : m1) * 255; +} + +var deg2rad = Math.PI / 180; +var rad2deg = 180 / Math.PI; + +var Kn = 18; +var Xn = 0.950470; +var Yn = 1; +var Zn = 1.088830; +var t0 = 4 / 29; +var t1 = 6 / 29; +var t2 = 3 * t1 * t1; +var t3 = t1 * t1 * t1; + +function labConvert(o) { + if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity); + if (o instanceof Hcl) { + var h = o.h * deg2rad; + return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity); + } + if (!(o instanceof Rgb)) o = rgbConvert(o); + var b = rgb2xyz(o.r), + a = rgb2xyz(o.g), + l = rgb2xyz(o.b), + x = xyz2lab((0.4124564 * b + 0.3575761 * a + 0.1804375 * l) / Xn), + y = xyz2lab((0.2126729 * b + 0.7151522 * a + 0.0721750 * l) / Yn), + z = xyz2lab((0.0193339 * b + 0.1191920 * a + 0.9503041 * l) / Zn); + return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity); +} + +function lab(l, a, b, opacity) { + return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity); +} + +function Lab(l, a, b, opacity) { + this.l = +l; + this.a = +a; + this.b = +b; + this.opacity = +opacity; +} + +define(Lab, lab, extend(Color, { + brighter: function(k) { + return new Lab(this.l + Kn * (k == null ? 1 : k), this.a, this.b, this.opacity); + }, + darker: function(k) { + return new Lab(this.l - Kn * (k == null ? 1 : k), this.a, this.b, this.opacity); + }, + rgb: function() { + var y = (this.l + 16) / 116, + x = isNaN(this.a) ? y : y + this.a / 500, + z = isNaN(this.b) ? y : y - this.b / 200; + y = Yn * lab2xyz(y); + x = Xn * lab2xyz(x); + z = Zn * lab2xyz(z); + return new Rgb( + xyz2rgb( 3.2404542 * x - 1.5371385 * y - 0.4985314 * z), // D65 -> sRGB + xyz2rgb(-0.9692660 * x + 1.8760108 * y + 0.0415560 * z), + xyz2rgb( 0.0556434 * x - 0.2040259 * y + 1.0572252 * z), + this.opacity + ); + } +})); + +function xyz2lab(t) { + return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0; +} + +function lab2xyz(t) { + return t > t1 ? t * t * t : t2 * (t - t0); +} + +function xyz2rgb(x) { + return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055); +} + +function rgb2xyz(x) { + return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4); +} + +function hclConvert(o) { + if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity); + if (!(o instanceof Lab)) o = labConvert(o); + var h = Math.atan2(o.b, o.a) * rad2deg; + return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity); +} + +function hcl(h, c, l, opacity) { + return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity); +} + +function Hcl(h, c, l, opacity) { + this.h = +h; + this.c = +c; + this.l = +l; + this.opacity = +opacity; +} + +define(Hcl, hcl, extend(Color, { + brighter: function(k) { + return new Hcl(this.h, this.c, this.l + Kn * (k == null ? 1 : k), this.opacity); + }, + darker: function(k) { + return new Hcl(this.h, this.c, this.l - Kn * (k == null ? 1 : k), this.opacity); + }, + rgb: function() { + return labConvert(this).rgb(); + } +})); + +var A = -0.14861; +var B = +1.78277; +var C = -0.29227; +var D = -0.90649; +var E = +1.97294; +var ED = E * D; +var EB = E * B; +var BC_DA = B * C - D * A; + +function cubehelixConvert(o) { + if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity); + if (!(o instanceof Rgb)) o = rgbConvert(o); + var r = o.r / 255, + g = o.g / 255, + b = o.b / 255, + l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB), + bl = b - l, + k = (E * (g - l) - C * bl) / D, + s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), // NaN if l=0 or l=1 + h = s ? Math.atan2(k, bl) * rad2deg - 120 : NaN; + return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity); +} + +function cubehelix(h, s, l, opacity) { + return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity); +} + +function Cubehelix(h, s, l, opacity) { + this.h = +h; + this.s = +s; + this.l = +l; + this.opacity = +opacity; +} + +define(Cubehelix, cubehelix, extend(Color, { + brighter: function(k) { + k = k == null ? brighter : Math.pow(brighter, k); + return new Cubehelix(this.h, this.s, this.l * k, this.opacity); + }, + darker: function(k) { + k = k == null ? darker : Math.pow(darker, k); + return new Cubehelix(this.h, this.s, this.l * k, this.opacity); + }, + rgb: function() { + var h = isNaN(this.h) ? 0 : (this.h + 120) * deg2rad, + l = +this.l, + a = isNaN(this.s) ? 0 : this.s * l * (1 - l), + cosh = Math.cos(h), + sinh = Math.sin(h); + return new Rgb( + 255 * (l + a * (A * cosh + B * sinh)), + 255 * (l + a * (C * cosh + D * sinh)), + 255 * (l + a * (E * cosh)), + this.opacity + ); + } +})); + +function basis(t1, v0, v1, v2, v3) { + var t2 = t1 * t1, t3 = t2 * t1; + return ((1 - 3 * t1 + 3 * t2 - t3) * v0 + + (4 - 6 * t2 + 3 * t3) * v1 + + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2 + + t3 * v3) / 6; +} + +var basis$1 = function(values) { + var n = values.length - 1; + return function(t) { + var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n), + v1 = values[i], + v2 = values[i + 1], + v0 = i > 0 ? values[i - 1] : 2 * v1 - v2, + v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1; + return basis((t - i / n) * n, v0, v1, v2, v3); + }; +}; + +var basisClosed = function(values) { + var n = values.length; + return function(t) { + var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n), + v0 = values[(i + n - 1) % n], + v1 = values[i % n], + v2 = values[(i + 1) % n], + v3 = values[(i + 2) % n]; + return basis((t - i / n) * n, v0, v1, v2, v3); + }; +}; + +var constant$3 = function(x) { + return function() { + return x; + }; +}; + +function linear(a, d) { + return function(t) { + return a + t * d; + }; +} + +function exponential(a, b, y) { + return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) { + return Math.pow(a + t * b, y); + }; +} + +function hue(a, b) { + var d = b - a; + return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant$3(isNaN(a) ? b : a); +} + +function gamma(y) { + return (y = +y) === 1 ? nogamma : function(a, b) { + return b - a ? exponential(a, b, y) : constant$3(isNaN(a) ? b : a); + }; +} + +function nogamma(a, b) { + var d = b - a; + return d ? linear(a, d) : constant$3(isNaN(a) ? b : a); +} + +var interpolateRgb = ((function rgbGamma(y) { + var color$$1 = gamma(y); + + function rgb$$1(start, end) { + var r = color$$1((start = rgb(start)).r, (end = rgb(end)).r), + g = color$$1(start.g, end.g), + b = color$$1(start.b, end.b), + opacity = nogamma(start.opacity, end.opacity); + return function(t) { + start.r = r(t); + start.g = g(t); + start.b = b(t); + start.opacity = opacity(t); + return start + ""; + }; + } + + rgb$$1.gamma = rgbGamma; + + return rgb$$1; +}))(1); + +function rgbSpline(spline) { + return function(colors) { + var n = colors.length, + r = new Array(n), + g = new Array(n), + b = new Array(n), + i, color$$1; + for (i = 0; i < n; ++i) { + color$$1 = rgb(colors[i]); + r[i] = color$$1.r || 0; + g[i] = color$$1.g || 0; + b[i] = color$$1.b || 0; + } + r = spline(r); + g = spline(g); + b = spline(b); + color$$1.opacity = 1; + return function(t) { + color$$1.r = r(t); + color$$1.g = g(t); + color$$1.b = b(t); + return color$$1 + ""; + }; + }; +} + +var rgbBasis = rgbSpline(basis$1); +var rgbBasisClosed = rgbSpline(basisClosed); + +var array$1 = function(a, b) { + var nb = b ? b.length : 0, + na = a ? Math.min(nb, a.length) : 0, + x = new Array(nb), + c = new Array(nb), + i; + + for (i = 0; i < na; ++i) x[i] = interpolateValue(a[i], b[i]); + for (; i < nb; ++i) c[i] = b[i]; + + return function(t) { + for (i = 0; i < na; ++i) c[i] = x[i](t); + return c; + }; +}; + +var date = function(a, b) { + var d = new Date; + return a = +a, b -= a, function(t) { + return d.setTime(a + b * t), d; + }; +}; + +var reinterpolate = function(a, b) { + return a = +a, b -= a, function(t) { + return a + b * t; + }; +}; + +var object = function(a, b) { + var i = {}, + c = {}, + k; + + if (a === null || typeof a !== "object") a = {}; + if (b === null || typeof b !== "object") b = {}; + + for (k in b) { + if (k in a) { + i[k] = interpolateValue(a[k], b[k]); + } else { + c[k] = b[k]; + } + } + + return function(t) { + for (k in i) c[k] = i[k](t); + return c; + }; +}; + +var reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g; +var reB = new RegExp(reA.source, "g"); + +function zero(b) { + return function() { + return b; + }; +} + +function one(b) { + return function(t) { + return b(t) + ""; + }; +} + +var interpolateString = function(a, b) { + var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b + am, // current match in a + bm, // current match in b + bs, // string preceding current number in b, if any + i = -1, // index in s + s = [], // string constants and placeholders + q = []; // number interpolators + + // Coerce inputs to strings. + a = a + "", b = b + ""; + + // Interpolate pairs of numbers in a & b. + while ((am = reA.exec(a)) + && (bm = reB.exec(b))) { + if ((bs = bm.index) > bi) { // a string precedes the next number in b + bs = b.slice(bi, bs); + if (s[i]) s[i] += bs; // coalesce with previous string + else s[++i] = bs; + } + if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match + if (s[i]) s[i] += bm; // coalesce with previous string + else s[++i] = bm; + } else { // interpolate non-matching numbers + s[++i] = null; + q.push({i: i, x: reinterpolate(am, bm)}); + } + bi = reB.lastIndex; + } + + // Add remains of b. + if (bi < b.length) { + bs = b.slice(bi); + if (s[i]) s[i] += bs; // coalesce with previous string + else s[++i] = bs; + } + + // Special optimization for only a single match. + // Otherwise, interpolate each of the numbers and rejoin the string. + return s.length < 2 ? (q[0] + ? one(q[0].x) + : zero(b)) + : (b = q.length, function(t) { + for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t); + return s.join(""); + }); +}; + +var interpolateValue = function(a, b) { + var t = typeof b, c; + return b == null || t === "boolean" ? constant$3(b) + : (t === "number" ? reinterpolate + : t === "string" ? ((c = color(b)) ? (b = c, interpolateRgb) : interpolateString) + : b instanceof color ? interpolateRgb + : b instanceof Date ? date + : Array.isArray(b) ? array$1 + : typeof b.valueOf !== "function" && typeof b.toString !== "function" || isNaN(b) ? object + : reinterpolate)(a, b); +}; + +var interpolateRound = function(a, b) { + return a = +a, b -= a, function(t) { + return Math.round(a + b * t); + }; +}; + +var degrees = 180 / Math.PI; + +var identity$2 = { + translateX: 0, + translateY: 0, + rotate: 0, + skewX: 0, + scaleX: 1, + scaleY: 1 +}; + +var decompose = function(a, b, c, d, e, f) { + var scaleX, scaleY, skewX; + if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX; + if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX; + if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY; + if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX; + return { + translateX: e, + translateY: f, + rotate: Math.atan2(b, a) * degrees, + skewX: Math.atan(skewX) * degrees, + scaleX: scaleX, + scaleY: scaleY + }; +}; + +var cssNode; +var cssRoot; +var cssView; +var svgNode; + +function parseCss(value) { + if (value === "none") return identity$2; + if (!cssNode) cssNode = document.createElement("DIV"), cssRoot = document.documentElement, cssView = document.defaultView; + cssNode.style.transform = value; + value = cssView.getComputedStyle(cssRoot.appendChild(cssNode), null).getPropertyValue("transform"); + cssRoot.removeChild(cssNode); + value = value.slice(7, -1).split(","); + return decompose(+value[0], +value[1], +value[2], +value[3], +value[4], +value[5]); +} + +function parseSvg(value) { + if (value == null) return identity$2; + if (!svgNode) svgNode = document.createElementNS("http://www.w3.org/2000/svg", "g"); + svgNode.setAttribute("transform", value); + if (!(value = svgNode.transform.baseVal.consolidate())) return identity$2; + value = value.matrix; + return decompose(value.a, value.b, value.c, value.d, value.e, value.f); +} + +function interpolateTransform(parse, pxComma, pxParen, degParen) { + + function pop(s) { + return s.length ? s.pop() + " " : ""; + } + + function translate(xa, ya, xb, yb, s, q) { + if (xa !== xb || ya !== yb) { + var i = s.push("translate(", null, pxComma, null, pxParen); + q.push({i: i - 4, x: reinterpolate(xa, xb)}, {i: i - 2, x: reinterpolate(ya, yb)}); + } else if (xb || yb) { + s.push("translate(" + xb + pxComma + yb + pxParen); + } + } + + function rotate(a, b, s, q) { + if (a !== b) { + if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path + q.push({i: s.push(pop(s) + "rotate(", null, degParen) - 2, x: reinterpolate(a, b)}); + } else if (b) { + s.push(pop(s) + "rotate(" + b + degParen); + } + } + + function skewX(a, b, s, q) { + if (a !== b) { + q.push({i: s.push(pop(s) + "skewX(", null, degParen) - 2, x: reinterpolate(a, b)}); + } else if (b) { + s.push(pop(s) + "skewX(" + b + degParen); + } + } + + function scale(xa, ya, xb, yb, s, q) { + if (xa !== xb || ya !== yb) { + var i = s.push(pop(s) + "scale(", null, ",", null, ")"); + q.push({i: i - 4, x: reinterpolate(xa, xb)}, {i: i - 2, x: reinterpolate(ya, yb)}); + } else if (xb !== 1 || yb !== 1) { + s.push(pop(s) + "scale(" + xb + "," + yb + ")"); + } + } + + return function(a, b) { + var s = [], // string constants and placeholders + q = []; // number interpolators + a = parse(a), b = parse(b); + translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q); + rotate(a.rotate, b.rotate, s, q); + skewX(a.skewX, b.skewX, s, q); + scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q); + a = b = null; // gc + return function(t) { + var i = -1, n = q.length, o; + while (++i < n) s[(o = q[i]).i] = o.x(t); + return s.join(""); + }; + }; +} + +var interpolateTransformCss = interpolateTransform(parseCss, "px, ", "px)", "deg)"); +var interpolateTransformSvg = interpolateTransform(parseSvg, ", ", ")", ")"); + +var rho = Math.SQRT2; +var rho2 = 2; +var rho4 = 4; +var epsilon2 = 1e-12; + +function cosh(x) { + return ((x = Math.exp(x)) + 1 / x) / 2; +} + +function sinh(x) { + return ((x = Math.exp(x)) - 1 / x) / 2; +} + +function tanh(x) { + return ((x = Math.exp(2 * x)) - 1) / (x + 1); +} + +// p0 = [ux0, uy0, w0] +// p1 = [ux1, uy1, w1] +var interpolateZoom = function(p0, p1) { + var ux0 = p0[0], uy0 = p0[1], w0 = p0[2], + ux1 = p1[0], uy1 = p1[1], w1 = p1[2], + dx = ux1 - ux0, + dy = uy1 - uy0, + d2 = dx * dx + dy * dy, + i, + S; + + // Special case for u0 ≅ u1. + if (d2 < epsilon2) { + S = Math.log(w1 / w0) / rho; + i = function(t) { + return [ + ux0 + t * dx, + uy0 + t * dy, + w0 * Math.exp(rho * t * S) + ]; + }; + } + + // General case. + else { + var d1 = Math.sqrt(d2), + b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1), + b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1), + r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), + r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1); + S = (r1 - r0) / rho; + i = function(t) { + var s = t * S, + coshr0 = cosh(r0), + u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0)); + return [ + ux0 + u * dx, + uy0 + u * dy, + w0 * coshr0 / cosh(rho * s + r0) + ]; + }; + } + + i.duration = S * 1000; + + return i; +}; + +function hsl$1(hue$$1) { + return function(start, end) { + var h = hue$$1((start = hsl(start)).h, (end = hsl(end)).h), + s = nogamma(start.s, end.s), + l = nogamma(start.l, end.l), + opacity = nogamma(start.opacity, end.opacity); + return function(t) { + start.h = h(t); + start.s = s(t); + start.l = l(t); + start.opacity = opacity(t); + return start + ""; + }; + } +} + +var hsl$2 = hsl$1(hue); +var hslLong = hsl$1(nogamma); + +function lab$1(start, end) { + var l = nogamma((start = lab(start)).l, (end = lab(end)).l), + a = nogamma(start.a, end.a), + b = nogamma(start.b, end.b), + opacity = nogamma(start.opacity, end.opacity); + return function(t) { + start.l = l(t); + start.a = a(t); + start.b = b(t); + start.opacity = opacity(t); + return start + ""; + }; +} + +function hcl$1(hue$$1) { + return function(start, end) { + var h = hue$$1((start = hcl(start)).h, (end = hcl(end)).h), + c = nogamma(start.c, end.c), + l = nogamma(start.l, end.l), + opacity = nogamma(start.opacity, end.opacity); + return function(t) { + start.h = h(t); + start.c = c(t); + start.l = l(t); + start.opacity = opacity(t); + return start + ""; + }; + } +} + +var hcl$2 = hcl$1(hue); +var hclLong = hcl$1(nogamma); + +function cubehelix$1(hue$$1) { + return (function cubehelixGamma(y) { + y = +y; + + function cubehelix$$1(start, end) { + var h = hue$$1((start = cubehelix(start)).h, (end = cubehelix(end)).h), + s = nogamma(start.s, end.s), + l = nogamma(start.l, end.l), + opacity = nogamma(start.opacity, end.opacity); + return function(t) { + start.h = h(t); + start.s = s(t); + start.l = l(Math.pow(t, y)); + start.opacity = opacity(t); + return start + ""; + }; + } + + cubehelix$$1.gamma = cubehelixGamma; + + return cubehelix$$1; + })(1); +} + +var cubehelix$2 = cubehelix$1(hue); +var cubehelixLong = cubehelix$1(nogamma); + +var quantize = function(interpolator, n) { + var samples = new Array(n); + for (var i = 0; i < n; ++i) samples[i] = interpolator(i / (n - 1)); + return samples; +}; + +var frame = 0; +var timeout = 0; +var interval = 0; +var pokeDelay = 1000; +var taskHead; +var taskTail; +var clockLast = 0; +var clockNow = 0; +var clockSkew = 0; +var clock = typeof performance === "object" && performance.now ? performance : Date; +var setFrame = typeof requestAnimationFrame === "function" ? requestAnimationFrame : function(f) { setTimeout(f, 17); }; + +function now() { + return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew); +} + +function clearNow() { + clockNow = 0; +} + +function Timer() { + this._call = + this._time = + this._next = null; +} + +Timer.prototype = timer.prototype = { + constructor: Timer, + restart: function(callback, delay, time) { + if (typeof callback !== "function") throw new TypeError("callback is not a function"); + time = (time == null ? now() : +time) + (delay == null ? 0 : +delay); + if (!this._next && taskTail !== this) { + if (taskTail) taskTail._next = this; + else taskHead = this; + taskTail = this; + } + this._call = callback; + this._time = time; + sleep(); + }, + stop: function() { + if (this._call) { + this._call = null; + this._time = Infinity; + sleep(); + } + } +}; + +function timer(callback, delay, time) { + var t = new Timer; + t.restart(callback, delay, time); + return t; +} + +function timerFlush() { + now(); // Get the current time, if not already set. + ++frame; // Pretend we’ve set an alarm, if we haven’t already. + var t = taskHead, e; + while (t) { + if ((e = clockNow - t._time) >= 0) t._call.call(null, e); + t = t._next; + } + --frame; +} + +function wake() { + clockNow = (clockLast = clock.now()) + clockSkew; + frame = timeout = 0; + try { + timerFlush(); + } finally { + frame = 0; + nap(); + clockNow = 0; + } +} + +function poke() { + var now = clock.now(), delay = now - clockLast; + if (delay > pokeDelay) clockSkew -= delay, clockLast = now; +} + +function nap() { + var t0, t1 = taskHead, t2, time = Infinity; + while (t1) { + if (t1._call) { + if (time > t1._time) time = t1._time; + t0 = t1, t1 = t1._next; + } else { + t2 = t1._next, t1._next = null; + t1 = t0 ? t0._next = t2 : taskHead = t2; + } + } + taskTail = t0; + sleep(time); +} + +function sleep(time) { + if (frame) return; // Soonest alarm already set, or will be. + if (timeout) timeout = clearTimeout(timeout); + var delay = time - clockNow; + if (delay > 24) { + if (time < Infinity) timeout = setTimeout(wake, delay); + if (interval) interval = clearInterval(interval); + } else { + if (!interval) clockLast = clockNow, interval = setInterval(poke, pokeDelay); + frame = 1, setFrame(wake); + } +} + +var timeout$1 = function(callback, delay, time) { + var t = new Timer; + delay = delay == null ? 0 : +delay; + t.restart(function(elapsed) { + t.stop(); + callback(elapsed + delay); + }, delay, time); + return t; +}; + +var interval$1 = function(callback, delay, time) { + var t = new Timer, total = delay; + if (delay == null) return t.restart(callback, delay, time), t; + delay = +delay, time = time == null ? now() : +time; + t.restart(function tick(elapsed) { + elapsed += total; + t.restart(tick, total += delay, time); + callback(elapsed); + }, delay, time); + return t; +}; + +var emptyOn = dispatch("start", "end", "interrupt"); +var emptyTween = []; + +var CREATED = 0; +var SCHEDULED = 1; +var STARTING = 2; +var STARTED = 3; +var RUNNING = 4; +var ENDING = 5; +var ENDED = 6; + +var schedule = function(node, name, id, index, group, timing) { + var schedules = node.__transition; + if (!schedules) node.__transition = {}; + else if (id in schedules) return; + create(node, id, { + name: name, + index: index, // For context during callback. + group: group, // For context during callback. + on: emptyOn, + tween: emptyTween, + time: timing.time, + delay: timing.delay, + duration: timing.duration, + ease: timing.ease, + timer: null, + state: CREATED + }); +}; + +function init(node, id) { + var schedule = node.__transition; + if (!schedule || !(schedule = schedule[id]) || schedule.state > CREATED) throw new Error("too late"); + return schedule; +} + +function set$1(node, id) { + var schedule = node.__transition; + if (!schedule || !(schedule = schedule[id]) || schedule.state > STARTING) throw new Error("too late"); + return schedule; +} + +function get$1(node, id) { + var schedule = node.__transition; + if (!schedule || !(schedule = schedule[id])) throw new Error("too late"); + return schedule; +} + +function create(node, id, self) { + var schedules = node.__transition, + tween; + + // Initialize the self timer when the transition is created. + // Note the actual delay is not known until the first callback! + schedules[id] = self; + self.timer = timer(schedule, 0, self.time); + + function schedule(elapsed) { + self.state = SCHEDULED; + self.timer.restart(start, self.delay, self.time); + + // If the elapsed delay is less than our first sleep, start immediately. + if (self.delay <= elapsed) start(elapsed - self.delay); + } + + function start(elapsed) { + var i, j, n, o; + + // If the state is not SCHEDULED, then we previously errored on start. + if (self.state !== SCHEDULED) return stop(); + + for (i in schedules) { + o = schedules[i]; + if (o.name !== self.name) continue; + + // While this element already has a starting transition during this frame, + // defer starting an interrupting transition until that transition has a + // chance to tick (and possibly end); see d3/d3-transition#54! + if (o.state === STARTED) return timeout$1(start); + + // Interrupt the active transition, if any. + // Dispatch the interrupt event. + if (o.state === RUNNING) { + o.state = ENDED; + o.timer.stop(); + o.on.call("interrupt", node, node.__data__, o.index, o.group); + delete schedules[i]; + } + + // Cancel any pre-empted transitions. No interrupt event is dispatched + // because the cancelled transitions never started. Note that this also + // removes this transition from the pending list! + else if (+i < id) { + o.state = ENDED; + o.timer.stop(); + delete schedules[i]; + } + } + + // Defer the first tick to end of the current frame; see d3/d3#1576. + // Note the transition may be canceled after start and before the first tick! + // Note this must be scheduled before the start event; see d3/d3-transition#16! + // Assuming this is successful, subsequent callbacks go straight to tick. + timeout$1(function() { + if (self.state === STARTED) { + self.state = RUNNING; + self.timer.restart(tick, self.delay, self.time); + tick(elapsed); + } + }); + + // Dispatch the start event. + // Note this must be done before the tween are initialized. + self.state = STARTING; + self.on.call("start", node, node.__data__, self.index, self.group); + if (self.state !== STARTING) return; // interrupted + self.state = STARTED; + + // Initialize the tween, deleting null tween. + tween = new Array(n = self.tween.length); + for (i = 0, j = -1; i < n; ++i) { + if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) { + tween[++j] = o; + } + } + tween.length = j + 1; + } + + function tick(elapsed) { + var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1), + i = -1, + n = tween.length; + + while (++i < n) { + tween[i].call(null, t); + } + + // Dispatch the end event. + if (self.state === ENDING) { + self.on.call("end", node, node.__data__, self.index, self.group); + stop(); + } + } + + function stop() { + self.state = ENDED; + self.timer.stop(); + delete schedules[id]; + for (var i in schedules) return; // eslint-disable-line no-unused-vars + delete node.__transition; + } +} + +var interrupt = function(node, name) { + var schedules = node.__transition, + schedule, + active, + empty = true, + i; + + if (!schedules) return; + + name = name == null ? null : name + ""; + + for (i in schedules) { + if ((schedule = schedules[i]).name !== name) { empty = false; continue; } + active = schedule.state > STARTING && schedule.state < ENDING; + schedule.state = ENDED; + schedule.timer.stop(); + if (active) schedule.on.call("interrupt", node, node.__data__, schedule.index, schedule.group); + delete schedules[i]; + } + + if (empty) delete node.__transition; +}; + +var selection_interrupt = function(name) { + return this.each(function() { + interrupt(this, name); + }); +}; + +function tweenRemove(id, name) { + var tween0, tween1; + return function() { + var schedule = set$1(this, id), + tween = schedule.tween; + + // If this node shared tween with the previous node, + // just assign the updated shared tween and we’re done! + // Otherwise, copy-on-write. + if (tween !== tween0) { + tween1 = tween0 = tween; + for (var i = 0, n = tween1.length; i < n; ++i) { + if (tween1[i].name === name) { + tween1 = tween1.slice(); + tween1.splice(i, 1); + break; + } + } + } + + schedule.tween = tween1; + }; +} + +function tweenFunction(id, name, value) { + var tween0, tween1; + if (typeof value !== "function") throw new Error; + return function() { + var schedule = set$1(this, id), + tween = schedule.tween; + + // If this node shared tween with the previous node, + // just assign the updated shared tween and we’re done! + // Otherwise, copy-on-write. + if (tween !== tween0) { + tween1 = (tween0 = tween).slice(); + for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) { + if (tween1[i].name === name) { + tween1[i] = t; + break; + } + } + if (i === n) tween1.push(t); + } + + schedule.tween = tween1; + }; +} + +var transition_tween = function(name, value) { + var id = this._id; + + name += ""; + + if (arguments.length < 2) { + var tween = get$1(this.node(), id).tween; + for (var i = 0, n = tween.length, t; i < n; ++i) { + if ((t = tween[i]).name === name) { + return t.value; + } + } + return null; + } + + return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value)); +}; + +function tweenValue(transition, name, value) { + var id = transition._id; + + transition.each(function() { + var schedule = set$1(this, id); + (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments); + }); + + return function(node) { + return get$1(node, id).value[name]; + }; +} + +var interpolate$$1 = function(a, b) { + var c; + return (typeof b === "number" ? reinterpolate + : b instanceof color ? interpolateRgb + : (c = color(b)) ? (b = c, interpolateRgb) + : interpolateString)(a, b); +}; + +function attrRemove$1(name) { + return function() { + this.removeAttribute(name); + }; +} + +function attrRemoveNS$1(fullname) { + return function() { + this.removeAttributeNS(fullname.space, fullname.local); + }; +} + +function attrConstant$1(name, interpolate$$1, value1) { + var value00, + interpolate0; + return function() { + var value0 = this.getAttribute(name); + return value0 === value1 ? null + : value0 === value00 ? interpolate0 + : interpolate0 = interpolate$$1(value00 = value0, value1); + }; +} + +function attrConstantNS$1(fullname, interpolate$$1, value1) { + var value00, + interpolate0; + return function() { + var value0 = this.getAttributeNS(fullname.space, fullname.local); + return value0 === value1 ? null + : value0 === value00 ? interpolate0 + : interpolate0 = interpolate$$1(value00 = value0, value1); + }; +} + +function attrFunction$1(name, interpolate$$1, value) { + var value00, + value10, + interpolate0; + return function() { + var value0, value1 = value(this); + if (value1 == null) return void this.removeAttribute(name); + value0 = this.getAttribute(name); + return value0 === value1 ? null + : value0 === value00 && value1 === value10 ? interpolate0 + : interpolate0 = interpolate$$1(value00 = value0, value10 = value1); + }; +} + +function attrFunctionNS$1(fullname, interpolate$$1, value) { + var value00, + value10, + interpolate0; + return function() { + var value0, value1 = value(this); + if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local); + value0 = this.getAttributeNS(fullname.space, fullname.local); + return value0 === value1 ? null + : value0 === value00 && value1 === value10 ? interpolate0 + : interpolate0 = interpolate$$1(value00 = value0, value10 = value1); + }; +} + +var transition_attr = function(name, value) { + var fullname = namespace(name), i = fullname === "transform" ? interpolateTransformSvg : interpolate$$1; + return this.attrTween(name, typeof value === "function" + ? (fullname.local ? attrFunctionNS$1 : attrFunction$1)(fullname, i, tweenValue(this, "attr." + name, value)) + : value == null ? (fullname.local ? attrRemoveNS$1 : attrRemove$1)(fullname) + : (fullname.local ? attrConstantNS$1 : attrConstant$1)(fullname, i, value + "")); +}; + +function attrTweenNS(fullname, value) { + function tween() { + var node = this, i = value.apply(node, arguments); + return i && function(t) { + node.setAttributeNS(fullname.space, fullname.local, i(t)); + }; + } + tween._value = value; + return tween; +} + +function attrTween(name, value) { + function tween() { + var node = this, i = value.apply(node, arguments); + return i && function(t) { + node.setAttribute(name, i(t)); + }; + } + tween._value = value; + return tween; +} + +var transition_attrTween = function(name, value) { + var key = "attr." + name; + if (arguments.length < 2) return (key = this.tween(key)) && key._value; + if (value == null) return this.tween(key, null); + if (typeof value !== "function") throw new Error; + var fullname = namespace(name); + return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value)); +}; + +function delayFunction(id, value) { + return function() { + init(this, id).delay = +value.apply(this, arguments); + }; +} + +function delayConstant(id, value) { + return value = +value, function() { + init(this, id).delay = value; + }; +} + +var transition_delay = function(value) { + var id = this._id; + + return arguments.length + ? this.each((typeof value === "function" + ? delayFunction + : delayConstant)(id, value)) + : get$1(this.node(), id).delay; +}; + +function durationFunction(id, value) { + return function() { + set$1(this, id).duration = +value.apply(this, arguments); + }; +} + +function durationConstant(id, value) { + return value = +value, function() { + set$1(this, id).duration = value; + }; +} + +var transition_duration = function(value) { + var id = this._id; + + return arguments.length + ? this.each((typeof value === "function" + ? durationFunction + : durationConstant)(id, value)) + : get$1(this.node(), id).duration; +}; + +function easeConstant(id, value) { + if (typeof value !== "function") throw new Error; + return function() { + set$1(this, id).ease = value; + }; +} + +var transition_ease = function(value) { + var id = this._id; + + return arguments.length + ? this.each(easeConstant(id, value)) + : get$1(this.node(), id).ease; +}; + +var transition_filter = function(match) { + if (typeof match !== "function") match = matcher$1(match); + + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) { + if ((node = group[i]) && match.call(node, node.__data__, i, group)) { + subgroup.push(node); + } + } + } + + return new Transition(subgroups, this._parents, this._name, this._id); +}; + +var transition_merge = function(transition) { + if (transition._id !== this._id) throw new Error; + + for (var groups0 = this._groups, groups1 = transition._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) { + for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) { + if (node = group0[i] || group1[i]) { + merge[i] = node; + } + } + } + + for (; j < m0; ++j) { + merges[j] = groups0[j]; + } + + return new Transition(merges, this._parents, this._name, this._id); +}; + +function start(name) { + return (name + "").trim().split(/^|\s+/).every(function(t) { + var i = t.indexOf("."); + if (i >= 0) t = t.slice(0, i); + return !t || t === "start"; + }); +} + +function onFunction(id, name, listener) { + var on0, on1, sit = start(name) ? init : set$1; + return function() { + var schedule = sit(this, id), + on = schedule.on; + + // If this node shared a dispatch with the previous node, + // just assign the updated shared dispatch and we’re done! + // Otherwise, copy-on-write. + if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener); + + schedule.on = on1; + }; +} + +var transition_on = function(name, listener) { + var id = this._id; + + return arguments.length < 2 + ? get$1(this.node(), id).on.on(name) + : this.each(onFunction(id, name, listener)); +}; + +function removeFunction(id) { + return function() { + var parent = this.parentNode; + for (var i in this.__transition) if (+i !== id) return; + if (parent) parent.removeChild(this); + }; +} + +var transition_remove = function() { + return this.on("end.remove", removeFunction(this._id)); +}; + +var transition_select = function(select$$1) { + var name = this._name, + id = this._id; + + if (typeof select$$1 !== "function") select$$1 = selector(select$$1); + + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) { + if ((node = group[i]) && (subnode = select$$1.call(node, node.__data__, i, group))) { + if ("__data__" in node) subnode.__data__ = node.__data__; + subgroup[i] = subnode; + schedule(subgroup[i], name, id, i, subgroup, get$1(node, id)); + } + } + } + + return new Transition(subgroups, this._parents, name, id); +}; + +var transition_selectAll = function(select$$1) { + var name = this._name, + id = this._id; + + if (typeof select$$1 !== "function") select$$1 = selectorAll(select$$1); + + for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + for (var children = select$$1.call(node, node.__data__, i, group), child, inherit = get$1(node, id), k = 0, l = children.length; k < l; ++k) { + if (child = children[k]) { + schedule(child, name, id, k, children, inherit); + } + } + subgroups.push(children); + parents.push(node); + } + } + } + + return new Transition(subgroups, parents, name, id); +}; + +var Selection$1 = selection.prototype.constructor; + +var transition_selection = function() { + return new Selection$1(this._groups, this._parents); +}; + +function styleRemove$1(name, interpolate$$2) { + var value00, + value10, + interpolate0; + return function() { + var value0 = styleValue(this, name), + value1 = (this.style.removeProperty(name), styleValue(this, name)); + return value0 === value1 ? null + : value0 === value00 && value1 === value10 ? interpolate0 + : interpolate0 = interpolate$$2(value00 = value0, value10 = value1); + }; +} + +function styleRemoveEnd(name) { + return function() { + this.style.removeProperty(name); + }; +} + +function styleConstant$1(name, interpolate$$2, value1) { + var value00, + interpolate0; + return function() { + var value0 = styleValue(this, name); + return value0 === value1 ? null + : value0 === value00 ? interpolate0 + : interpolate0 = interpolate$$2(value00 = value0, value1); + }; +} + +function styleFunction$1(name, interpolate$$2, value) { + var value00, + value10, + interpolate0; + return function() { + var value0 = styleValue(this, name), + value1 = value(this); + if (value1 == null) value1 = (this.style.removeProperty(name), styleValue(this, name)); + return value0 === value1 ? null + : value0 === value00 && value1 === value10 ? interpolate0 + : interpolate0 = interpolate$$2(value00 = value0, value10 = value1); + }; +} + +var transition_style = function(name, value, priority) { + var i = (name += "") === "transform" ? interpolateTransformCss : interpolate$$1; + return value == null ? this + .styleTween(name, styleRemove$1(name, i)) + .on("end.style." + name, styleRemoveEnd(name)) + : this.styleTween(name, typeof value === "function" + ? styleFunction$1(name, i, tweenValue(this, "style." + name, value)) + : styleConstant$1(name, i, value + ""), priority); +}; + +function styleTween(name, value, priority) { + function tween() { + var node = this, i = value.apply(node, arguments); + return i && function(t) { + node.style.setProperty(name, i(t), priority); + }; + } + tween._value = value; + return tween; +} + +var transition_styleTween = function(name, value, priority) { + var key = "style." + (name += ""); + if (arguments.length < 2) return (key = this.tween(key)) && key._value; + if (value == null) return this.tween(key, null); + if (typeof value !== "function") throw new Error; + return this.tween(key, styleTween(name, value, priority == null ? "" : priority)); +}; + +function textConstant$1(value) { + return function() { + this.textContent = value; + }; +} + +function textFunction$1(value) { + return function() { + var value1 = value(this); + this.textContent = value1 == null ? "" : value1; + }; +} + +var transition_text = function(value) { + return this.tween("text", typeof value === "function" + ? textFunction$1(tweenValue(this, "text", value)) + : textConstant$1(value == null ? "" : value + "")); +}; + +var transition_transition = function() { + var name = this._name, + id0 = this._id, + id1 = newId(); + + for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + var inherit = get$1(node, id0); + schedule(node, name, id1, i, group, { + time: inherit.time + inherit.delay + inherit.duration, + delay: 0, + duration: inherit.duration, + ease: inherit.ease + }); + } + } + } + + return new Transition(groups, this._parents, name, id1); +}; + +var id = 0; + +function Transition(groups, parents, name, id) { + this._groups = groups; + this._parents = parents; + this._name = name; + this._id = id; +} + +function transition(name) { + return selection().transition(name); +} + +function newId() { + return ++id; +} + +var selection_prototype = selection.prototype; + +Transition.prototype = transition.prototype = { + constructor: Transition, + select: transition_select, + selectAll: transition_selectAll, + filter: transition_filter, + merge: transition_merge, + selection: transition_selection, + transition: transition_transition, + call: selection_prototype.call, + nodes: selection_prototype.nodes, + node: selection_prototype.node, + size: selection_prototype.size, + empty: selection_prototype.empty, + each: selection_prototype.each, + on: transition_on, + attr: transition_attr, + attrTween: transition_attrTween, + style: transition_style, + styleTween: transition_styleTween, + text: transition_text, + remove: transition_remove, + tween: transition_tween, + delay: transition_delay, + duration: transition_duration, + ease: transition_ease +}; + +function linear$1(t) { + return +t; +} + +function quadIn(t) { + return t * t; +} + +function quadOut(t) { + return t * (2 - t); +} + +function quadInOut(t) { + return ((t *= 2) <= 1 ? t * t : --t * (2 - t) + 1) / 2; +} + +function cubicIn(t) { + return t * t * t; +} + +function cubicOut(t) { + return --t * t * t + 1; +} + +function cubicInOut(t) { + return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2; +} + +var exponent = 3; + +var polyIn = (function custom(e) { + e = +e; + + function polyIn(t) { + return Math.pow(t, e); + } + + polyIn.exponent = custom; + + return polyIn; +})(exponent); + +var polyOut = (function custom(e) { + e = +e; + + function polyOut(t) { + return 1 - Math.pow(1 - t, e); + } + + polyOut.exponent = custom; + + return polyOut; +})(exponent); + +var polyInOut = (function custom(e) { + e = +e; + + function polyInOut(t) { + return ((t *= 2) <= 1 ? Math.pow(t, e) : 2 - Math.pow(2 - t, e)) / 2; + } + + polyInOut.exponent = custom; + + return polyInOut; +})(exponent); + +var pi = Math.PI; +var halfPi = pi / 2; + +function sinIn(t) { + return 1 - Math.cos(t * halfPi); +} + +function sinOut(t) { + return Math.sin(t * halfPi); +} + +function sinInOut(t) { + return (1 - Math.cos(pi * t)) / 2; +} + +function expIn(t) { + return Math.pow(2, 10 * t - 10); +} + +function expOut(t) { + return 1 - Math.pow(2, -10 * t); +} + +function expInOut(t) { + return ((t *= 2) <= 1 ? Math.pow(2, 10 * t - 10) : 2 - Math.pow(2, 10 - 10 * t)) / 2; +} + +function circleIn(t) { + return 1 - Math.sqrt(1 - t * t); +} + +function circleOut(t) { + return Math.sqrt(1 - --t * t); +} + +function circleInOut(t) { + return ((t *= 2) <= 1 ? 1 - Math.sqrt(1 - t * t) : Math.sqrt(1 - (t -= 2) * t) + 1) / 2; +} + +var b1 = 4 / 11; +var b2 = 6 / 11; +var b3 = 8 / 11; +var b4 = 3 / 4; +var b5 = 9 / 11; +var b6 = 10 / 11; +var b7 = 15 / 16; +var b8 = 21 / 22; +var b9 = 63 / 64; +var b0 = 1 / b1 / b1; + +function bounceIn(t) { + return 1 - bounceOut(1 - t); +} + +function bounceOut(t) { + return (t = +t) < b1 ? b0 * t * t : t < b3 ? b0 * (t -= b2) * t + b4 : t < b6 ? b0 * (t -= b5) * t + b7 : b0 * (t -= b8) * t + b9; +} + +function bounceInOut(t) { + return ((t *= 2) <= 1 ? 1 - bounceOut(1 - t) : bounceOut(t - 1) + 1) / 2; +} + +var overshoot = 1.70158; + +var backIn = (function custom(s) { + s = +s; + + function backIn(t) { + return t * t * ((s + 1) * t - s); + } + + backIn.overshoot = custom; + + return backIn; +})(overshoot); + +var backOut = (function custom(s) { + s = +s; + + function backOut(t) { + return --t * t * ((s + 1) * t + s) + 1; + } + + backOut.overshoot = custom; + + return backOut; +})(overshoot); + +var backInOut = (function custom(s) { + s = +s; + + function backInOut(t) { + return ((t *= 2) < 1 ? t * t * ((s + 1) * t - s) : (t -= 2) * t * ((s + 1) * t + s) + 2) / 2; + } + + backInOut.overshoot = custom; + + return backInOut; +})(overshoot); + +var tau = 2 * Math.PI; +var amplitude = 1; +var period = 0.3; + +var elasticIn = (function custom(a, p) { + var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau); + + function elasticIn(t) { + return a * Math.pow(2, 10 * --t) * Math.sin((s - t) / p); + } + + elasticIn.amplitude = function(a) { return custom(a, p * tau); }; + elasticIn.period = function(p) { return custom(a, p); }; + + return elasticIn; +})(amplitude, period); + +var elasticOut = (function custom(a, p) { + var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau); + + function elasticOut(t) { + return 1 - a * Math.pow(2, -10 * (t = +t)) * Math.sin((t + s) / p); + } + + elasticOut.amplitude = function(a) { return custom(a, p * tau); }; + elasticOut.period = function(p) { return custom(a, p); }; + + return elasticOut; +})(amplitude, period); + +var elasticInOut = (function custom(a, p) { + var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau); + + function elasticInOut(t) { + return ((t = t * 2 - 1) < 0 + ? a * Math.pow(2, 10 * t) * Math.sin((s - t) / p) + : 2 - a * Math.pow(2, -10 * t) * Math.sin((s + t) / p)) / 2; + } + + elasticInOut.amplitude = function(a) { return custom(a, p * tau); }; + elasticInOut.period = function(p) { return custom(a, p); }; + + return elasticInOut; +})(amplitude, period); + +var defaultTiming = { + time: null, // Set on use. + delay: 0, + duration: 250, + ease: cubicInOut +}; + +function inherit(node, id) { + var timing; + while (!(timing = node.__transition) || !(timing = timing[id])) { + if (!(node = node.parentNode)) { + return defaultTiming.time = now(), defaultTiming; + } + } + return timing; +} + +var selection_transition = function(name) { + var id, + timing; + + if (name instanceof Transition) { + id = name._id, name = name._name; + } else { + id = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + ""; + } + + for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + schedule(node, name, id, i, group, timing || inherit(node, id)); + } + } + } + + return new Transition(groups, this._parents, name, id); +}; + +selection.prototype.interrupt = selection_interrupt; +selection.prototype.transition = selection_transition; + +var root$1 = [null]; + +var active = function(node, name) { + var schedules = node.__transition, + schedule, + i; + + if (schedules) { + name = name == null ? null : name + ""; + for (i in schedules) { + if ((schedule = schedules[i]).state > SCHEDULED && schedule.name === name) { + return new Transition([[node]], root$1, name, +i); + } + } + } + + return null; +}; + +var constant$4 = function(x) { + return function() { + return x; + }; +}; + +var BrushEvent = function(target, type, selection) { + this.target = target; + this.type = type; + this.selection = selection; +}; + +function nopropagation$1() { + exports.event.stopImmediatePropagation(); +} + +var noevent$1 = function() { + exports.event.preventDefault(); + exports.event.stopImmediatePropagation(); +}; + +var MODE_DRAG = {name: "drag"}; +var MODE_SPACE = {name: "space"}; +var MODE_HANDLE = {name: "handle"}; +var MODE_CENTER = {name: "center"}; + +var X = { + name: "x", + handles: ["e", "w"].map(type), + input: function(x, e) { return x && [[x[0], e[0][1]], [x[1], e[1][1]]]; }, + output: function(xy) { return xy && [xy[0][0], xy[1][0]]; } +}; + +var Y = { + name: "y", + handles: ["n", "s"].map(type), + input: function(y, e) { return y && [[e[0][0], y[0]], [e[1][0], y[1]]]; }, + output: function(xy) { return xy && [xy[0][1], xy[1][1]]; } +}; + +var XY = { + name: "xy", + handles: ["n", "e", "s", "w", "nw", "ne", "se", "sw"].map(type), + input: function(xy) { return xy; }, + output: function(xy) { return xy; } +}; + +var cursors = { + overlay: "crosshair", + selection: "move", + n: "ns-resize", + e: "ew-resize", + s: "ns-resize", + w: "ew-resize", + nw: "nwse-resize", + ne: "nesw-resize", + se: "nwse-resize", + sw: "nesw-resize" +}; + +var flipX = { + e: "w", + w: "e", + nw: "ne", + ne: "nw", + se: "sw", + sw: "se" +}; + +var flipY = { + n: "s", + s: "n", + nw: "sw", + ne: "se", + se: "ne", + sw: "nw" +}; + +var signsX = { + overlay: +1, + selection: +1, + n: null, + e: +1, + s: null, + w: -1, + nw: -1, + ne: +1, + se: +1, + sw: -1 +}; + +var signsY = { + overlay: +1, + selection: +1, + n: -1, + e: null, + s: +1, + w: null, + nw: -1, + ne: -1, + se: +1, + sw: +1 +}; + +function type(t) { + return {type: t}; +} + +// Ignore right-click, since that should open the context menu. +function defaultFilter() { + return !exports.event.button; +} + +function defaultExtent() { + var svg = this.ownerSVGElement || this; + return [[0, 0], [svg.width.baseVal.value, svg.height.baseVal.value]]; +} + +// Like d3.local, but with the name “__brush” rather than auto-generated. +function local$$1(node) { + while (!node.__brush) if (!(node = node.parentNode)) return; + return node.__brush; +} + +function empty(extent) { + return extent[0][0] === extent[1][0] + || extent[0][1] === extent[1][1]; +} + +function brushSelection(node) { + var state = node.__brush; + return state ? state.dim.output(state.selection) : null; +} + +function brushX() { + return brush$1(X); +} + +function brushY() { + return brush$1(Y); +} + +var brush = function() { + return brush$1(XY); +}; + +function brush$1(dim) { + var extent = defaultExtent, + filter = defaultFilter, + listeners = dispatch(brush, "start", "brush", "end"), + handleSize = 6, + touchending; + + function brush(group) { + var overlay = group + .property("__brush", initialize) + .selectAll(".overlay") + .data([type("overlay")]); + + overlay.enter().append("rect") + .attr("class", "overlay") + .attr("pointer-events", "all") + .attr("cursor", cursors.overlay) + .merge(overlay) + .each(function() { + var extent = local$$1(this).extent; + select(this) + .attr("x", extent[0][0]) + .attr("y", extent[0][1]) + .attr("width", extent[1][0] - extent[0][0]) + .attr("height", extent[1][1] - extent[0][1]); + }); + + group.selectAll(".selection") + .data([type("selection")]) + .enter().append("rect") + .attr("class", "selection") + .attr("cursor", cursors.selection) + .attr("fill", "#777") + .attr("fill-opacity", 0.3) + .attr("stroke", "#fff") + .attr("shape-rendering", "crispEdges"); + + var handle = group.selectAll(".handle") + .data(dim.handles, function(d) { return d.type; }); + + handle.exit().remove(); + + handle.enter().append("rect") + .attr("class", function(d) { return "handle handle--" + d.type; }) + .attr("cursor", function(d) { return cursors[d.type]; }); + + group + .each(redraw) + .attr("fill", "none") + .attr("pointer-events", "all") + .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)") + .on("mousedown.brush touchstart.brush", started); + } + + brush.move = function(group, selection$$1) { + if (group.selection) { + group + .on("start.brush", function() { emitter(this, arguments).beforestart().start(); }) + .on("interrupt.brush end.brush", function() { emitter(this, arguments).end(); }) + .tween("brush", function() { + var that = this, + state = that.__brush, + emit = emitter(that, arguments), + selection0 = state.selection, + selection1 = dim.input(typeof selection$$1 === "function" ? selection$$1.apply(this, arguments) : selection$$1, state.extent), + i = interpolateValue(selection0, selection1); + + function tween(t) { + state.selection = t === 1 && empty(selection1) ? null : i(t); + redraw.call(that); + emit.brush(); + } + + return selection0 && selection1 ? tween : tween(1); + }); + } else { + group + .each(function() { + var that = this, + args = arguments, + state = that.__brush, + selection1 = dim.input(typeof selection$$1 === "function" ? selection$$1.apply(that, args) : selection$$1, state.extent), + emit = emitter(that, args).beforestart(); + + interrupt(that); + state.selection = selection1 == null || empty(selection1) ? null : selection1; + redraw.call(that); + emit.start().brush().end(); + }); + } + }; + + function redraw() { + var group = select(this), + selection$$1 = local$$1(this).selection; + + if (selection$$1) { + group.selectAll(".selection") + .style("display", null) + .attr("x", selection$$1[0][0]) + .attr("y", selection$$1[0][1]) + .attr("width", selection$$1[1][0] - selection$$1[0][0]) + .attr("height", selection$$1[1][1] - selection$$1[0][1]); + + group.selectAll(".handle") + .style("display", null) + .attr("x", function(d) { return d.type[d.type.length - 1] === "e" ? selection$$1[1][0] - handleSize / 2 : selection$$1[0][0] - handleSize / 2; }) + .attr("y", function(d) { return d.type[0] === "s" ? selection$$1[1][1] - handleSize / 2 : selection$$1[0][1] - handleSize / 2; }) + .attr("width", function(d) { return d.type === "n" || d.type === "s" ? selection$$1[1][0] - selection$$1[0][0] + handleSize : handleSize; }) + .attr("height", function(d) { return d.type === "e" || d.type === "w" ? selection$$1[1][1] - selection$$1[0][1] + handleSize : handleSize; }); + } + + else { + group.selectAll(".selection,.handle") + .style("display", "none") + .attr("x", null) + .attr("y", null) + .attr("width", null) + .attr("height", null); + } + } + + function emitter(that, args) { + return that.__brush.emitter || new Emitter(that, args); + } + + function Emitter(that, args) { + this.that = that; + this.args = args; + this.state = that.__brush; + this.active = 0; + } + + Emitter.prototype = { + beforestart: function() { + if (++this.active === 1) this.state.emitter = this, this.starting = true; + return this; + }, + start: function() { + if (this.starting) this.starting = false, this.emit("start"); + return this; + }, + brush: function() { + this.emit("brush"); + return this; + }, + end: function() { + if (--this.active === 0) delete this.state.emitter, this.emit("end"); + return this; + }, + emit: function(type) { + customEvent(new BrushEvent(brush, type, dim.output(this.state.selection)), listeners.apply, listeners, [type, this.that, this.args]); + } + }; + + function started() { + if (exports.event.touches) { if (exports.event.changedTouches.length < exports.event.touches.length) return noevent$1(); } + else if (touchending) return; + if (!filter.apply(this, arguments)) return; + + var that = this, + type = exports.event.target.__data__.type, + mode = (exports.event.metaKey ? type = "overlay" : type) === "selection" ? MODE_DRAG : (exports.event.altKey ? MODE_CENTER : MODE_HANDLE), + signX = dim === Y ? null : signsX[type], + signY = dim === X ? null : signsY[type], + state = local$$1(that), + extent = state.extent, + selection$$1 = state.selection, + W = extent[0][0], w0, w1, + N = extent[0][1], n0, n1, + E = extent[1][0], e0, e1, + S = extent[1][1], s0, s1, + dx, + dy, + moving, + shifting = signX && signY && exports.event.shiftKey, + lockX, + lockY, + point0 = mouse(that), + point = point0, + emit = emitter(that, arguments).beforestart(); + + if (type === "overlay") { + state.selection = selection$$1 = [ + [w0 = dim === Y ? W : point0[0], n0 = dim === X ? N : point0[1]], + [e0 = dim === Y ? E : w0, s0 = dim === X ? S : n0] + ]; + } else { + w0 = selection$$1[0][0]; + n0 = selection$$1[0][1]; + e0 = selection$$1[1][0]; + s0 = selection$$1[1][1]; + } + + w1 = w0; + n1 = n0; + e1 = e0; + s1 = s0; + + var group = select(that) + .attr("pointer-events", "none"); + + var overlay = group.selectAll(".overlay") + .attr("cursor", cursors[type]); + + if (exports.event.touches) { + group + .on("touchmove.brush", moved, true) + .on("touchend.brush touchcancel.brush", ended, true); + } else { + var view = select(exports.event.view) + .on("keydown.brush", keydowned, true) + .on("keyup.brush", keyupped, true) + .on("mousemove.brush", moved, true) + .on("mouseup.brush", ended, true); + + dragDisable(exports.event.view); + } + + nopropagation$1(); + interrupt(that); + redraw.call(that); + emit.start(); + + function moved() { + var point1 = mouse(that); + if (shifting && !lockX && !lockY) { + if (Math.abs(point1[0] - point[0]) > Math.abs(point1[1] - point[1])) lockY = true; + else lockX = true; + } + point = point1; + moving = true; + noevent$1(); + move(); + } + + function move() { + var t; + + dx = point[0] - point0[0]; + dy = point[1] - point0[1]; + + switch (mode) { + case MODE_SPACE: + case MODE_DRAG: { + if (signX) dx = Math.max(W - w0, Math.min(E - e0, dx)), w1 = w0 + dx, e1 = e0 + dx; + if (signY) dy = Math.max(N - n0, Math.min(S - s0, dy)), n1 = n0 + dy, s1 = s0 + dy; + break; + } + case MODE_HANDLE: { + if (signX < 0) dx = Math.max(W - w0, Math.min(E - w0, dx)), w1 = w0 + dx, e1 = e0; + else if (signX > 0) dx = Math.max(W - e0, Math.min(E - e0, dx)), w1 = w0, e1 = e0 + dx; + if (signY < 0) dy = Math.max(N - n0, Math.min(S - n0, dy)), n1 = n0 + dy, s1 = s0; + else if (signY > 0) dy = Math.max(N - s0, Math.min(S - s0, dy)), n1 = n0, s1 = s0 + dy; + break; + } + case MODE_CENTER: { + if (signX) w1 = Math.max(W, Math.min(E, w0 - dx * signX)), e1 = Math.max(W, Math.min(E, e0 + dx * signX)); + if (signY) n1 = Math.max(N, Math.min(S, n0 - dy * signY)), s1 = Math.max(N, Math.min(S, s0 + dy * signY)); + break; + } + } + + if (e1 < w1) { + signX *= -1; + t = w0, w0 = e0, e0 = t; + t = w1, w1 = e1, e1 = t; + if (type in flipX) overlay.attr("cursor", cursors[type = flipX[type]]); + } + + if (s1 < n1) { + signY *= -1; + t = n0, n0 = s0, s0 = t; + t = n1, n1 = s1, s1 = t; + if (type in flipY) overlay.attr("cursor", cursors[type = flipY[type]]); + } + + if (state.selection) selection$$1 = state.selection; // May be set by brush.move! + if (lockX) w1 = selection$$1[0][0], e1 = selection$$1[1][0]; + if (lockY) n1 = selection$$1[0][1], s1 = selection$$1[1][1]; + + if (selection$$1[0][0] !== w1 + || selection$$1[0][1] !== n1 + || selection$$1[1][0] !== e1 + || selection$$1[1][1] !== s1) { + state.selection = [[w1, n1], [e1, s1]]; + redraw.call(that); + emit.brush(); + } + } + + function ended() { + nopropagation$1(); + if (exports.event.touches) { + if (exports.event.touches.length) return; + if (touchending) clearTimeout(touchending); + touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed! + group.on("touchmove.brush touchend.brush touchcancel.brush", null); + } else { + yesdrag(exports.event.view, moving); + view.on("keydown.brush keyup.brush mousemove.brush mouseup.brush", null); + } + group.attr("pointer-events", "all"); + overlay.attr("cursor", cursors.overlay); + if (state.selection) selection$$1 = state.selection; // May be set by brush.move (on start)! + if (empty(selection$$1)) state.selection = null, redraw.call(that); + emit.end(); + } + + function keydowned() { + switch (exports.event.keyCode) { + case 16: { // SHIFT + shifting = signX && signY; + break; + } + case 18: { // ALT + if (mode === MODE_HANDLE) { + if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX; + if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY; + mode = MODE_CENTER; + move(); + } + break; + } + case 32: { // SPACE; takes priority over ALT + if (mode === MODE_HANDLE || mode === MODE_CENTER) { + if (signX < 0) e0 = e1 - dx; else if (signX > 0) w0 = w1 - dx; + if (signY < 0) s0 = s1 - dy; else if (signY > 0) n0 = n1 - dy; + mode = MODE_SPACE; + overlay.attr("cursor", cursors.selection); + move(); + } + break; + } + default: return; + } + noevent$1(); + } + + function keyupped() { + switch (exports.event.keyCode) { + case 16: { // SHIFT + if (shifting) { + lockX = lockY = shifting = false; + move(); + } + break; + } + case 18: { // ALT + if (mode === MODE_CENTER) { + if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1; + if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1; + mode = MODE_HANDLE; + move(); + } + break; + } + case 32: { // SPACE + if (mode === MODE_SPACE) { + if (exports.event.altKey) { + if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX; + if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY; + mode = MODE_CENTER; + } else { + if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1; + if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1; + mode = MODE_HANDLE; + } + overlay.attr("cursor", cursors[type]); + move(); + } + break; + } + default: return; + } + noevent$1(); + } + } + + function initialize() { + var state = this.__brush || {selection: null}; + state.extent = extent.apply(this, arguments); + state.dim = dim; + return state; + } + + brush.extent = function(_) { + return arguments.length ? (extent = typeof _ === "function" ? _ : constant$4([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), brush) : extent; + }; + + brush.filter = function(_) { + return arguments.length ? (filter = typeof _ === "function" ? _ : constant$4(!!_), brush) : filter; + }; + + brush.handleSize = function(_) { + return arguments.length ? (handleSize = +_, brush) : handleSize; + }; + + brush.on = function() { + var value = listeners.on.apply(listeners, arguments); + return value === listeners ? brush : value; + }; + + return brush; +} + +var cos = Math.cos; +var sin = Math.sin; +var pi$1 = Math.PI; +var halfPi$1 = pi$1 / 2; +var tau$1 = pi$1 * 2; +var max$1 = Math.max; + +function compareValue(compare) { + return function(a, b) { + return compare( + a.source.value + a.target.value, + b.source.value + b.target.value + ); + }; +} + +var chord = function() { + var padAngle = 0, + sortGroups = null, + sortSubgroups = null, + sortChords = null; + + function chord(matrix) { + var n = matrix.length, + groupSums = [], + groupIndex = sequence(n), + subgroupIndex = [], + chords = [], + groups = chords.groups = new Array(n), + subgroups = new Array(n * n), + k, + x, + x0, + dx, + i, + j; + + // Compute the sum. + k = 0, i = -1; while (++i < n) { + x = 0, j = -1; while (++j < n) { + x += matrix[i][j]; + } + groupSums.push(x); + subgroupIndex.push(sequence(n)); + k += x; + } + + // Sort groups… + if (sortGroups) groupIndex.sort(function(a, b) { + return sortGroups(groupSums[a], groupSums[b]); + }); + + // Sort subgroups… + if (sortSubgroups) subgroupIndex.forEach(function(d, i) { + d.sort(function(a, b) { + return sortSubgroups(matrix[i][a], matrix[i][b]); + }); + }); + + // Convert the sum to scaling factor for [0, 2pi]. + // TODO Allow start and end angle to be specified? + // TODO Allow padding to be specified as percentage? + k = max$1(0, tau$1 - padAngle * n) / k; + dx = k ? padAngle : tau$1 / n; + + // Compute the start and end angle for each group and subgroup. + // Note: Opera has a bug reordering object literal properties! + x = 0, i = -1; while (++i < n) { + x0 = x, j = -1; while (++j < n) { + var di = groupIndex[i], + dj = subgroupIndex[di][j], + v = matrix[di][dj], + a0 = x, + a1 = x += v * k; + subgroups[dj * n + di] = { + index: di, + subindex: dj, + startAngle: a0, + endAngle: a1, + value: v + }; + } + groups[di] = { + index: di, + startAngle: x0, + endAngle: x, + value: groupSums[di] + }; + x += dx; + } + + // Generate chords for each (non-empty) subgroup-subgroup link. + i = -1; while (++i < n) { + j = i - 1; while (++j < n) { + var source = subgroups[j * n + i], + target = subgroups[i * n + j]; + if (source.value || target.value) { + chords.push(source.value < target.value + ? {source: target, target: source} + : {source: source, target: target}); + } + } + } + + return sortChords ? chords.sort(sortChords) : chords; + } + + chord.padAngle = function(_) { + return arguments.length ? (padAngle = max$1(0, _), chord) : padAngle; + }; + + chord.sortGroups = function(_) { + return arguments.length ? (sortGroups = _, chord) : sortGroups; + }; + + chord.sortSubgroups = function(_) { + return arguments.length ? (sortSubgroups = _, chord) : sortSubgroups; + }; + + chord.sortChords = function(_) { + return arguments.length ? (_ == null ? sortChords = null : (sortChords = compareValue(_))._ = _, chord) : sortChords && sortChords._; + }; + + return chord; +}; + +var slice$2 = Array.prototype.slice; + +var constant$5 = function(x) { + return function() { + return x; + }; +}; + +var pi$2 = Math.PI; +var tau$2 = 2 * pi$2; +var epsilon$1 = 1e-6; +var tauEpsilon = tau$2 - epsilon$1; + +function Path() { + this._x0 = this._y0 = // start of current subpath + this._x1 = this._y1 = null; // end of current subpath + this._ = ""; +} + +function path() { + return new Path; +} + +Path.prototype = path.prototype = { + constructor: Path, + moveTo: function(x, y) { + this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y); + }, + closePath: function() { + if (this._x1 !== null) { + this._x1 = this._x0, this._y1 = this._y0; + this._ += "Z"; + } + }, + lineTo: function(x, y) { + this._ += "L" + (this._x1 = +x) + "," + (this._y1 = +y); + }, + quadraticCurveTo: function(x1, y1, x, y) { + this._ += "Q" + (+x1) + "," + (+y1) + "," + (this._x1 = +x) + "," + (this._y1 = +y); + }, + bezierCurveTo: function(x1, y1, x2, y2, x, y) { + this._ += "C" + (+x1) + "," + (+y1) + "," + (+x2) + "," + (+y2) + "," + (this._x1 = +x) + "," + (this._y1 = +y); + }, + arcTo: function(x1, y1, x2, y2, r) { + x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r; + var x0 = this._x1, + y0 = this._y1, + x21 = x2 - x1, + y21 = y2 - y1, + x01 = x0 - x1, + y01 = y0 - y1, + l01_2 = x01 * x01 + y01 * y01; + + // Is the radius negative? Error. + if (r < 0) throw new Error("negative radius: " + r); + + // Is this path empty? Move to (x1,y1). + if (this._x1 === null) { + this._ += "M" + (this._x1 = x1) + "," + (this._y1 = y1); + } + + // Or, is (x1,y1) coincident with (x0,y0)? Do nothing. + else if (!(l01_2 > epsilon$1)) {} + + // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear? + // Equivalently, is (x1,y1) coincident with (x2,y2)? + // Or, is the radius zero? Line to (x1,y1). + else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon$1) || !r) { + this._ += "L" + (this._x1 = x1) + "," + (this._y1 = y1); + } + + // Otherwise, draw an arc! + else { + var x20 = x2 - x0, + y20 = y2 - y0, + l21_2 = x21 * x21 + y21 * y21, + l20_2 = x20 * x20 + y20 * y20, + l21 = Math.sqrt(l21_2), + l01 = Math.sqrt(l01_2), + l = r * Math.tan((pi$2 - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2), + t01 = l / l01, + t21 = l / l21; + + // If the start tangent is not coincident with (x0,y0), line to. + if (Math.abs(t01 - 1) > epsilon$1) { + this._ += "L" + (x1 + t01 * x01) + "," + (y1 + t01 * y01); + } + + this._ += "A" + r + "," + r + ",0,0," + (+(y01 * x20 > x01 * y20)) + "," + (this._x1 = x1 + t21 * x21) + "," + (this._y1 = y1 + t21 * y21); + } + }, + arc: function(x, y, r, a0, a1, ccw) { + x = +x, y = +y, r = +r; + var dx = r * Math.cos(a0), + dy = r * Math.sin(a0), + x0 = x + dx, + y0 = y + dy, + cw = 1 ^ ccw, + da = ccw ? a0 - a1 : a1 - a0; + + // Is the radius negative? Error. + if (r < 0) throw new Error("negative radius: " + r); + + // Is this path empty? Move to (x0,y0). + if (this._x1 === null) { + this._ += "M" + x0 + "," + y0; + } + + // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0). + else if (Math.abs(this._x1 - x0) > epsilon$1 || Math.abs(this._y1 - y0) > epsilon$1) { + this._ += "L" + x0 + "," + y0; + } + + // Is this arc empty? We’re done. + if (!r) return; + + // Does the angle go the wrong way? Flip the direction. + if (da < 0) da = da % tau$2 + tau$2; + + // Is this a complete circle? Draw two arcs to complete the circle. + if (da > tauEpsilon) { + this._ += "A" + r + "," + r + ",0,1," + cw + "," + (x - dx) + "," + (y - dy) + "A" + r + "," + r + ",0,1," + cw + "," + (this._x1 = x0) + "," + (this._y1 = y0); + } + + // Is this arc non-empty? Draw an arc! + else if (da > epsilon$1) { + this._ += "A" + r + "," + r + ",0," + (+(da >= pi$2)) + "," + cw + "," + (this._x1 = x + r * Math.cos(a1)) + "," + (this._y1 = y + r * Math.sin(a1)); + } + }, + rect: function(x, y, w, h) { + this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y) + "h" + (+w) + "v" + (+h) + "h" + (-w) + "Z"; + }, + toString: function() { + return this._; + } +}; + +function defaultSource(d) { + return d.source; +} + +function defaultTarget(d) { + return d.target; +} + +function defaultRadius(d) { + return d.radius; +} + +function defaultStartAngle(d) { + return d.startAngle; +} + +function defaultEndAngle(d) { + return d.endAngle; +} + +var ribbon = function() { + var source = defaultSource, + target = defaultTarget, + radius = defaultRadius, + startAngle = defaultStartAngle, + endAngle = defaultEndAngle, + context = null; + + function ribbon() { + var buffer, + argv = slice$2.call(arguments), + s = source.apply(this, argv), + t = target.apply(this, argv), + sr = +radius.apply(this, (argv[0] = s, argv)), + sa0 = startAngle.apply(this, argv) - halfPi$1, + sa1 = endAngle.apply(this, argv) - halfPi$1, + sx0 = sr * cos(sa0), + sy0 = sr * sin(sa0), + tr = +radius.apply(this, (argv[0] = t, argv)), + ta0 = startAngle.apply(this, argv) - halfPi$1, + ta1 = endAngle.apply(this, argv) - halfPi$1; + + if (!context) context = buffer = path(); + + context.moveTo(sx0, sy0); + context.arc(0, 0, sr, sa0, sa1); + if (sa0 !== ta0 || sa1 !== ta1) { // TODO sr !== tr? + context.quadraticCurveTo(0, 0, tr * cos(ta0), tr * sin(ta0)); + context.arc(0, 0, tr, ta0, ta1); + } + context.quadraticCurveTo(0, 0, sx0, sy0); + context.closePath(); + + if (buffer) return context = null, buffer + "" || null; + } + + ribbon.radius = function(_) { + return arguments.length ? (radius = typeof _ === "function" ? _ : constant$5(+_), ribbon) : radius; + }; + + ribbon.startAngle = function(_) { + return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$5(+_), ribbon) : startAngle; + }; + + ribbon.endAngle = function(_) { + return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$5(+_), ribbon) : endAngle; + }; + + ribbon.source = function(_) { + return arguments.length ? (source = _, ribbon) : source; + }; + + ribbon.target = function(_) { + return arguments.length ? (target = _, ribbon) : target; + }; + + ribbon.context = function(_) { + return arguments.length ? ((context = _ == null ? null : _), ribbon) : context; + }; + + return ribbon; +}; + +var prefix = "$"; + +function Map() {} + +Map.prototype = map$1.prototype = { + constructor: Map, + has: function(key) { + return (prefix + key) in this; + }, + get: function(key) { + return this[prefix + key]; + }, + set: function(key, value) { + this[prefix + key] = value; + return this; + }, + remove: function(key) { + var property = prefix + key; + return property in this && delete this[property]; + }, + clear: function() { + for (var property in this) if (property[0] === prefix) delete this[property]; + }, + keys: function() { + var keys = []; + for (var property in this) if (property[0] === prefix) keys.push(property.slice(1)); + return keys; + }, + values: function() { + var values = []; + for (var property in this) if (property[0] === prefix) values.push(this[property]); + return values; + }, + entries: function() { + var entries = []; + for (var property in this) if (property[0] === prefix) entries.push({key: property.slice(1), value: this[property]}); + return entries; + }, + size: function() { + var size = 0; + for (var property in this) if (property[0] === prefix) ++size; + return size; + }, + empty: function() { + for (var property in this) if (property[0] === prefix) return false; + return true; + }, + each: function(f) { + for (var property in this) if (property[0] === prefix) f(this[property], property.slice(1), this); + } +}; + +function map$1(object, f) { + var map = new Map; + + // Copy constructor. + if (object instanceof Map) object.each(function(value, key) { map.set(key, value); }); + + // Index array by numeric index or specified key function. + else if (Array.isArray(object)) { + var i = -1, + n = object.length, + o; + + if (f == null) while (++i < n) map.set(i, object[i]); + else while (++i < n) map.set(f(o = object[i], i, object), o); + } + + // Convert object to map. + else if (object) for (var key in object) map.set(key, object[key]); + + return map; +} + +var nest = function() { + var keys = [], + sortKeys = [], + sortValues, + rollup, + nest; + + function apply(array, depth, createResult, setResult) { + if (depth >= keys.length) return rollup != null + ? rollup(array) : (sortValues != null + ? array.sort(sortValues) + : array); + + var i = -1, + n = array.length, + key = keys[depth++], + keyValue, + value, + valuesByKey = map$1(), + values, + result = createResult(); + + while (++i < n) { + if (values = valuesByKey.get(keyValue = key(value = array[i]) + "")) { + values.push(value); + } else { + valuesByKey.set(keyValue, [value]); + } + } + + valuesByKey.each(function(values, key) { + setResult(result, key, apply(values, depth, createResult, setResult)); + }); + + return result; + } + + function entries(map, depth) { + if (++depth > keys.length) return map; + var array, sortKey = sortKeys[depth - 1]; + if (rollup != null && depth >= keys.length) array = map.entries(); + else array = [], map.each(function(v, k) { array.push({key: k, values: entries(v, depth)}); }); + return sortKey != null ? array.sort(function(a, b) { return sortKey(a.key, b.key); }) : array; + } + + return nest = { + object: function(array) { return apply(array, 0, createObject, setObject); }, + map: function(array) { return apply(array, 0, createMap, setMap); }, + entries: function(array) { return entries(apply(array, 0, createMap, setMap), 0); }, + key: function(d) { keys.push(d); return nest; }, + sortKeys: function(order) { sortKeys[keys.length - 1] = order; return nest; }, + sortValues: function(order) { sortValues = order; return nest; }, + rollup: function(f) { rollup = f; return nest; } + }; +}; + +function createObject() { + return {}; +} + +function setObject(object, key, value) { + object[key] = value; +} + +function createMap() { + return map$1(); +} + +function setMap(map, key, value) { + map.set(key, value); +} + +function Set() {} + +var proto = map$1.prototype; + +Set.prototype = set$2.prototype = { + constructor: Set, + has: proto.has, + add: function(value) { + value += ""; + this[prefix + value] = value; + return this; + }, + remove: proto.remove, + clear: proto.clear, + values: proto.keys, + size: proto.size, + empty: proto.empty, + each: proto.each +}; + +function set$2(object, f) { + var set = new Set; + + // Copy constructor. + if (object instanceof Set) object.each(function(value) { set.add(value); }); + + // Otherwise, assume it’s an array. + else if (object) { + var i = -1, n = object.length; + if (f == null) while (++i < n) set.add(object[i]); + else while (++i < n) set.add(f(object[i], i, object)); + } + + return set; +} + +var keys = function(map) { + var keys = []; + for (var key in map) keys.push(key); + return keys; +}; + +var values = function(map) { + var values = []; + for (var key in map) values.push(map[key]); + return values; +}; + +var entries = function(map) { + var entries = []; + for (var key in map) entries.push({key: key, value: map[key]}); + return entries; +}; + +function objectConverter(columns) { + return new Function("d", "return {" + columns.map(function(name, i) { + return JSON.stringify(name) + ": d[" + i + "]"; + }).join(",") + "}"); +} + +function customConverter(columns, f) { + var object = objectConverter(columns); + return function(row, i) { + return f(object(row), i, columns); + }; +} + +// Compute unique columns in order of discovery. +function inferColumns(rows) { + var columnSet = Object.create(null), + columns = []; + + rows.forEach(function(row) { + for (var column in row) { + if (!(column in columnSet)) { + columns.push(columnSet[column] = column); + } + } + }); + + return columns; +} + +var dsv = function(delimiter) { + var reFormat = new RegExp("[\"" + delimiter + "\n\r]"), + delimiterCode = delimiter.charCodeAt(0); + + function parse(text, f) { + var convert, columns, rows = parseRows(text, function(row, i) { + if (convert) return convert(row, i - 1); + columns = row, convert = f ? customConverter(row, f) : objectConverter(row); + }); + rows.columns = columns; + return rows; + } + + function parseRows(text, f) { + var EOL = {}, // sentinel value for end-of-line + EOF = {}, // sentinel value for end-of-file + rows = [], // output rows + N = text.length, + I = 0, // current character index + n = 0, // the current line number + t, // the current token + eol; // is the current token followed by EOL? + + function token() { + if (I >= N) return EOF; // special case: end of file + if (eol) return eol = false, EOL; // special case: end of line + + // special case: quotes + var j = I, c; + if (text.charCodeAt(j) === 34) { + var i = j; + while (i++ < N) { + if (text.charCodeAt(i) === 34) { + if (text.charCodeAt(i + 1) !== 34) break; + ++i; + } + } + I = i + 2; + c = text.charCodeAt(i + 1); + if (c === 13) { + eol = true; + if (text.charCodeAt(i + 2) === 10) ++I; + } else if (c === 10) { + eol = true; + } + return text.slice(j + 1, i).replace(/""/g, "\""); + } + + // common case: find next delimiter or newline + while (I < N) { + var k = 1; + c = text.charCodeAt(I++); + if (c === 10) eol = true; // \n + else if (c === 13) { eol = true; if (text.charCodeAt(I) === 10) ++I, ++k; } // \r|\r\n + else if (c !== delimiterCode) continue; + return text.slice(j, I - k); + } + + // special case: last token before EOF + return text.slice(j); + } + + while ((t = token()) !== EOF) { + var a = []; + while (t !== EOL && t !== EOF) { + a.push(t); + t = token(); + } + if (f && (a = f(a, n++)) == null) continue; + rows.push(a); + } + + return rows; + } + + function format(rows, columns) { + if (columns == null) columns = inferColumns(rows); + return [columns.map(formatValue).join(delimiter)].concat(rows.map(function(row) { + return columns.map(function(column) { + return formatValue(row[column]); + }).join(delimiter); + })).join("\n"); + } + + function formatRows(rows) { + return rows.map(formatRow).join("\n"); + } + + function formatRow(row) { + return row.map(formatValue).join(delimiter); + } + + function formatValue(text) { + return text == null ? "" + : reFormat.test(text += "") ? "\"" + text.replace(/\"/g, "\"\"") + "\"" + : text; + } + + return { + parse: parse, + parseRows: parseRows, + format: format, + formatRows: formatRows + }; +}; + +var csv = dsv(","); + +var csvParse = csv.parse; +var csvParseRows = csv.parseRows; +var csvFormat = csv.format; +var csvFormatRows = csv.formatRows; + +var tsv = dsv("\t"); + +var tsvParse = tsv.parse; +var tsvParseRows = tsv.parseRows; +var tsvFormat = tsv.format; +var tsvFormatRows = tsv.formatRows; + +var center$1 = function(x, y) { + var nodes; + + if (x == null) x = 0; + if (y == null) y = 0; + + function force() { + var i, + n = nodes.length, + node, + sx = 0, + sy = 0; + + for (i = 0; i < n; ++i) { + node = nodes[i], sx += node.x, sy += node.y; + } + + for (sx = sx / n - x, sy = sy / n - y, i = 0; i < n; ++i) { + node = nodes[i], node.x -= sx, node.y -= sy; + } + } + + force.initialize = function(_) { + nodes = _; + }; + + force.x = function(_) { + return arguments.length ? (x = +_, force) : x; + }; + + force.y = function(_) { + return arguments.length ? (y = +_, force) : y; + }; + + return force; +}; + +var constant$6 = function(x) { + return function() { + return x; + }; +}; + +var jiggle = function() { + return (Math.random() - 0.5) * 1e-6; +}; + +var tree_add = function(d) { + var x = +this._x.call(null, d), + y = +this._y.call(null, d); + return add(this.cover(x, y), x, y, d); +}; + +function add(tree, x, y, d) { + if (isNaN(x) || isNaN(y)) return tree; // ignore invalid points + + var parent, + node = tree._root, + leaf = {data: d}, + x0 = tree._x0, + y0 = tree._y0, + x1 = tree._x1, + y1 = tree._y1, + xm, + ym, + xp, + yp, + right, + bottom, + i, + j; + + // If the tree is empty, initialize the root as a leaf. + if (!node) return tree._root = leaf, tree; + + // Find the existing leaf for the new point, or add it. + while (node.length) { + if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm; + if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym; + if (parent = node, !(node = node[i = bottom << 1 | right])) return parent[i] = leaf, tree; + } + + // Is the new point is exactly coincident with the existing point? + xp = +tree._x.call(null, node.data); + yp = +tree._y.call(null, node.data); + if (x === xp && y === yp) return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree; + + // Otherwise, split the leaf node until the old and new point are separated. + do { + parent = parent ? parent[i] = new Array(4) : tree._root = new Array(4); + if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm; + if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym; + } while ((i = bottom << 1 | right) === (j = (yp >= ym) << 1 | (xp >= xm))); + return parent[j] = node, parent[i] = leaf, tree; +} + +function addAll(data) { + var d, i, n = data.length, + x, + y, + xz = new Array(n), + yz = new Array(n), + x0 = Infinity, + y0 = Infinity, + x1 = -Infinity, + y1 = -Infinity; + + // Compute the points and their extent. + for (i = 0; i < n; ++i) { + if (isNaN(x = +this._x.call(null, d = data[i])) || isNaN(y = +this._y.call(null, d))) continue; + xz[i] = x; + yz[i] = y; + if (x < x0) x0 = x; + if (x > x1) x1 = x; + if (y < y0) y0 = y; + if (y > y1) y1 = y; + } + + // If there were no (valid) points, inherit the existing extent. + if (x1 < x0) x0 = this._x0, x1 = this._x1; + if (y1 < y0) y0 = this._y0, y1 = this._y1; + + // Expand the tree to cover the new points. + this.cover(x0, y0).cover(x1, y1); + + // Add the new points. + for (i = 0; i < n; ++i) { + add(this, xz[i], yz[i], data[i]); + } + + return this; +} + +var tree_cover = function(x, y) { + if (isNaN(x = +x) || isNaN(y = +y)) return this; // ignore invalid points + + var x0 = this._x0, + y0 = this._y0, + x1 = this._x1, + y1 = this._y1; + + // If the quadtree has no extent, initialize them. + // Integer extent are necessary so that if we later double the extent, + // the existing quadrant boundaries don’t change due to floating point error! + if (isNaN(x0)) { + x1 = (x0 = Math.floor(x)) + 1; + y1 = (y0 = Math.floor(y)) + 1; + } + + // Otherwise, double repeatedly to cover. + else if (x0 > x || x > x1 || y0 > y || y > y1) { + var z = x1 - x0, + node = this._root, + parent, + i; + + switch (i = (y < (y0 + y1) / 2) << 1 | (x < (x0 + x1) / 2)) { + case 0: { + do parent = new Array(4), parent[i] = node, node = parent; + while (z *= 2, x1 = x0 + z, y1 = y0 + z, x > x1 || y > y1); + break; + } + case 1: { + do parent = new Array(4), parent[i] = node, node = parent; + while (z *= 2, x0 = x1 - z, y1 = y0 + z, x0 > x || y > y1); + break; + } + case 2: { + do parent = new Array(4), parent[i] = node, node = parent; + while (z *= 2, x1 = x0 + z, y0 = y1 - z, x > x1 || y0 > y); + break; + } + case 3: { + do parent = new Array(4), parent[i] = node, node = parent; + while (z *= 2, x0 = x1 - z, y0 = y1 - z, x0 > x || y0 > y); + break; + } + } + + if (this._root && this._root.length) this._root = node; + } + + // If the quadtree covers the point already, just return. + else return this; + + this._x0 = x0; + this._y0 = y0; + this._x1 = x1; + this._y1 = y1; + return this; +}; + +var tree_data = function() { + var data = []; + this.visit(function(node) { + if (!node.length) do data.push(node.data); while (node = node.next) + }); + return data; +}; + +var tree_extent = function(_) { + return arguments.length + ? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1]) + : isNaN(this._x0) ? undefined : [[this._x0, this._y0], [this._x1, this._y1]]; +}; + +var Quad = function(node, x0, y0, x1, y1) { + this.node = node; + this.x0 = x0; + this.y0 = y0; + this.x1 = x1; + this.y1 = y1; +}; + +var tree_find = function(x, y, radius) { + var data, + x0 = this._x0, + y0 = this._y0, + x1, + y1, + x2, + y2, + x3 = this._x1, + y3 = this._y1, + quads = [], + node = this._root, + q, + i; + + if (node) quads.push(new Quad(node, x0, y0, x3, y3)); + if (radius == null) radius = Infinity; + else { + x0 = x - radius, y0 = y - radius; + x3 = x + radius, y3 = y + radius; + radius *= radius; + } + + while (q = quads.pop()) { + + // Stop searching if this quadrant can’t contain a closer node. + if (!(node = q.node) + || (x1 = q.x0) > x3 + || (y1 = q.y0) > y3 + || (x2 = q.x1) < x0 + || (y2 = q.y1) < y0) continue; + + // Bisect the current quadrant. + if (node.length) { + var xm = (x1 + x2) / 2, + ym = (y1 + y2) / 2; + + quads.push( + new Quad(node[3], xm, ym, x2, y2), + new Quad(node[2], x1, ym, xm, y2), + new Quad(node[1], xm, y1, x2, ym), + new Quad(node[0], x1, y1, xm, ym) + ); + + // Visit the closest quadrant first. + if (i = (y >= ym) << 1 | (x >= xm)) { + q = quads[quads.length - 1]; + quads[quads.length - 1] = quads[quads.length - 1 - i]; + quads[quads.length - 1 - i] = q; + } + } + + // Visit this point. (Visiting coincident points isn’t necessary!) + else { + var dx = x - +this._x.call(null, node.data), + dy = y - +this._y.call(null, node.data), + d2 = dx * dx + dy * dy; + if (d2 < radius) { + var d = Math.sqrt(radius = d2); + x0 = x - d, y0 = y - d; + x3 = x + d, y3 = y + d; + data = node.data; + } + } + } + + return data; +}; + +var tree_remove = function(d) { + if (isNaN(x = +this._x.call(null, d)) || isNaN(y = +this._y.call(null, d))) return this; // ignore invalid points + + var parent, + node = this._root, + retainer, + previous, + next, + x0 = this._x0, + y0 = this._y0, + x1 = this._x1, + y1 = this._y1, + x, + y, + xm, + ym, + right, + bottom, + i, + j; + + // If the tree is empty, initialize the root as a leaf. + if (!node) return this; + + // Find the leaf node for the point. + // While descending, also retain the deepest parent with a non-removed sibling. + if (node.length) while (true) { + if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm; + if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym; + if (!(parent = node, node = node[i = bottom << 1 | right])) return this; + if (!node.length) break; + if (parent[(i + 1) & 3] || parent[(i + 2) & 3] || parent[(i + 3) & 3]) retainer = parent, j = i; + } + + // Find the point to remove. + while (node.data !== d) if (!(previous = node, node = node.next)) return this; + if (next = node.next) delete node.next; + + // If there are multiple coincident points, remove just the point. + if (previous) return (next ? previous.next = next : delete previous.next), this; + + // If this is the root point, remove it. + if (!parent) return this._root = next, this; + + // Remove this leaf. + next ? parent[i] = next : delete parent[i]; + + // If the parent now contains exactly one leaf, collapse superfluous parents. + if ((node = parent[0] || parent[1] || parent[2] || parent[3]) + && node === (parent[3] || parent[2] || parent[1] || parent[0]) + && !node.length) { + if (retainer) retainer[j] = node; + else this._root = node; + } + + return this; +}; + +function removeAll(data) { + for (var i = 0, n = data.length; i < n; ++i) this.remove(data[i]); + return this; +} + +var tree_root = function() { + return this._root; +}; + +var tree_size = function() { + var size = 0; + this.visit(function(node) { + if (!node.length) do ++size; while (node = node.next) + }); + return size; +}; + +var tree_visit = function(callback) { + var quads = [], q, node = this._root, child, x0, y0, x1, y1; + if (node) quads.push(new Quad(node, this._x0, this._y0, this._x1, this._y1)); + while (q = quads.pop()) { + if (!callback(node = q.node, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1) && node.length) { + var xm = (x0 + x1) / 2, ym = (y0 + y1) / 2; + if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1)); + if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1)); + if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym)); + if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym)); + } + } + return this; +}; + +var tree_visitAfter = function(callback) { + var quads = [], next = [], q; + if (this._root) quads.push(new Quad(this._root, this._x0, this._y0, this._x1, this._y1)); + while (q = quads.pop()) { + var node = q.node; + if (node.length) { + var child, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1, xm = (x0 + x1) / 2, ym = (y0 + y1) / 2; + if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym)); + if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym)); + if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1)); + if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1)); + } + next.push(q); + } + while (q = next.pop()) { + callback(q.node, q.x0, q.y0, q.x1, q.y1); + } + return this; +}; + +function defaultX(d) { + return d[0]; +} + +var tree_x = function(_) { + return arguments.length ? (this._x = _, this) : this._x; +}; + +function defaultY(d) { + return d[1]; +} + +var tree_y = function(_) { + return arguments.length ? (this._y = _, this) : this._y; +}; + +function quadtree(nodes, x, y) { + var tree = new Quadtree(x == null ? defaultX : x, y == null ? defaultY : y, NaN, NaN, NaN, NaN); + return nodes == null ? tree : tree.addAll(nodes); +} + +function Quadtree(x, y, x0, y0, x1, y1) { + this._x = x; + this._y = y; + this._x0 = x0; + this._y0 = y0; + this._x1 = x1; + this._y1 = y1; + this._root = undefined; +} + +function leaf_copy(leaf) { + var copy = {data: leaf.data}, next = copy; + while (leaf = leaf.next) next = next.next = {data: leaf.data}; + return copy; +} + +var treeProto = quadtree.prototype = Quadtree.prototype; + +treeProto.copy = function() { + var copy = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1), + node = this._root, + nodes, + child; + + if (!node) return copy; + + if (!node.length) return copy._root = leaf_copy(node), copy; + + nodes = [{source: node, target: copy._root = new Array(4)}]; + while (node = nodes.pop()) { + for (var i = 0; i < 4; ++i) { + if (child = node.source[i]) { + if (child.length) nodes.push({source: child, target: node.target[i] = new Array(4)}); + else node.target[i] = leaf_copy(child); + } + } + } + + return copy; +}; + +treeProto.add = tree_add; +treeProto.addAll = addAll; +treeProto.cover = tree_cover; +treeProto.data = tree_data; +treeProto.extent = tree_extent; +treeProto.find = tree_find; +treeProto.remove = tree_remove; +treeProto.removeAll = removeAll; +treeProto.root = tree_root; +treeProto.size = tree_size; +treeProto.visit = tree_visit; +treeProto.visitAfter = tree_visitAfter; +treeProto.x = tree_x; +treeProto.y = tree_y; + +function x(d) { + return d.x + d.vx; +} + +function y(d) { + return d.y + d.vy; +} + +var collide = function(radius) { + var nodes, + radii, + strength = 1, + iterations = 1; + + if (typeof radius !== "function") radius = constant$6(radius == null ? 1 : +radius); + + function force() { + var i, n = nodes.length, + tree, + node, + xi, + yi, + ri, + ri2; + + for (var k = 0; k < iterations; ++k) { + tree = quadtree(nodes, x, y).visitAfter(prepare); + for (i = 0; i < n; ++i) { + node = nodes[i]; + ri = radii[node.index], ri2 = ri * ri; + xi = node.x + node.vx; + yi = node.y + node.vy; + tree.visit(apply); + } + } + + function apply(quad, x0, y0, x1, y1) { + var data = quad.data, rj = quad.r, r = ri + rj; + if (data) { + if (data.index > node.index) { + var x = xi - data.x - data.vx, + y = yi - data.y - data.vy, + l = x * x + y * y; + if (l < r * r) { + if (x === 0) x = jiggle(), l += x * x; + if (y === 0) y = jiggle(), l += y * y; + l = (r - (l = Math.sqrt(l))) / l * strength; + node.vx += (x *= l) * (r = (rj *= rj) / (ri2 + rj)); + node.vy += (y *= l) * r; + data.vx -= x * (r = 1 - r); + data.vy -= y * r; + } + } + return; + } + return x0 > xi + r || x1 < xi - r || y0 > yi + r || y1 < yi - r; + } + } + + function prepare(quad) { + if (quad.data) return quad.r = radii[quad.data.index]; + for (var i = quad.r = 0; i < 4; ++i) { + if (quad[i] && quad[i].r > quad.r) { + quad.r = quad[i].r; + } + } + } + + function initialize() { + if (!nodes) return; + var i, n = nodes.length, node; + radii = new Array(n); + for (i = 0; i < n; ++i) node = nodes[i], radii[node.index] = +radius(node, i, nodes); + } + + force.initialize = function(_) { + nodes = _; + initialize(); + }; + + force.iterations = function(_) { + return arguments.length ? (iterations = +_, force) : iterations; + }; + + force.strength = function(_) { + return arguments.length ? (strength = +_, force) : strength; + }; + + force.radius = function(_) { + return arguments.length ? (radius = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : radius; + }; + + return force; +}; + +function index(d) { + return d.index; +} + +function find(nodeById, nodeId) { + var node = nodeById.get(nodeId); + if (!node) throw new Error("missing: " + nodeId); + return node; +} + +var link = function(links) { + var id = index, + strength = defaultStrength, + strengths, + distance = constant$6(30), + distances, + nodes, + count, + bias, + iterations = 1; + + if (links == null) links = []; + + function defaultStrength(link) { + return 1 / Math.min(count[link.source.index], count[link.target.index]); + } + + function force(alpha) { + for (var k = 0, n = links.length; k < iterations; ++k) { + for (var i = 0, link, source, target, x, y, l, b; i < n; ++i) { + link = links[i], source = link.source, target = link.target; + x = target.x + target.vx - source.x - source.vx || jiggle(); + y = target.y + target.vy - source.y - source.vy || jiggle(); + l = Math.sqrt(x * x + y * y); + l = (l - distances[i]) / l * alpha * strengths[i]; + x *= l, y *= l; + target.vx -= x * (b = bias[i]); + target.vy -= y * b; + source.vx += x * (b = 1 - b); + source.vy += y * b; + } + } + } + + function initialize() { + if (!nodes) return; + + var i, + n = nodes.length, + m = links.length, + nodeById = map$1(nodes, id), + link; + + for (i = 0, count = new Array(n); i < m; ++i) { + link = links[i], link.index = i; + if (typeof link.source !== "object") link.source = find(nodeById, link.source); + if (typeof link.target !== "object") link.target = find(nodeById, link.target); + count[link.source.index] = (count[link.source.index] || 0) + 1; + count[link.target.index] = (count[link.target.index] || 0) + 1; + } + + for (i = 0, bias = new Array(m); i < m; ++i) { + link = links[i], bias[i] = count[link.source.index] / (count[link.source.index] + count[link.target.index]); + } + + strengths = new Array(m), initializeStrength(); + distances = new Array(m), initializeDistance(); + } + + function initializeStrength() { + if (!nodes) return; + + for (var i = 0, n = links.length; i < n; ++i) { + strengths[i] = +strength(links[i], i, links); + } + } + + function initializeDistance() { + if (!nodes) return; + + for (var i = 0, n = links.length; i < n; ++i) { + distances[i] = +distance(links[i], i, links); + } + } + + force.initialize = function(_) { + nodes = _; + initialize(); + }; + + force.links = function(_) { + return arguments.length ? (links = _, initialize(), force) : links; + }; + + force.id = function(_) { + return arguments.length ? (id = _, force) : id; + }; + + force.iterations = function(_) { + return arguments.length ? (iterations = +_, force) : iterations; + }; + + force.strength = function(_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initializeStrength(), force) : strength; + }; + + force.distance = function(_) { + return arguments.length ? (distance = typeof _ === "function" ? _ : constant$6(+_), initializeDistance(), force) : distance; + }; + + return force; +}; + +function x$1(d) { + return d.x; +} + +function y$1(d) { + return d.y; +} + +var initialRadius = 10; +var initialAngle = Math.PI * (3 - Math.sqrt(5)); + +var simulation = function(nodes) { + var simulation, + alpha = 1, + alphaMin = 0.001, + alphaDecay = 1 - Math.pow(alphaMin, 1 / 300), + alphaTarget = 0, + velocityDecay = 0.6, + forces = map$1(), + stepper = timer(step), + event = dispatch("tick", "end"); + + if (nodes == null) nodes = []; + + function step() { + tick(); + event.call("tick", simulation); + if (alpha < alphaMin) { + stepper.stop(); + event.call("end", simulation); + } + } + + function tick() { + var i, n = nodes.length, node; + + alpha += (alphaTarget - alpha) * alphaDecay; + + forces.each(function(force) { + force(alpha); + }); + + for (i = 0; i < n; ++i) { + node = nodes[i]; + if (node.fx == null) node.x += node.vx *= velocityDecay; + else node.x = node.fx, node.vx = 0; + if (node.fy == null) node.y += node.vy *= velocityDecay; + else node.y = node.fy, node.vy = 0; + } + } + + function initializeNodes() { + for (var i = 0, n = nodes.length, node; i < n; ++i) { + node = nodes[i], node.index = i; + if (isNaN(node.x) || isNaN(node.y)) { + var radius = initialRadius * Math.sqrt(i), angle = i * initialAngle; + node.x = radius * Math.cos(angle); + node.y = radius * Math.sin(angle); + } + if (isNaN(node.vx) || isNaN(node.vy)) { + node.vx = node.vy = 0; + } + } + } + + function initializeForce(force) { + if (force.initialize) force.initialize(nodes); + return force; + } + + initializeNodes(); + + return simulation = { + tick: tick, + + restart: function() { + return stepper.restart(step), simulation; + }, + + stop: function() { + return stepper.stop(), simulation; + }, + + nodes: function(_) { + return arguments.length ? (nodes = _, initializeNodes(), forces.each(initializeForce), simulation) : nodes; + }, + + alpha: function(_) { + return arguments.length ? (alpha = +_, simulation) : alpha; + }, + + alphaMin: function(_) { + return arguments.length ? (alphaMin = +_, simulation) : alphaMin; + }, + + alphaDecay: function(_) { + return arguments.length ? (alphaDecay = +_, simulation) : +alphaDecay; + }, + + alphaTarget: function(_) { + return arguments.length ? (alphaTarget = +_, simulation) : alphaTarget; + }, + + velocityDecay: function(_) { + return arguments.length ? (velocityDecay = 1 - _, simulation) : 1 - velocityDecay; + }, + + force: function(name, _) { + return arguments.length > 1 ? ((_ == null ? forces.remove(name) : forces.set(name, initializeForce(_))), simulation) : forces.get(name); + }, + + find: function(x, y, radius) { + var i = 0, + n = nodes.length, + dx, + dy, + d2, + node, + closest; + + if (radius == null) radius = Infinity; + else radius *= radius; + + for (i = 0; i < n; ++i) { + node = nodes[i]; + dx = x - node.x; + dy = y - node.y; + d2 = dx * dx + dy * dy; + if (d2 < radius) closest = node, radius = d2; + } + + return closest; + }, + + on: function(name, _) { + return arguments.length > 1 ? (event.on(name, _), simulation) : event.on(name); + } + }; +}; + +var manyBody = function() { + var nodes, + node, + alpha, + strength = constant$6(-30), + strengths, + distanceMin2 = 1, + distanceMax2 = Infinity, + theta2 = 0.81; + + function force(_) { + var i, n = nodes.length, tree = quadtree(nodes, x$1, y$1).visitAfter(accumulate); + for (alpha = _, i = 0; i < n; ++i) node = nodes[i], tree.visit(apply); + } + + function initialize() { + if (!nodes) return; + var i, n = nodes.length, node; + strengths = new Array(n); + for (i = 0; i < n; ++i) node = nodes[i], strengths[node.index] = +strength(node, i, nodes); + } + + function accumulate(quad) { + var strength = 0, q, c, x$$1, y$$1, i; + + // For internal nodes, accumulate forces from child quadrants. + if (quad.length) { + for (x$$1 = y$$1 = i = 0; i < 4; ++i) { + if ((q = quad[i]) && (c = q.value)) { + strength += c, x$$1 += c * q.x, y$$1 += c * q.y; + } + } + quad.x = x$$1 / strength; + quad.y = y$$1 / strength; + } + + // For leaf nodes, accumulate forces from coincident quadrants. + else { + q = quad; + q.x = q.data.x; + q.y = q.data.y; + do strength += strengths[q.data.index]; + while (q = q.next); + } + + quad.value = strength; + } + + function apply(quad, x1, _, x2) { + if (!quad.value) return true; + + var x$$1 = quad.x - node.x, + y$$1 = quad.y - node.y, + w = x2 - x1, + l = x$$1 * x$$1 + y$$1 * y$$1; + + // Apply the Barnes-Hut approximation if possible. + // Limit forces for very close nodes; randomize direction if coincident. + if (w * w / theta2 < l) { + if (l < distanceMax2) { + if (x$$1 === 0) x$$1 = jiggle(), l += x$$1 * x$$1; + if (y$$1 === 0) y$$1 = jiggle(), l += y$$1 * y$$1; + if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l); + node.vx += x$$1 * quad.value * alpha / l; + node.vy += y$$1 * quad.value * alpha / l; + } + return true; + } + + // Otherwise, process points directly. + else if (quad.length || l >= distanceMax2) return; + + // Limit forces for very close nodes; randomize direction if coincident. + if (quad.data !== node || quad.next) { + if (x$$1 === 0) x$$1 = jiggle(), l += x$$1 * x$$1; + if (y$$1 === 0) y$$1 = jiggle(), l += y$$1 * y$$1; + if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l); + } + + do if (quad.data !== node) { + w = strengths[quad.data.index] * alpha / l; + node.vx += x$$1 * w; + node.vy += y$$1 * w; + } while (quad = quad.next); + } + + force.initialize = function(_) { + nodes = _; + initialize(); + }; + + force.strength = function(_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : strength; + }; + + force.distanceMin = function(_) { + return arguments.length ? (distanceMin2 = _ * _, force) : Math.sqrt(distanceMin2); + }; + + force.distanceMax = function(_) { + return arguments.length ? (distanceMax2 = _ * _, force) : Math.sqrt(distanceMax2); + }; + + force.theta = function(_) { + return arguments.length ? (theta2 = _ * _, force) : Math.sqrt(theta2); + }; + + return force; +}; + +var x$2 = function(x) { + var strength = constant$6(0.1), + nodes, + strengths, + xz; + + if (typeof x !== "function") x = constant$6(x == null ? 0 : +x); + + function force(alpha) { + for (var i = 0, n = nodes.length, node; i < n; ++i) { + node = nodes[i], node.vx += (xz[i] - node.x) * strengths[i] * alpha; + } + } + + function initialize() { + if (!nodes) return; + var i, n = nodes.length; + strengths = new Array(n); + xz = new Array(n); + for (i = 0; i < n; ++i) { + strengths[i] = isNaN(xz[i] = +x(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes); + } + } + + force.initialize = function(_) { + nodes = _; + initialize(); + }; + + force.strength = function(_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : strength; + }; + + force.x = function(_) { + return arguments.length ? (x = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : x; + }; + + return force; +}; + +var y$2 = function(y) { + var strength = constant$6(0.1), + nodes, + strengths, + yz; + + if (typeof y !== "function") y = constant$6(y == null ? 0 : +y); + + function force(alpha) { + for (var i = 0, n = nodes.length, node; i < n; ++i) { + node = nodes[i], node.vy += (yz[i] - node.y) * strengths[i] * alpha; + } + } + + function initialize() { + if (!nodes) return; + var i, n = nodes.length; + strengths = new Array(n); + yz = new Array(n); + for (i = 0; i < n; ++i) { + strengths[i] = isNaN(yz[i] = +y(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes); + } + } + + force.initialize = function(_) { + nodes = _; + initialize(); + }; + + force.strength = function(_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : strength; + }; + + force.y = function(_) { + return arguments.length ? (y = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : y; + }; + + return force; +}; + +// Computes the decimal coefficient and exponent of the specified number x with +// significant digits p, where x is positive and p is in [1, 21] or undefined. +// For example, formatDecimal(1.23) returns ["123", 0]. +var formatDecimal = function(x, p) { + if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf("e")) < 0) return null; // NaN, ±Infinity + var i, coefficient = x.slice(0, i); + + // The string returned by toExponential either has the form \d\.\d+e[-+]\d+ + // (e.g., 1.2e+3) or the form \de[-+]\d+ (e.g., 1e+3). + return [ + coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient, + +x.slice(i + 1) + ]; +}; + +var exponent$1 = function(x) { + return x = formatDecimal(Math.abs(x)), x ? x[1] : NaN; +}; + +var formatGroup = function(grouping, thousands) { + return function(value, width) { + var i = value.length, + t = [], + j = 0, + g = grouping[0], + length = 0; + + while (i > 0 && g > 0) { + if (length + g + 1 > width) g = Math.max(1, width - length); + t.push(value.substring(i -= g, i + g)); + if ((length += g + 1) > width) break; + g = grouping[j = (j + 1) % grouping.length]; + } + + return t.reverse().join(thousands); + }; +}; + +var formatNumerals = function(numerals) { + return function(value) { + return value.replace(/[0-9]/g, function(i) { + return numerals[+i]; + }); + }; +}; + +var formatDefault = function(x, p) { + x = x.toPrecision(p); + + out: for (var n = x.length, i = 1, i0 = -1, i1; i < n; ++i) { + switch (x[i]) { + case ".": i0 = i1 = i; break; + case "0": if (i0 === 0) i0 = i; i1 = i; break; + case "e": break out; + default: if (i0 > 0) i0 = 0; break; + } + } + + return i0 > 0 ? x.slice(0, i0) + x.slice(i1 + 1) : x; +}; + +var prefixExponent; + +var formatPrefixAuto = function(x, p) { + var d = formatDecimal(x, p); + if (!d) return x + ""; + var coefficient = d[0], + exponent = d[1], + i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1, + n = coefficient.length; + return i === n ? coefficient + : i > n ? coefficient + new Array(i - n + 1).join("0") + : i > 0 ? coefficient.slice(0, i) + "." + coefficient.slice(i) + : "0." + new Array(1 - i).join("0") + formatDecimal(x, Math.max(0, p + i - 1))[0]; // less than 1y! +}; + +var formatRounded = function(x, p) { + var d = formatDecimal(x, p); + if (!d) return x + ""; + var coefficient = d[0], + exponent = d[1]; + return exponent < 0 ? "0." + new Array(-exponent).join("0") + coefficient + : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + "." + coefficient.slice(exponent + 1) + : coefficient + new Array(exponent - coefficient.length + 2).join("0"); +}; + +var formatTypes = { + "": formatDefault, + "%": function(x, p) { return (x * 100).toFixed(p); }, + "b": function(x) { return Math.round(x).toString(2); }, + "c": function(x) { return x + ""; }, + "d": function(x) { return Math.round(x).toString(10); }, + "e": function(x, p) { return x.toExponential(p); }, + "f": function(x, p) { return x.toFixed(p); }, + "g": function(x, p) { return x.toPrecision(p); }, + "o": function(x) { return Math.round(x).toString(8); }, + "p": function(x, p) { return formatRounded(x * 100, p); }, + "r": formatRounded, + "s": formatPrefixAuto, + "X": function(x) { return Math.round(x).toString(16).toUpperCase(); }, + "x": function(x) { return Math.round(x).toString(16); } +}; + +// [[fill]align][sign][symbol][0][width][,][.precision][type] +var re = /^(?:(.)?([<>=^]))?([+\-\( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?([a-z%])?$/i; + +function formatSpecifier(specifier) { + return new FormatSpecifier(specifier); +} + +formatSpecifier.prototype = FormatSpecifier.prototype; // instanceof + +function FormatSpecifier(specifier) { + if (!(match = re.exec(specifier))) throw new Error("invalid format: " + specifier); + + var match, + fill = match[1] || " ", + align = match[2] || ">", + sign = match[3] || "-", + symbol = match[4] || "", + zero = !!match[5], + width = match[6] && +match[6], + comma = !!match[7], + precision = match[8] && +match[8].slice(1), + type = match[9] || ""; + + // The "n" type is an alias for ",g". + if (type === "n") comma = true, type = "g"; + + // Map invalid types to the default format. + else if (!formatTypes[type]) type = ""; + + // If zero fill is specified, padding goes after sign and before digits. + if (zero || (fill === "0" && align === "=")) zero = true, fill = "0", align = "="; + + this.fill = fill; + this.align = align; + this.sign = sign; + this.symbol = symbol; + this.zero = zero; + this.width = width; + this.comma = comma; + this.precision = precision; + this.type = type; +} + +FormatSpecifier.prototype.toString = function() { + return this.fill + + this.align + + this.sign + + this.symbol + + (this.zero ? "0" : "") + + (this.width == null ? "" : Math.max(1, this.width | 0)) + + (this.comma ? "," : "") + + (this.precision == null ? "" : "." + Math.max(0, this.precision | 0)) + + this.type; +}; + +var identity$3 = function(x) { + return x; +}; + +var prefixes = ["y","z","a","f","p","n","\xB5","m","","k","M","G","T","P","E","Z","Y"]; + +var formatLocale = function(locale) { + var group = locale.grouping && locale.thousands ? formatGroup(locale.grouping, locale.thousands) : identity$3, + currency = locale.currency, + decimal = locale.decimal, + numerals = locale.numerals ? formatNumerals(locale.numerals) : identity$3, + percent = locale.percent || "%"; + + function newFormat(specifier) { + specifier = formatSpecifier(specifier); + + var fill = specifier.fill, + align = specifier.align, + sign = specifier.sign, + symbol = specifier.symbol, + zero = specifier.zero, + width = specifier.width, + comma = specifier.comma, + precision = specifier.precision, + type = specifier.type; + + // Compute the prefix and suffix. + // For SI-prefix, the suffix is lazily computed. + var prefix = symbol === "$" ? currency[0] : symbol === "#" && /[boxX]/.test(type) ? "0" + type.toLowerCase() : "", + suffix = symbol === "$" ? currency[1] : /[%p]/.test(type) ? percent : ""; + + // What format function should we use? + // Is this an integer type? + // Can this type generate exponential notation? + var formatType = formatTypes[type], + maybeSuffix = !type || /[defgprs%]/.test(type); + + // Set the default precision if not specified, + // or clamp the specified precision to the supported range. + // For significant precision, it must be in [1, 21]. + // For fixed precision, it must be in [0, 20]. + precision = precision == null ? (type ? 6 : 12) + : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision)) + : Math.max(0, Math.min(20, precision)); + + function format(value) { + var valuePrefix = prefix, + valueSuffix = suffix, + i, n, c; + + if (type === "c") { + valueSuffix = formatType(value) + valueSuffix; + value = ""; + } else { + value = +value; + + // Perform the initial formatting. + var valueNegative = value < 0; + value = formatType(Math.abs(value), precision); + + // If a negative value rounds to zero during formatting, treat as positive. + if (valueNegative && +value === 0) valueNegative = false; + + // Compute the prefix and suffix. + valuePrefix = (valueNegative ? (sign === "(" ? sign : "-") : sign === "-" || sign === "(" ? "" : sign) + valuePrefix; + valueSuffix = valueSuffix + (type === "s" ? prefixes[8 + prefixExponent / 3] : "") + (valueNegative && sign === "(" ? ")" : ""); + + // Break the formatted value into the integer “value” part that can be + // grouped, and fractional or exponential “suffix” part that is not. + if (maybeSuffix) { + i = -1, n = value.length; + while (++i < n) { + if (c = value.charCodeAt(i), 48 > c || c > 57) { + valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix; + value = value.slice(0, i); + break; + } + } + } + } + + // If the fill character is not "0", grouping is applied before padding. + if (comma && !zero) value = group(value, Infinity); + + // Compute the padding. + var length = valuePrefix.length + value.length + valueSuffix.length, + padding = length < width ? new Array(width - length + 1).join(fill) : ""; + + // If the fill character is "0", grouping is applied after padding. + if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = ""; + + // Reconstruct the final output based on the desired alignment. + switch (align) { + case "<": value = valuePrefix + value + valueSuffix + padding; break; + case "=": value = valuePrefix + padding + value + valueSuffix; break; + case "^": value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); break; + default: value = padding + valuePrefix + value + valueSuffix; break; + } + + return numerals(value); + } + + format.toString = function() { + return specifier + ""; + }; + + return format; + } + + function formatPrefix(specifier, value) { + var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = "f", specifier)), + e = Math.max(-8, Math.min(8, Math.floor(exponent$1(value) / 3))) * 3, + k = Math.pow(10, -e), + prefix = prefixes[8 + e / 3]; + return function(value) { + return f(k * value) + prefix; + }; + } + + return { + format: newFormat, + formatPrefix: formatPrefix + }; +}; + +var locale$1; + + + +defaultLocale({ + decimal: ".", + thousands: ",", + grouping: [3], + currency: ["$", ""] +}); + +function defaultLocale(definition) { + locale$1 = formatLocale(definition); + exports.format = locale$1.format; + exports.formatPrefix = locale$1.formatPrefix; + return locale$1; +} + +var precisionFixed = function(step) { + return Math.max(0, -exponent$1(Math.abs(step))); +}; + +var precisionPrefix = function(step, value) { + return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent$1(value) / 3))) * 3 - exponent$1(Math.abs(step))); +}; + +var precisionRound = function(step, max) { + step = Math.abs(step), max = Math.abs(max) - step; + return Math.max(0, exponent$1(max) - exponent$1(step)) + 1; +}; + +// Adds floating point numbers with twice the normal precision. +// Reference: J. R. Shewchuk, Adaptive Precision Floating-Point Arithmetic and +// Fast Robust Geometric Predicates, Discrete & Computational Geometry 18(3) +// 305–363 (1997). +// Code adapted from GeographicLib by Charles F. F. Karney, +// http://geographiclib.sourceforge.net/ + +var adder = function() { + return new Adder; +}; + +function Adder() { + this.reset(); +} + +Adder.prototype = { + constructor: Adder, + reset: function() { + this.s = // rounded value + this.t = 0; // exact error + }, + add: function(y) { + add$1(temp, y, this.t); + add$1(this, temp.s, this.s); + if (this.s) this.t += temp.t; + else this.s = temp.t; + }, + valueOf: function() { + return this.s; + } +}; + +var temp = new Adder; + +function add$1(adder, a, b) { + var x = adder.s = a + b, + bv = x - a, + av = x - bv; + adder.t = (a - av) + (b - bv); +} + +var epsilon$2 = 1e-6; +var epsilon2$1 = 1e-12; +var pi$3 = Math.PI; +var halfPi$2 = pi$3 / 2; +var quarterPi = pi$3 / 4; +var tau$3 = pi$3 * 2; + +var degrees$1 = 180 / pi$3; +var radians = pi$3 / 180; + +var abs = Math.abs; +var atan = Math.atan; +var atan2 = Math.atan2; +var cos$1 = Math.cos; +var ceil = Math.ceil; +var exp = Math.exp; + +var log = Math.log; +var pow = Math.pow; +var sin$1 = Math.sin; +var sign = Math.sign || function(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; }; +var sqrt = Math.sqrt; +var tan = Math.tan; + +function acos(x) { + return x > 1 ? 0 : x < -1 ? pi$3 : Math.acos(x); +} + +function asin(x) { + return x > 1 ? halfPi$2 : x < -1 ? -halfPi$2 : Math.asin(x); +} + +function haversin(x) { + return (x = sin$1(x / 2)) * x; +} + +function noop$1() {} + +function streamGeometry(geometry, stream) { + if (geometry && streamGeometryType.hasOwnProperty(geometry.type)) { + streamGeometryType[geometry.type](geometry, stream); + } +} + +var streamObjectType = { + Feature: function(object, stream) { + streamGeometry(object.geometry, stream); + }, + FeatureCollection: function(object, stream) { + var features = object.features, i = -1, n = features.length; + while (++i < n) streamGeometry(features[i].geometry, stream); + } +}; + +var streamGeometryType = { + Sphere: function(object, stream) { + stream.sphere(); + }, + Point: function(object, stream) { + object = object.coordinates; + stream.point(object[0], object[1], object[2]); + }, + MultiPoint: function(object, stream) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) object = coordinates[i], stream.point(object[0], object[1], object[2]); + }, + LineString: function(object, stream) { + streamLine(object.coordinates, stream, 0); + }, + MultiLineString: function(object, stream) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) streamLine(coordinates[i], stream, 0); + }, + Polygon: function(object, stream) { + streamPolygon(object.coordinates, stream); + }, + MultiPolygon: function(object, stream) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) streamPolygon(coordinates[i], stream); + }, + GeometryCollection: function(object, stream) { + var geometries = object.geometries, i = -1, n = geometries.length; + while (++i < n) streamGeometry(geometries[i], stream); + } +}; + +function streamLine(coordinates, stream, closed) { + var i = -1, n = coordinates.length - closed, coordinate; + stream.lineStart(); + while (++i < n) coordinate = coordinates[i], stream.point(coordinate[0], coordinate[1], coordinate[2]); + stream.lineEnd(); +} + +function streamPolygon(coordinates, stream) { + var i = -1, n = coordinates.length; + stream.polygonStart(); + while (++i < n) streamLine(coordinates[i], stream, 1); + stream.polygonEnd(); +} + +var geoStream = function(object, stream) { + if (object && streamObjectType.hasOwnProperty(object.type)) { + streamObjectType[object.type](object, stream); + } else { + streamGeometry(object, stream); + } +}; + +var areaRingSum = adder(); + +var areaSum = adder(); +var lambda00; +var phi00; +var lambda0; +var cosPhi0; +var sinPhi0; + +var areaStream = { + point: noop$1, + lineStart: noop$1, + lineEnd: noop$1, + polygonStart: function() { + areaRingSum.reset(); + areaStream.lineStart = areaRingStart; + areaStream.lineEnd = areaRingEnd; + }, + polygonEnd: function() { + var areaRing = +areaRingSum; + areaSum.add(areaRing < 0 ? tau$3 + areaRing : areaRing); + this.lineStart = this.lineEnd = this.point = noop$1; + }, + sphere: function() { + areaSum.add(tau$3); + } +}; + +function areaRingStart() { + areaStream.point = areaPointFirst; +} + +function areaRingEnd() { + areaPoint(lambda00, phi00); +} + +function areaPointFirst(lambda, phi) { + areaStream.point = areaPoint; + lambda00 = lambda, phi00 = phi; + lambda *= radians, phi *= radians; + lambda0 = lambda, cosPhi0 = cos$1(phi = phi / 2 + quarterPi), sinPhi0 = sin$1(phi); +} + +function areaPoint(lambda, phi) { + lambda *= radians, phi *= radians; + phi = phi / 2 + quarterPi; // half the angular distance from south pole + + // Spherical excess E for a spherical triangle with vertices: south pole, + // previous point, current point. Uses a formula derived from Cagnoli’s + // theorem. See Todhunter, Spherical Trig. (1871), Sec. 103, Eq. (2). + var dLambda = lambda - lambda0, + sdLambda = dLambda >= 0 ? 1 : -1, + adLambda = sdLambda * dLambda, + cosPhi = cos$1(phi), + sinPhi = sin$1(phi), + k = sinPhi0 * sinPhi, + u = cosPhi0 * cosPhi + k * cos$1(adLambda), + v = k * sdLambda * sin$1(adLambda); + areaRingSum.add(atan2(v, u)); + + // Advance the previous points. + lambda0 = lambda, cosPhi0 = cosPhi, sinPhi0 = sinPhi; +} + +var area = function(object) { + areaSum.reset(); + geoStream(object, areaStream); + return areaSum * 2; +}; + +function spherical(cartesian) { + return [atan2(cartesian[1], cartesian[0]), asin(cartesian[2])]; +} + +function cartesian(spherical) { + var lambda = spherical[0], phi = spherical[1], cosPhi = cos$1(phi); + return [cosPhi * cos$1(lambda), cosPhi * sin$1(lambda), sin$1(phi)]; +} + +function cartesianDot(a, b) { + return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; +} + +function cartesianCross(a, b) { + return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]]; +} + +// TODO return a +function cartesianAddInPlace(a, b) { + a[0] += b[0], a[1] += b[1], a[2] += b[2]; +} + +function cartesianScale(vector, k) { + return [vector[0] * k, vector[1] * k, vector[2] * k]; +} + +// TODO return d +function cartesianNormalizeInPlace(d) { + var l = sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]); + d[0] /= l, d[1] /= l, d[2] /= l; +} + +var lambda0$1; +var phi0; +var lambda1; +var phi1; +var lambda2; +var lambda00$1; +var phi00$1; +var p0; +var deltaSum = adder(); +var ranges; +var range; + +var boundsStream = { + point: boundsPoint, + lineStart: boundsLineStart, + lineEnd: boundsLineEnd, + polygonStart: function() { + boundsStream.point = boundsRingPoint; + boundsStream.lineStart = boundsRingStart; + boundsStream.lineEnd = boundsRingEnd; + deltaSum.reset(); + areaStream.polygonStart(); + }, + polygonEnd: function() { + areaStream.polygonEnd(); + boundsStream.point = boundsPoint; + boundsStream.lineStart = boundsLineStart; + boundsStream.lineEnd = boundsLineEnd; + if (areaRingSum < 0) lambda0$1 = -(lambda1 = 180), phi0 = -(phi1 = 90); + else if (deltaSum > epsilon$2) phi1 = 90; + else if (deltaSum < -epsilon$2) phi0 = -90; + range[0] = lambda0$1, range[1] = lambda1; + } +}; + +function boundsPoint(lambda, phi) { + ranges.push(range = [lambda0$1 = lambda, lambda1 = lambda]); + if (phi < phi0) phi0 = phi; + if (phi > phi1) phi1 = phi; +} + +function linePoint(lambda, phi) { + var p = cartesian([lambda * radians, phi * radians]); + if (p0) { + var normal = cartesianCross(p0, p), + equatorial = [normal[1], -normal[0], 0], + inflection = cartesianCross(equatorial, normal); + cartesianNormalizeInPlace(inflection); + inflection = spherical(inflection); + var delta = lambda - lambda2, + sign$$1 = delta > 0 ? 1 : -1, + lambdai = inflection[0] * degrees$1 * sign$$1, + phii, + antimeridian = abs(delta) > 180; + if (antimeridian ^ (sign$$1 * lambda2 < lambdai && lambdai < sign$$1 * lambda)) { + phii = inflection[1] * degrees$1; + if (phii > phi1) phi1 = phii; + } else if (lambdai = (lambdai + 360) % 360 - 180, antimeridian ^ (sign$$1 * lambda2 < lambdai && lambdai < sign$$1 * lambda)) { + phii = -inflection[1] * degrees$1; + if (phii < phi0) phi0 = phii; + } else { + if (phi < phi0) phi0 = phi; + if (phi > phi1) phi1 = phi; + } + if (antimeridian) { + if (lambda < lambda2) { + if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda; + } else { + if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda; + } + } else { + if (lambda1 >= lambda0$1) { + if (lambda < lambda0$1) lambda0$1 = lambda; + if (lambda > lambda1) lambda1 = lambda; + } else { + if (lambda > lambda2) { + if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda; + } else { + if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda; + } + } + } + } else { + ranges.push(range = [lambda0$1 = lambda, lambda1 = lambda]); + } + if (phi < phi0) phi0 = phi; + if (phi > phi1) phi1 = phi; + p0 = p, lambda2 = lambda; +} + +function boundsLineStart() { + boundsStream.point = linePoint; +} + +function boundsLineEnd() { + range[0] = lambda0$1, range[1] = lambda1; + boundsStream.point = boundsPoint; + p0 = null; +} + +function boundsRingPoint(lambda, phi) { + if (p0) { + var delta = lambda - lambda2; + deltaSum.add(abs(delta) > 180 ? delta + (delta > 0 ? 360 : -360) : delta); + } else { + lambda00$1 = lambda, phi00$1 = phi; + } + areaStream.point(lambda, phi); + linePoint(lambda, phi); +} + +function boundsRingStart() { + areaStream.lineStart(); +} + +function boundsRingEnd() { + boundsRingPoint(lambda00$1, phi00$1); + areaStream.lineEnd(); + if (abs(deltaSum) > epsilon$2) lambda0$1 = -(lambda1 = 180); + range[0] = lambda0$1, range[1] = lambda1; + p0 = null; +} + +// Finds the left-right distance between two longitudes. +// This is almost the same as (lambda1 - lambda0 + 360°) % 360°, except that we want +// the distance between ±180° to be 360°. +function angle(lambda0, lambda1) { + return (lambda1 -= lambda0) < 0 ? lambda1 + 360 : lambda1; +} + +function rangeCompare(a, b) { + return a[0] - b[0]; +} + +function rangeContains(range, x) { + return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x; +} + +var bounds = function(feature) { + var i, n, a, b, merged, deltaMax, delta; + + phi1 = lambda1 = -(lambda0$1 = phi0 = Infinity); + ranges = []; + geoStream(feature, boundsStream); + + // First, sort ranges by their minimum longitudes. + if (n = ranges.length) { + ranges.sort(rangeCompare); + + // Then, merge any ranges that overlap. + for (i = 1, a = ranges[0], merged = [a]; i < n; ++i) { + b = ranges[i]; + if (rangeContains(a, b[0]) || rangeContains(a, b[1])) { + if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1]; + if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0]; + } else { + merged.push(a = b); + } + } + + // Finally, find the largest gap between the merged ranges. + // The final bounding box will be the inverse of this gap. + for (deltaMax = -Infinity, n = merged.length - 1, i = 0, a = merged[n]; i <= n; a = b, ++i) { + b = merged[i]; + if ((delta = angle(a[1], b[0])) > deltaMax) deltaMax = delta, lambda0$1 = b[0], lambda1 = a[1]; + } + } + + ranges = range = null; + + return lambda0$1 === Infinity || phi0 === Infinity + ? [[NaN, NaN], [NaN, NaN]] + : [[lambda0$1, phi0], [lambda1, phi1]]; +}; + +var W0; +var W1; +var X0; +var Y0; +var Z0; +var X1; +var Y1; +var Z1; +var X2; +var Y2; +var Z2; +var lambda00$2; +var phi00$2; +var x0; +var y0; +var z0; // previous point + +var centroidStream = { + sphere: noop$1, + point: centroidPoint, + lineStart: centroidLineStart, + lineEnd: centroidLineEnd, + polygonStart: function() { + centroidStream.lineStart = centroidRingStart; + centroidStream.lineEnd = centroidRingEnd; + }, + polygonEnd: function() { + centroidStream.lineStart = centroidLineStart; + centroidStream.lineEnd = centroidLineEnd; + } +}; + +// Arithmetic mean of Cartesian vectors. +function centroidPoint(lambda, phi) { + lambda *= radians, phi *= radians; + var cosPhi = cos$1(phi); + centroidPointCartesian(cosPhi * cos$1(lambda), cosPhi * sin$1(lambda), sin$1(phi)); +} + +function centroidPointCartesian(x, y, z) { + ++W0; + X0 += (x - X0) / W0; + Y0 += (y - Y0) / W0; + Z0 += (z - Z0) / W0; +} + +function centroidLineStart() { + centroidStream.point = centroidLinePointFirst; +} + +function centroidLinePointFirst(lambda, phi) { + lambda *= radians, phi *= radians; + var cosPhi = cos$1(phi); + x0 = cosPhi * cos$1(lambda); + y0 = cosPhi * sin$1(lambda); + z0 = sin$1(phi); + centroidStream.point = centroidLinePoint; + centroidPointCartesian(x0, y0, z0); +} + +function centroidLinePoint(lambda, phi) { + lambda *= radians, phi *= radians; + var cosPhi = cos$1(phi), + x = cosPhi * cos$1(lambda), + y = cosPhi * sin$1(lambda), + z = sin$1(phi), + w = atan2(sqrt((w = y0 * z - z0 * y) * w + (w = z0 * x - x0 * z) * w + (w = x0 * y - y0 * x) * w), x0 * x + y0 * y + z0 * z); + W1 += w; + X1 += w * (x0 + (x0 = x)); + Y1 += w * (y0 + (y0 = y)); + Z1 += w * (z0 + (z0 = z)); + centroidPointCartesian(x0, y0, z0); +} + +function centroidLineEnd() { + centroidStream.point = centroidPoint; +} + +// See J. E. Brock, The Inertia Tensor for a Spherical Triangle, +// J. Applied Mechanics 42, 239 (1975). +function centroidRingStart() { + centroidStream.point = centroidRingPointFirst; +} + +function centroidRingEnd() { + centroidRingPoint(lambda00$2, phi00$2); + centroidStream.point = centroidPoint; +} + +function centroidRingPointFirst(lambda, phi) { + lambda00$2 = lambda, phi00$2 = phi; + lambda *= radians, phi *= radians; + centroidStream.point = centroidRingPoint; + var cosPhi = cos$1(phi); + x0 = cosPhi * cos$1(lambda); + y0 = cosPhi * sin$1(lambda); + z0 = sin$1(phi); + centroidPointCartesian(x0, y0, z0); +} + +function centroidRingPoint(lambda, phi) { + lambda *= radians, phi *= radians; + var cosPhi = cos$1(phi), + x = cosPhi * cos$1(lambda), + y = cosPhi * sin$1(lambda), + z = sin$1(phi), + cx = y0 * z - z0 * y, + cy = z0 * x - x0 * z, + cz = x0 * y - y0 * x, + m = sqrt(cx * cx + cy * cy + cz * cz), + w = asin(m), // line weight = angle + v = m && -w / m; // area weight multiplier + X2 += v * cx; + Y2 += v * cy; + Z2 += v * cz; + W1 += w; + X1 += w * (x0 + (x0 = x)); + Y1 += w * (y0 + (y0 = y)); + Z1 += w * (z0 + (z0 = z)); + centroidPointCartesian(x0, y0, z0); +} + +var centroid = function(object) { + W0 = W1 = + X0 = Y0 = Z0 = + X1 = Y1 = Z1 = + X2 = Y2 = Z2 = 0; + geoStream(object, centroidStream); + + var x = X2, + y = Y2, + z = Z2, + m = x * x + y * y + z * z; + + // If the area-weighted ccentroid is undefined, fall back to length-weighted ccentroid. + if (m < epsilon2$1) { + x = X1, y = Y1, z = Z1; + // If the feature has zero length, fall back to arithmetic mean of point vectors. + if (W1 < epsilon$2) x = X0, y = Y0, z = Z0; + m = x * x + y * y + z * z; + // If the feature still has an undefined ccentroid, then return. + if (m < epsilon2$1) return [NaN, NaN]; + } + + return [atan2(y, x) * degrees$1, asin(z / sqrt(m)) * degrees$1]; +}; + +var constant$7 = function(x) { + return function() { + return x; + }; +}; + +var compose = function(a, b) { + + function compose(x, y) { + return x = a(x, y), b(x[0], x[1]); + } + + if (a.invert && b.invert) compose.invert = function(x, y) { + return x = b.invert(x, y), x && a.invert(x[0], x[1]); + }; + + return compose; +}; + +function rotationIdentity(lambda, phi) { + return [lambda > pi$3 ? lambda - tau$3 : lambda < -pi$3 ? lambda + tau$3 : lambda, phi]; +} + +rotationIdentity.invert = rotationIdentity; + +function rotateRadians(deltaLambda, deltaPhi, deltaGamma) { + return (deltaLambda %= tau$3) ? (deltaPhi || deltaGamma ? compose(rotationLambda(deltaLambda), rotationPhiGamma(deltaPhi, deltaGamma)) + : rotationLambda(deltaLambda)) + : (deltaPhi || deltaGamma ? rotationPhiGamma(deltaPhi, deltaGamma) + : rotationIdentity); +} + +function forwardRotationLambda(deltaLambda) { + return function(lambda, phi) { + return lambda += deltaLambda, [lambda > pi$3 ? lambda - tau$3 : lambda < -pi$3 ? lambda + tau$3 : lambda, phi]; + }; +} + +function rotationLambda(deltaLambda) { + var rotation = forwardRotationLambda(deltaLambda); + rotation.invert = forwardRotationLambda(-deltaLambda); + return rotation; +} + +function rotationPhiGamma(deltaPhi, deltaGamma) { + var cosDeltaPhi = cos$1(deltaPhi), + sinDeltaPhi = sin$1(deltaPhi), + cosDeltaGamma = cos$1(deltaGamma), + sinDeltaGamma = sin$1(deltaGamma); + + function rotation(lambda, phi) { + var cosPhi = cos$1(phi), + x = cos$1(lambda) * cosPhi, + y = sin$1(lambda) * cosPhi, + z = sin$1(phi), + k = z * cosDeltaPhi + x * sinDeltaPhi; + return [ + atan2(y * cosDeltaGamma - k * sinDeltaGamma, x * cosDeltaPhi - z * sinDeltaPhi), + asin(k * cosDeltaGamma + y * sinDeltaGamma) + ]; + } + + rotation.invert = function(lambda, phi) { + var cosPhi = cos$1(phi), + x = cos$1(lambda) * cosPhi, + y = sin$1(lambda) * cosPhi, + z = sin$1(phi), + k = z * cosDeltaGamma - y * sinDeltaGamma; + return [ + atan2(y * cosDeltaGamma + z * sinDeltaGamma, x * cosDeltaPhi + k * sinDeltaPhi), + asin(k * cosDeltaPhi - x * sinDeltaPhi) + ]; + }; + + return rotation; +} + +var rotation = function(rotate) { + rotate = rotateRadians(rotate[0] * radians, rotate[1] * radians, rotate.length > 2 ? rotate[2] * radians : 0); + + function forward(coordinates) { + coordinates = rotate(coordinates[0] * radians, coordinates[1] * radians); + return coordinates[0] *= degrees$1, coordinates[1] *= degrees$1, coordinates; + } + + forward.invert = function(coordinates) { + coordinates = rotate.invert(coordinates[0] * radians, coordinates[1] * radians); + return coordinates[0] *= degrees$1, coordinates[1] *= degrees$1, coordinates; + }; + + return forward; +}; + +// Generates a circle centered at [0°, 0°], with a given radius and precision. +function circleStream(stream, radius, delta, direction, t0, t1) { + if (!delta) return; + var cosRadius = cos$1(radius), + sinRadius = sin$1(radius), + step = direction * delta; + if (t0 == null) { + t0 = radius + direction * tau$3; + t1 = radius - step / 2; + } else { + t0 = circleRadius(cosRadius, t0); + t1 = circleRadius(cosRadius, t1); + if (direction > 0 ? t0 < t1 : t0 > t1) t0 += direction * tau$3; + } + for (var point, t = t0; direction > 0 ? t > t1 : t < t1; t -= step) { + point = spherical([cosRadius, -sinRadius * cos$1(t), -sinRadius * sin$1(t)]); + stream.point(point[0], point[1]); + } +} + +// Returns the signed angle of a cartesian point relative to [cosRadius, 0, 0]. +function circleRadius(cosRadius, point) { + point = cartesian(point), point[0] -= cosRadius; + cartesianNormalizeInPlace(point); + var radius = acos(-point[1]); + return ((-point[2] < 0 ? -radius : radius) + tau$3 - epsilon$2) % tau$3; +} + +var circle = function() { + var center = constant$7([0, 0]), + radius = constant$7(90), + precision = constant$7(6), + ring, + rotate, + stream = {point: point}; + + function point(x, y) { + ring.push(x = rotate(x, y)); + x[0] *= degrees$1, x[1] *= degrees$1; + } + + function circle() { + var c = center.apply(this, arguments), + r = radius.apply(this, arguments) * radians, + p = precision.apply(this, arguments) * radians; + ring = []; + rotate = rotateRadians(-c[0] * radians, -c[1] * radians, 0).invert; + circleStream(stream, r, p, 1); + c = {type: "Polygon", coordinates: [ring]}; + ring = rotate = null; + return c; + } + + circle.center = function(_) { + return arguments.length ? (center = typeof _ === "function" ? _ : constant$7([+_[0], +_[1]]), circle) : center; + }; + + circle.radius = function(_) { + return arguments.length ? (radius = typeof _ === "function" ? _ : constant$7(+_), circle) : radius; + }; + + circle.precision = function(_) { + return arguments.length ? (precision = typeof _ === "function" ? _ : constant$7(+_), circle) : precision; + }; + + return circle; +}; + +var clipBuffer = function() { + var lines = [], + line; + return { + point: function(x, y) { + line.push([x, y]); + }, + lineStart: function() { + lines.push(line = []); + }, + lineEnd: noop$1, + rejoin: function() { + if (lines.length > 1) lines.push(lines.pop().concat(lines.shift())); + }, + result: function() { + var result = lines; + lines = []; + line = null; + return result; + } + }; +}; + +var clipLine = function(a, b, x0, y0, x1, y1) { + var ax = a[0], + ay = a[1], + bx = b[0], + by = b[1], + t0 = 0, + t1 = 1, + dx = bx - ax, + dy = by - ay, + r; + + r = x0 - ax; + if (!dx && r > 0) return; + r /= dx; + if (dx < 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } else if (dx > 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } + + r = x1 - ax; + if (!dx && r < 0) return; + r /= dx; + if (dx < 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } else if (dx > 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } + + r = y0 - ay; + if (!dy && r > 0) return; + r /= dy; + if (dy < 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } else if (dy > 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } + + r = y1 - ay; + if (!dy && r < 0) return; + r /= dy; + if (dy < 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } else if (dy > 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } + + if (t0 > 0) a[0] = ax + t0 * dx, a[1] = ay + t0 * dy; + if (t1 < 1) b[0] = ax + t1 * dx, b[1] = ay + t1 * dy; + return true; +}; + +var pointEqual = function(a, b) { + return abs(a[0] - b[0]) < epsilon$2 && abs(a[1] - b[1]) < epsilon$2; +}; + +function Intersection(point, points, other, entry) { + this.x = point; + this.z = points; + this.o = other; // another intersection + this.e = entry; // is an entry? + this.v = false; // visited + this.n = this.p = null; // next & previous +} + +// A generalized polygon clipping algorithm: given a polygon that has been cut +// into its visible line segments, and rejoins the segments by interpolating +// along the clip edge. +var clipPolygon = function(segments, compareIntersection, startInside, interpolate, stream) { + var subject = [], + clip = [], + i, + n; + + segments.forEach(function(segment) { + if ((n = segment.length - 1) <= 0) return; + var n, p0 = segment[0], p1 = segment[n], x; + + // If the first and last points of a segment are coincident, then treat as a + // closed ring. TODO if all rings are closed, then the winding order of the + // exterior ring should be checked. + if (pointEqual(p0, p1)) { + stream.lineStart(); + for (i = 0; i < n; ++i) stream.point((p0 = segment[i])[0], p0[1]); + stream.lineEnd(); + return; + } + + subject.push(x = new Intersection(p0, segment, null, true)); + clip.push(x.o = new Intersection(p0, null, x, false)); + subject.push(x = new Intersection(p1, segment, null, false)); + clip.push(x.o = new Intersection(p1, null, x, true)); + }); + + if (!subject.length) return; + + clip.sort(compareIntersection); + link$1(subject); + link$1(clip); + + for (i = 0, n = clip.length; i < n; ++i) { + clip[i].e = startInside = !startInside; + } + + var start = subject[0], + points, + point; + + while (1) { + // Find first unvisited intersection. + var current = start, + isSubject = true; + while (current.v) if ((current = current.n) === start) return; + points = current.z; + stream.lineStart(); + do { + current.v = current.o.v = true; + if (current.e) { + if (isSubject) { + for (i = 0, n = points.length; i < n; ++i) stream.point((point = points[i])[0], point[1]); + } else { + interpolate(current.x, current.n.x, 1, stream); + } + current = current.n; + } else { + if (isSubject) { + points = current.p.z; + for (i = points.length - 1; i >= 0; --i) stream.point((point = points[i])[0], point[1]); + } else { + interpolate(current.x, current.p.x, -1, stream); + } + current = current.p; + } + current = current.o; + points = current.z; + isSubject = !isSubject; + } while (!current.v); + stream.lineEnd(); + } +}; + +function link$1(array) { + if (!(n = array.length)) return; + var n, + i = 0, + a = array[0], + b; + while (++i < n) { + a.n = b = array[i]; + b.p = a; + a = b; + } + a.n = b = array[0]; + b.p = a; +} + +var clipMax = 1e9; +var clipMin = -clipMax; + +// TODO Use d3-polygon’s polygonContains here for the ring check? +// TODO Eliminate duplicate buffering in clipBuffer and polygon.push? + +function clipExtent(x0, y0, x1, y1) { + + function visible(x, y) { + return x0 <= x && x <= x1 && y0 <= y && y <= y1; + } + + function interpolate(from, to, direction, stream) { + var a = 0, a1 = 0; + if (from == null + || (a = corner(from, direction)) !== (a1 = corner(to, direction)) + || comparePoint(from, to) < 0 ^ direction > 0) { + do stream.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0); + while ((a = (a + direction + 4) % 4) !== a1); + } else { + stream.point(to[0], to[1]); + } + } + + function corner(p, direction) { + return abs(p[0] - x0) < epsilon$2 ? direction > 0 ? 0 : 3 + : abs(p[0] - x1) < epsilon$2 ? direction > 0 ? 2 : 1 + : abs(p[1] - y0) < epsilon$2 ? direction > 0 ? 1 : 0 + : direction > 0 ? 3 : 2; // abs(p[1] - y1) < epsilon + } + + function compareIntersection(a, b) { + return comparePoint(a.x, b.x); + } + + function comparePoint(a, b) { + var ca = corner(a, 1), + cb = corner(b, 1); + return ca !== cb ? ca - cb + : ca === 0 ? b[1] - a[1] + : ca === 1 ? a[0] - b[0] + : ca === 2 ? a[1] - b[1] + : b[0] - a[0]; + } + + return function(stream) { + var activeStream = stream, + bufferStream = clipBuffer(), + segments, + polygon, + ring, + x__, y__, v__, // first point + x_, y_, v_, // previous point + first, + clean; + + var clipStream = { + point: point, + lineStart: lineStart, + lineEnd: lineEnd, + polygonStart: polygonStart, + polygonEnd: polygonEnd + }; + + function point(x, y) { + if (visible(x, y)) activeStream.point(x, y); + } + + function polygonInside() { + var winding = 0; + + for (var i = 0, n = polygon.length; i < n; ++i) { + for (var ring = polygon[i], j = 1, m = ring.length, point = ring[0], a0, a1, b0 = point[0], b1 = point[1]; j < m; ++j) { + a0 = b0, a1 = b1, point = ring[j], b0 = point[0], b1 = point[1]; + if (a1 <= y1) { if (b1 > y1 && (b0 - a0) * (y1 - a1) > (b1 - a1) * (x0 - a0)) ++winding; } + else { if (b1 <= y1 && (b0 - a0) * (y1 - a1) < (b1 - a1) * (x0 - a0)) --winding; } + } + } + + return winding; + } + + // Buffer geometry within a polygon and then clip it en masse. + function polygonStart() { + activeStream = bufferStream, segments = [], polygon = [], clean = true; + } + + function polygonEnd() { + var startInside = polygonInside(), + cleanInside = clean && startInside, + visible = (segments = merge(segments)).length; + if (cleanInside || visible) { + stream.polygonStart(); + if (cleanInside) { + stream.lineStart(); + interpolate(null, null, 1, stream); + stream.lineEnd(); + } + if (visible) { + clipPolygon(segments, compareIntersection, startInside, interpolate, stream); + } + stream.polygonEnd(); + } + activeStream = stream, segments = polygon = ring = null; + } + + function lineStart() { + clipStream.point = linePoint; + if (polygon) polygon.push(ring = []); + first = true; + v_ = false; + x_ = y_ = NaN; + } + + // TODO rather than special-case polygons, simply handle them separately. + // Ideally, coincident intersection points should be jittered to avoid + // clipping issues. + function lineEnd() { + if (segments) { + linePoint(x__, y__); + if (v__ && v_) bufferStream.rejoin(); + segments.push(bufferStream.result()); + } + clipStream.point = point; + if (v_) activeStream.lineEnd(); + } + + function linePoint(x, y) { + var v = visible(x, y); + if (polygon) ring.push([x, y]); + if (first) { + x__ = x, y__ = y, v__ = v; + first = false; + if (v) { + activeStream.lineStart(); + activeStream.point(x, y); + } + } else { + if (v && v_) activeStream.point(x, y); + else { + var a = [x_ = Math.max(clipMin, Math.min(clipMax, x_)), y_ = Math.max(clipMin, Math.min(clipMax, y_))], + b = [x = Math.max(clipMin, Math.min(clipMax, x)), y = Math.max(clipMin, Math.min(clipMax, y))]; + if (clipLine(a, b, x0, y0, x1, y1)) { + if (!v_) { + activeStream.lineStart(); + activeStream.point(a[0], a[1]); + } + activeStream.point(b[0], b[1]); + if (!v) activeStream.lineEnd(); + clean = false; + } else if (v) { + activeStream.lineStart(); + activeStream.point(x, y); + clean = false; + } + } + } + x_ = x, y_ = y, v_ = v; + } + + return clipStream; + }; +} + +var extent$1 = function() { + var x0 = 0, + y0 = 0, + x1 = 960, + y1 = 500, + cache, + cacheStream, + clip; + + return clip = { + stream: function(stream) { + return cache && cacheStream === stream ? cache : cache = clipExtent(x0, y0, x1, y1)(cacheStream = stream); + }, + extent: function(_) { + return arguments.length ? (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1], cache = cacheStream = null, clip) : [[x0, y0], [x1, y1]]; + } + }; +}; + +var sum$1 = adder(); + +var polygonContains = function(polygon, point) { + var lambda = point[0], + phi = point[1], + normal = [sin$1(lambda), -cos$1(lambda), 0], + angle = 0, + winding = 0; + + sum$1.reset(); + + for (var i = 0, n = polygon.length; i < n; ++i) { + if (!(m = (ring = polygon[i]).length)) continue; + var ring, + m, + point0 = ring[m - 1], + lambda0 = point0[0], + phi0 = point0[1] / 2 + quarterPi, + sinPhi0 = sin$1(phi0), + cosPhi0 = cos$1(phi0); + + for (var j = 0; j < m; ++j, lambda0 = lambda1, sinPhi0 = sinPhi1, cosPhi0 = cosPhi1, point0 = point1) { + var point1 = ring[j], + lambda1 = point1[0], + phi1 = point1[1] / 2 + quarterPi, + sinPhi1 = sin$1(phi1), + cosPhi1 = cos$1(phi1), + delta = lambda1 - lambda0, + sign$$1 = delta >= 0 ? 1 : -1, + absDelta = sign$$1 * delta, + antimeridian = absDelta > pi$3, + k = sinPhi0 * sinPhi1; + + sum$1.add(atan2(k * sign$$1 * sin$1(absDelta), cosPhi0 * cosPhi1 + k * cos$1(absDelta))); + angle += antimeridian ? delta + sign$$1 * tau$3 : delta; + + // Are the longitudes either side of the point’s meridian (lambda), + // and are the latitudes smaller than the parallel (phi)? + if (antimeridian ^ lambda0 >= lambda ^ lambda1 >= lambda) { + var arc = cartesianCross(cartesian(point0), cartesian(point1)); + cartesianNormalizeInPlace(arc); + var intersection = cartesianCross(normal, arc); + cartesianNormalizeInPlace(intersection); + var phiArc = (antimeridian ^ delta >= 0 ? -1 : 1) * asin(intersection[2]); + if (phi > phiArc || phi === phiArc && (arc[0] || arc[1])) { + winding += antimeridian ^ delta >= 0 ? 1 : -1; + } + } + } + } + + // First, determine whether the South pole is inside or outside: + // + // It is inside if: + // * the polygon winds around it in a clockwise direction. + // * the polygon does not (cumulatively) wind around it, but has a negative + // (counter-clockwise) area. + // + // Second, count the (signed) number of times a segment crosses a lambda + // from the point to the South pole. If it is zero, then the point is the + // same side as the South pole. + + return (angle < -epsilon$2 || angle < epsilon$2 && sum$1 < -epsilon$2) ^ (winding & 1); +}; + +var lengthSum = adder(); +var lambda0$2; +var sinPhi0$1; +var cosPhi0$1; + +var lengthStream = { + sphere: noop$1, + point: noop$1, + lineStart: lengthLineStart, + lineEnd: noop$1, + polygonStart: noop$1, + polygonEnd: noop$1 +}; + +function lengthLineStart() { + lengthStream.point = lengthPointFirst; + lengthStream.lineEnd = lengthLineEnd; +} + +function lengthLineEnd() { + lengthStream.point = lengthStream.lineEnd = noop$1; +} + +function lengthPointFirst(lambda, phi) { + lambda *= radians, phi *= radians; + lambda0$2 = lambda, sinPhi0$1 = sin$1(phi), cosPhi0$1 = cos$1(phi); + lengthStream.point = lengthPoint; +} + +function lengthPoint(lambda, phi) { + lambda *= radians, phi *= radians; + var sinPhi = sin$1(phi), + cosPhi = cos$1(phi), + delta = abs(lambda - lambda0$2), + cosDelta = cos$1(delta), + sinDelta = sin$1(delta), + x = cosPhi * sinDelta, + y = cosPhi0$1 * sinPhi - sinPhi0$1 * cosPhi * cosDelta, + z = sinPhi0$1 * sinPhi + cosPhi0$1 * cosPhi * cosDelta; + lengthSum.add(atan2(sqrt(x * x + y * y), z)); + lambda0$2 = lambda, sinPhi0$1 = sinPhi, cosPhi0$1 = cosPhi; +} + +var length$1 = function(object) { + lengthSum.reset(); + geoStream(object, lengthStream); + return +lengthSum; +}; + +var coordinates = [null, null]; +var object$1 = {type: "LineString", coordinates: coordinates}; + +var distance = function(a, b) { + coordinates[0] = a; + coordinates[1] = b; + return length$1(object$1); +}; + +var containsObjectType = { + Feature: function(object, point) { + return containsGeometry(object.geometry, point); + }, + FeatureCollection: function(object, point) { + var features = object.features, i = -1, n = features.length; + while (++i < n) if (containsGeometry(features[i].geometry, point)) return true; + return false; + } +}; + +var containsGeometryType = { + Sphere: function() { + return true; + }, + Point: function(object, point) { + return containsPoint(object.coordinates, point); + }, + MultiPoint: function(object, point) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) if (containsPoint(coordinates[i], point)) return true; + return false; + }, + LineString: function(object, point) { + return containsLine(object.coordinates, point); + }, + MultiLineString: function(object, point) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) if (containsLine(coordinates[i], point)) return true; + return false; + }, + Polygon: function(object, point) { + return containsPolygon(object.coordinates, point); + }, + MultiPolygon: function(object, point) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) if (containsPolygon(coordinates[i], point)) return true; + return false; + }, + GeometryCollection: function(object, point) { + var geometries = object.geometries, i = -1, n = geometries.length; + while (++i < n) if (containsGeometry(geometries[i], point)) return true; + return false; + } +}; + +function containsGeometry(geometry, point) { + return geometry && containsGeometryType.hasOwnProperty(geometry.type) + ? containsGeometryType[geometry.type](geometry, point) + : false; +} + +function containsPoint(coordinates, point) { + return distance(coordinates, point) === 0; +} + +function containsLine(coordinates, point) { + var ab = distance(coordinates[0], coordinates[1]), + ao = distance(coordinates[0], point), + ob = distance(point, coordinates[1]); + return ao + ob <= ab + epsilon$2; +} + +function containsPolygon(coordinates, point) { + return !!polygonContains(coordinates.map(ringRadians), pointRadians(point)); +} + +function ringRadians(ring) { + return ring = ring.map(pointRadians), ring.pop(), ring; +} + +function pointRadians(point) { + return [point[0] * radians, point[1] * radians]; +} + +var contains = function(object, point) { + return (object && containsObjectType.hasOwnProperty(object.type) + ? containsObjectType[object.type] + : containsGeometry)(object, point); +}; + +function graticuleX(y0, y1, dy) { + var y = sequence(y0, y1 - epsilon$2, dy).concat(y1); + return function(x) { return y.map(function(y) { return [x, y]; }); }; +} + +function graticuleY(x0, x1, dx) { + var x = sequence(x0, x1 - epsilon$2, dx).concat(x1); + return function(y) { return x.map(function(x) { return [x, y]; }); }; +} + +function graticule() { + var x1, x0, X1, X0, + y1, y0, Y1, Y0, + dx = 10, dy = dx, DX = 90, DY = 360, + x, y, X, Y, + precision = 2.5; + + function graticule() { + return {type: "MultiLineString", coordinates: lines()}; + } + + function lines() { + return sequence(ceil(X0 / DX) * DX, X1, DX).map(X) + .concat(sequence(ceil(Y0 / DY) * DY, Y1, DY).map(Y)) + .concat(sequence(ceil(x0 / dx) * dx, x1, dx).filter(function(x) { return abs(x % DX) > epsilon$2; }).map(x)) + .concat(sequence(ceil(y0 / dy) * dy, y1, dy).filter(function(y) { return abs(y % DY) > epsilon$2; }).map(y)); + } + + graticule.lines = function() { + return lines().map(function(coordinates) { return {type: "LineString", coordinates: coordinates}; }); + }; + + graticule.outline = function() { + return { + type: "Polygon", + coordinates: [ + X(X0).concat( + Y(Y1).slice(1), + X(X1).reverse().slice(1), + Y(Y0).reverse().slice(1)) + ] + }; + }; + + graticule.extent = function(_) { + if (!arguments.length) return graticule.extentMinor(); + return graticule.extentMajor(_).extentMinor(_); + }; + + graticule.extentMajor = function(_) { + if (!arguments.length) return [[X0, Y0], [X1, Y1]]; + X0 = +_[0][0], X1 = +_[1][0]; + Y0 = +_[0][1], Y1 = +_[1][1]; + if (X0 > X1) _ = X0, X0 = X1, X1 = _; + if (Y0 > Y1) _ = Y0, Y0 = Y1, Y1 = _; + return graticule.precision(precision); + }; + + graticule.extentMinor = function(_) { + if (!arguments.length) return [[x0, y0], [x1, y1]]; + x0 = +_[0][0], x1 = +_[1][0]; + y0 = +_[0][1], y1 = +_[1][1]; + if (x0 > x1) _ = x0, x0 = x1, x1 = _; + if (y0 > y1) _ = y0, y0 = y1, y1 = _; + return graticule.precision(precision); + }; + + graticule.step = function(_) { + if (!arguments.length) return graticule.stepMinor(); + return graticule.stepMajor(_).stepMinor(_); + }; + + graticule.stepMajor = function(_) { + if (!arguments.length) return [DX, DY]; + DX = +_[0], DY = +_[1]; + return graticule; + }; + + graticule.stepMinor = function(_) { + if (!arguments.length) return [dx, dy]; + dx = +_[0], dy = +_[1]; + return graticule; + }; + + graticule.precision = function(_) { + if (!arguments.length) return precision; + precision = +_; + x = graticuleX(y0, y1, 90); + y = graticuleY(x0, x1, precision); + X = graticuleX(Y0, Y1, 90); + Y = graticuleY(X0, X1, precision); + return graticule; + }; + + return graticule + .extentMajor([[-180, -90 + epsilon$2], [180, 90 - epsilon$2]]) + .extentMinor([[-180, -80 - epsilon$2], [180, 80 + epsilon$2]]); +} + +function graticule10() { + return graticule()(); +} + +var interpolate$1 = function(a, b) { + var x0 = a[0] * radians, + y0 = a[1] * radians, + x1 = b[0] * radians, + y1 = b[1] * radians, + cy0 = cos$1(y0), + sy0 = sin$1(y0), + cy1 = cos$1(y1), + sy1 = sin$1(y1), + kx0 = cy0 * cos$1(x0), + ky0 = cy0 * sin$1(x0), + kx1 = cy1 * cos$1(x1), + ky1 = cy1 * sin$1(x1), + d = 2 * asin(sqrt(haversin(y1 - y0) + cy0 * cy1 * haversin(x1 - x0))), + k = sin$1(d); + + var interpolate = d ? function(t) { + var B = sin$1(t *= d) / k, + A = sin$1(d - t) / k, + x = A * kx0 + B * kx1, + y = A * ky0 + B * ky1, + z = A * sy0 + B * sy1; + return [ + atan2(y, x) * degrees$1, + atan2(z, sqrt(x * x + y * y)) * degrees$1 + ]; + } : function() { + return [x0 * degrees$1, y0 * degrees$1]; + }; + + interpolate.distance = d; + + return interpolate; +}; + +var identity$4 = function(x) { + return x; +}; + +var areaSum$1 = adder(); +var areaRingSum$1 = adder(); +var x00; +var y00; +var x0$1; +var y0$1; + +var areaStream$1 = { + point: noop$1, + lineStart: noop$1, + lineEnd: noop$1, + polygonStart: function() { + areaStream$1.lineStart = areaRingStart$1; + areaStream$1.lineEnd = areaRingEnd$1; + }, + polygonEnd: function() { + areaStream$1.lineStart = areaStream$1.lineEnd = areaStream$1.point = noop$1; + areaSum$1.add(abs(areaRingSum$1)); + areaRingSum$1.reset(); + }, + result: function() { + var area = areaSum$1 / 2; + areaSum$1.reset(); + return area; + } +}; + +function areaRingStart$1() { + areaStream$1.point = areaPointFirst$1; +} + +function areaPointFirst$1(x, y) { + areaStream$1.point = areaPoint$1; + x00 = x0$1 = x, y00 = y0$1 = y; +} + +function areaPoint$1(x, y) { + areaRingSum$1.add(y0$1 * x - x0$1 * y); + x0$1 = x, y0$1 = y; +} + +function areaRingEnd$1() { + areaPoint$1(x00, y00); +} + +var x0$2 = Infinity; +var y0$2 = x0$2; +var x1 = -x0$2; +var y1 = x1; + +var boundsStream$1 = { + point: boundsPoint$1, + lineStart: noop$1, + lineEnd: noop$1, + polygonStart: noop$1, + polygonEnd: noop$1, + result: function() { + var bounds = [[x0$2, y0$2], [x1, y1]]; + x1 = y1 = -(y0$2 = x0$2 = Infinity); + return bounds; + } +}; + +function boundsPoint$1(x, y) { + if (x < x0$2) x0$2 = x; + if (x > x1) x1 = x; + if (y < y0$2) y0$2 = y; + if (y > y1) y1 = y; +} + +// TODO Enforce positive area for exterior, negative area for interior? + +var X0$1 = 0; +var Y0$1 = 0; +var Z0$1 = 0; +var X1$1 = 0; +var Y1$1 = 0; +var Z1$1 = 0; +var X2$1 = 0; +var Y2$1 = 0; +var Z2$1 = 0; +var x00$1; +var y00$1; +var x0$3; +var y0$3; + +var centroidStream$1 = { + point: centroidPoint$1, + lineStart: centroidLineStart$1, + lineEnd: centroidLineEnd$1, + polygonStart: function() { + centroidStream$1.lineStart = centroidRingStart$1; + centroidStream$1.lineEnd = centroidRingEnd$1; + }, + polygonEnd: function() { + centroidStream$1.point = centroidPoint$1; + centroidStream$1.lineStart = centroidLineStart$1; + centroidStream$1.lineEnd = centroidLineEnd$1; + }, + result: function() { + var centroid = Z2$1 ? [X2$1 / Z2$1, Y2$1 / Z2$1] + : Z1$1 ? [X1$1 / Z1$1, Y1$1 / Z1$1] + : Z0$1 ? [X0$1 / Z0$1, Y0$1 / Z0$1] + : [NaN, NaN]; + X0$1 = Y0$1 = Z0$1 = + X1$1 = Y1$1 = Z1$1 = + X2$1 = Y2$1 = Z2$1 = 0; + return centroid; + } +}; + +function centroidPoint$1(x, y) { + X0$1 += x; + Y0$1 += y; + ++Z0$1; +} + +function centroidLineStart$1() { + centroidStream$1.point = centroidPointFirstLine; +} + +function centroidPointFirstLine(x, y) { + centroidStream$1.point = centroidPointLine; + centroidPoint$1(x0$3 = x, y0$3 = y); +} + +function centroidPointLine(x, y) { + var dx = x - x0$3, dy = y - y0$3, z = sqrt(dx * dx + dy * dy); + X1$1 += z * (x0$3 + x) / 2; + Y1$1 += z * (y0$3 + y) / 2; + Z1$1 += z; + centroidPoint$1(x0$3 = x, y0$3 = y); +} + +function centroidLineEnd$1() { + centroidStream$1.point = centroidPoint$1; +} + +function centroidRingStart$1() { + centroidStream$1.point = centroidPointFirstRing; +} + +function centroidRingEnd$1() { + centroidPointRing(x00$1, y00$1); +} + +function centroidPointFirstRing(x, y) { + centroidStream$1.point = centroidPointRing; + centroidPoint$1(x00$1 = x0$3 = x, y00$1 = y0$3 = y); +} + +function centroidPointRing(x, y) { + var dx = x - x0$3, + dy = y - y0$3, + z = sqrt(dx * dx + dy * dy); + + X1$1 += z * (x0$3 + x) / 2; + Y1$1 += z * (y0$3 + y) / 2; + Z1$1 += z; + + z = y0$3 * x - x0$3 * y; + X2$1 += z * (x0$3 + x); + Y2$1 += z * (y0$3 + y); + Z2$1 += z * 3; + centroidPoint$1(x0$3 = x, y0$3 = y); +} + +function PathContext(context) { + this._context = context; +} + +PathContext.prototype = { + _radius: 4.5, + pointRadius: function(_) { + return this._radius = _, this; + }, + polygonStart: function() { + this._line = 0; + }, + polygonEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._point = 0; + }, + lineEnd: function() { + if (this._line === 0) this._context.closePath(); + this._point = NaN; + }, + point: function(x, y) { + switch (this._point) { + case 0: { + this._context.moveTo(x, y); + this._point = 1; + break; + } + case 1: { + this._context.lineTo(x, y); + break; + } + default: { + this._context.moveTo(x + this._radius, y); + this._context.arc(x, y, this._radius, 0, tau$3); + break; + } + } + }, + result: noop$1 +}; + +var lengthSum$1 = adder(); +var lengthRing; +var x00$2; +var y00$2; +var x0$4; +var y0$4; + +var lengthStream$1 = { + point: noop$1, + lineStart: function() { + lengthStream$1.point = lengthPointFirst$1; + }, + lineEnd: function() { + if (lengthRing) lengthPoint$1(x00$2, y00$2); + lengthStream$1.point = noop$1; + }, + polygonStart: function() { + lengthRing = true; + }, + polygonEnd: function() { + lengthRing = null; + }, + result: function() { + var length = +lengthSum$1; + lengthSum$1.reset(); + return length; + } +}; + +function lengthPointFirst$1(x, y) { + lengthStream$1.point = lengthPoint$1; + x00$2 = x0$4 = x, y00$2 = y0$4 = y; +} + +function lengthPoint$1(x, y) { + x0$4 -= x, y0$4 -= y; + lengthSum$1.add(sqrt(x0$4 * x0$4 + y0$4 * y0$4)); + x0$4 = x, y0$4 = y; +} + +function PathString() { + this._string = []; +} + +PathString.prototype = { + _radius: 4.5, + _circle: circle$1(4.5), + pointRadius: function(_) { + if ((_ = +_) !== this._radius) this._radius = _, this._circle = null; + return this; + }, + polygonStart: function() { + this._line = 0; + }, + polygonEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._point = 0; + }, + lineEnd: function() { + if (this._line === 0) this._string.push("Z"); + this._point = NaN; + }, + point: function(x, y) { + switch (this._point) { + case 0: { + this._string.push("M", x, ",", y); + this._point = 1; + break; + } + case 1: { + this._string.push("L", x, ",", y); + break; + } + default: { + if (this._circle == null) this._circle = circle$1(this._radius); + this._string.push("M", x, ",", y, this._circle); + break; + } + } + }, + result: function() { + if (this._string.length) { + var result = this._string.join(""); + this._string = []; + return result; + } else { + return null; + } + } +}; + +function circle$1(radius) { + return "m0," + radius + + "a" + radius + "," + radius + " 0 1,1 0," + -2 * radius + + "a" + radius + "," + radius + " 0 1,1 0," + 2 * radius + + "z"; +} + +var index$1 = function(projection, context) { + var pointRadius = 4.5, + projectionStream, + contextStream; + + function path(object) { + if (object) { + if (typeof pointRadius === "function") contextStream.pointRadius(+pointRadius.apply(this, arguments)); + geoStream(object, projectionStream(contextStream)); + } + return contextStream.result(); + } + + path.area = function(object) { + geoStream(object, projectionStream(areaStream$1)); + return areaStream$1.result(); + }; + + path.measure = function(object) { + geoStream(object, projectionStream(lengthStream$1)); + return lengthStream$1.result(); + }; + + path.bounds = function(object) { + geoStream(object, projectionStream(boundsStream$1)); + return boundsStream$1.result(); + }; + + path.centroid = function(object) { + geoStream(object, projectionStream(centroidStream$1)); + return centroidStream$1.result(); + }; + + path.projection = function(_) { + return arguments.length ? (projectionStream = _ == null ? (projection = null, identity$4) : (projection = _).stream, path) : projection; + }; + + path.context = function(_) { + if (!arguments.length) return context; + contextStream = _ == null ? (context = null, new PathString) : new PathContext(context = _); + if (typeof pointRadius !== "function") contextStream.pointRadius(pointRadius); + return path; + }; + + path.pointRadius = function(_) { + if (!arguments.length) return pointRadius; + pointRadius = typeof _ === "function" ? _ : (contextStream.pointRadius(+_), +_); + return path; + }; + + return path.projection(projection).context(context); +}; + +var clip = function(pointVisible, clipLine, interpolate, start) { + return function(rotate, sink) { + var line = clipLine(sink), + rotatedStart = rotate.invert(start[0], start[1]), + ringBuffer = clipBuffer(), + ringSink = clipLine(ringBuffer), + polygonStarted = false, + polygon, + segments, + ring; + + var clip = { + point: point, + lineStart: lineStart, + lineEnd: lineEnd, + polygonStart: function() { + clip.point = pointRing; + clip.lineStart = ringStart; + clip.lineEnd = ringEnd; + segments = []; + polygon = []; + }, + polygonEnd: function() { + clip.point = point; + clip.lineStart = lineStart; + clip.lineEnd = lineEnd; + segments = merge(segments); + var startInside = polygonContains(polygon, rotatedStart); + if (segments.length) { + if (!polygonStarted) sink.polygonStart(), polygonStarted = true; + clipPolygon(segments, compareIntersection, startInside, interpolate, sink); + } else if (startInside) { + if (!polygonStarted) sink.polygonStart(), polygonStarted = true; + sink.lineStart(); + interpolate(null, null, 1, sink); + sink.lineEnd(); + } + if (polygonStarted) sink.polygonEnd(), polygonStarted = false; + segments = polygon = null; + }, + sphere: function() { + sink.polygonStart(); + sink.lineStart(); + interpolate(null, null, 1, sink); + sink.lineEnd(); + sink.polygonEnd(); + } + }; + + function point(lambda, phi) { + var point = rotate(lambda, phi); + if (pointVisible(lambda = point[0], phi = point[1])) sink.point(lambda, phi); + } + + function pointLine(lambda, phi) { + var point = rotate(lambda, phi); + line.point(point[0], point[1]); + } + + function lineStart() { + clip.point = pointLine; + line.lineStart(); + } + + function lineEnd() { + clip.point = point; + line.lineEnd(); + } + + function pointRing(lambda, phi) { + ring.push([lambda, phi]); + var point = rotate(lambda, phi); + ringSink.point(point[0], point[1]); + } + + function ringStart() { + ringSink.lineStart(); + ring = []; + } + + function ringEnd() { + pointRing(ring[0][0], ring[0][1]); + ringSink.lineEnd(); + + var clean = ringSink.clean(), + ringSegments = ringBuffer.result(), + i, n = ringSegments.length, m, + segment, + point; + + ring.pop(); + polygon.push(ring); + ring = null; + + if (!n) return; + + // No intersections. + if (clean & 1) { + segment = ringSegments[0]; + if ((m = segment.length - 1) > 0) { + if (!polygonStarted) sink.polygonStart(), polygonStarted = true; + sink.lineStart(); + for (i = 0; i < m; ++i) sink.point((point = segment[i])[0], point[1]); + sink.lineEnd(); + } + return; + } + + // Rejoin connected segments. + // TODO reuse ringBuffer.rejoin()? + if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift())); + + segments.push(ringSegments.filter(validSegment)); + } + + return clip; + }; +}; + +function validSegment(segment) { + return segment.length > 1; +} + +// Intersections are sorted along the clip edge. For both antimeridian cutting +// and circle clipping, the same comparison is used. +function compareIntersection(a, b) { + return ((a = a.x)[0] < 0 ? a[1] - halfPi$2 - epsilon$2 : halfPi$2 - a[1]) + - ((b = b.x)[0] < 0 ? b[1] - halfPi$2 - epsilon$2 : halfPi$2 - b[1]); +} + +var clipAntimeridian = clip( + function() { return true; }, + clipAntimeridianLine, + clipAntimeridianInterpolate, + [-pi$3, -halfPi$2] +); + +// Takes a line and cuts into visible segments. Return values: 0 - there were +// intersections or the line was empty; 1 - no intersections; 2 - there were +// intersections, and the first and last segments should be rejoined. +function clipAntimeridianLine(stream) { + var lambda0 = NaN, + phi0 = NaN, + sign0 = NaN, + clean; // no intersections + + return { + lineStart: function() { + stream.lineStart(); + clean = 1; + }, + point: function(lambda1, phi1) { + var sign1 = lambda1 > 0 ? pi$3 : -pi$3, + delta = abs(lambda1 - lambda0); + if (abs(delta - pi$3) < epsilon$2) { // line crosses a pole + stream.point(lambda0, phi0 = (phi0 + phi1) / 2 > 0 ? halfPi$2 : -halfPi$2); + stream.point(sign0, phi0); + stream.lineEnd(); + stream.lineStart(); + stream.point(sign1, phi0); + stream.point(lambda1, phi0); + clean = 0; + } else if (sign0 !== sign1 && delta >= pi$3) { // line crosses antimeridian + if (abs(lambda0 - sign0) < epsilon$2) lambda0 -= sign0 * epsilon$2; // handle degeneracies + if (abs(lambda1 - sign1) < epsilon$2) lambda1 -= sign1 * epsilon$2; + phi0 = clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1); + stream.point(sign0, phi0); + stream.lineEnd(); + stream.lineStart(); + stream.point(sign1, phi0); + clean = 0; + } + stream.point(lambda0 = lambda1, phi0 = phi1); + sign0 = sign1; + }, + lineEnd: function() { + stream.lineEnd(); + lambda0 = phi0 = NaN; + }, + clean: function() { + return 2 - clean; // if intersections, rejoin first and last segments + } + }; +} + +function clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1) { + var cosPhi0, + cosPhi1, + sinLambda0Lambda1 = sin$1(lambda0 - lambda1); + return abs(sinLambda0Lambda1) > epsilon$2 + ? atan((sin$1(phi0) * (cosPhi1 = cos$1(phi1)) * sin$1(lambda1) + - sin$1(phi1) * (cosPhi0 = cos$1(phi0)) * sin$1(lambda0)) + / (cosPhi0 * cosPhi1 * sinLambda0Lambda1)) + : (phi0 + phi1) / 2; +} + +function clipAntimeridianInterpolate(from, to, direction, stream) { + var phi; + if (from == null) { + phi = direction * halfPi$2; + stream.point(-pi$3, phi); + stream.point(0, phi); + stream.point(pi$3, phi); + stream.point(pi$3, 0); + stream.point(pi$3, -phi); + stream.point(0, -phi); + stream.point(-pi$3, -phi); + stream.point(-pi$3, 0); + stream.point(-pi$3, phi); + } else if (abs(from[0] - to[0]) > epsilon$2) { + var lambda = from[0] < to[0] ? pi$3 : -pi$3; + phi = direction * lambda / 2; + stream.point(-lambda, phi); + stream.point(0, phi); + stream.point(lambda, phi); + } else { + stream.point(to[0], to[1]); + } +} + +var clipCircle = function(radius, delta) { + var cr = cos$1(radius), + smallRadius = cr > 0, + notHemisphere = abs(cr) > epsilon$2; // TODO optimise for this common case + + function interpolate(from, to, direction, stream) { + circleStream(stream, radius, delta, direction, from, to); + } + + function visible(lambda, phi) { + return cos$1(lambda) * cos$1(phi) > cr; + } + + // Takes a line and cuts into visible segments. Return values used for polygon + // clipping: 0 - there were intersections or the line was empty; 1 - no + // intersections 2 - there were intersections, and the first and last segments + // should be rejoined. + function clipLine(stream) { + var point0, // previous point + c0, // code for previous point + v0, // visibility of previous point + v00, // visibility of first point + clean; // no intersections + return { + lineStart: function() { + v00 = v0 = false; + clean = 1; + }, + point: function(lambda, phi) { + var point1 = [lambda, phi], + point2, + v = visible(lambda, phi), + c = smallRadius + ? v ? 0 : code(lambda, phi) + : v ? code(lambda + (lambda < 0 ? pi$3 : -pi$3), phi) : 0; + if (!point0 && (v00 = v0 = v)) stream.lineStart(); + // Handle degeneracies. + // TODO ignore if not clipping polygons. + if (v !== v0) { + point2 = intersect(point0, point1); + if (!point2 || pointEqual(point0, point2) || pointEqual(point1, point2)) { + point1[0] += epsilon$2; + point1[1] += epsilon$2; + v = visible(point1[0], point1[1]); + } + } + if (v !== v0) { + clean = 0; + if (v) { + // outside going in + stream.lineStart(); + point2 = intersect(point1, point0); + stream.point(point2[0], point2[1]); + } else { + // inside going out + point2 = intersect(point0, point1); + stream.point(point2[0], point2[1]); + stream.lineEnd(); + } + point0 = point2; + } else if (notHemisphere && point0 && smallRadius ^ v) { + var t; + // If the codes for two points are different, or are both zero, + // and there this segment intersects with the small circle. + if (!(c & c0) && (t = intersect(point1, point0, true))) { + clean = 0; + if (smallRadius) { + stream.lineStart(); + stream.point(t[0][0], t[0][1]); + stream.point(t[1][0], t[1][1]); + stream.lineEnd(); + } else { + stream.point(t[1][0], t[1][1]); + stream.lineEnd(); + stream.lineStart(); + stream.point(t[0][0], t[0][1]); + } + } + } + if (v && (!point0 || !pointEqual(point0, point1))) { + stream.point(point1[0], point1[1]); + } + point0 = point1, v0 = v, c0 = c; + }, + lineEnd: function() { + if (v0) stream.lineEnd(); + point0 = null; + }, + // Rejoin first and last segments if there were intersections and the first + // and last points were visible. + clean: function() { + return clean | ((v00 && v0) << 1); + } + }; + } + + // Intersects the great circle between a and b with the clip circle. + function intersect(a, b, two) { + var pa = cartesian(a), + pb = cartesian(b); + + // We have two planes, n1.p = d1 and n2.p = d2. + // Find intersection line p(t) = c1 n1 + c2 n2 + t (n1 ⨯ n2). + var n1 = [1, 0, 0], // normal + n2 = cartesianCross(pa, pb), + n2n2 = cartesianDot(n2, n2), + n1n2 = n2[0], // cartesianDot(n1, n2), + determinant = n2n2 - n1n2 * n1n2; + + // Two polar points. + if (!determinant) return !two && a; + + var c1 = cr * n2n2 / determinant, + c2 = -cr * n1n2 / determinant, + n1xn2 = cartesianCross(n1, n2), + A = cartesianScale(n1, c1), + B = cartesianScale(n2, c2); + cartesianAddInPlace(A, B); + + // Solve |p(t)|^2 = 1. + var u = n1xn2, + w = cartesianDot(A, u), + uu = cartesianDot(u, u), + t2 = w * w - uu * (cartesianDot(A, A) - 1); + + if (t2 < 0) return; + + var t = sqrt(t2), + q = cartesianScale(u, (-w - t) / uu); + cartesianAddInPlace(q, A); + q = spherical(q); + + if (!two) return q; + + // Two intersection points. + var lambda0 = a[0], + lambda1 = b[0], + phi0 = a[1], + phi1 = b[1], + z; + + if (lambda1 < lambda0) z = lambda0, lambda0 = lambda1, lambda1 = z; + + var delta = lambda1 - lambda0, + polar = abs(delta - pi$3) < epsilon$2, + meridian = polar || delta < epsilon$2; + + if (!polar && phi1 < phi0) z = phi0, phi0 = phi1, phi1 = z; + + // Check that the first point is between a and b. + if (meridian + ? polar + ? phi0 + phi1 > 0 ^ q[1] < (abs(q[0] - lambda0) < epsilon$2 ? phi0 : phi1) + : phi0 <= q[1] && q[1] <= phi1 + : delta > pi$3 ^ (lambda0 <= q[0] && q[0] <= lambda1)) { + var q1 = cartesianScale(u, (-w + t) / uu); + cartesianAddInPlace(q1, A); + return [q, spherical(q1)]; + } + } + + // Generates a 4-bit vector representing the location of a point relative to + // the small circle's bounding box. + function code(lambda, phi) { + var r = smallRadius ? radius : pi$3 - radius, + code = 0; + if (lambda < -r) code |= 1; // left + else if (lambda > r) code |= 2; // right + if (phi < -r) code |= 4; // below + else if (phi > r) code |= 8; // above + return code; + } + + return clip(visible, clipLine, interpolate, smallRadius ? [0, -radius] : [-pi$3, radius - pi$3]); +}; + +var transform = function(methods) { + return { + stream: transformer(methods) + }; +}; + +function transformer(methods) { + return function(stream) { + var s = new TransformStream; + for (var key in methods) s[key] = methods[key]; + s.stream = stream; + return s; + }; +} + +function TransformStream() {} + +TransformStream.prototype = { + constructor: TransformStream, + point: function(x, y) { this.stream.point(x, y); }, + sphere: function() { this.stream.sphere(); }, + lineStart: function() { this.stream.lineStart(); }, + lineEnd: function() { this.stream.lineEnd(); }, + polygonStart: function() { this.stream.polygonStart(); }, + polygonEnd: function() { this.stream.polygonEnd(); } +}; + +function fitExtent(projection, extent, object) { + var w = extent[1][0] - extent[0][0], + h = extent[1][1] - extent[0][1], + clip = projection.clipExtent && projection.clipExtent(); + + projection + .scale(150) + .translate([0, 0]); + + if (clip != null) projection.clipExtent(null); + + geoStream(object, projection.stream(boundsStream$1)); + + var b = boundsStream$1.result(), + k = Math.min(w / (b[1][0] - b[0][0]), h / (b[1][1] - b[0][1])), + x = +extent[0][0] + (w - k * (b[1][0] + b[0][0])) / 2, + y = +extent[0][1] + (h - k * (b[1][1] + b[0][1])) / 2; + + if (clip != null) projection.clipExtent(clip); + + return projection + .scale(k * 150) + .translate([x, y]); +} + +function fitSize(projection, size, object) { + return fitExtent(projection, [[0, 0], size], object); +} + +var maxDepth = 16; +var cosMinDistance = cos$1(30 * radians); // cos(minimum angular distance) + +var resample = function(project, delta2) { + return +delta2 ? resample$1(project, delta2) : resampleNone(project); +}; + +function resampleNone(project) { + return transformer({ + point: function(x, y) { + x = project(x, y); + this.stream.point(x[0], x[1]); + } + }); +} + +function resample$1(project, delta2) { + + function resampleLineTo(x0, y0, lambda0, a0, b0, c0, x1, y1, lambda1, a1, b1, c1, depth, stream) { + var dx = x1 - x0, + dy = y1 - y0, + d2 = dx * dx + dy * dy; + if (d2 > 4 * delta2 && depth--) { + var a = a0 + a1, + b = b0 + b1, + c = c0 + c1, + m = sqrt(a * a + b * b + c * c), + phi2 = asin(c /= m), + lambda2 = abs(abs(c) - 1) < epsilon$2 || abs(lambda0 - lambda1) < epsilon$2 ? (lambda0 + lambda1) / 2 : atan2(b, a), + p = project(lambda2, phi2), + x2 = p[0], + y2 = p[1], + dx2 = x2 - x0, + dy2 = y2 - y0, + dz = dy * dx2 - dx * dy2; + if (dz * dz / d2 > delta2 // perpendicular projected distance + || abs((dx * dx2 + dy * dy2) / d2 - 0.5) > 0.3 // midpoint close to an end + || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) { // angular distance + resampleLineTo(x0, y0, lambda0, a0, b0, c0, x2, y2, lambda2, a /= m, b /= m, c, depth, stream); + stream.point(x2, y2); + resampleLineTo(x2, y2, lambda2, a, b, c, x1, y1, lambda1, a1, b1, c1, depth, stream); + } + } + } + return function(stream) { + var lambda00, x00, y00, a00, b00, c00, // first point + lambda0, x0, y0, a0, b0, c0; // previous point + + var resampleStream = { + point: point, + lineStart: lineStart, + lineEnd: lineEnd, + polygonStart: function() { stream.polygonStart(); resampleStream.lineStart = ringStart; }, + polygonEnd: function() { stream.polygonEnd(); resampleStream.lineStart = lineStart; } + }; + + function point(x, y) { + x = project(x, y); + stream.point(x[0], x[1]); + } + + function lineStart() { + x0 = NaN; + resampleStream.point = linePoint; + stream.lineStart(); + } + + function linePoint(lambda, phi) { + var c = cartesian([lambda, phi]), p = project(lambda, phi); + resampleLineTo(x0, y0, lambda0, a0, b0, c0, x0 = p[0], y0 = p[1], lambda0 = lambda, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream); + stream.point(x0, y0); + } + + function lineEnd() { + resampleStream.point = point; + stream.lineEnd(); + } + + function ringStart() { + lineStart(); + resampleStream.point = ringPoint; + resampleStream.lineEnd = ringEnd; + } + + function ringPoint(lambda, phi) { + linePoint(lambda00 = lambda, phi), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0; + resampleStream.point = linePoint; + } + + function ringEnd() { + resampleLineTo(x0, y0, lambda0, a0, b0, c0, x00, y00, lambda00, a00, b00, c00, maxDepth, stream); + resampleStream.lineEnd = lineEnd; + lineEnd(); + } + + return resampleStream; + }; +} + +var transformRadians = transformer({ + point: function(x, y) { + this.stream.point(x * radians, y * radians); + } +}); + +function projection(project) { + return projectionMutator(function() { return project; })(); +} + +function projectionMutator(projectAt) { + var project, + k = 150, // scale + x = 480, y = 250, // translate + dx, dy, lambda = 0, phi = 0, // center + deltaLambda = 0, deltaPhi = 0, deltaGamma = 0, rotate, projectRotate, // rotate + theta = null, preclip = clipAntimeridian, // clip angle + x0 = null, y0, x1, y1, postclip = identity$4, // clip extent + delta2 = 0.5, projectResample = resample(projectTransform, delta2), // precision + cache, + cacheStream; + + function projection(point) { + point = projectRotate(point[0] * radians, point[1] * radians); + return [point[0] * k + dx, dy - point[1] * k]; + } + + function invert(point) { + point = projectRotate.invert((point[0] - dx) / k, (dy - point[1]) / k); + return point && [point[0] * degrees$1, point[1] * degrees$1]; + } + + function projectTransform(x, y) { + return x = project(x, y), [x[0] * k + dx, dy - x[1] * k]; + } + + projection.stream = function(stream) { + return cache && cacheStream === stream ? cache : cache = transformRadians(preclip(rotate, projectResample(postclip(cacheStream = stream)))); + }; + + projection.clipAngle = function(_) { + return arguments.length ? (preclip = +_ ? clipCircle(theta = _ * radians, 6 * radians) : (theta = null, clipAntimeridian), reset()) : theta * degrees$1; + }; + + projection.clipExtent = function(_) { + return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity$4) : clipExtent(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]]; + }; + + projection.scale = function(_) { + return arguments.length ? (k = +_, recenter()) : k; + }; + + projection.translate = function(_) { + return arguments.length ? (x = +_[0], y = +_[1], recenter()) : [x, y]; + }; + + projection.center = function(_) { + return arguments.length ? (lambda = _[0] % 360 * radians, phi = _[1] % 360 * radians, recenter()) : [lambda * degrees$1, phi * degrees$1]; + }; + + projection.rotate = function(_) { + return arguments.length ? (deltaLambda = _[0] % 360 * radians, deltaPhi = _[1] % 360 * radians, deltaGamma = _.length > 2 ? _[2] % 360 * radians : 0, recenter()) : [deltaLambda * degrees$1, deltaPhi * degrees$1, deltaGamma * degrees$1]; + }; + + projection.precision = function(_) { + return arguments.length ? (projectResample = resample(projectTransform, delta2 = _ * _), reset()) : sqrt(delta2); + }; + + projection.fitExtent = function(extent, object) { + return fitExtent(projection, extent, object); + }; + + projection.fitSize = function(size, object) { + return fitSize(projection, size, object); + }; + + function recenter() { + projectRotate = compose(rotate = rotateRadians(deltaLambda, deltaPhi, deltaGamma), project); + var center = project(lambda, phi); + dx = x - center[0] * k; + dy = y + center[1] * k; + return reset(); + } + + function reset() { + cache = cacheStream = null; + return projection; + } + + return function() { + project = projectAt.apply(this, arguments); + projection.invert = project.invert && invert; + return recenter(); + }; +} + +function conicProjection(projectAt) { + var phi0 = 0, + phi1 = pi$3 / 3, + m = projectionMutator(projectAt), + p = m(phi0, phi1); + + p.parallels = function(_) { + return arguments.length ? m(phi0 = _[0] * radians, phi1 = _[1] * radians) : [phi0 * degrees$1, phi1 * degrees$1]; + }; + + return p; +} + +function cylindricalEqualAreaRaw(phi0) { + var cosPhi0 = cos$1(phi0); + + function forward(lambda, phi) { + return [lambda * cosPhi0, sin$1(phi) / cosPhi0]; + } + + forward.invert = function(x, y) { + return [x / cosPhi0, asin(y * cosPhi0)]; + }; + + return forward; +} + +function conicEqualAreaRaw(y0, y1) { + var sy0 = sin$1(y0), n = (sy0 + sin$1(y1)) / 2; + + // Are the parallels symmetrical around the Equator? + if (abs(n) < epsilon$2) return cylindricalEqualAreaRaw(y0); + + var c = 1 + sy0 * (2 * n - sy0), r0 = sqrt(c) / n; + + function project(x, y) { + var r = sqrt(c - 2 * n * sin$1(y)) / n; + return [r * sin$1(x *= n), r0 - r * cos$1(x)]; + } + + project.invert = function(x, y) { + var r0y = r0 - y; + return [atan2(x, abs(r0y)) / n * sign(r0y), asin((c - (x * x + r0y * r0y) * n * n) / (2 * n))]; + }; + + return project; +} + +var conicEqualArea = function() { + return conicProjection(conicEqualAreaRaw) + .scale(155.424) + .center([0, 33.6442]); +}; + +var albers = function() { + return conicEqualArea() + .parallels([29.5, 45.5]) + .scale(1070) + .translate([480, 250]) + .rotate([96, 0]) + .center([-0.6, 38.7]); +}; + +// The projections must have mutually exclusive clip regions on the sphere, +// as this will avoid emitting interleaving lines and polygons. +function multiplex(streams) { + var n = streams.length; + return { + point: function(x, y) { var i = -1; while (++i < n) streams[i].point(x, y); }, + sphere: function() { var i = -1; while (++i < n) streams[i].sphere(); }, + lineStart: function() { var i = -1; while (++i < n) streams[i].lineStart(); }, + lineEnd: function() { var i = -1; while (++i < n) streams[i].lineEnd(); }, + polygonStart: function() { var i = -1; while (++i < n) streams[i].polygonStart(); }, + polygonEnd: function() { var i = -1; while (++i < n) streams[i].polygonEnd(); } + }; +} + +// A composite projection for the United States, configured by default for +// 960×500. The projection also works quite well at 960×600 if you change the +// scale to 1285 and adjust the translate accordingly. The set of standard +// parallels for each region comes from USGS, which is published here: +// http://egsc.usgs.gov/isb/pubs/MapProjections/projections.html#albers +var albersUsa = function() { + var cache, + cacheStream, + lower48 = albers(), lower48Point, + alaska = conicEqualArea().rotate([154, 0]).center([-2, 58.5]).parallels([55, 65]), alaskaPoint, // EPSG:3338 + hawaii = conicEqualArea().rotate([157, 0]).center([-3, 19.9]).parallels([8, 18]), hawaiiPoint, // ESRI:102007 + point, pointStream = {point: function(x, y) { point = [x, y]; }}; + + function albersUsa(coordinates) { + var x = coordinates[0], y = coordinates[1]; + return point = null, + (lower48Point.point(x, y), point) + || (alaskaPoint.point(x, y), point) + || (hawaiiPoint.point(x, y), point); + } + + albersUsa.invert = function(coordinates) { + var k = lower48.scale(), + t = lower48.translate(), + x = (coordinates[0] - t[0]) / k, + y = (coordinates[1] - t[1]) / k; + return (y >= 0.120 && y < 0.234 && x >= -0.425 && x < -0.214 ? alaska + : y >= 0.166 && y < 0.234 && x >= -0.214 && x < -0.115 ? hawaii + : lower48).invert(coordinates); + }; + + albersUsa.stream = function(stream) { + return cache && cacheStream === stream ? cache : cache = multiplex([lower48.stream(cacheStream = stream), alaska.stream(stream), hawaii.stream(stream)]); + }; + + albersUsa.precision = function(_) { + if (!arguments.length) return lower48.precision(); + lower48.precision(_), alaska.precision(_), hawaii.precision(_); + return reset(); + }; + + albersUsa.scale = function(_) { + if (!arguments.length) return lower48.scale(); + lower48.scale(_), alaska.scale(_ * 0.35), hawaii.scale(_); + return albersUsa.translate(lower48.translate()); + }; + + albersUsa.translate = function(_) { + if (!arguments.length) return lower48.translate(); + var k = lower48.scale(), x = +_[0], y = +_[1]; + + lower48Point = lower48 + .translate(_) + .clipExtent([[x - 0.455 * k, y - 0.238 * k], [x + 0.455 * k, y + 0.238 * k]]) + .stream(pointStream); + + alaskaPoint = alaska + .translate([x - 0.307 * k, y + 0.201 * k]) + .clipExtent([[x - 0.425 * k + epsilon$2, y + 0.120 * k + epsilon$2], [x - 0.214 * k - epsilon$2, y + 0.234 * k - epsilon$2]]) + .stream(pointStream); + + hawaiiPoint = hawaii + .translate([x - 0.205 * k, y + 0.212 * k]) + .clipExtent([[x - 0.214 * k + epsilon$2, y + 0.166 * k + epsilon$2], [x - 0.115 * k - epsilon$2, y + 0.234 * k - epsilon$2]]) + .stream(pointStream); + + return reset(); + }; + + albersUsa.fitExtent = function(extent, object) { + return fitExtent(albersUsa, extent, object); + }; + + albersUsa.fitSize = function(size, object) { + return fitSize(albersUsa, size, object); + }; + + function reset() { + cache = cacheStream = null; + return albersUsa; + } + + return albersUsa.scale(1070); +}; + +function azimuthalRaw(scale) { + return function(x, y) { + var cx = cos$1(x), + cy = cos$1(y), + k = scale(cx * cy); + return [ + k * cy * sin$1(x), + k * sin$1(y) + ]; + } +} + +function azimuthalInvert(angle) { + return function(x, y) { + var z = sqrt(x * x + y * y), + c = angle(z), + sc = sin$1(c), + cc = cos$1(c); + return [ + atan2(x * sc, z * cc), + asin(z && y * sc / z) + ]; + } +} + +var azimuthalEqualAreaRaw = azimuthalRaw(function(cxcy) { + return sqrt(2 / (1 + cxcy)); +}); + +azimuthalEqualAreaRaw.invert = azimuthalInvert(function(z) { + return 2 * asin(z / 2); +}); + +var azimuthalEqualArea = function() { + return projection(azimuthalEqualAreaRaw) + .scale(124.75) + .clipAngle(180 - 1e-3); +}; + +var azimuthalEquidistantRaw = azimuthalRaw(function(c) { + return (c = acos(c)) && c / sin$1(c); +}); + +azimuthalEquidistantRaw.invert = azimuthalInvert(function(z) { + return z; +}); + +var azimuthalEquidistant = function() { + return projection(azimuthalEquidistantRaw) + .scale(79.4188) + .clipAngle(180 - 1e-3); +}; + +function mercatorRaw(lambda, phi) { + return [lambda, log(tan((halfPi$2 + phi) / 2))]; +} + +mercatorRaw.invert = function(x, y) { + return [x, 2 * atan(exp(y)) - halfPi$2]; +}; + +var mercator = function() { + return mercatorProjection(mercatorRaw) + .scale(961 / tau$3); +}; + +function mercatorProjection(project) { + var m = projection(project), + center = m.center, + scale = m.scale, + translate = m.translate, + clipExtent = m.clipExtent, + x0 = null, y0, x1, y1; // clip extent + + m.scale = function(_) { + return arguments.length ? (scale(_), reclip()) : scale(); + }; + + m.translate = function(_) { + return arguments.length ? (translate(_), reclip()) : translate(); + }; + + m.center = function(_) { + return arguments.length ? (center(_), reclip()) : center(); + }; + + m.clipExtent = function(_) { + return arguments.length ? ((_ == null ? x0 = y0 = x1 = y1 = null : (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1])), reclip()) : x0 == null ? null : [[x0, y0], [x1, y1]]; + }; + + function reclip() { + var k = pi$3 * scale(), + t = m(rotation(m.rotate()).invert([0, 0])); + return clipExtent(x0 == null + ? [[t[0] - k, t[1] - k], [t[0] + k, t[1] + k]] : project === mercatorRaw + ? [[Math.max(t[0] - k, x0), y0], [Math.min(t[0] + k, x1), y1]] + : [[x0, Math.max(t[1] - k, y0)], [x1, Math.min(t[1] + k, y1)]]); + } + + return reclip(); +} + +function tany(y) { + return tan((halfPi$2 + y) / 2); +} + +function conicConformalRaw(y0, y1) { + var cy0 = cos$1(y0), + n = y0 === y1 ? sin$1(y0) : log(cy0 / cos$1(y1)) / log(tany(y1) / tany(y0)), + f = cy0 * pow(tany(y0), n) / n; + + if (!n) return mercatorRaw; + + function project(x, y) { + if (f > 0) { if (y < -halfPi$2 + epsilon$2) y = -halfPi$2 + epsilon$2; } + else { if (y > halfPi$2 - epsilon$2) y = halfPi$2 - epsilon$2; } + var r = f / pow(tany(y), n); + return [r * sin$1(n * x), f - r * cos$1(n * x)]; + } + + project.invert = function(x, y) { + var fy = f - y, r = sign(n) * sqrt(x * x + fy * fy); + return [atan2(x, abs(fy)) / n * sign(fy), 2 * atan(pow(f / r, 1 / n)) - halfPi$2]; + }; + + return project; +} + +var conicConformal = function() { + return conicProjection(conicConformalRaw) + .scale(109.5) + .parallels([30, 30]); +}; + +function equirectangularRaw(lambda, phi) { + return [lambda, phi]; +} + +equirectangularRaw.invert = equirectangularRaw; + +var equirectangular = function() { + return projection(equirectangularRaw) + .scale(152.63); +}; + +function conicEquidistantRaw(y0, y1) { + var cy0 = cos$1(y0), + n = y0 === y1 ? sin$1(y0) : (cy0 - cos$1(y1)) / (y1 - y0), + g = cy0 / n + y0; + + if (abs(n) < epsilon$2) return equirectangularRaw; + + function project(x, y) { + var gy = g - y, nx = n * x; + return [gy * sin$1(nx), g - gy * cos$1(nx)]; + } + + project.invert = function(x, y) { + var gy = g - y; + return [atan2(x, abs(gy)) / n * sign(gy), g - sign(n) * sqrt(x * x + gy * gy)]; + }; + + return project; +} + +var conicEquidistant = function() { + return conicProjection(conicEquidistantRaw) + .scale(131.154) + .center([0, 13.9389]); +}; + +function gnomonicRaw(x, y) { + var cy = cos$1(y), k = cos$1(x) * cy; + return [cy * sin$1(x) / k, sin$1(y) / k]; +} + +gnomonicRaw.invert = azimuthalInvert(atan); + +var gnomonic = function() { + return projection(gnomonicRaw) + .scale(144.049) + .clipAngle(60); +}; + +function scaleTranslate(kx, ky, tx, ty) { + return kx === 1 && ky === 1 && tx === 0 && ty === 0 ? identity$4 : transformer({ + point: function(x, y) { + this.stream.point(x * kx + tx, y * ky + ty); + } + }); +} + +var identity$5 = function() { + var k = 1, tx = 0, ty = 0, sx = 1, sy = 1, transform = identity$4, // scale, translate and reflect + x0 = null, y0, x1, y1, clip = identity$4, // clip extent + cache, + cacheStream, + projection; + + function reset() { + cache = cacheStream = null; + return projection; + } + + return projection = { + stream: function(stream) { + return cache && cacheStream === stream ? cache : cache = transform(clip(cacheStream = stream)); + }, + clipExtent: function(_) { + return arguments.length ? (clip = _ == null ? (x0 = y0 = x1 = y1 = null, identity$4) : clipExtent(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]]; + }, + scale: function(_) { + return arguments.length ? (transform = scaleTranslate((k = +_) * sx, k * sy, tx, ty), reset()) : k; + }, + translate: function(_) { + return arguments.length ? (transform = scaleTranslate(k * sx, k * sy, tx = +_[0], ty = +_[1]), reset()) : [tx, ty]; + }, + reflectX: function(_) { + return arguments.length ? (transform = scaleTranslate(k * (sx = _ ? -1 : 1), k * sy, tx, ty), reset()) : sx < 0; + }, + reflectY: function(_) { + return arguments.length ? (transform = scaleTranslate(k * sx, k * (sy = _ ? -1 : 1), tx, ty), reset()) : sy < 0; + }, + fitExtent: function(extent, object) { + return fitExtent(projection, extent, object); + }, + fitSize: function(size, object) { + return fitSize(projection, size, object); + } + }; +}; + +function orthographicRaw(x, y) { + return [cos$1(y) * sin$1(x), sin$1(y)]; +} + +orthographicRaw.invert = azimuthalInvert(asin); + +var orthographic = function() { + return projection(orthographicRaw) + .scale(249.5) + .clipAngle(90 + epsilon$2); +}; + +function stereographicRaw(x, y) { + var cy = cos$1(y), k = 1 + cos$1(x) * cy; + return [cy * sin$1(x) / k, sin$1(y) / k]; +} + +stereographicRaw.invert = azimuthalInvert(function(z) { + return 2 * atan(z); +}); + +var stereographic = function() { + return projection(stereographicRaw) + .scale(250) + .clipAngle(142); +}; + +function transverseMercatorRaw(lambda, phi) { + return [log(tan((halfPi$2 + phi) / 2)), -lambda]; +} + +transverseMercatorRaw.invert = function(x, y) { + return [-y, 2 * atan(exp(x)) - halfPi$2]; +}; + +var transverseMercator = function() { + var m = mercatorProjection(transverseMercatorRaw), + center = m.center, + rotate = m.rotate; + + m.center = function(_) { + return arguments.length ? center([-_[1], _[0]]) : (_ = center(), [_[1], -_[0]]); + }; + + m.rotate = function(_) { + return arguments.length ? rotate([_[0], _[1], _.length > 2 ? _[2] + 90 : 90]) : (_ = rotate(), [_[0], _[1], _[2] - 90]); + }; + + return rotate([0, 0, 90]) + .scale(159.155); +}; + +function defaultSeparation(a, b) { + return a.parent === b.parent ? 1 : 2; +} + +function meanX(children) { + return children.reduce(meanXReduce, 0) / children.length; +} + +function meanXReduce(x, c) { + return x + c.x; +} + +function maxY(children) { + return 1 + children.reduce(maxYReduce, 0); +} + +function maxYReduce(y, c) { + return Math.max(y, c.y); +} + +function leafLeft(node) { + var children; + while (children = node.children) node = children[0]; + return node; +} + +function leafRight(node) { + var children; + while (children = node.children) node = children[children.length - 1]; + return node; +} + +var cluster = function() { + var separation = defaultSeparation, + dx = 1, + dy = 1, + nodeSize = false; + + function cluster(root) { + var previousNode, + x = 0; + + // First walk, computing the initial x & y values. + root.eachAfter(function(node) { + var children = node.children; + if (children) { + node.x = meanX(children); + node.y = maxY(children); + } else { + node.x = previousNode ? x += separation(node, previousNode) : 0; + node.y = 0; + previousNode = node; + } + }); + + var left = leafLeft(root), + right = leafRight(root), + x0 = left.x - separation(left, right) / 2, + x1 = right.x + separation(right, left) / 2; + + // Second walk, normalizing x & y to the desired size. + return root.eachAfter(nodeSize ? function(node) { + node.x = (node.x - root.x) * dx; + node.y = (root.y - node.y) * dy; + } : function(node) { + node.x = (node.x - x0) / (x1 - x0) * dx; + node.y = (1 - (root.y ? node.y / root.y : 1)) * dy; + }); + } + + cluster.separation = function(x) { + return arguments.length ? (separation = x, cluster) : separation; + }; + + cluster.size = function(x) { + return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? null : [dx, dy]); + }; + + cluster.nodeSize = function(x) { + return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? [dx, dy] : null); + }; + + return cluster; +}; + +function count(node) { + var sum = 0, + children = node.children, + i = children && children.length; + if (!i) sum = 1; + else while (--i >= 0) sum += children[i].value; + node.value = sum; +} + +var node_count = function() { + return this.eachAfter(count); +}; + +var node_each = function(callback) { + var node = this, current, next = [node], children, i, n; + do { + current = next.reverse(), next = []; + while (node = current.pop()) { + callback(node), children = node.children; + if (children) for (i = 0, n = children.length; i < n; ++i) { + next.push(children[i]); + } + } + } while (next.length); + return this; +}; + +var node_eachBefore = function(callback) { + var node = this, nodes = [node], children, i; + while (node = nodes.pop()) { + callback(node), children = node.children; + if (children) for (i = children.length - 1; i >= 0; --i) { + nodes.push(children[i]); + } + } + return this; +}; + +var node_eachAfter = function(callback) { + var node = this, nodes = [node], next = [], children, i, n; + while (node = nodes.pop()) { + next.push(node), children = node.children; + if (children) for (i = 0, n = children.length; i < n; ++i) { + nodes.push(children[i]); + } + } + while (node = next.pop()) { + callback(node); + } + return this; +}; + +var node_sum = function(value) { + return this.eachAfter(function(node) { + var sum = +value(node.data) || 0, + children = node.children, + i = children && children.length; + while (--i >= 0) sum += children[i].value; + node.value = sum; + }); +}; + +var node_sort = function(compare) { + return this.eachBefore(function(node) { + if (node.children) { + node.children.sort(compare); + } + }); +}; + +var node_path = function(end) { + var start = this, + ancestor = leastCommonAncestor(start, end), + nodes = [start]; + while (start !== ancestor) { + start = start.parent; + nodes.push(start); + } + var k = nodes.length; + while (end !== ancestor) { + nodes.splice(k, 0, end); + end = end.parent; + } + return nodes; +}; + +function leastCommonAncestor(a, b) { + if (a === b) return a; + var aNodes = a.ancestors(), + bNodes = b.ancestors(), + c = null; + a = aNodes.pop(); + b = bNodes.pop(); + while (a === b) { + c = a; + a = aNodes.pop(); + b = bNodes.pop(); + } + return c; +} + +var node_ancestors = function() { + var node = this, nodes = [node]; + while (node = node.parent) { + nodes.push(node); + } + return nodes; +}; + +var node_descendants = function() { + var nodes = []; + this.each(function(node) { + nodes.push(node); + }); + return nodes; +}; + +var node_leaves = function() { + var leaves = []; + this.eachBefore(function(node) { + if (!node.children) { + leaves.push(node); + } + }); + return leaves; +}; + +var node_links = function() { + var root = this, links = []; + root.each(function(node) { + if (node !== root) { // Don’t include the root’s parent, if any. + links.push({source: node.parent, target: node}); + } + }); + return links; +}; + +function hierarchy(data, children) { + var root = new Node(data), + valued = +data.value && (root.value = data.value), + node, + nodes = [root], + child, + childs, + i, + n; + + if (children == null) children = defaultChildren; + + while (node = nodes.pop()) { + if (valued) node.value = +node.data.value; + if ((childs = children(node.data)) && (n = childs.length)) { + node.children = new Array(n); + for (i = n - 1; i >= 0; --i) { + nodes.push(child = node.children[i] = new Node(childs[i])); + child.parent = node; + child.depth = node.depth + 1; + } + } + } + + return root.eachBefore(computeHeight); +} + +function node_copy() { + return hierarchy(this).eachBefore(copyData); +} + +function defaultChildren(d) { + return d.children; +} + +function copyData(node) { + node.data = node.data.data; +} + +function computeHeight(node) { + var height = 0; + do node.height = height; + while ((node = node.parent) && (node.height < ++height)); +} + +function Node(data) { + this.data = data; + this.depth = + this.height = 0; + this.parent = null; +} + +Node.prototype = hierarchy.prototype = { + constructor: Node, + count: node_count, + each: node_each, + eachAfter: node_eachAfter, + eachBefore: node_eachBefore, + sum: node_sum, + sort: node_sort, + path: node_path, + ancestors: node_ancestors, + descendants: node_descendants, + leaves: node_leaves, + links: node_links, + copy: node_copy +}; + +function Node$2(value) { + this._ = value; + this.next = null; +} + +var shuffle$1 = function(array) { + var i, + n = (array = array.slice()).length, + head = null, + node = head; + + while (n) { + var next = new Node$2(array[n - 1]); + if (node) node = node.next = next; + else node = head = next; + array[i] = array[--n]; + } + + return { + head: head, + tail: node + }; +}; + +var enclose = function(circles) { + return encloseN(shuffle$1(circles), []); +}; + +function encloses(a, b) { + var dx = b.x - a.x, + dy = b.y - a.y, + dr = a.r - b.r; + return dr * dr + 1e-6 > dx * dx + dy * dy; +} + +// Returns the smallest circle that contains circles L and intersects circles B. +function encloseN(L, B) { + var circle, + l0 = null, + l1 = L.head, + l2, + p1; + + switch (B.length) { + case 1: circle = enclose1(B[0]); break; + case 2: circle = enclose2(B[0], B[1]); break; + case 3: circle = enclose3(B[0], B[1], B[2]); break; + } + + while (l1) { + p1 = l1._, l2 = l1.next; + if (!circle || !encloses(circle, p1)) { + + // Temporarily truncate L before l1. + if (l0) L.tail = l0, l0.next = null; + else L.head = L.tail = null; + + B.push(p1); + circle = encloseN(L, B); // Note: reorders L! + B.pop(); + + // Move l1 to the front of L and reconnect the truncated list L. + if (L.head) l1.next = L.head, L.head = l1; + else l1.next = null, L.head = L.tail = l1; + l0 = L.tail, l0.next = l2; + + } else { + l0 = l1; + } + l1 = l2; + } + + L.tail = l0; + return circle; +} + +function enclose1(a) { + return { + x: a.x, + y: a.y, + r: a.r + }; +} + +function enclose2(a, b) { + var x1 = a.x, y1 = a.y, r1 = a.r, + x2 = b.x, y2 = b.y, r2 = b.r, + x21 = x2 - x1, y21 = y2 - y1, r21 = r2 - r1, + l = Math.sqrt(x21 * x21 + y21 * y21); + return { + x: (x1 + x2 + x21 / l * r21) / 2, + y: (y1 + y2 + y21 / l * r21) / 2, + r: (l + r1 + r2) / 2 + }; +} + +function enclose3(a, b, c) { + var x1 = a.x, y1 = a.y, r1 = a.r, + x2 = b.x, y2 = b.y, r2 = b.r, + x3 = c.x, y3 = c.y, r3 = c.r, + a2 = 2 * (x1 - x2), + b2 = 2 * (y1 - y2), + c2 = 2 * (r2 - r1), + d2 = x1 * x1 + y1 * y1 - r1 * r1 - x2 * x2 - y2 * y2 + r2 * r2, + a3 = 2 * (x1 - x3), + b3 = 2 * (y1 - y3), + c3 = 2 * (r3 - r1), + d3 = x1 * x1 + y1 * y1 - r1 * r1 - x3 * x3 - y3 * y3 + r3 * r3, + ab = a3 * b2 - a2 * b3, + xa = (b2 * d3 - b3 * d2) / ab - x1, + xb = (b3 * c2 - b2 * c3) / ab, + ya = (a3 * d2 - a2 * d3) / ab - y1, + yb = (a2 * c3 - a3 * c2) / ab, + A = xb * xb + yb * yb - 1, + B = 2 * (xa * xb + ya * yb + r1), + C = xa * xa + ya * ya - r1 * r1, + r = (-B - Math.sqrt(B * B - 4 * A * C)) / (2 * A); + return { + x: xa + xb * r + x1, + y: ya + yb * r + y1, + r: r + }; +} + +function place(a, b, c) { + var ax = a.x, + ay = a.y, + da = b.r + c.r, + db = a.r + c.r, + dx = b.x - ax, + dy = b.y - ay, + dc = dx * dx + dy * dy; + if (dc) { + var x = 0.5 + ((db *= db) - (da *= da)) / (2 * dc), + y = Math.sqrt(Math.max(0, 2 * da * (db + dc) - (db -= dc) * db - da * da)) / (2 * dc); + c.x = ax + x * dx + y * dy; + c.y = ay + x * dy - y * dx; + } else { + c.x = ax + db; + c.y = ay; + } +} + +function intersects(a, b) { + var dx = b.x - a.x, + dy = b.y - a.y, + dr = a.r + b.r; + return dr * dr - 1e-6 > dx * dx + dy * dy; +} + +function distance2(node, x, y) { + var a = node._, + b = node.next._, + ab = a.r + b.r, + dx = (a.x * b.r + b.x * a.r) / ab - x, + dy = (a.y * b.r + b.y * a.r) / ab - y; + return dx * dx + dy * dy; +} + +function Node$1(circle) { + this._ = circle; + this.next = null; + this.previous = null; +} + +function packEnclose(circles) { + if (!(n = circles.length)) return 0; + + var a, b, c, n; + + // Place the first circle. + a = circles[0], a.x = 0, a.y = 0; + if (!(n > 1)) return a.r; + + // Place the second circle. + b = circles[1], a.x = -b.r, b.x = a.r, b.y = 0; + if (!(n > 2)) return a.r + b.r; + + // Place the third circle. + place(b, a, c = circles[2]); + + // Initialize the weighted centroid. + var aa = a.r * a.r, + ba = b.r * b.r, + ca = c.r * c.r, + oa = aa + ba + ca, + ox = aa * a.x + ba * b.x + ca * c.x, + oy = aa * a.y + ba * b.y + ca * c.y, + cx, cy, i, j, k, sj, sk; + + // Initialize the front-chain using the first three circles a, b and c. + a = new Node$1(a), b = new Node$1(b), c = new Node$1(c); + a.next = c.previous = b; + b.next = a.previous = c; + c.next = b.previous = a; + + // Attempt to place each remaining circle… + pack: for (i = 3; i < n; ++i) { + place(a._, b._, c = circles[i]), c = new Node$1(c); + + // Find the closest intersecting circle on the front-chain, if any. + // “Closeness” is determined by linear distance along the front-chain. + // “Ahead” or “behind” is likewise determined by linear distance. + j = b.next, k = a.previous, sj = b._.r, sk = a._.r; + do { + if (sj <= sk) { + if (intersects(j._, c._)) { + b = j, a.next = b, b.previous = a, --i; + continue pack; + } + sj += j._.r, j = j.next; + } else { + if (intersects(k._, c._)) { + a = k, a.next = b, b.previous = a, --i; + continue pack; + } + sk += k._.r, k = k.previous; + } + } while (j !== k.next); + + // Success! Insert the new circle c between a and b. + c.previous = a, c.next = b, a.next = b.previous = b = c; + + // Update the weighted centroid. + oa += ca = c._.r * c._.r; + ox += ca * c._.x; + oy += ca * c._.y; + + // Compute the new closest circle pair to the centroid. + aa = distance2(a, cx = ox / oa, cy = oy / oa); + while ((c = c.next) !== b) { + if ((ca = distance2(c, cx, cy)) < aa) { + a = c, aa = ca; + } + } + b = a.next; + } + + // Compute the enclosing circle of the front chain. + a = [b._], c = b; while ((c = c.next) !== b) a.push(c._); c = enclose(a); + + // Translate the circles to put the enclosing circle around the origin. + for (i = 0; i < n; ++i) a = circles[i], a.x -= c.x, a.y -= c.y; + + return c.r; +} + +var siblings = function(circles) { + packEnclose(circles); + return circles; +}; + +function optional(f) { + return f == null ? null : required(f); +} + +function required(f) { + if (typeof f !== "function") throw new Error; + return f; +} + +function constantZero() { + return 0; +} + +var constant$8 = function(x) { + return function() { + return x; + }; +}; + +function defaultRadius$1(d) { + return Math.sqrt(d.value); +} + +var index$2 = function() { + var radius = null, + dx = 1, + dy = 1, + padding = constantZero; + + function pack(root) { + root.x = dx / 2, root.y = dy / 2; + if (radius) { + root.eachBefore(radiusLeaf(radius)) + .eachAfter(packChildren(padding, 0.5)) + .eachBefore(translateChild(1)); + } else { + root.eachBefore(radiusLeaf(defaultRadius$1)) + .eachAfter(packChildren(constantZero, 1)) + .eachAfter(packChildren(padding, root.r / Math.min(dx, dy))) + .eachBefore(translateChild(Math.min(dx, dy) / (2 * root.r))); + } + return root; + } + + pack.radius = function(x) { + return arguments.length ? (radius = optional(x), pack) : radius; + }; + + pack.size = function(x) { + return arguments.length ? (dx = +x[0], dy = +x[1], pack) : [dx, dy]; + }; + + pack.padding = function(x) { + return arguments.length ? (padding = typeof x === "function" ? x : constant$8(+x), pack) : padding; + }; + + return pack; +}; + +function radiusLeaf(radius) { + return function(node) { + if (!node.children) { + node.r = Math.max(0, +radius(node) || 0); + } + }; +} + +function packChildren(padding, k) { + return function(node) { + if (children = node.children) { + var children, + i, + n = children.length, + r = padding(node) * k || 0, + e; + + if (r) for (i = 0; i < n; ++i) children[i].r += r; + e = packEnclose(children); + if (r) for (i = 0; i < n; ++i) children[i].r -= r; + node.r = e + r; + } + }; +} + +function translateChild(k) { + return function(node) { + var parent = node.parent; + node.r *= k; + if (parent) { + node.x = parent.x + k * node.x; + node.y = parent.y + k * node.y; + } + }; +} + +var roundNode = function(node) { + node.x0 = Math.round(node.x0); + node.y0 = Math.round(node.y0); + node.x1 = Math.round(node.x1); + node.y1 = Math.round(node.y1); +}; + +var treemapDice = function(parent, x0, y0, x1, y1) { + var nodes = parent.children, + node, + i = -1, + n = nodes.length, + k = parent.value && (x1 - x0) / parent.value; + + while (++i < n) { + node = nodes[i], node.y0 = y0, node.y1 = y1; + node.x0 = x0, node.x1 = x0 += node.value * k; + } +}; + +var partition = function() { + var dx = 1, + dy = 1, + padding = 0, + round = false; + + function partition(root) { + var n = root.height + 1; + root.x0 = + root.y0 = padding; + root.x1 = dx; + root.y1 = dy / n; + root.eachBefore(positionNode(dy, n)); + if (round) root.eachBefore(roundNode); + return root; + } + + function positionNode(dy, n) { + return function(node) { + if (node.children) { + treemapDice(node, node.x0, dy * (node.depth + 1) / n, node.x1, dy * (node.depth + 2) / n); + } + var x0 = node.x0, + y0 = node.y0, + x1 = node.x1 - padding, + y1 = node.y1 - padding; + if (x1 < x0) x0 = x1 = (x0 + x1) / 2; + if (y1 < y0) y0 = y1 = (y0 + y1) / 2; + node.x0 = x0; + node.y0 = y0; + node.x1 = x1; + node.y1 = y1; + }; + } + + partition.round = function(x) { + return arguments.length ? (round = !!x, partition) : round; + }; + + partition.size = function(x) { + return arguments.length ? (dx = +x[0], dy = +x[1], partition) : [dx, dy]; + }; + + partition.padding = function(x) { + return arguments.length ? (padding = +x, partition) : padding; + }; + + return partition; +}; + +var keyPrefix$1 = "$"; +var preroot = {depth: -1}; +var ambiguous = {}; + +function defaultId(d) { + return d.id; +} + +function defaultParentId(d) { + return d.parentId; +} + +var stratify = function() { + var id = defaultId, + parentId = defaultParentId; + + function stratify(data) { + var d, + i, + n = data.length, + root, + parent, + node, + nodes = new Array(n), + nodeId, + nodeKey, + nodeByKey = {}; + + for (i = 0; i < n; ++i) { + d = data[i], node = nodes[i] = new Node(d); + if ((nodeId = id(d, i, data)) != null && (nodeId += "")) { + nodeKey = keyPrefix$1 + (node.id = nodeId); + nodeByKey[nodeKey] = nodeKey in nodeByKey ? ambiguous : node; + } + } + + for (i = 0; i < n; ++i) { + node = nodes[i], nodeId = parentId(data[i], i, data); + if (nodeId == null || !(nodeId += "")) { + if (root) throw new Error("multiple roots"); + root = node; + } else { + parent = nodeByKey[keyPrefix$1 + nodeId]; + if (!parent) throw new Error("missing: " + nodeId); + if (parent === ambiguous) throw new Error("ambiguous: " + nodeId); + if (parent.children) parent.children.push(node); + else parent.children = [node]; + node.parent = parent; + } + } + + if (!root) throw new Error("no root"); + root.parent = preroot; + root.eachBefore(function(node) { node.depth = node.parent.depth + 1; --n; }).eachBefore(computeHeight); + root.parent = null; + if (n > 0) throw new Error("cycle"); + + return root; + } + + stratify.id = function(x) { + return arguments.length ? (id = required(x), stratify) : id; + }; + + stratify.parentId = function(x) { + return arguments.length ? (parentId = required(x), stratify) : parentId; + }; + + return stratify; +}; + +function defaultSeparation$1(a, b) { + return a.parent === b.parent ? 1 : 2; +} + +// function radialSeparation(a, b) { +// return (a.parent === b.parent ? 1 : 2) / a.depth; +// } + +// This function is used to traverse the left contour of a subtree (or +// subforest). It returns the successor of v on this contour. This successor is +// either given by the leftmost child of v or by the thread of v. The function +// returns null if and only if v is on the highest level of its subtree. +function nextLeft(v) { + var children = v.children; + return children ? children[0] : v.t; +} + +// This function works analogously to nextLeft. +function nextRight(v) { + var children = v.children; + return children ? children[children.length - 1] : v.t; +} + +// Shifts the current subtree rooted at w+. This is done by increasing +// prelim(w+) and mod(w+) by shift. +function moveSubtree(wm, wp, shift) { + var change = shift / (wp.i - wm.i); + wp.c -= change; + wp.s += shift; + wm.c += change; + wp.z += shift; + wp.m += shift; +} + +// All other shifts, applied to the smaller subtrees between w- and w+, are +// performed by this function. To prepare the shifts, we have to adjust +// change(w+), shift(w+), and change(w-). +function executeShifts(v) { + var shift = 0, + change = 0, + children = v.children, + i = children.length, + w; + while (--i >= 0) { + w = children[i]; + w.z += shift; + w.m += shift; + shift += w.s + (change += w.c); + } +} + +// If vi-’s ancestor is a sibling of v, returns vi-’s ancestor. Otherwise, +// returns the specified (default) ancestor. +function nextAncestor(vim, v, ancestor) { + return vim.a.parent === v.parent ? vim.a : ancestor; +} + +function TreeNode(node, i) { + this._ = node; + this.parent = null; + this.children = null; + this.A = null; // default ancestor + this.a = this; // ancestor + this.z = 0; // prelim + this.m = 0; // mod + this.c = 0; // change + this.s = 0; // shift + this.t = null; // thread + this.i = i; // number +} + +TreeNode.prototype = Object.create(Node.prototype); + +function treeRoot(root) { + var tree = new TreeNode(root, 0), + node, + nodes = [tree], + child, + children, + i, + n; + + while (node = nodes.pop()) { + if (children = node._.children) { + node.children = new Array(n = children.length); + for (i = n - 1; i >= 0; --i) { + nodes.push(child = node.children[i] = new TreeNode(children[i], i)); + child.parent = node; + } + } + } + + (tree.parent = new TreeNode(null, 0)).children = [tree]; + return tree; +} + +// Node-link tree diagram using the Reingold-Tilford "tidy" algorithm +var tree = function() { + var separation = defaultSeparation$1, + dx = 1, + dy = 1, + nodeSize = null; + + function tree(root) { + var t = treeRoot(root); + + // Compute the layout using Buchheim et al.’s algorithm. + t.eachAfter(firstWalk), t.parent.m = -t.z; + t.eachBefore(secondWalk); + + // If a fixed node size is specified, scale x and y. + if (nodeSize) root.eachBefore(sizeNode); + + // If a fixed tree size is specified, scale x and y based on the extent. + // Compute the left-most, right-most, and depth-most nodes for extents. + else { + var left = root, + right = root, + bottom = root; + root.eachBefore(function(node) { + if (node.x < left.x) left = node; + if (node.x > right.x) right = node; + if (node.depth > bottom.depth) bottom = node; + }); + var s = left === right ? 1 : separation(left, right) / 2, + tx = s - left.x, + kx = dx / (right.x + s + tx), + ky = dy / (bottom.depth || 1); + root.eachBefore(function(node) { + node.x = (node.x + tx) * kx; + node.y = node.depth * ky; + }); + } + + return root; + } + + // Computes a preliminary x-coordinate for v. Before that, FIRST WALK is + // applied recursively to the children of v, as well as the function + // APPORTION. After spacing out the children by calling EXECUTE SHIFTS, the + // node v is placed to the midpoint of its outermost children. + function firstWalk(v) { + var children = v.children, + siblings = v.parent.children, + w = v.i ? siblings[v.i - 1] : null; + if (children) { + executeShifts(v); + var midpoint = (children[0].z + children[children.length - 1].z) / 2; + if (w) { + v.z = w.z + separation(v._, w._); + v.m = v.z - midpoint; + } else { + v.z = midpoint; + } + } else if (w) { + v.z = w.z + separation(v._, w._); + } + v.parent.A = apportion(v, w, v.parent.A || siblings[0]); + } + + // Computes all real x-coordinates by summing up the modifiers recursively. + function secondWalk(v) { + v._.x = v.z + v.parent.m; + v.m += v.parent.m; + } + + // The core of the algorithm. Here, a new subtree is combined with the + // previous subtrees. Threads are used to traverse the inside and outside + // contours of the left and right subtree up to the highest common level. The + // vertices used for the traversals are vi+, vi-, vo-, and vo+, where the + // superscript o means outside and i means inside, the subscript - means left + // subtree and + means right subtree. For summing up the modifiers along the + // contour, we use respective variables si+, si-, so-, and so+. Whenever two + // nodes of the inside contours conflict, we compute the left one of the + // greatest uncommon ancestors using the function ANCESTOR and call MOVE + // SUBTREE to shift the subtree and prepare the shifts of smaller subtrees. + // Finally, we add a new thread (if necessary). + function apportion(v, w, ancestor) { + if (w) { + var vip = v, + vop = v, + vim = w, + vom = vip.parent.children[0], + sip = vip.m, + sop = vop.m, + sim = vim.m, + som = vom.m, + shift; + while (vim = nextRight(vim), vip = nextLeft(vip), vim && vip) { + vom = nextLeft(vom); + vop = nextRight(vop); + vop.a = v; + shift = vim.z + sim - vip.z - sip + separation(vim._, vip._); + if (shift > 0) { + moveSubtree(nextAncestor(vim, v, ancestor), v, shift); + sip += shift; + sop += shift; + } + sim += vim.m; + sip += vip.m; + som += vom.m; + sop += vop.m; + } + if (vim && !nextRight(vop)) { + vop.t = vim; + vop.m += sim - sop; + } + if (vip && !nextLeft(vom)) { + vom.t = vip; + vom.m += sip - som; + ancestor = v; + } + } + return ancestor; + } + + function sizeNode(node) { + node.x *= dx; + node.y = node.depth * dy; + } + + tree.separation = function(x) { + return arguments.length ? (separation = x, tree) : separation; + }; + + tree.size = function(x) { + return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], tree) : (nodeSize ? null : [dx, dy]); + }; + + tree.nodeSize = function(x) { + return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], tree) : (nodeSize ? [dx, dy] : null); + }; + + return tree; +}; + +var treemapSlice = function(parent, x0, y0, x1, y1) { + var nodes = parent.children, + node, + i = -1, + n = nodes.length, + k = parent.value && (y1 - y0) / parent.value; + + while (++i < n) { + node = nodes[i], node.x0 = x0, node.x1 = x1; + node.y0 = y0, node.y1 = y0 += node.value * k; + } +}; + +var phi = (1 + Math.sqrt(5)) / 2; + +function squarifyRatio(ratio, parent, x0, y0, x1, y1) { + var rows = [], + nodes = parent.children, + row, + nodeValue, + i0 = 0, + i1 = 0, + n = nodes.length, + dx, dy, + value = parent.value, + sumValue, + minValue, + maxValue, + newRatio, + minRatio, + alpha, + beta; + + while (i0 < n) { + dx = x1 - x0, dy = y1 - y0; + + // Find the next non-empty node. + do sumValue = nodes[i1++].value; while (!sumValue && i1 < n); + minValue = maxValue = sumValue; + alpha = Math.max(dy / dx, dx / dy) / (value * ratio); + beta = sumValue * sumValue * alpha; + minRatio = Math.max(maxValue / beta, beta / minValue); + + // Keep adding nodes while the aspect ratio maintains or improves. + for (; i1 < n; ++i1) { + sumValue += nodeValue = nodes[i1].value; + if (nodeValue < minValue) minValue = nodeValue; + if (nodeValue > maxValue) maxValue = nodeValue; + beta = sumValue * sumValue * alpha; + newRatio = Math.max(maxValue / beta, beta / minValue); + if (newRatio > minRatio) { sumValue -= nodeValue; break; } + minRatio = newRatio; + } + + // Position and record the row orientation. + rows.push(row = {value: sumValue, dice: dx < dy, children: nodes.slice(i0, i1)}); + if (row.dice) treemapDice(row, x0, y0, x1, value ? y0 += dy * sumValue / value : y1); + else treemapSlice(row, x0, y0, value ? x0 += dx * sumValue / value : x1, y1); + value -= sumValue, i0 = i1; + } + + return rows; +} + +var squarify = ((function custom(ratio) { + + function squarify(parent, x0, y0, x1, y1) { + squarifyRatio(ratio, parent, x0, y0, x1, y1); + } + + squarify.ratio = function(x) { + return custom((x = +x) > 1 ? x : 1); + }; + + return squarify; +}))(phi); + +var index$3 = function() { + var tile = squarify, + round = false, + dx = 1, + dy = 1, + paddingStack = [0], + paddingInner = constantZero, + paddingTop = constantZero, + paddingRight = constantZero, + paddingBottom = constantZero, + paddingLeft = constantZero; + + function treemap(root) { + root.x0 = + root.y0 = 0; + root.x1 = dx; + root.y1 = dy; + root.eachBefore(positionNode); + paddingStack = [0]; + if (round) root.eachBefore(roundNode); + return root; + } + + function positionNode(node) { + var p = paddingStack[node.depth], + x0 = node.x0 + p, + y0 = node.y0 + p, + x1 = node.x1 - p, + y1 = node.y1 - p; + if (x1 < x0) x0 = x1 = (x0 + x1) / 2; + if (y1 < y0) y0 = y1 = (y0 + y1) / 2; + node.x0 = x0; + node.y0 = y0; + node.x1 = x1; + node.y1 = y1; + if (node.children) { + p = paddingStack[node.depth + 1] = paddingInner(node) / 2; + x0 += paddingLeft(node) - p; + y0 += paddingTop(node) - p; + x1 -= paddingRight(node) - p; + y1 -= paddingBottom(node) - p; + if (x1 < x0) x0 = x1 = (x0 + x1) / 2; + if (y1 < y0) y0 = y1 = (y0 + y1) / 2; + tile(node, x0, y0, x1, y1); + } + } + + treemap.round = function(x) { + return arguments.length ? (round = !!x, treemap) : round; + }; + + treemap.size = function(x) { + return arguments.length ? (dx = +x[0], dy = +x[1], treemap) : [dx, dy]; + }; + + treemap.tile = function(x) { + return arguments.length ? (tile = required(x), treemap) : tile; + }; + + treemap.padding = function(x) { + return arguments.length ? treemap.paddingInner(x).paddingOuter(x) : treemap.paddingInner(); + }; + + treemap.paddingInner = function(x) { + return arguments.length ? (paddingInner = typeof x === "function" ? x : constant$8(+x), treemap) : paddingInner; + }; + + treemap.paddingOuter = function(x) { + return arguments.length ? treemap.paddingTop(x).paddingRight(x).paddingBottom(x).paddingLeft(x) : treemap.paddingTop(); + }; + + treemap.paddingTop = function(x) { + return arguments.length ? (paddingTop = typeof x === "function" ? x : constant$8(+x), treemap) : paddingTop; + }; + + treemap.paddingRight = function(x) { + return arguments.length ? (paddingRight = typeof x === "function" ? x : constant$8(+x), treemap) : paddingRight; + }; + + treemap.paddingBottom = function(x) { + return arguments.length ? (paddingBottom = typeof x === "function" ? x : constant$8(+x), treemap) : paddingBottom; + }; + + treemap.paddingLeft = function(x) { + return arguments.length ? (paddingLeft = typeof x === "function" ? x : constant$8(+x), treemap) : paddingLeft; + }; + + return treemap; +}; + +var binary = function(parent, x0, y0, x1, y1) { + var nodes = parent.children, + i, n = nodes.length, + sum, sums = new Array(n + 1); + + for (sums[0] = sum = i = 0; i < n; ++i) { + sums[i + 1] = sum += nodes[i].value; + } + + partition(0, n, parent.value, x0, y0, x1, y1); + + function partition(i, j, value, x0, y0, x1, y1) { + if (i >= j - 1) { + var node = nodes[i]; + node.x0 = x0, node.y0 = y0; + node.x1 = x1, node.y1 = y1; + return; + } + + var valueOffset = sums[i], + valueTarget = (value / 2) + valueOffset, + k = i + 1, + hi = j - 1; + + while (k < hi) { + var mid = k + hi >>> 1; + if (sums[mid] < valueTarget) k = mid + 1; + else hi = mid; + } + + if ((valueTarget - sums[k - 1]) < (sums[k] - valueTarget) && i + 1 < k) --k; + + var valueLeft = sums[k] - valueOffset, + valueRight = value - valueLeft; + + if ((x1 - x0) > (y1 - y0)) { + var xk = (x0 * valueRight + x1 * valueLeft) / value; + partition(i, k, valueLeft, x0, y0, xk, y1); + partition(k, j, valueRight, xk, y0, x1, y1); + } else { + var yk = (y0 * valueRight + y1 * valueLeft) / value; + partition(i, k, valueLeft, x0, y0, x1, yk); + partition(k, j, valueRight, x0, yk, x1, y1); + } + } +}; + +var sliceDice = function(parent, x0, y0, x1, y1) { + (parent.depth & 1 ? treemapSlice : treemapDice)(parent, x0, y0, x1, y1); +}; + +var resquarify = ((function custom(ratio) { + + function resquarify(parent, x0, y0, x1, y1) { + if ((rows = parent._squarify) && (rows.ratio === ratio)) { + var rows, + row, + nodes, + i, + j = -1, + n, + m = rows.length, + value = parent.value; + + while (++j < m) { + row = rows[j], nodes = row.children; + for (i = row.value = 0, n = nodes.length; i < n; ++i) row.value += nodes[i].value; + if (row.dice) treemapDice(row, x0, y0, x1, y0 += (y1 - y0) * row.value / value); + else treemapSlice(row, x0, y0, x0 += (x1 - x0) * row.value / value, y1); + value -= row.value; + } + } else { + parent._squarify = rows = squarifyRatio(ratio, parent, x0, y0, x1, y1); + rows.ratio = ratio; + } + } + + resquarify.ratio = function(x) { + return custom((x = +x) > 1 ? x : 1); + }; + + return resquarify; +}))(phi); + +var area$1 = function(polygon) { + var i = -1, + n = polygon.length, + a, + b = polygon[n - 1], + area = 0; + + while (++i < n) { + a = b; + b = polygon[i]; + area += a[1] * b[0] - a[0] * b[1]; + } + + return area / 2; +}; + +var centroid$1 = function(polygon) { + var i = -1, + n = polygon.length, + x = 0, + y = 0, + a, + b = polygon[n - 1], + c, + k = 0; + + while (++i < n) { + a = b; + b = polygon[i]; + k += c = a[0] * b[1] - b[0] * a[1]; + x += (a[0] + b[0]) * c; + y += (a[1] + b[1]) * c; + } + + return k *= 3, [x / k, y / k]; +}; + +// Returns the 2D cross product of AB and AC vectors, i.e., the z-component of +// the 3D cross product in a quadrant I Cartesian coordinate system (+x is +// right, +y is up). Returns a positive value if ABC is counter-clockwise, +// negative if clockwise, and zero if the points are collinear. +var cross$1 = function(a, b, c) { + return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]); +}; + +function lexicographicOrder(a, b) { + return a[0] - b[0] || a[1] - b[1]; +} + +// Computes the upper convex hull per the monotone chain algorithm. +// Assumes points.length >= 3, is sorted by x, unique in y. +// Returns an array of indices into points in left-to-right order. +function computeUpperHullIndexes(points) { + var n = points.length, + indexes = [0, 1], + size = 2; + + for (var i = 2; i < n; ++i) { + while (size > 1 && cross$1(points[indexes[size - 2]], points[indexes[size - 1]], points[i]) <= 0) --size; + indexes[size++] = i; + } + + return indexes.slice(0, size); // remove popped points +} + +var hull = function(points) { + if ((n = points.length) < 3) return null; + + var i, + n, + sortedPoints = new Array(n), + flippedPoints = new Array(n); + + for (i = 0; i < n; ++i) sortedPoints[i] = [+points[i][0], +points[i][1], i]; + sortedPoints.sort(lexicographicOrder); + for (i = 0; i < n; ++i) flippedPoints[i] = [sortedPoints[i][0], -sortedPoints[i][1]]; + + var upperIndexes = computeUpperHullIndexes(sortedPoints), + lowerIndexes = computeUpperHullIndexes(flippedPoints); + + // Construct the hull polygon, removing possible duplicate endpoints. + var skipLeft = lowerIndexes[0] === upperIndexes[0], + skipRight = lowerIndexes[lowerIndexes.length - 1] === upperIndexes[upperIndexes.length - 1], + hull = []; + + // Add upper hull in right-to-l order. + // Then add lower hull in left-to-right order. + for (i = upperIndexes.length - 1; i >= 0; --i) hull.push(points[sortedPoints[upperIndexes[i]][2]]); + for (i = +skipLeft; i < lowerIndexes.length - skipRight; ++i) hull.push(points[sortedPoints[lowerIndexes[i]][2]]); + + return hull; +}; + +var contains$1 = function(polygon, point) { + var n = polygon.length, + p = polygon[n - 1], + x = point[0], y = point[1], + x0 = p[0], y0 = p[1], + x1, y1, + inside = false; + + for (var i = 0; i < n; ++i) { + p = polygon[i], x1 = p[0], y1 = p[1]; + if (((y1 > y) !== (y0 > y)) && (x < (x0 - x1) * (y - y1) / (y0 - y1) + x1)) inside = !inside; + x0 = x1, y0 = y1; + } + + return inside; +}; + +var length$2 = function(polygon) { + var i = -1, + n = polygon.length, + b = polygon[n - 1], + xa, + ya, + xb = b[0], + yb = b[1], + perimeter = 0; + + while (++i < n) { + xa = xb; + ya = yb; + b = polygon[i]; + xb = b[0]; + yb = b[1]; + xa -= xb; + ya -= yb; + perimeter += Math.sqrt(xa * xa + ya * ya); + } + + return perimeter; +}; + +var slice$3 = [].slice; + +var noabort = {}; + +function Queue(size) { + this._size = size; + this._call = + this._error = null; + this._tasks = []; + this._data = []; + this._waiting = + this._active = + this._ended = + this._start = 0; // inside a synchronous task callback? +} + +Queue.prototype = queue.prototype = { + constructor: Queue, + defer: function(callback) { + if (typeof callback !== "function") throw new Error("invalid callback"); + if (this._call) throw new Error("defer after await"); + if (this._error != null) return this; + var t = slice$3.call(arguments, 1); + t.push(callback); + ++this._waiting, this._tasks.push(t); + poke$1(this); + return this; + }, + abort: function() { + if (this._error == null) abort(this, new Error("abort")); + return this; + }, + await: function(callback) { + if (typeof callback !== "function") throw new Error("invalid callback"); + if (this._call) throw new Error("multiple await"); + this._call = function(error, results) { callback.apply(null, [error].concat(results)); }; + maybeNotify(this); + return this; + }, + awaitAll: function(callback) { + if (typeof callback !== "function") throw new Error("invalid callback"); + if (this._call) throw new Error("multiple await"); + this._call = callback; + maybeNotify(this); + return this; + } +}; + +function poke$1(q) { + if (!q._start) { + try { start$1(q); } // let the current task complete + catch (e) { + if (q._tasks[q._ended + q._active - 1]) abort(q, e); // task errored synchronously + else if (!q._data) throw e; // await callback errored synchronously + } + } +} + +function start$1(q) { + while (q._start = q._waiting && q._active < q._size) { + var i = q._ended + q._active, + t = q._tasks[i], + j = t.length - 1, + c = t[j]; + t[j] = end(q, i); + --q._waiting, ++q._active; + t = c.apply(null, t); + if (!q._tasks[i]) continue; // task finished synchronously + q._tasks[i] = t || noabort; + } +} + +function end(q, i) { + return function(e, r) { + if (!q._tasks[i]) return; // ignore multiple callbacks + --q._active, ++q._ended; + q._tasks[i] = null; + if (q._error != null) return; // ignore secondary errors + if (e != null) { + abort(q, e); + } else { + q._data[i] = r; + if (q._waiting) poke$1(q); + else maybeNotify(q); + } + }; +} + +function abort(q, e) { + var i = q._tasks.length, t; + q._error = e; // ignore active callbacks + q._data = undefined; // allow gc + q._waiting = NaN; // prevent starting + + while (--i >= 0) { + if (t = q._tasks[i]) { + q._tasks[i] = null; + if (t.abort) { + try { t.abort(); } + catch (e) { /* ignore */ } + } + } + } + + q._active = NaN; // allow notification + maybeNotify(q); +} + +function maybeNotify(q) { + if (!q._active && q._call) { + var d = q._data; + q._data = undefined; // allow gc + q._call(q._error, d); + } +} + +function queue(concurrency) { + if (concurrency == null) concurrency = Infinity; + else if (!((concurrency = +concurrency) >= 1)) throw new Error("invalid concurrency"); + return new Queue(concurrency); +} + +var defaultSource$1 = function() { + return Math.random(); +}; + +var uniform = ((function sourceRandomUniform(source) { + function randomUniform(min, max) { + min = min == null ? 0 : +min; + max = max == null ? 1 : +max; + if (arguments.length === 1) max = min, min = 0; + else max -= min; + return function() { + return source() * max + min; + }; + } + + randomUniform.source = sourceRandomUniform; + + return randomUniform; +}))(defaultSource$1); + +var normal = ((function sourceRandomNormal(source) { + function randomNormal(mu, sigma) { + var x, r; + mu = mu == null ? 0 : +mu; + sigma = sigma == null ? 1 : +sigma; + return function() { + var y; + + // If available, use the second previously-generated uniform random. + if (x != null) y = x, x = null; + + // Otherwise, generate a new x and y. + else do { + x = source() * 2 - 1; + y = source() * 2 - 1; + r = x * x + y * y; + } while (!r || r > 1); + + return mu + sigma * y * Math.sqrt(-2 * Math.log(r) / r); + }; + } + + randomNormal.source = sourceRandomNormal; + + return randomNormal; +}))(defaultSource$1); + +var logNormal = ((function sourceRandomLogNormal(source) { + function randomLogNormal() { + var randomNormal = normal.source(source).apply(this, arguments); + return function() { + return Math.exp(randomNormal()); + }; + } + + randomLogNormal.source = sourceRandomLogNormal; + + return randomLogNormal; +}))(defaultSource$1); + +var irwinHall = ((function sourceRandomIrwinHall(source) { + function randomIrwinHall(n) { + return function() { + for (var sum = 0, i = 0; i < n; ++i) sum += source(); + return sum; + }; + } + + randomIrwinHall.source = sourceRandomIrwinHall; + + return randomIrwinHall; +}))(defaultSource$1); + +var bates = ((function sourceRandomBates(source) { + function randomBates(n) { + var randomIrwinHall = irwinHall.source(source)(n); + return function() { + return randomIrwinHall() / n; + }; + } + + randomBates.source = sourceRandomBates; + + return randomBates; +}))(defaultSource$1); + +var exponential$1 = ((function sourceRandomExponential(source) { + function randomExponential(lambda) { + return function() { + return -Math.log(1 - source()) / lambda; + }; + } + + randomExponential.source = sourceRandomExponential; + + return randomExponential; +}))(defaultSource$1); + +var request = function(url, callback) { + var request, + event = dispatch("beforesend", "progress", "load", "error"), + mimeType, + headers = map$1(), + xhr = new XMLHttpRequest, + user = null, + password = null, + response, + responseType, + timeout = 0; + + // If IE does not support CORS, use XDomainRequest. + if (typeof XDomainRequest !== "undefined" + && !("withCredentials" in xhr) + && /^(http(s)?:)?\/\//.test(url)) xhr = new XDomainRequest; + + "onload" in xhr + ? xhr.onload = xhr.onerror = xhr.ontimeout = respond + : xhr.onreadystatechange = function(o) { xhr.readyState > 3 && respond(o); }; + + function respond(o) { + var status = xhr.status, result; + if (!status && hasResponse(xhr) + || status >= 200 && status < 300 + || status === 304) { + if (response) { + try { + result = response.call(request, xhr); + } catch (e) { + event.call("error", request, e); + return; + } + } else { + result = xhr; + } + event.call("load", request, result); + } else { + event.call("error", request, o); + } + } + + xhr.onprogress = function(e) { + event.call("progress", request, e); + }; + + request = { + header: function(name, value) { + name = (name + "").toLowerCase(); + if (arguments.length < 2) return headers.get(name); + if (value == null) headers.remove(name); + else headers.set(name, value + ""); + return request; + }, + + // If mimeType is non-null and no Accept header is set, a default is used. + mimeType: function(value) { + if (!arguments.length) return mimeType; + mimeType = value == null ? null : value + ""; + return request; + }, + + // Specifies what type the response value should take; + // for instance, arraybuffer, blob, document, or text. + responseType: function(value) { + if (!arguments.length) return responseType; + responseType = value; + return request; + }, + + timeout: function(value) { + if (!arguments.length) return timeout; + timeout = +value; + return request; + }, + + user: function(value) { + return arguments.length < 1 ? user : (user = value == null ? null : value + "", request); + }, + + password: function(value) { + return arguments.length < 1 ? password : (password = value == null ? null : value + "", request); + }, + + // Specify how to convert the response content to a specific type; + // changes the callback value on "load" events. + response: function(value) { + response = value; + return request; + }, + + // Alias for send("GET", …). + get: function(data, callback) { + return request.send("GET", data, callback); + }, + + // Alias for send("POST", …). + post: function(data, callback) { + return request.send("POST", data, callback); + }, + + // If callback is non-null, it will be used for error and load events. + send: function(method, data, callback) { + xhr.open(method, url, true, user, password); + if (mimeType != null && !headers.has("accept")) headers.set("accept", mimeType + ",*/*"); + if (xhr.setRequestHeader) headers.each(function(value, name) { xhr.setRequestHeader(name, value); }); + if (mimeType != null && xhr.overrideMimeType) xhr.overrideMimeType(mimeType); + if (responseType != null) xhr.responseType = responseType; + if (timeout > 0) xhr.timeout = timeout; + if (callback == null && typeof data === "function") callback = data, data = null; + if (callback != null && callback.length === 1) callback = fixCallback(callback); + if (callback != null) request.on("error", callback).on("load", function(xhr) { callback(null, xhr); }); + event.call("beforesend", request, xhr); + xhr.send(data == null ? null : data); + return request; + }, + + abort: function() { + xhr.abort(); + return request; + }, + + on: function() { + var value = event.on.apply(event, arguments); + return value === event ? request : value; + } + }; + + if (callback != null) { + if (typeof callback !== "function") throw new Error("invalid callback: " + callback); + return request.get(callback); + } + + return request; +}; + +function fixCallback(callback) { + return function(error, xhr) { + callback(error == null ? xhr : null); + }; +} + +function hasResponse(xhr) { + var type = xhr.responseType; + return type && type !== "text" + ? xhr.response // null on error + : xhr.responseText; // "" on error +} + +var type$1 = function(defaultMimeType, response) { + return function(url, callback) { + var r = request(url).mimeType(defaultMimeType).response(response); + if (callback != null) { + if (typeof callback !== "function") throw new Error("invalid callback: " + callback); + return r.get(callback); + } + return r; + }; +}; + +var html = type$1("text/html", function(xhr) { + return document.createRange().createContextualFragment(xhr.responseText); +}); + +var json = type$1("application/json", function(xhr) { + return JSON.parse(xhr.responseText); +}); + +var text = type$1("text/plain", function(xhr) { + return xhr.responseText; +}); + +var xml = type$1("application/xml", function(xhr) { + var xml = xhr.responseXML; + if (!xml) throw new Error("parse error"); + return xml; +}); + +var dsv$1 = function(defaultMimeType, parse) { + return function(url, row, callback) { + if (arguments.length < 3) callback = row, row = null; + var r = request(url).mimeType(defaultMimeType); + r.row = function(_) { return arguments.length ? r.response(responseOf(parse, row = _)) : row; }; + r.row(row); + return callback ? r.get(callback) : r; + }; +}; + +function responseOf(parse, row) { + return function(request$$1) { + return parse(request$$1.responseText, row); + }; +} + +var csv$1 = dsv$1("text/csv", csvParse); + +var tsv$1 = dsv$1("text/tab-separated-values", tsvParse); + +var array$2 = Array.prototype; + +var map$3 = array$2.map; +var slice$4 = array$2.slice; + +var implicit = {name: "implicit"}; + +function ordinal(range) { + var index = map$1(), + domain = [], + unknown = implicit; + + range = range == null ? [] : slice$4.call(range); + + function scale(d) { + var key = d + "", i = index.get(key); + if (!i) { + if (unknown !== implicit) return unknown; + index.set(key, i = domain.push(d)); + } + return range[(i - 1) % range.length]; + } + + scale.domain = function(_) { + if (!arguments.length) return domain.slice(); + domain = [], index = map$1(); + var i = -1, n = _.length, d, key; + while (++i < n) if (!index.has(key = (d = _[i]) + "")) index.set(key, domain.push(d)); + return scale; + }; + + scale.range = function(_) { + return arguments.length ? (range = slice$4.call(_), scale) : range.slice(); + }; + + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + scale.copy = function() { + return ordinal() + .domain(domain) + .range(range) + .unknown(unknown); + }; + + return scale; +} + +function band() { + var scale = ordinal().unknown(undefined), + domain = scale.domain, + ordinalRange = scale.range, + range$$1 = [0, 1], + step, + bandwidth, + round = false, + paddingInner = 0, + paddingOuter = 0, + align = 0.5; + + delete scale.unknown; + + function rescale() { + var n = domain().length, + reverse = range$$1[1] < range$$1[0], + start = range$$1[reverse - 0], + stop = range$$1[1 - reverse]; + step = (stop - start) / Math.max(1, n - paddingInner + paddingOuter * 2); + if (round) step = Math.floor(step); + start += (stop - start - step * (n - paddingInner)) * align; + bandwidth = step * (1 - paddingInner); + if (round) start = Math.round(start), bandwidth = Math.round(bandwidth); + var values = sequence(n).map(function(i) { return start + step * i; }); + return ordinalRange(reverse ? values.reverse() : values); + } + + scale.domain = function(_) { + return arguments.length ? (domain(_), rescale()) : domain(); + }; + + scale.range = function(_) { + return arguments.length ? (range$$1 = [+_[0], +_[1]], rescale()) : range$$1.slice(); + }; + + scale.rangeRound = function(_) { + return range$$1 = [+_[0], +_[1]], round = true, rescale(); + }; + + scale.bandwidth = function() { + return bandwidth; + }; + + scale.step = function() { + return step; + }; + + scale.round = function(_) { + return arguments.length ? (round = !!_, rescale()) : round; + }; + + scale.padding = function(_) { + return arguments.length ? (paddingInner = paddingOuter = Math.max(0, Math.min(1, _)), rescale()) : paddingInner; + }; + + scale.paddingInner = function(_) { + return arguments.length ? (paddingInner = Math.max(0, Math.min(1, _)), rescale()) : paddingInner; + }; + + scale.paddingOuter = function(_) { + return arguments.length ? (paddingOuter = Math.max(0, Math.min(1, _)), rescale()) : paddingOuter; + }; + + scale.align = function(_) { + return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align; + }; + + scale.copy = function() { + return band() + .domain(domain()) + .range(range$$1) + .round(round) + .paddingInner(paddingInner) + .paddingOuter(paddingOuter) + .align(align); + }; + + return rescale(); +} + +function pointish(scale) { + var copy = scale.copy; + + scale.padding = scale.paddingOuter; + delete scale.paddingInner; + delete scale.paddingOuter; + + scale.copy = function() { + return pointish(copy()); + }; + + return scale; +} + +function point$1() { + return pointish(band().paddingInner(1)); +} + +var constant$9 = function(x) { + return function() { + return x; + }; +}; + +var number$1 = function(x) { + return +x; +}; + +var unit = [0, 1]; + +function deinterpolateLinear(a, b) { + return (b -= (a = +a)) + ? function(x) { return (x - a) / b; } + : constant$9(b); +} + +function deinterpolateClamp(deinterpolate) { + return function(a, b) { + var d = deinterpolate(a = +a, b = +b); + return function(x) { return x <= a ? 0 : x >= b ? 1 : d(x); }; + }; +} + +function reinterpolateClamp(reinterpolate) { + return function(a, b) { + var r = reinterpolate(a = +a, b = +b); + return function(t) { return t <= 0 ? a : t >= 1 ? b : r(t); }; + }; +} + +function bimap(domain, range$$1, deinterpolate, reinterpolate) { + var d0 = domain[0], d1 = domain[1], r0 = range$$1[0], r1 = range$$1[1]; + if (d1 < d0) d0 = deinterpolate(d1, d0), r0 = reinterpolate(r1, r0); + else d0 = deinterpolate(d0, d1), r0 = reinterpolate(r0, r1); + return function(x) { return r0(d0(x)); }; +} + +function polymap(domain, range$$1, deinterpolate, reinterpolate) { + var j = Math.min(domain.length, range$$1.length) - 1, + d = new Array(j), + r = new Array(j), + i = -1; + + // Reverse descending domains. + if (domain[j] < domain[0]) { + domain = domain.slice().reverse(); + range$$1 = range$$1.slice().reverse(); + } + + while (++i < j) { + d[i] = deinterpolate(domain[i], domain[i + 1]); + r[i] = reinterpolate(range$$1[i], range$$1[i + 1]); + } + + return function(x) { + var i = bisectRight(domain, x, 1, j) - 1; + return r[i](d[i](x)); + }; +} + +function copy(source, target) { + return target + .domain(source.domain()) + .range(source.range()) + .interpolate(source.interpolate()) + .clamp(source.clamp()); +} + +// deinterpolate(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1]. +// reinterpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding domain value x in [a,b]. +function continuous(deinterpolate, reinterpolate) { + var domain = unit, + range$$1 = unit, + interpolate$$1 = interpolateValue, + clamp = false, + piecewise, + output, + input; + + function rescale() { + piecewise = Math.min(domain.length, range$$1.length) > 2 ? polymap : bimap; + output = input = null; + return scale; + } + + function scale(x) { + return (output || (output = piecewise(domain, range$$1, clamp ? deinterpolateClamp(deinterpolate) : deinterpolate, interpolate$$1)))(+x); + } + + scale.invert = function(y) { + return (input || (input = piecewise(range$$1, domain, deinterpolateLinear, clamp ? reinterpolateClamp(reinterpolate) : reinterpolate)))(+y); + }; + + scale.domain = function(_) { + return arguments.length ? (domain = map$3.call(_, number$1), rescale()) : domain.slice(); + }; + + scale.range = function(_) { + return arguments.length ? (range$$1 = slice$4.call(_), rescale()) : range$$1.slice(); + }; + + scale.rangeRound = function(_) { + return range$$1 = slice$4.call(_), interpolate$$1 = interpolateRound, rescale(); + }; + + scale.clamp = function(_) { + return arguments.length ? (clamp = !!_, rescale()) : clamp; + }; + + scale.interpolate = function(_) { + return arguments.length ? (interpolate$$1 = _, rescale()) : interpolate$$1; + }; + + return rescale(); +} + +var tickFormat = function(domain, count, specifier) { + var start = domain[0], + stop = domain[domain.length - 1], + step = tickStep(start, stop, count == null ? 10 : count), + precision; + specifier = formatSpecifier(specifier == null ? ",f" : specifier); + switch (specifier.type) { + case "s": { + var value = Math.max(Math.abs(start), Math.abs(stop)); + if (specifier.precision == null && !isNaN(precision = precisionPrefix(step, value))) specifier.precision = precision; + return exports.formatPrefix(specifier, value); + } + case "": + case "e": + case "g": + case "p": + case "r": { + if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === "e"); + break; + } + case "f": + case "%": { + if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) specifier.precision = precision - (specifier.type === "%") * 2; + break; + } + } + return exports.format(specifier); +}; + +function linearish(scale) { + var domain = scale.domain; + + scale.ticks = function(count) { + var d = domain(); + return ticks(d[0], d[d.length - 1], count == null ? 10 : count); + }; + + scale.tickFormat = function(count, specifier) { + return tickFormat(domain(), count, specifier); + }; + + scale.nice = function(count) { + if (count == null) count = 10; + + var d = domain(), + i0 = 0, + i1 = d.length - 1, + start = d[i0], + stop = d[i1], + step; + + if (stop < start) { + step = start, start = stop, stop = step; + step = i0, i0 = i1, i1 = step; + } + + step = tickIncrement(start, stop, count); + + if (step > 0) { + start = Math.floor(start / step) * step; + stop = Math.ceil(stop / step) * step; + step = tickIncrement(start, stop, count); + } else if (step < 0) { + start = Math.ceil(start * step) / step; + stop = Math.floor(stop * step) / step; + step = tickIncrement(start, stop, count); + } + + if (step > 0) { + d[i0] = Math.floor(start / step) * step; + d[i1] = Math.ceil(stop / step) * step; + domain(d); + } else if (step < 0) { + d[i0] = Math.ceil(start * step) / step; + d[i1] = Math.floor(stop * step) / step; + domain(d); + } + + return scale; + }; + + return scale; +} + +function linear$2() { + var scale = continuous(deinterpolateLinear, reinterpolate); + + scale.copy = function() { + return copy(scale, linear$2()); + }; + + return linearish(scale); +} + +function identity$6() { + var domain = [0, 1]; + + function scale(x) { + return +x; + } + + scale.invert = scale; + + scale.domain = scale.range = function(_) { + return arguments.length ? (domain = map$3.call(_, number$1), scale) : domain.slice(); + }; + + scale.copy = function() { + return identity$6().domain(domain); + }; + + return linearish(scale); +} + +var nice = function(domain, interval) { + domain = domain.slice(); + + var i0 = 0, + i1 = domain.length - 1, + x0 = domain[i0], + x1 = domain[i1], + t; + + if (x1 < x0) { + t = i0, i0 = i1, i1 = t; + t = x0, x0 = x1, x1 = t; + } + + domain[i0] = interval.floor(x0); + domain[i1] = interval.ceil(x1); + return domain; +}; + +function deinterpolate(a, b) { + return (b = Math.log(b / a)) + ? function(x) { return Math.log(x / a) / b; } + : constant$9(b); +} + +function reinterpolate$1(a, b) { + return a < 0 + ? function(t) { return -Math.pow(-b, t) * Math.pow(-a, 1 - t); } + : function(t) { return Math.pow(b, t) * Math.pow(a, 1 - t); }; +} + +function pow10(x) { + return isFinite(x) ? +("1e" + x) : x < 0 ? 0 : x; +} + +function powp(base) { + return base === 10 ? pow10 + : base === Math.E ? Math.exp + : function(x) { return Math.pow(base, x); }; +} + +function logp(base) { + return base === Math.E ? Math.log + : base === 10 && Math.log10 + || base === 2 && Math.log2 + || (base = Math.log(base), function(x) { return Math.log(x) / base; }); +} + +function reflect(f) { + return function(x) { + return -f(-x); + }; +} + +function log$1() { + var scale = continuous(deinterpolate, reinterpolate$1).domain([1, 10]), + domain = scale.domain, + base = 10, + logs = logp(10), + pows = powp(10); + + function rescale() { + logs = logp(base), pows = powp(base); + if (domain()[0] < 0) logs = reflect(logs), pows = reflect(pows); + return scale; + } + + scale.base = function(_) { + return arguments.length ? (base = +_, rescale()) : base; + }; + + scale.domain = function(_) { + return arguments.length ? (domain(_), rescale()) : domain(); + }; + + scale.ticks = function(count) { + var d = domain(), + u = d[0], + v = d[d.length - 1], + r; + + if (r = v < u) i = u, u = v, v = i; + + var i = logs(u), + j = logs(v), + p, + k, + t, + n = count == null ? 10 : +count, + z = []; + + if (!(base % 1) && j - i < n) { + i = Math.round(i) - 1, j = Math.round(j) + 1; + if (u > 0) for (; i < j; ++i) { + for (k = 1, p = pows(i); k < base; ++k) { + t = p * k; + if (t < u) continue; + if (t > v) break; + z.push(t); + } + } else for (; i < j; ++i) { + for (k = base - 1, p = pows(i); k >= 1; --k) { + t = p * k; + if (t < u) continue; + if (t > v) break; + z.push(t); + } + } + } else { + z = ticks(i, j, Math.min(j - i, n)).map(pows); + } + + return r ? z.reverse() : z; + }; + + scale.tickFormat = function(count, specifier) { + if (specifier == null) specifier = base === 10 ? ".0e" : ","; + if (typeof specifier !== "function") specifier = exports.format(specifier); + if (count === Infinity) return specifier; + if (count == null) count = 10; + var k = Math.max(1, base * count / scale.ticks().length); // TODO fast estimate? + return function(d) { + var i = d / pows(Math.round(logs(d))); + if (i * base < base - 0.5) i *= base; + return i <= k ? specifier(d) : ""; + }; + }; + + scale.nice = function() { + return domain(nice(domain(), { + floor: function(x) { return pows(Math.floor(logs(x))); }, + ceil: function(x) { return pows(Math.ceil(logs(x))); } + })); + }; + + scale.copy = function() { + return copy(scale, log$1().base(base)); + }; + + return scale; +} + +function raise$1(x, exponent) { + return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent); +} + +function pow$1() { + var exponent = 1, + scale = continuous(deinterpolate, reinterpolate), + domain = scale.domain; + + function deinterpolate(a, b) { + return (b = raise$1(b, exponent) - (a = raise$1(a, exponent))) + ? function(x) { return (raise$1(x, exponent) - a) / b; } + : constant$9(b); + } + + function reinterpolate(a, b) { + b = raise$1(b, exponent) - (a = raise$1(a, exponent)); + return function(t) { return raise$1(a + b * t, 1 / exponent); }; + } + + scale.exponent = function(_) { + return arguments.length ? (exponent = +_, domain(domain())) : exponent; + }; + + scale.copy = function() { + return copy(scale, pow$1().exponent(exponent)); + }; + + return linearish(scale); +} + +function sqrt$1() { + return pow$1().exponent(0.5); +} + +function quantile$$1() { + var domain = [], + range$$1 = [], + thresholds = []; + + function rescale() { + var i = 0, n = Math.max(1, range$$1.length); + thresholds = new Array(n - 1); + while (++i < n) thresholds[i - 1] = threshold(domain, i / n); + return scale; + } + + function scale(x) { + if (!isNaN(x = +x)) return range$$1[bisectRight(thresholds, x)]; + } + + scale.invertExtent = function(y) { + var i = range$$1.indexOf(y); + return i < 0 ? [NaN, NaN] : [ + i > 0 ? thresholds[i - 1] : domain[0], + i < thresholds.length ? thresholds[i] : domain[domain.length - 1] + ]; + }; + + scale.domain = function(_) { + if (!arguments.length) return domain.slice(); + domain = []; + for (var i = 0, n = _.length, d; i < n; ++i) if (d = _[i], d != null && !isNaN(d = +d)) domain.push(d); + domain.sort(ascending); + return rescale(); + }; + + scale.range = function(_) { + return arguments.length ? (range$$1 = slice$4.call(_), rescale()) : range$$1.slice(); + }; + + scale.quantiles = function() { + return thresholds.slice(); + }; + + scale.copy = function() { + return quantile$$1() + .domain(domain) + .range(range$$1); + }; + + return scale; +} + +function quantize$1() { + var x0 = 0, + x1 = 1, + n = 1, + domain = [0.5], + range$$1 = [0, 1]; + + function scale(x) { + if (x <= x) return range$$1[bisectRight(domain, x, 0, n)]; + } + + function rescale() { + var i = -1; + domain = new Array(n); + while (++i < n) domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1); + return scale; + } + + scale.domain = function(_) { + return arguments.length ? (x0 = +_[0], x1 = +_[1], rescale()) : [x0, x1]; + }; + + scale.range = function(_) { + return arguments.length ? (n = (range$$1 = slice$4.call(_)).length - 1, rescale()) : range$$1.slice(); + }; + + scale.invertExtent = function(y) { + var i = range$$1.indexOf(y); + return i < 0 ? [NaN, NaN] + : i < 1 ? [x0, domain[0]] + : i >= n ? [domain[n - 1], x1] + : [domain[i - 1], domain[i]]; + }; + + scale.copy = function() { + return quantize$1() + .domain([x0, x1]) + .range(range$$1); + }; + + return linearish(scale); +} + +function threshold$1() { + var domain = [0.5], + range$$1 = [0, 1], + n = 1; + + function scale(x) { + if (x <= x) return range$$1[bisectRight(domain, x, 0, n)]; + } + + scale.domain = function(_) { + return arguments.length ? (domain = slice$4.call(_), n = Math.min(domain.length, range$$1.length - 1), scale) : domain.slice(); + }; + + scale.range = function(_) { + return arguments.length ? (range$$1 = slice$4.call(_), n = Math.min(domain.length, range$$1.length - 1), scale) : range$$1.slice(); + }; + + scale.invertExtent = function(y) { + var i = range$$1.indexOf(y); + return [domain[i - 1], domain[i]]; + }; + + scale.copy = function() { + return threshold$1() + .domain(domain) + .range(range$$1); + }; + + return scale; +} + +var t0$1 = new Date; +var t1$1 = new Date; + +function newInterval(floori, offseti, count, field) { + + function interval(date) { + return floori(date = new Date(+date)), date; + } + + interval.floor = interval; + + interval.ceil = function(date) { + return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date; + }; + + interval.round = function(date) { + var d0 = interval(date), + d1 = interval.ceil(date); + return date - d0 < d1 - date ? d0 : d1; + }; + + interval.offset = function(date, step) { + return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date; + }; + + interval.range = function(start, stop, step) { + var range = []; + start = interval.ceil(start); + step = step == null ? 1 : Math.floor(step); + if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date + do range.push(new Date(+start)); while (offseti(start, step), floori(start), start < stop) + return range; + }; + + interval.filter = function(test) { + return newInterval(function(date) { + if (date >= date) while (floori(date), !test(date)) date.setTime(date - 1); + }, function(date, step) { + if (date >= date) while (--step >= 0) while (offseti(date, 1), !test(date)) {} // eslint-disable-line no-empty + }); + }; + + if (count) { + interval.count = function(start, end) { + t0$1.setTime(+start), t1$1.setTime(+end); + floori(t0$1), floori(t1$1); + return Math.floor(count(t0$1, t1$1)); + }; + + interval.every = function(step) { + step = Math.floor(step); + return !isFinite(step) || !(step > 0) ? null + : !(step > 1) ? interval + : interval.filter(field + ? function(d) { return field(d) % step === 0; } + : function(d) { return interval.count(0, d) % step === 0; }); + }; + } + + return interval; +} + +var millisecond = newInterval(function() { + // noop +}, function(date, step) { + date.setTime(+date + step); +}, function(start, end) { + return end - start; +}); + +// An optimized implementation for this simple case. +millisecond.every = function(k) { + k = Math.floor(k); + if (!isFinite(k) || !(k > 0)) return null; + if (!(k > 1)) return millisecond; + return newInterval(function(date) { + date.setTime(Math.floor(date / k) * k); + }, function(date, step) { + date.setTime(+date + step * k); + }, function(start, end) { + return (end - start) / k; + }); +}; + +var milliseconds = millisecond.range; + +var durationSecond$1 = 1e3; +var durationMinute$1 = 6e4; +var durationHour$1 = 36e5; +var durationDay$1 = 864e5; +var durationWeek$1 = 6048e5; + +var second = newInterval(function(date) { + date.setTime(Math.floor(date / durationSecond$1) * durationSecond$1); +}, function(date, step) { + date.setTime(+date + step * durationSecond$1); +}, function(start, end) { + return (end - start) / durationSecond$1; +}, function(date) { + return date.getUTCSeconds(); +}); + +var seconds = second.range; + +var minute = newInterval(function(date) { + date.setTime(Math.floor(date / durationMinute$1) * durationMinute$1); +}, function(date, step) { + date.setTime(+date + step * durationMinute$1); +}, function(start, end) { + return (end - start) / durationMinute$1; +}, function(date) { + return date.getMinutes(); +}); + +var minutes = minute.range; + +var hour = newInterval(function(date) { + var offset = date.getTimezoneOffset() * durationMinute$1 % durationHour$1; + if (offset < 0) offset += durationHour$1; + date.setTime(Math.floor((+date - offset) / durationHour$1) * durationHour$1 + offset); +}, function(date, step) { + date.setTime(+date + step * durationHour$1); +}, function(start, end) { + return (end - start) / durationHour$1; +}, function(date) { + return date.getHours(); +}); + +var hours = hour.range; + +var day = newInterval(function(date) { + date.setHours(0, 0, 0, 0); +}, function(date, step) { + date.setDate(date.getDate() + step); +}, function(start, end) { + return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute$1) / durationDay$1; +}, function(date) { + return date.getDate() - 1; +}); + +var days = day.range; + +function weekday(i) { + return newInterval(function(date) { + date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7); + date.setHours(0, 0, 0, 0); + }, function(date, step) { + date.setDate(date.getDate() + step * 7); + }, function(start, end) { + return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute$1) / durationWeek$1; + }); +} + +var sunday = weekday(0); +var monday = weekday(1); +var tuesday = weekday(2); +var wednesday = weekday(3); +var thursday = weekday(4); +var friday = weekday(5); +var saturday = weekday(6); + +var sundays = sunday.range; +var mondays = monday.range; +var tuesdays = tuesday.range; +var wednesdays = wednesday.range; +var thursdays = thursday.range; +var fridays = friday.range; +var saturdays = saturday.range; + +var month = newInterval(function(date) { + date.setDate(1); + date.setHours(0, 0, 0, 0); +}, function(date, step) { + date.setMonth(date.getMonth() + step); +}, function(start, end) { + return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12; +}, function(date) { + return date.getMonth(); +}); + +var months = month.range; + +var year = newInterval(function(date) { + date.setMonth(0, 1); + date.setHours(0, 0, 0, 0); +}, function(date, step) { + date.setFullYear(date.getFullYear() + step); +}, function(start, end) { + return end.getFullYear() - start.getFullYear(); +}, function(date) { + return date.getFullYear(); +}); + +// An optimized implementation for this simple case. +year.every = function(k) { + return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) { + date.setFullYear(Math.floor(date.getFullYear() / k) * k); + date.setMonth(0, 1); + date.setHours(0, 0, 0, 0); + }, function(date, step) { + date.setFullYear(date.getFullYear() + step * k); + }); +}; + +var years = year.range; + +var utcMinute = newInterval(function(date) { + date.setUTCSeconds(0, 0); +}, function(date, step) { + date.setTime(+date + step * durationMinute$1); +}, function(start, end) { + return (end - start) / durationMinute$1; +}, function(date) { + return date.getUTCMinutes(); +}); + +var utcMinutes = utcMinute.range; + +var utcHour = newInterval(function(date) { + date.setUTCMinutes(0, 0, 0); +}, function(date, step) { + date.setTime(+date + step * durationHour$1); +}, function(start, end) { + return (end - start) / durationHour$1; +}, function(date) { + return date.getUTCHours(); +}); + +var utcHours = utcHour.range; + +var utcDay = newInterval(function(date) { + date.setUTCHours(0, 0, 0, 0); +}, function(date, step) { + date.setUTCDate(date.getUTCDate() + step); +}, function(start, end) { + return (end - start) / durationDay$1; +}, function(date) { + return date.getUTCDate() - 1; +}); + +var utcDays = utcDay.range; + +function utcWeekday(i) { + return newInterval(function(date) { + date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7); + date.setUTCHours(0, 0, 0, 0); + }, function(date, step) { + date.setUTCDate(date.getUTCDate() + step * 7); + }, function(start, end) { + return (end - start) / durationWeek$1; + }); +} + +var utcSunday = utcWeekday(0); +var utcMonday = utcWeekday(1); +var utcTuesday = utcWeekday(2); +var utcWednesday = utcWeekday(3); +var utcThursday = utcWeekday(4); +var utcFriday = utcWeekday(5); +var utcSaturday = utcWeekday(6); + +var utcSundays = utcSunday.range; +var utcMondays = utcMonday.range; +var utcTuesdays = utcTuesday.range; +var utcWednesdays = utcWednesday.range; +var utcThursdays = utcThursday.range; +var utcFridays = utcFriday.range; +var utcSaturdays = utcSaturday.range; + +var utcMonth = newInterval(function(date) { + date.setUTCDate(1); + date.setUTCHours(0, 0, 0, 0); +}, function(date, step) { + date.setUTCMonth(date.getUTCMonth() + step); +}, function(start, end) { + return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12; +}, function(date) { + return date.getUTCMonth(); +}); + +var utcMonths = utcMonth.range; + +var utcYear = newInterval(function(date) { + date.setUTCMonth(0, 1); + date.setUTCHours(0, 0, 0, 0); +}, function(date, step) { + date.setUTCFullYear(date.getUTCFullYear() + step); +}, function(start, end) { + return end.getUTCFullYear() - start.getUTCFullYear(); +}, function(date) { + return date.getUTCFullYear(); +}); + +// An optimized implementation for this simple case. +utcYear.every = function(k) { + return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) { + date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k); + date.setUTCMonth(0, 1); + date.setUTCHours(0, 0, 0, 0); + }, function(date, step) { + date.setUTCFullYear(date.getUTCFullYear() + step * k); + }); +}; + +var utcYears = utcYear.range; + +function localDate(d) { + if (0 <= d.y && d.y < 100) { + var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L); + date.setFullYear(d.y); + return date; + } + return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L); +} + +function utcDate(d) { + if (0 <= d.y && d.y < 100) { + var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L)); + date.setUTCFullYear(d.y); + return date; + } + return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L)); +} + +function newYear(y) { + return {y: y, m: 0, d: 1, H: 0, M: 0, S: 0, L: 0}; +} + +function formatLocale$1(locale) { + var locale_dateTime = locale.dateTime, + locale_date = locale.date, + locale_time = locale.time, + locale_periods = locale.periods, + locale_weekdays = locale.days, + locale_shortWeekdays = locale.shortDays, + locale_months = locale.months, + locale_shortMonths = locale.shortMonths; + + var periodRe = formatRe(locale_periods), + periodLookup = formatLookup(locale_periods), + weekdayRe = formatRe(locale_weekdays), + weekdayLookup = formatLookup(locale_weekdays), + shortWeekdayRe = formatRe(locale_shortWeekdays), + shortWeekdayLookup = formatLookup(locale_shortWeekdays), + monthRe = formatRe(locale_months), + monthLookup = formatLookup(locale_months), + shortMonthRe = formatRe(locale_shortMonths), + shortMonthLookup = formatLookup(locale_shortMonths); + + var formats = { + "a": formatShortWeekday, + "A": formatWeekday, + "b": formatShortMonth, + "B": formatMonth, + "c": null, + "d": formatDayOfMonth, + "e": formatDayOfMonth, + "H": formatHour24, + "I": formatHour12, + "j": formatDayOfYear, + "L": formatMilliseconds, + "m": formatMonthNumber, + "M": formatMinutes, + "p": formatPeriod, + "S": formatSeconds, + "U": formatWeekNumberSunday, + "w": formatWeekdayNumber, + "W": formatWeekNumberMonday, + "x": null, + "X": null, + "y": formatYear, + "Y": formatFullYear, + "Z": formatZone, + "%": formatLiteralPercent + }; + + var utcFormats = { + "a": formatUTCShortWeekday, + "A": formatUTCWeekday, + "b": formatUTCShortMonth, + "B": formatUTCMonth, + "c": null, + "d": formatUTCDayOfMonth, + "e": formatUTCDayOfMonth, + "H": formatUTCHour24, + "I": formatUTCHour12, + "j": formatUTCDayOfYear, + "L": formatUTCMilliseconds, + "m": formatUTCMonthNumber, + "M": formatUTCMinutes, + "p": formatUTCPeriod, + "S": formatUTCSeconds, + "U": formatUTCWeekNumberSunday, + "w": formatUTCWeekdayNumber, + "W": formatUTCWeekNumberMonday, + "x": null, + "X": null, + "y": formatUTCYear, + "Y": formatUTCFullYear, + "Z": formatUTCZone, + "%": formatLiteralPercent + }; + + var parses = { + "a": parseShortWeekday, + "A": parseWeekday, + "b": parseShortMonth, + "B": parseMonth, + "c": parseLocaleDateTime, + "d": parseDayOfMonth, + "e": parseDayOfMonth, + "H": parseHour24, + "I": parseHour24, + "j": parseDayOfYear, + "L": parseMilliseconds, + "m": parseMonthNumber, + "M": parseMinutes, + "p": parsePeriod, + "S": parseSeconds, + "U": parseWeekNumberSunday, + "w": parseWeekdayNumber, + "W": parseWeekNumberMonday, + "x": parseLocaleDate, + "X": parseLocaleTime, + "y": parseYear, + "Y": parseFullYear, + "Z": parseZone, + "%": parseLiteralPercent + }; + + // These recursive directive definitions must be deferred. + formats.x = newFormat(locale_date, formats); + formats.X = newFormat(locale_time, formats); + formats.c = newFormat(locale_dateTime, formats); + utcFormats.x = newFormat(locale_date, utcFormats); + utcFormats.X = newFormat(locale_time, utcFormats); + utcFormats.c = newFormat(locale_dateTime, utcFormats); + + function newFormat(specifier, formats) { + return function(date) { + var string = [], + i = -1, + j = 0, + n = specifier.length, + c, + pad, + format; + + if (!(date instanceof Date)) date = new Date(+date); + + while (++i < n) { + if (specifier.charCodeAt(i) === 37) { + string.push(specifier.slice(j, i)); + if ((pad = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i); + else pad = c === "e" ? " " : "0"; + if (format = formats[c]) c = format(date, pad); + string.push(c); + j = i + 1; + } + } + + string.push(specifier.slice(j, i)); + return string.join(""); + }; + } + + function newParse(specifier, newDate) { + return function(string) { + var d = newYear(1900), + i = parseSpecifier(d, specifier, string += "", 0); + if (i != string.length) return null; + + // The am-pm flag is 0 for AM, and 1 for PM. + if ("p" in d) d.H = d.H % 12 + d.p * 12; + + // Convert day-of-week and week-of-year to day-of-year. + if ("W" in d || "U" in d) { + if (!("w" in d)) d.w = "W" in d ? 1 : 0; + var day$$1 = "Z" in d ? utcDate(newYear(d.y)).getUTCDay() : newDate(newYear(d.y)).getDay(); + d.m = 0; + d.d = "W" in d ? (d.w + 6) % 7 + d.W * 7 - (day$$1 + 5) % 7 : d.w + d.U * 7 - (day$$1 + 6) % 7; + } + + // If a time zone is specified, all fields are interpreted as UTC and then + // offset according to the specified time zone. + if ("Z" in d) { + d.H += d.Z / 100 | 0; + d.M += d.Z % 100; + return utcDate(d); + } + + // Otherwise, all fields are in local time. + return newDate(d); + }; + } + + function parseSpecifier(d, specifier, string, j) { + var i = 0, + n = specifier.length, + m = string.length, + c, + parse; + + while (i < n) { + if (j >= m) return -1; + c = specifier.charCodeAt(i++); + if (c === 37) { + c = specifier.charAt(i++); + parse = parses[c in pads ? specifier.charAt(i++) : c]; + if (!parse || ((j = parse(d, string, j)) < 0)) return -1; + } else if (c != string.charCodeAt(j++)) { + return -1; + } + } + + return j; + } + + function parsePeriod(d, string, i) { + var n = periodRe.exec(string.slice(i)); + return n ? (d.p = periodLookup[n[0].toLowerCase()], i + n[0].length) : -1; + } + + function parseShortWeekday(d, string, i) { + var n = shortWeekdayRe.exec(string.slice(i)); + return n ? (d.w = shortWeekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1; + } + + function parseWeekday(d, string, i) { + var n = weekdayRe.exec(string.slice(i)); + return n ? (d.w = weekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1; + } + + function parseShortMonth(d, string, i) { + var n = shortMonthRe.exec(string.slice(i)); + return n ? (d.m = shortMonthLookup[n[0].toLowerCase()], i + n[0].length) : -1; + } + + function parseMonth(d, string, i) { + var n = monthRe.exec(string.slice(i)); + return n ? (d.m = monthLookup[n[0].toLowerCase()], i + n[0].length) : -1; + } + + function parseLocaleDateTime(d, string, i) { + return parseSpecifier(d, locale_dateTime, string, i); + } + + function parseLocaleDate(d, string, i) { + return parseSpecifier(d, locale_date, string, i); + } + + function parseLocaleTime(d, string, i) { + return parseSpecifier(d, locale_time, string, i); + } + + function formatShortWeekday(d) { + return locale_shortWeekdays[d.getDay()]; + } + + function formatWeekday(d) { + return locale_weekdays[d.getDay()]; + } + + function formatShortMonth(d) { + return locale_shortMonths[d.getMonth()]; + } + + function formatMonth(d) { + return locale_months[d.getMonth()]; + } + + function formatPeriod(d) { + return locale_periods[+(d.getHours() >= 12)]; + } + + function formatUTCShortWeekday(d) { + return locale_shortWeekdays[d.getUTCDay()]; + } + + function formatUTCWeekday(d) { + return locale_weekdays[d.getUTCDay()]; + } + + function formatUTCShortMonth(d) { + return locale_shortMonths[d.getUTCMonth()]; + } + + function formatUTCMonth(d) { + return locale_months[d.getUTCMonth()]; + } + + function formatUTCPeriod(d) { + return locale_periods[+(d.getUTCHours() >= 12)]; + } + + return { + format: function(specifier) { + var f = newFormat(specifier += "", formats); + f.toString = function() { return specifier; }; + return f; + }, + parse: function(specifier) { + var p = newParse(specifier += "", localDate); + p.toString = function() { return specifier; }; + return p; + }, + utcFormat: function(specifier) { + var f = newFormat(specifier += "", utcFormats); + f.toString = function() { return specifier; }; + return f; + }, + utcParse: function(specifier) { + var p = newParse(specifier, utcDate); + p.toString = function() { return specifier; }; + return p; + } + }; +} + +var pads = {"-": "", "_": " ", "0": "0"}; +var numberRe = /^\s*\d+/; +var percentRe = /^%/; +var requoteRe = /[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g; + +function pad(value, fill, width) { + var sign = value < 0 ? "-" : "", + string = (sign ? -value : value) + "", + length = string.length; + return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string); +} + +function requote(s) { + return s.replace(requoteRe, "\\$&"); +} + +function formatRe(names) { + return new RegExp("^(?:" + names.map(requote).join("|") + ")", "i"); +} + +function formatLookup(names) { + var map = {}, i = -1, n = names.length; + while (++i < n) map[names[i].toLowerCase()] = i; + return map; +} + +function parseWeekdayNumber(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 1)); + return n ? (d.w = +n[0], i + n[0].length) : -1; +} + +function parseWeekNumberSunday(d, string, i) { + var n = numberRe.exec(string.slice(i)); + return n ? (d.U = +n[0], i + n[0].length) : -1; +} + +function parseWeekNumberMonday(d, string, i) { + var n = numberRe.exec(string.slice(i)); + return n ? (d.W = +n[0], i + n[0].length) : -1; +} + +function parseFullYear(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 4)); + return n ? (d.y = +n[0], i + n[0].length) : -1; +} + +function parseYear(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1; +} + +function parseZone(d, string, i) { + var n = /^(Z)|([+-]\d\d)(?:\:?(\d\d))?/.exec(string.slice(i, i + 6)); + return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || "00")), i + n[0].length) : -1; +} + +function parseMonthNumber(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.m = n[0] - 1, i + n[0].length) : -1; +} + +function parseDayOfMonth(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.d = +n[0], i + n[0].length) : -1; +} + +function parseDayOfYear(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 3)); + return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1; +} + +function parseHour24(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.H = +n[0], i + n[0].length) : -1; +} + +function parseMinutes(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.M = +n[0], i + n[0].length) : -1; +} + +function parseSeconds(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.S = +n[0], i + n[0].length) : -1; +} + +function parseMilliseconds(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 3)); + return n ? (d.L = +n[0], i + n[0].length) : -1; +} + +function parseLiteralPercent(d, string, i) { + var n = percentRe.exec(string.slice(i, i + 1)); + return n ? i + n[0].length : -1; +} + +function formatDayOfMonth(d, p) { + return pad(d.getDate(), p, 2); +} + +function formatHour24(d, p) { + return pad(d.getHours(), p, 2); +} + +function formatHour12(d, p) { + return pad(d.getHours() % 12 || 12, p, 2); +} + +function formatDayOfYear(d, p) { + return pad(1 + day.count(year(d), d), p, 3); +} + +function formatMilliseconds(d, p) { + return pad(d.getMilliseconds(), p, 3); +} + +function formatMonthNumber(d, p) { + return pad(d.getMonth() + 1, p, 2); +} + +function formatMinutes(d, p) { + return pad(d.getMinutes(), p, 2); +} + +function formatSeconds(d, p) { + return pad(d.getSeconds(), p, 2); +} + +function formatWeekNumberSunday(d, p) { + return pad(sunday.count(year(d), d), p, 2); +} + +function formatWeekdayNumber(d) { + return d.getDay(); +} + +function formatWeekNumberMonday(d, p) { + return pad(monday.count(year(d), d), p, 2); +} + +function formatYear(d, p) { + return pad(d.getFullYear() % 100, p, 2); +} + +function formatFullYear(d, p) { + return pad(d.getFullYear() % 10000, p, 4); +} + +function formatZone(d) { + var z = d.getTimezoneOffset(); + return (z > 0 ? "-" : (z *= -1, "+")) + + pad(z / 60 | 0, "0", 2) + + pad(z % 60, "0", 2); +} + +function formatUTCDayOfMonth(d, p) { + return pad(d.getUTCDate(), p, 2); +} + +function formatUTCHour24(d, p) { + return pad(d.getUTCHours(), p, 2); +} + +function formatUTCHour12(d, p) { + return pad(d.getUTCHours() % 12 || 12, p, 2); +} + +function formatUTCDayOfYear(d, p) { + return pad(1 + utcDay.count(utcYear(d), d), p, 3); +} + +function formatUTCMilliseconds(d, p) { + return pad(d.getUTCMilliseconds(), p, 3); +} + +function formatUTCMonthNumber(d, p) { + return pad(d.getUTCMonth() + 1, p, 2); +} + +function formatUTCMinutes(d, p) { + return pad(d.getUTCMinutes(), p, 2); +} + +function formatUTCSeconds(d, p) { + return pad(d.getUTCSeconds(), p, 2); +} + +function formatUTCWeekNumberSunday(d, p) { + return pad(utcSunday.count(utcYear(d), d), p, 2); +} + +function formatUTCWeekdayNumber(d) { + return d.getUTCDay(); +} + +function formatUTCWeekNumberMonday(d, p) { + return pad(utcMonday.count(utcYear(d), d), p, 2); +} + +function formatUTCYear(d, p) { + return pad(d.getUTCFullYear() % 100, p, 2); +} + +function formatUTCFullYear(d, p) { + return pad(d.getUTCFullYear() % 10000, p, 4); +} + +function formatUTCZone() { + return "+0000"; +} + +function formatLiteralPercent() { + return "%"; +} + +var locale$2; + + + + + +defaultLocale$1({ + dateTime: "%x, %X", + date: "%-m/%-d/%Y", + time: "%-I:%M:%S %p", + periods: ["AM", "PM"], + days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], + shortDays: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], + months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], + shortMonths: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] +}); + +function defaultLocale$1(definition) { + locale$2 = formatLocale$1(definition); + exports.timeFormat = locale$2.format; + exports.timeParse = locale$2.parse; + exports.utcFormat = locale$2.utcFormat; + exports.utcParse = locale$2.utcParse; + return locale$2; +} + +var isoSpecifier = "%Y-%m-%dT%H:%M:%S.%LZ"; + +function formatIsoNative(date) { + return date.toISOString(); +} + +var formatIso = Date.prototype.toISOString + ? formatIsoNative + : exports.utcFormat(isoSpecifier); + +function parseIsoNative(string) { + var date = new Date(string); + return isNaN(date) ? null : date; +} + +var parseIso = +new Date("2000-01-01T00:00:00.000Z") + ? parseIsoNative + : exports.utcParse(isoSpecifier); + +var durationSecond = 1000; +var durationMinute = durationSecond * 60; +var durationHour = durationMinute * 60; +var durationDay = durationHour * 24; +var durationWeek = durationDay * 7; +var durationMonth = durationDay * 30; +var durationYear = durationDay * 365; + +function date$1(t) { + return new Date(t); +} + +function number$2(t) { + return t instanceof Date ? +t : +new Date(+t); +} + +function calendar(year$$1, month$$1, week, day$$1, hour$$1, minute$$1, second$$1, millisecond$$1, format) { + var scale = continuous(deinterpolateLinear, reinterpolate), + invert = scale.invert, + domain = scale.domain; + + var formatMillisecond = format(".%L"), + formatSecond = format(":%S"), + formatMinute = format("%I:%M"), + formatHour = format("%I %p"), + formatDay = format("%a %d"), + formatWeek = format("%b %d"), + formatMonth = format("%B"), + formatYear = format("%Y"); + + var tickIntervals = [ + [second$$1, 1, durationSecond], + [second$$1, 5, 5 * durationSecond], + [second$$1, 15, 15 * durationSecond], + [second$$1, 30, 30 * durationSecond], + [minute$$1, 1, durationMinute], + [minute$$1, 5, 5 * durationMinute], + [minute$$1, 15, 15 * durationMinute], + [minute$$1, 30, 30 * durationMinute], + [ hour$$1, 1, durationHour ], + [ hour$$1, 3, 3 * durationHour ], + [ hour$$1, 6, 6 * durationHour ], + [ hour$$1, 12, 12 * durationHour ], + [ day$$1, 1, durationDay ], + [ day$$1, 2, 2 * durationDay ], + [ week, 1, durationWeek ], + [ month$$1, 1, durationMonth ], + [ month$$1, 3, 3 * durationMonth ], + [ year$$1, 1, durationYear ] + ]; + + function tickFormat(date) { + return (second$$1(date) < date ? formatMillisecond + : minute$$1(date) < date ? formatSecond + : hour$$1(date) < date ? formatMinute + : day$$1(date) < date ? formatHour + : month$$1(date) < date ? (week(date) < date ? formatDay : formatWeek) + : year$$1(date) < date ? formatMonth + : formatYear)(date); + } + + function tickInterval(interval, start, stop, step) { + if (interval == null) interval = 10; + + // If a desired tick count is specified, pick a reasonable tick interval + // based on the extent of the domain and a rough estimate of tick size. + // Otherwise, assume interval is already a time interval and use it. + if (typeof interval === "number") { + var target = Math.abs(stop - start) / interval, + i = bisector(function(i) { return i[2]; }).right(tickIntervals, target); + if (i === tickIntervals.length) { + step = tickStep(start / durationYear, stop / durationYear, interval); + interval = year$$1; + } else if (i) { + i = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i]; + step = i[1]; + interval = i[0]; + } else { + step = tickStep(start, stop, interval); + interval = millisecond$$1; + } + } + + return step == null ? interval : interval.every(step); + } + + scale.invert = function(y) { + return new Date(invert(y)); + }; + + scale.domain = function(_) { + return arguments.length ? domain(map$3.call(_, number$2)) : domain().map(date$1); + }; + + scale.ticks = function(interval, step) { + var d = domain(), + t0 = d[0], + t1 = d[d.length - 1], + r = t1 < t0, + t; + if (r) t = t0, t0 = t1, t1 = t; + t = tickInterval(interval, t0, t1, step); + t = t ? t.range(t0, t1 + 1) : []; // inclusive stop + return r ? t.reverse() : t; + }; + + scale.tickFormat = function(count, specifier) { + return specifier == null ? tickFormat : format(specifier); + }; + + scale.nice = function(interval, step) { + var d = domain(); + return (interval = tickInterval(interval, d[0], d[d.length - 1], step)) + ? domain(nice(d, interval)) + : scale; + }; + + scale.copy = function() { + return copy(scale, calendar(year$$1, month$$1, week, day$$1, hour$$1, minute$$1, second$$1, millisecond$$1, format)); + }; + + return scale; +} + +var time = function() { + return calendar(year, month, sunday, day, hour, minute, second, millisecond, exports.timeFormat).domain([new Date(2000, 0, 1), new Date(2000, 0, 2)]); +}; + +var utcTime = function() { + return calendar(utcYear, utcMonth, utcSunday, utcDay, utcHour, utcMinute, second, millisecond, exports.utcFormat).domain([Date.UTC(2000, 0, 1), Date.UTC(2000, 0, 2)]); +}; + +var colors = function(s) { + return s.match(/.{6}/g).map(function(x) { + return "#" + x; + }); +}; + +var category10 = colors("1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf"); + +var category20b = colors("393b795254a36b6ecf9c9ede6379398ca252b5cf6bcedb9c8c6d31bd9e39e7ba52e7cb94843c39ad494ad6616be7969c7b4173a55194ce6dbdde9ed6"); + +var category20c = colors("3182bd6baed69ecae1c6dbefe6550dfd8d3cfdae6bfdd0a231a35474c476a1d99bc7e9c0756bb19e9ac8bcbddcdadaeb636363969696bdbdbdd9d9d9"); + +var category20 = colors("1f77b4aec7e8ff7f0effbb782ca02c98df8ad62728ff98969467bdc5b0d58c564bc49c94e377c2f7b6d27f7f7fc7c7c7bcbd22dbdb8d17becf9edae5"); + +var cubehelix$3 = cubehelixLong(cubehelix(300, 0.5, 0.0), cubehelix(-240, 0.5, 1.0)); + +var warm = cubehelixLong(cubehelix(-100, 0.75, 0.35), cubehelix(80, 1.50, 0.8)); + +var cool = cubehelixLong(cubehelix(260, 0.75, 0.35), cubehelix(80, 1.50, 0.8)); + +var rainbow = cubehelix(); + +var rainbow$1 = function(t) { + if (t < 0 || t > 1) t -= Math.floor(t); + var ts = Math.abs(t - 0.5); + rainbow.h = 360 * t - 100; + rainbow.s = 1.5 - 1.5 * ts; + rainbow.l = 0.8 - 0.9 * ts; + return rainbow + ""; +}; + +function ramp(range) { + var n = range.length; + return function(t) { + return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))]; + }; +} + +var viridis = ramp(colors("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725")); + +var magma = ramp(colors("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf")); + +var inferno = ramp(colors("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4")); + +var plasma = ramp(colors("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921")); + +function sequential(interpolator) { + var x0 = 0, + x1 = 1, + clamp = false; + + function scale(x) { + var t = (x - x0) / (x1 - x0); + return interpolator(clamp ? Math.max(0, Math.min(1, t)) : t); + } + + scale.domain = function(_) { + return arguments.length ? (x0 = +_[0], x1 = +_[1], scale) : [x0, x1]; + }; + + scale.clamp = function(_) { + return arguments.length ? (clamp = !!_, scale) : clamp; + }; + + scale.interpolator = function(_) { + return arguments.length ? (interpolator = _, scale) : interpolator; + }; + + scale.copy = function() { + return sequential(interpolator).domain([x0, x1]).clamp(clamp); + }; + + return linearish(scale); +} + +var constant$10 = function(x) { + return function constant() { + return x; + }; +}; + +var abs$1 = Math.abs; +var atan2$1 = Math.atan2; +var cos$2 = Math.cos; +var max$2 = Math.max; +var min$1 = Math.min; +var sin$2 = Math.sin; +var sqrt$2 = Math.sqrt; + +var epsilon$3 = 1e-12; +var pi$4 = Math.PI; +var halfPi$3 = pi$4 / 2; +var tau$4 = 2 * pi$4; + +function acos$1(x) { + return x > 1 ? 0 : x < -1 ? pi$4 : Math.acos(x); +} + +function asin$1(x) { + return x >= 1 ? halfPi$3 : x <= -1 ? -halfPi$3 : Math.asin(x); +} + +function arcInnerRadius(d) { + return d.innerRadius; +} + +function arcOuterRadius(d) { + return d.outerRadius; +} + +function arcStartAngle(d) { + return d.startAngle; +} + +function arcEndAngle(d) { + return d.endAngle; +} + +function arcPadAngle(d) { + return d && d.padAngle; // Note: optional! +} + +function intersect(x0, y0, x1, y1, x2, y2, x3, y3) { + var x10 = x1 - x0, y10 = y1 - y0, + x32 = x3 - x2, y32 = y3 - y2, + t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / (y32 * x10 - x32 * y10); + return [x0 + t * x10, y0 + t * y10]; +} + +// Compute perpendicular offset line of length rc. +// http://mathworld.wolfram.com/Circle-LineIntersection.html +function cornerTangents(x0, y0, x1, y1, r1, rc, cw) { + var x01 = x0 - x1, + y01 = y0 - y1, + lo = (cw ? rc : -rc) / sqrt$2(x01 * x01 + y01 * y01), + ox = lo * y01, + oy = -lo * x01, + x11 = x0 + ox, + y11 = y0 + oy, + x10 = x1 + ox, + y10 = y1 + oy, + x00 = (x11 + x10) / 2, + y00 = (y11 + y10) / 2, + dx = x10 - x11, + dy = y10 - y11, + d2 = dx * dx + dy * dy, + r = r1 - rc, + D = x11 * y10 - x10 * y11, + d = (dy < 0 ? -1 : 1) * sqrt$2(max$2(0, r * r * d2 - D * D)), + cx0 = (D * dy - dx * d) / d2, + cy0 = (-D * dx - dy * d) / d2, + cx1 = (D * dy + dx * d) / d2, + cy1 = (-D * dx + dy * d) / d2, + dx0 = cx0 - x00, + dy0 = cy0 - y00, + dx1 = cx1 - x00, + dy1 = cy1 - y00; + + // Pick the closer of the two intersection points. + // TODO Is there a faster way to determine which intersection to use? + if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1; + + return { + cx: cx0, + cy: cy0, + x01: -ox, + y01: -oy, + x11: cx0 * (r1 / r - 1), + y11: cy0 * (r1 / r - 1) + }; +} + +var arc = function() { + var innerRadius = arcInnerRadius, + outerRadius = arcOuterRadius, + cornerRadius = constant$10(0), + padRadius = null, + startAngle = arcStartAngle, + endAngle = arcEndAngle, + padAngle = arcPadAngle, + context = null; + + function arc() { + var buffer, + r, + r0 = +innerRadius.apply(this, arguments), + r1 = +outerRadius.apply(this, arguments), + a0 = startAngle.apply(this, arguments) - halfPi$3, + a1 = endAngle.apply(this, arguments) - halfPi$3, + da = abs$1(a1 - a0), + cw = a1 > a0; + + if (!context) context = buffer = path(); + + // Ensure that the outer radius is always larger than the inner radius. + if (r1 < r0) r = r1, r1 = r0, r0 = r; + + // Is it a point? + if (!(r1 > epsilon$3)) context.moveTo(0, 0); + + // Or is it a circle or annulus? + else if (da > tau$4 - epsilon$3) { + context.moveTo(r1 * cos$2(a0), r1 * sin$2(a0)); + context.arc(0, 0, r1, a0, a1, !cw); + if (r0 > epsilon$3) { + context.moveTo(r0 * cos$2(a1), r0 * sin$2(a1)); + context.arc(0, 0, r0, a1, a0, cw); + } + } + + // Or is it a circular or annular sector? + else { + var a01 = a0, + a11 = a1, + a00 = a0, + a10 = a1, + da0 = da, + da1 = da, + ap = padAngle.apply(this, arguments) / 2, + rp = (ap > epsilon$3) && (padRadius ? +padRadius.apply(this, arguments) : sqrt$2(r0 * r0 + r1 * r1)), + rc = min$1(abs$1(r1 - r0) / 2, +cornerRadius.apply(this, arguments)), + rc0 = rc, + rc1 = rc, + t0, + t1; + + // Apply padding? Note that since r1 ≥ r0, da1 ≥ da0. + if (rp > epsilon$3) { + var p0 = asin$1(rp / r0 * sin$2(ap)), + p1 = asin$1(rp / r1 * sin$2(ap)); + if ((da0 -= p0 * 2) > epsilon$3) p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0; + else da0 = 0, a00 = a10 = (a0 + a1) / 2; + if ((da1 -= p1 * 2) > epsilon$3) p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1; + else da1 = 0, a01 = a11 = (a0 + a1) / 2; + } + + var x01 = r1 * cos$2(a01), + y01 = r1 * sin$2(a01), + x10 = r0 * cos$2(a10), + y10 = r0 * sin$2(a10); + + // Apply rounded corners? + if (rc > epsilon$3) { + var x11 = r1 * cos$2(a11), + y11 = r1 * sin$2(a11), + x00 = r0 * cos$2(a00), + y00 = r0 * sin$2(a00); + + // Restrict the corner radius according to the sector angle. + if (da < pi$4) { + var oc = da0 > epsilon$3 ? intersect(x01, y01, x00, y00, x11, y11, x10, y10) : [x10, y10], + ax = x01 - oc[0], + ay = y01 - oc[1], + bx = x11 - oc[0], + by = y11 - oc[1], + kc = 1 / sin$2(acos$1((ax * bx + ay * by) / (sqrt$2(ax * ax + ay * ay) * sqrt$2(bx * bx + by * by))) / 2), + lc = sqrt$2(oc[0] * oc[0] + oc[1] * oc[1]); + rc0 = min$1(rc, (r0 - lc) / (kc - 1)); + rc1 = min$1(rc, (r1 - lc) / (kc + 1)); + } + } + + // Is the sector collapsed to a line? + if (!(da1 > epsilon$3)) context.moveTo(x01, y01); + + // Does the sector’s outer ring have rounded corners? + else if (rc1 > epsilon$3) { + t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw); + t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw); + + context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01); + + // Have the corners merged? + if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, atan2$1(t0.y01, t0.x01), atan2$1(t1.y01, t1.x01), !cw); + + // Otherwise, draw the two corners and the ring. + else { + context.arc(t0.cx, t0.cy, rc1, atan2$1(t0.y01, t0.x01), atan2$1(t0.y11, t0.x11), !cw); + context.arc(0, 0, r1, atan2$1(t0.cy + t0.y11, t0.cx + t0.x11), atan2$1(t1.cy + t1.y11, t1.cx + t1.x11), !cw); + context.arc(t1.cx, t1.cy, rc1, atan2$1(t1.y11, t1.x11), atan2$1(t1.y01, t1.x01), !cw); + } + } + + // Or is the outer ring just a circular arc? + else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw); + + // Is there no inner ring, and it’s a circular sector? + // Or perhaps it’s an annular sector collapsed due to padding? + if (!(r0 > epsilon$3) || !(da0 > epsilon$3)) context.lineTo(x10, y10); + + // Does the sector’s inner ring (or point) have rounded corners? + else if (rc0 > epsilon$3) { + t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw); + t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw); + + context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01); + + // Have the corners merged? + if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, atan2$1(t0.y01, t0.x01), atan2$1(t1.y01, t1.x01), !cw); + + // Otherwise, draw the two corners and the ring. + else { + context.arc(t0.cx, t0.cy, rc0, atan2$1(t0.y01, t0.x01), atan2$1(t0.y11, t0.x11), !cw); + context.arc(0, 0, r0, atan2$1(t0.cy + t0.y11, t0.cx + t0.x11), atan2$1(t1.cy + t1.y11, t1.cx + t1.x11), cw); + context.arc(t1.cx, t1.cy, rc0, atan2$1(t1.y11, t1.x11), atan2$1(t1.y01, t1.x01), !cw); + } + } + + // Or is the inner ring just a circular arc? + else context.arc(0, 0, r0, a10, a00, cw); + } + + context.closePath(); + + if (buffer) return context = null, buffer + "" || null; + } + + arc.centroid = function() { + var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2, + a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi$4 / 2; + return [cos$2(a) * r, sin$2(a) * r]; + }; + + arc.innerRadius = function(_) { + return arguments.length ? (innerRadius = typeof _ === "function" ? _ : constant$10(+_), arc) : innerRadius; + }; + + arc.outerRadius = function(_) { + return arguments.length ? (outerRadius = typeof _ === "function" ? _ : constant$10(+_), arc) : outerRadius; + }; + + arc.cornerRadius = function(_) { + return arguments.length ? (cornerRadius = typeof _ === "function" ? _ : constant$10(+_), arc) : cornerRadius; + }; + + arc.padRadius = function(_) { + return arguments.length ? (padRadius = _ == null ? null : typeof _ === "function" ? _ : constant$10(+_), arc) : padRadius; + }; + + arc.startAngle = function(_) { + return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$10(+_), arc) : startAngle; + }; + + arc.endAngle = function(_) { + return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$10(+_), arc) : endAngle; + }; + + arc.padAngle = function(_) { + return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant$10(+_), arc) : padAngle; + }; + + arc.context = function(_) { + return arguments.length ? ((context = _ == null ? null : _), arc) : context; + }; + + return arc; +}; + +function Linear(context) { + this._context = context; +} + +Linear.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._point = 0; + }, + lineEnd: function() { + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; + case 1: this._point = 2; // proceed + default: this._context.lineTo(x, y); break; + } + } +}; + +var curveLinear = function(context) { + return new Linear(context); +}; + +function x$3(p) { + return p[0]; +} + +function y$3(p) { + return p[1]; +} + +var line = function() { + var x$$1 = x$3, + y$$1 = y$3, + defined = constant$10(true), + context = null, + curve = curveLinear, + output = null; + + function line(data) { + var i, + n = data.length, + d, + defined0 = false, + buffer; + + if (context == null) output = curve(buffer = path()); + + for (i = 0; i <= n; ++i) { + if (!(i < n && defined(d = data[i], i, data)) === defined0) { + if (defined0 = !defined0) output.lineStart(); + else output.lineEnd(); + } + if (defined0) output.point(+x$$1(d, i, data), +y$$1(d, i, data)); + } + + if (buffer) return output = null, buffer + "" || null; + } + + line.x = function(_) { + return arguments.length ? (x$$1 = typeof _ === "function" ? _ : constant$10(+_), line) : x$$1; + }; + + line.y = function(_) { + return arguments.length ? (y$$1 = typeof _ === "function" ? _ : constant$10(+_), line) : y$$1; + }; + + line.defined = function(_) { + return arguments.length ? (defined = typeof _ === "function" ? _ : constant$10(!!_), line) : defined; + }; + + line.curve = function(_) { + return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve; + }; + + line.context = function(_) { + return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context; + }; + + return line; +}; + +var area$2 = function() { + var x0 = x$3, + x1 = null, + y0 = constant$10(0), + y1 = y$3, + defined = constant$10(true), + context = null, + curve = curveLinear, + output = null; + + function area(data) { + var i, + j, + k, + n = data.length, + d, + defined0 = false, + buffer, + x0z = new Array(n), + y0z = new Array(n); + + if (context == null) output = curve(buffer = path()); + + for (i = 0; i <= n; ++i) { + if (!(i < n && defined(d = data[i], i, data)) === defined0) { + if (defined0 = !defined0) { + j = i; + output.areaStart(); + output.lineStart(); + } else { + output.lineEnd(); + output.lineStart(); + for (k = i - 1; k >= j; --k) { + output.point(x0z[k], y0z[k]); + } + output.lineEnd(); + output.areaEnd(); + } + } + if (defined0) { + x0z[i] = +x0(d, i, data), y0z[i] = +y0(d, i, data); + output.point(x1 ? +x1(d, i, data) : x0z[i], y1 ? +y1(d, i, data) : y0z[i]); + } + } + + if (buffer) return output = null, buffer + "" || null; + } + + function arealine() { + return line().defined(defined).curve(curve).context(context); + } + + area.x = function(_) { + return arguments.length ? (x0 = typeof _ === "function" ? _ : constant$10(+_), x1 = null, area) : x0; + }; + + area.x0 = function(_) { + return arguments.length ? (x0 = typeof _ === "function" ? _ : constant$10(+_), area) : x0; + }; + + area.x1 = function(_) { + return arguments.length ? (x1 = _ == null ? null : typeof _ === "function" ? _ : constant$10(+_), area) : x1; + }; + + area.y = function(_) { + return arguments.length ? (y0 = typeof _ === "function" ? _ : constant$10(+_), y1 = null, area) : y0; + }; + + area.y0 = function(_) { + return arguments.length ? (y0 = typeof _ === "function" ? _ : constant$10(+_), area) : y0; + }; + + area.y1 = function(_) { + return arguments.length ? (y1 = _ == null ? null : typeof _ === "function" ? _ : constant$10(+_), area) : y1; + }; + + area.lineX0 = + area.lineY0 = function() { + return arealine().x(x0).y(y0); + }; + + area.lineY1 = function() { + return arealine().x(x0).y(y1); + }; + + area.lineX1 = function() { + return arealine().x(x1).y(y0); + }; + + area.defined = function(_) { + return arguments.length ? (defined = typeof _ === "function" ? _ : constant$10(!!_), area) : defined; + }; + + area.curve = function(_) { + return arguments.length ? (curve = _, context != null && (output = curve(context)), area) : curve; + }; + + area.context = function(_) { + return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), area) : context; + }; + + return area; +}; + +var descending$1 = function(a, b) { + return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN; +}; + +var identity$7 = function(d) { + return d; +}; + +var pie = function() { + var value = identity$7, + sortValues = descending$1, + sort = null, + startAngle = constant$10(0), + endAngle = constant$10(tau$4), + padAngle = constant$10(0); + + function pie(data) { + var i, + n = data.length, + j, + k, + sum = 0, + index = new Array(n), + arcs = new Array(n), + a0 = +startAngle.apply(this, arguments), + da = Math.min(tau$4, Math.max(-tau$4, endAngle.apply(this, arguments) - a0)), + a1, + p = Math.min(Math.abs(da) / n, padAngle.apply(this, arguments)), + pa = p * (da < 0 ? -1 : 1), + v; + + for (i = 0; i < n; ++i) { + if ((v = arcs[index[i] = i] = +value(data[i], i, data)) > 0) { + sum += v; + } + } + + // Optionally sort the arcs by previously-computed values or by data. + if (sortValues != null) index.sort(function(i, j) { return sortValues(arcs[i], arcs[j]); }); + else if (sort != null) index.sort(function(i, j) { return sort(data[i], data[j]); }); + + // Compute the arcs! They are stored in the original data's order. + for (i = 0, k = sum ? (da - n * pa) / sum : 0; i < n; ++i, a0 = a1) { + j = index[i], v = arcs[j], a1 = a0 + (v > 0 ? v * k : 0) + pa, arcs[j] = { + data: data[j], + index: i, + value: v, + startAngle: a0, + endAngle: a1, + padAngle: p + }; + } + + return arcs; + } + + pie.value = function(_) { + return arguments.length ? (value = typeof _ === "function" ? _ : constant$10(+_), pie) : value; + }; + + pie.sortValues = function(_) { + return arguments.length ? (sortValues = _, sort = null, pie) : sortValues; + }; + + pie.sort = function(_) { + return arguments.length ? (sort = _, sortValues = null, pie) : sort; + }; + + pie.startAngle = function(_) { + return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$10(+_), pie) : startAngle; + }; + + pie.endAngle = function(_) { + return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$10(+_), pie) : endAngle; + }; + + pie.padAngle = function(_) { + return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant$10(+_), pie) : padAngle; + }; + + return pie; +}; + +var curveRadialLinear = curveRadial(curveLinear); + +function Radial(curve) { + this._curve = curve; +} + +Radial.prototype = { + areaStart: function() { + this._curve.areaStart(); + }, + areaEnd: function() { + this._curve.areaEnd(); + }, + lineStart: function() { + this._curve.lineStart(); + }, + lineEnd: function() { + this._curve.lineEnd(); + }, + point: function(a, r) { + this._curve.point(r * Math.sin(a), r * -Math.cos(a)); + } +}; + +function curveRadial(curve) { + + function radial(context) { + return new Radial(curve(context)); + } + + radial._curve = curve; + + return radial; +} + +function radialLine(l) { + var c = l.curve; + + l.angle = l.x, delete l.x; + l.radius = l.y, delete l.y; + + l.curve = function(_) { + return arguments.length ? c(curveRadial(_)) : c()._curve; + }; + + return l; +} + +var radialLine$1 = function() { + return radialLine(line().curve(curveRadialLinear)); +}; + +var radialArea = function() { + var a = area$2().curve(curveRadialLinear), + c = a.curve, + x0 = a.lineX0, + x1 = a.lineX1, + y0 = a.lineY0, + y1 = a.lineY1; + + a.angle = a.x, delete a.x; + a.startAngle = a.x0, delete a.x0; + a.endAngle = a.x1, delete a.x1; + a.radius = a.y, delete a.y; + a.innerRadius = a.y0, delete a.y0; + a.outerRadius = a.y1, delete a.y1; + a.lineStartAngle = function() { return radialLine(x0()); }, delete a.lineX0; + a.lineEndAngle = function() { return radialLine(x1()); }, delete a.lineX1; + a.lineInnerRadius = function() { return radialLine(y0()); }, delete a.lineY0; + a.lineOuterRadius = function() { return radialLine(y1()); }, delete a.lineY1; + + a.curve = function(_) { + return arguments.length ? c(curveRadial(_)) : c()._curve; + }; + + return a; +}; + +var slice$5 = Array.prototype.slice; + +var radialPoint = function(x, y) { + return [(y = +y) * Math.cos(x -= Math.PI / 2), y * Math.sin(x)]; +}; + +function linkSource(d) { + return d.source; +} + +function linkTarget(d) { + return d.target; +} + +function link$2(curve) { + var source = linkSource, + target = linkTarget, + x$$1 = x$3, + y$$1 = y$3, + context = null; + + function link() { + var buffer, argv = slice$5.call(arguments), s = source.apply(this, argv), t = target.apply(this, argv); + if (!context) context = buffer = path(); + curve(context, +x$$1.apply(this, (argv[0] = s, argv)), +y$$1.apply(this, argv), +x$$1.apply(this, (argv[0] = t, argv)), +y$$1.apply(this, argv)); + if (buffer) return context = null, buffer + "" || null; + } + + link.source = function(_) { + return arguments.length ? (source = _, link) : source; + }; + + link.target = function(_) { + return arguments.length ? (target = _, link) : target; + }; + + link.x = function(_) { + return arguments.length ? (x$$1 = typeof _ === "function" ? _ : constant$10(+_), link) : x$$1; + }; + + link.y = function(_) { + return arguments.length ? (y$$1 = typeof _ === "function" ? _ : constant$10(+_), link) : y$$1; + }; + + link.context = function(_) { + return arguments.length ? ((context = _ == null ? null : _), link) : context; + }; + + return link; +} + +function curveHorizontal(context, x0, y0, x1, y1) { + context.moveTo(x0, y0); + context.bezierCurveTo(x0 = (x0 + x1) / 2, y0, x0, y1, x1, y1); +} + +function curveVertical(context, x0, y0, x1, y1) { + context.moveTo(x0, y0); + context.bezierCurveTo(x0, y0 = (y0 + y1) / 2, x1, y0, x1, y1); +} + +function curveRadial$1(context, x0, y0, x1, y1) { + var p0 = radialPoint(x0, y0), + p1 = radialPoint(x0, y0 = (y0 + y1) / 2), + p2 = radialPoint(x1, y0), + p3 = radialPoint(x1, y1); + context.moveTo(p0[0], p0[1]); + context.bezierCurveTo(p1[0], p1[1], p2[0], p2[1], p3[0], p3[1]); +} + +function linkHorizontal() { + return link$2(curveHorizontal); +} + +function linkVertical() { + return link$2(curveVertical); +} + +function linkRadial() { + var l = link$2(curveRadial$1); + l.angle = l.x, delete l.x; + l.radius = l.y, delete l.y; + return l; +} + +var circle$2 = { + draw: function(context, size) { + var r = Math.sqrt(size / pi$4); + context.moveTo(r, 0); + context.arc(0, 0, r, 0, tau$4); + } +}; + +var cross$2 = { + draw: function(context, size) { + var r = Math.sqrt(size / 5) / 2; + context.moveTo(-3 * r, -r); + context.lineTo(-r, -r); + context.lineTo(-r, -3 * r); + context.lineTo(r, -3 * r); + context.lineTo(r, -r); + context.lineTo(3 * r, -r); + context.lineTo(3 * r, r); + context.lineTo(r, r); + context.lineTo(r, 3 * r); + context.lineTo(-r, 3 * r); + context.lineTo(-r, r); + context.lineTo(-3 * r, r); + context.closePath(); + } +}; + +var tan30 = Math.sqrt(1 / 3); +var tan30_2 = tan30 * 2; + +var diamond = { + draw: function(context, size) { + var y = Math.sqrt(size / tan30_2), + x = y * tan30; + context.moveTo(0, -y); + context.lineTo(x, 0); + context.lineTo(0, y); + context.lineTo(-x, 0); + context.closePath(); + } +}; + +var ka = 0.89081309152928522810; +var kr = Math.sin(pi$4 / 10) / Math.sin(7 * pi$4 / 10); +var kx = Math.sin(tau$4 / 10) * kr; +var ky = -Math.cos(tau$4 / 10) * kr; + +var star = { + draw: function(context, size) { + var r = Math.sqrt(size * ka), + x = kx * r, + y = ky * r; + context.moveTo(0, -r); + context.lineTo(x, y); + for (var i = 1; i < 5; ++i) { + var a = tau$4 * i / 5, + c = Math.cos(a), + s = Math.sin(a); + context.lineTo(s * r, -c * r); + context.lineTo(c * x - s * y, s * x + c * y); + } + context.closePath(); + } +}; + +var square = { + draw: function(context, size) { + var w = Math.sqrt(size), + x = -w / 2; + context.rect(x, x, w, w); + } +}; + +var sqrt3 = Math.sqrt(3); + +var triangle = { + draw: function(context, size) { + var y = -Math.sqrt(size / (sqrt3 * 3)); + context.moveTo(0, y * 2); + context.lineTo(-sqrt3 * y, -y); + context.lineTo(sqrt3 * y, -y); + context.closePath(); + } +}; + +var c = -0.5; +var s = Math.sqrt(3) / 2; +var k = 1 / Math.sqrt(12); +var a = (k / 2 + 1) * 3; + +var wye = { + draw: function(context, size) { + var r = Math.sqrt(size / a), + x0 = r / 2, + y0 = r * k, + x1 = x0, + y1 = r * k + r, + x2 = -x1, + y2 = y1; + context.moveTo(x0, y0); + context.lineTo(x1, y1); + context.lineTo(x2, y2); + context.lineTo(c * x0 - s * y0, s * x0 + c * y0); + context.lineTo(c * x1 - s * y1, s * x1 + c * y1); + context.lineTo(c * x2 - s * y2, s * x2 + c * y2); + context.lineTo(c * x0 + s * y0, c * y0 - s * x0); + context.lineTo(c * x1 + s * y1, c * y1 - s * x1); + context.lineTo(c * x2 + s * y2, c * y2 - s * x2); + context.closePath(); + } +}; + +var symbols = [ + circle$2, + cross$2, + diamond, + square, + star, + triangle, + wye +]; + +var symbol = function() { + var type = constant$10(circle$2), + size = constant$10(64), + context = null; + + function symbol() { + var buffer; + if (!context) context = buffer = path(); + type.apply(this, arguments).draw(context, +size.apply(this, arguments)); + if (buffer) return context = null, buffer + "" || null; + } + + symbol.type = function(_) { + return arguments.length ? (type = typeof _ === "function" ? _ : constant$10(_), symbol) : type; + }; + + symbol.size = function(_) { + return arguments.length ? (size = typeof _ === "function" ? _ : constant$10(+_), symbol) : size; + }; + + symbol.context = function(_) { + return arguments.length ? (context = _ == null ? null : _, symbol) : context; + }; + + return symbol; +}; + +var noop$2 = function() {}; + +function point$2(that, x, y) { + that._context.bezierCurveTo( + (2 * that._x0 + that._x1) / 3, + (2 * that._y0 + that._y1) / 3, + (that._x0 + 2 * that._x1) / 3, + (that._y0 + 2 * that._y1) / 3, + (that._x0 + 4 * that._x1 + x) / 6, + (that._y0 + 4 * that._y1 + y) / 6 + ); +} + +function Basis(context) { + this._context = context; +} + +Basis.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x0 = this._x1 = + this._y0 = this._y1 = NaN; + this._point = 0; + }, + lineEnd: function() { + switch (this._point) { + case 3: point$2(this, this._x1, this._y1); // proceed + case 2: this._context.lineTo(this._x1, this._y1); break; + } + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; + case 1: this._point = 2; break; + case 2: this._point = 3; this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6); // proceed + default: point$2(this, x, y); break; + } + this._x0 = this._x1, this._x1 = x; + this._y0 = this._y1, this._y1 = y; + } +}; + +var basis$2 = function(context) { + return new Basis(context); +}; + +function BasisClosed(context) { + this._context = context; +} + +BasisClosed.prototype = { + areaStart: noop$2, + areaEnd: noop$2, + lineStart: function() { + this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = + this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN; + this._point = 0; + }, + lineEnd: function() { + switch (this._point) { + case 1: { + this._context.moveTo(this._x2, this._y2); + this._context.closePath(); + break; + } + case 2: { + this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3); + this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3); + this._context.closePath(); + break; + } + case 3: { + this.point(this._x2, this._y2); + this.point(this._x3, this._y3); + this.point(this._x4, this._y4); + break; + } + } + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; this._x2 = x, this._y2 = y; break; + case 1: this._point = 2; this._x3 = x, this._y3 = y; break; + case 2: this._point = 3; this._x4 = x, this._y4 = y; this._context.moveTo((this._x0 + 4 * this._x1 + x) / 6, (this._y0 + 4 * this._y1 + y) / 6); break; + default: point$2(this, x, y); break; + } + this._x0 = this._x1, this._x1 = x; + this._y0 = this._y1, this._y1 = y; + } +}; + +var basisClosed$1 = function(context) { + return new BasisClosed(context); +}; + +function BasisOpen(context) { + this._context = context; +} + +BasisOpen.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x0 = this._x1 = + this._y0 = this._y1 = NaN; + this._point = 0; + }, + lineEnd: function() { + if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; break; + case 1: this._point = 2; break; + case 2: this._point = 3; var x0 = (this._x0 + 4 * this._x1 + x) / 6, y0 = (this._y0 + 4 * this._y1 + y) / 6; this._line ? this._context.lineTo(x0, y0) : this._context.moveTo(x0, y0); break; + case 3: this._point = 4; // proceed + default: point$2(this, x, y); break; + } + this._x0 = this._x1, this._x1 = x; + this._y0 = this._y1, this._y1 = y; + } +}; + +var basisOpen = function(context) { + return new BasisOpen(context); +}; + +function Bundle(context, beta) { + this._basis = new Basis(context); + this._beta = beta; +} + +Bundle.prototype = { + lineStart: function() { + this._x = []; + this._y = []; + this._basis.lineStart(); + }, + lineEnd: function() { + var x = this._x, + y = this._y, + j = x.length - 1; + + if (j > 0) { + var x0 = x[0], + y0 = y[0], + dx = x[j] - x0, + dy = y[j] - y0, + i = -1, + t; + + while (++i <= j) { + t = i / j; + this._basis.point( + this._beta * x[i] + (1 - this._beta) * (x0 + t * dx), + this._beta * y[i] + (1 - this._beta) * (y0 + t * dy) + ); + } + } + + this._x = this._y = null; + this._basis.lineEnd(); + }, + point: function(x, y) { + this._x.push(+x); + this._y.push(+y); + } +}; + +var bundle = ((function custom(beta) { + + function bundle(context) { + return beta === 1 ? new Basis(context) : new Bundle(context, beta); + } + + bundle.beta = function(beta) { + return custom(+beta); + }; + + return bundle; +}))(0.85); + +function point$3(that, x, y) { + that._context.bezierCurveTo( + that._x1 + that._k * (that._x2 - that._x0), + that._y1 + that._k * (that._y2 - that._y0), + that._x2 + that._k * (that._x1 - x), + that._y2 + that._k * (that._y1 - y), + that._x2, + that._y2 + ); +} + +function Cardinal(context, tension) { + this._context = context; + this._k = (1 - tension) / 6; +} + +Cardinal.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x0 = this._x1 = this._x2 = + this._y0 = this._y1 = this._y2 = NaN; + this._point = 0; + }, + lineEnd: function() { + switch (this._point) { + case 2: this._context.lineTo(this._x2, this._y2); break; + case 3: point$3(this, this._x1, this._y1); break; + } + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; + case 1: this._point = 2; this._x1 = x, this._y1 = y; break; + case 2: this._point = 3; // proceed + default: point$3(this, x, y); break; + } + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } +}; + +var cardinal = ((function custom(tension) { + + function cardinal(context) { + return new Cardinal(context, tension); + } + + cardinal.tension = function(tension) { + return custom(+tension); + }; + + return cardinal; +}))(0); + +function CardinalClosed(context, tension) { + this._context = context; + this._k = (1 - tension) / 6; +} + +CardinalClosed.prototype = { + areaStart: noop$2, + areaEnd: noop$2, + lineStart: function() { + this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 = + this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN; + this._point = 0; + }, + lineEnd: function() { + switch (this._point) { + case 1: { + this._context.moveTo(this._x3, this._y3); + this._context.closePath(); + break; + } + case 2: { + this._context.lineTo(this._x3, this._y3); + this._context.closePath(); + break; + } + case 3: { + this.point(this._x3, this._y3); + this.point(this._x4, this._y4); + this.point(this._x5, this._y5); + break; + } + } + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; this._x3 = x, this._y3 = y; break; + case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break; + case 2: this._point = 3; this._x5 = x, this._y5 = y; break; + default: point$3(this, x, y); break; + } + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } +}; + +var cardinalClosed = ((function custom(tension) { + + function cardinal(context) { + return new CardinalClosed(context, tension); + } + + cardinal.tension = function(tension) { + return custom(+tension); + }; + + return cardinal; +}))(0); + +function CardinalOpen(context, tension) { + this._context = context; + this._k = (1 - tension) / 6; +} + +CardinalOpen.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x0 = this._x1 = this._x2 = + this._y0 = this._y1 = this._y2 = NaN; + this._point = 0; + }, + lineEnd: function() { + if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; break; + case 1: this._point = 2; break; + case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break; + case 3: this._point = 4; // proceed + default: point$3(this, x, y); break; + } + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } +}; + +var cardinalOpen = ((function custom(tension) { + + function cardinal(context) { + return new CardinalOpen(context, tension); + } + + cardinal.tension = function(tension) { + return custom(+tension); + }; + + return cardinal; +}))(0); + +function point$4(that, x, y) { + var x1 = that._x1, + y1 = that._y1, + x2 = that._x2, + y2 = that._y2; + + if (that._l01_a > epsilon$3) { + var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a, + n = 3 * that._l01_a * (that._l01_a + that._l12_a); + x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n; + y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n; + } + + if (that._l23_a > epsilon$3) { + var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a, + m = 3 * that._l23_a * (that._l23_a + that._l12_a); + x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m; + y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m; + } + + that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2); +} + +function CatmullRom(context, alpha) { + this._context = context; + this._alpha = alpha; +} + +CatmullRom.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x0 = this._x1 = this._x2 = + this._y0 = this._y1 = this._y2 = NaN; + this._l01_a = this._l12_a = this._l23_a = + this._l01_2a = this._l12_2a = this._l23_2a = + this._point = 0; + }, + lineEnd: function() { + switch (this._point) { + case 2: this._context.lineTo(this._x2, this._y2); break; + case 3: this.point(this._x2, this._y2); break; + } + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + + if (this._point) { + var x23 = this._x2 - x, + y23 = this._y2 - y; + this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha)); + } + + switch (this._point) { + case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; + case 1: this._point = 2; break; + case 2: this._point = 3; // proceed + default: point$4(this, x, y); break; + } + + this._l01_a = this._l12_a, this._l12_a = this._l23_a; + this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a; + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } +}; + +var catmullRom = ((function custom(alpha) { + + function catmullRom(context) { + return alpha ? new CatmullRom(context, alpha) : new Cardinal(context, 0); + } + + catmullRom.alpha = function(alpha) { + return custom(+alpha); + }; + + return catmullRom; +}))(0.5); + +function CatmullRomClosed(context, alpha) { + this._context = context; + this._alpha = alpha; +} + +CatmullRomClosed.prototype = { + areaStart: noop$2, + areaEnd: noop$2, + lineStart: function() { + this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 = + this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN; + this._l01_a = this._l12_a = this._l23_a = + this._l01_2a = this._l12_2a = this._l23_2a = + this._point = 0; + }, + lineEnd: function() { + switch (this._point) { + case 1: { + this._context.moveTo(this._x3, this._y3); + this._context.closePath(); + break; + } + case 2: { + this._context.lineTo(this._x3, this._y3); + this._context.closePath(); + break; + } + case 3: { + this.point(this._x3, this._y3); + this.point(this._x4, this._y4); + this.point(this._x5, this._y5); + break; + } + } + }, + point: function(x, y) { + x = +x, y = +y; + + if (this._point) { + var x23 = this._x2 - x, + y23 = this._y2 - y; + this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha)); + } + + switch (this._point) { + case 0: this._point = 1; this._x3 = x, this._y3 = y; break; + case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break; + case 2: this._point = 3; this._x5 = x, this._y5 = y; break; + default: point$4(this, x, y); break; + } + + this._l01_a = this._l12_a, this._l12_a = this._l23_a; + this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a; + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } +}; + +var catmullRomClosed = ((function custom(alpha) { + + function catmullRom(context) { + return alpha ? new CatmullRomClosed(context, alpha) : new CardinalClosed(context, 0); + } + + catmullRom.alpha = function(alpha) { + return custom(+alpha); + }; + + return catmullRom; +}))(0.5); + +function CatmullRomOpen(context, alpha) { + this._context = context; + this._alpha = alpha; +} + +CatmullRomOpen.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x0 = this._x1 = this._x2 = + this._y0 = this._y1 = this._y2 = NaN; + this._l01_a = this._l12_a = this._l23_a = + this._l01_2a = this._l12_2a = this._l23_2a = + this._point = 0; + }, + lineEnd: function() { + if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + + if (this._point) { + var x23 = this._x2 - x, + y23 = this._y2 - y; + this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha)); + } + + switch (this._point) { + case 0: this._point = 1; break; + case 1: this._point = 2; break; + case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break; + case 3: this._point = 4; // proceed + default: point$4(this, x, y); break; + } + + this._l01_a = this._l12_a, this._l12_a = this._l23_a; + this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a; + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } +}; + +var catmullRomOpen = ((function custom(alpha) { + + function catmullRom(context) { + return alpha ? new CatmullRomOpen(context, alpha) : new CardinalOpen(context, 0); + } + + catmullRom.alpha = function(alpha) { + return custom(+alpha); + }; + + return catmullRom; +}))(0.5); + +function LinearClosed(context) { + this._context = context; +} + +LinearClosed.prototype = { + areaStart: noop$2, + areaEnd: noop$2, + lineStart: function() { + this._point = 0; + }, + lineEnd: function() { + if (this._point) this._context.closePath(); + }, + point: function(x, y) { + x = +x, y = +y; + if (this._point) this._context.lineTo(x, y); + else this._point = 1, this._context.moveTo(x, y); + } +}; + +var linearClosed = function(context) { + return new LinearClosed(context); +}; + +function sign$1(x) { + return x < 0 ? -1 : 1; +} + +// Calculate the slopes of the tangents (Hermite-type interpolation) based on +// the following paper: Steffen, M. 1990. A Simple Method for Monotonic +// Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO. +// NOV(II), P. 443, 1990. +function slope3(that, x2, y2) { + var h0 = that._x1 - that._x0, + h1 = x2 - that._x1, + s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0), + s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0), + p = (s0 * h1 + s1 * h0) / (h0 + h1); + return (sign$1(s0) + sign$1(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0; +} + +// Calculate a one-sided slope. +function slope2(that, t) { + var h = that._x1 - that._x0; + return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t; +} + +// According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations +// "you can express cubic Hermite interpolation in terms of cubic Bézier curves +// with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1". +function point$5(that, t0, t1) { + var x0 = that._x0, + y0 = that._y0, + x1 = that._x1, + y1 = that._y1, + dx = (x1 - x0) / 3; + that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1); +} + +function MonotoneX(context) { + this._context = context; +} + +MonotoneX.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x0 = this._x1 = + this._y0 = this._y1 = + this._t0 = NaN; + this._point = 0; + }, + lineEnd: function() { + switch (this._point) { + case 2: this._context.lineTo(this._x1, this._y1); break; + case 3: point$5(this, this._t0, slope2(this, this._t0)); break; + } + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + var t1 = NaN; + + x = +x, y = +y; + if (x === this._x1 && y === this._y1) return; // Ignore coincident points. + switch (this._point) { + case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; + case 1: this._point = 2; break; + case 2: this._point = 3; point$5(this, slope2(this, t1 = slope3(this, x, y)), t1); break; + default: point$5(this, this._t0, t1 = slope3(this, x, y)); break; + } + + this._x0 = this._x1, this._x1 = x; + this._y0 = this._y1, this._y1 = y; + this._t0 = t1; + } +}; + +function MonotoneY(context) { + this._context = new ReflectContext(context); +} + +(MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) { + MonotoneX.prototype.point.call(this, y, x); +}; + +function ReflectContext(context) { + this._context = context; +} + +ReflectContext.prototype = { + moveTo: function(x, y) { this._context.moveTo(y, x); }, + closePath: function() { this._context.closePath(); }, + lineTo: function(x, y) { this._context.lineTo(y, x); }, + bezierCurveTo: function(x1, y1, x2, y2, x, y) { this._context.bezierCurveTo(y1, x1, y2, x2, y, x); } +}; + +function monotoneX(context) { + return new MonotoneX(context); +} + +function monotoneY(context) { + return new MonotoneY(context); +} + +function Natural(context) { + this._context = context; +} + +Natural.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x = []; + this._y = []; + }, + lineEnd: function() { + var x = this._x, + y = this._y, + n = x.length; + + if (n) { + this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]); + if (n === 2) { + this._context.lineTo(x[1], y[1]); + } else { + var px = controlPoints(x), + py = controlPoints(y); + for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) { + this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]); + } + } + } + + if (this._line || (this._line !== 0 && n === 1)) this._context.closePath(); + this._line = 1 - this._line; + this._x = this._y = null; + }, + point: function(x, y) { + this._x.push(+x); + this._y.push(+y); + } +}; + +// See https://www.particleincell.com/2012/bezier-splines/ for derivation. +function controlPoints(x) { + var i, + n = x.length - 1, + m, + a = new Array(n), + b = new Array(n), + r = new Array(n); + a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1]; + for (i = 1; i < n - 1; ++i) a[i] = 1, b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1]; + a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n]; + for (i = 1; i < n; ++i) m = a[i] / b[i - 1], b[i] -= m, r[i] -= m * r[i - 1]; + a[n - 1] = r[n - 1] / b[n - 1]; + for (i = n - 2; i >= 0; --i) a[i] = (r[i] - a[i + 1]) / b[i]; + b[n - 1] = (x[n] + a[n - 1]) / 2; + for (i = 0; i < n - 1; ++i) b[i] = 2 * x[i + 1] - a[i + 1]; + return [a, b]; +} + +var natural = function(context) { + return new Natural(context); +}; + +function Step(context, t) { + this._context = context; + this._t = t; +} + +Step.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x = this._y = NaN; + this._point = 0; + }, + lineEnd: function() { + if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y); + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; + case 1: this._point = 2; // proceed + default: { + if (this._t <= 0) { + this._context.lineTo(this._x, y); + this._context.lineTo(x, y); + } else { + var x1 = this._x * (1 - this._t) + x * this._t; + this._context.lineTo(x1, this._y); + this._context.lineTo(x1, y); + } + break; + } + } + this._x = x, this._y = y; + } +}; + +var step = function(context) { + return new Step(context, 0.5); +}; + +function stepBefore(context) { + return new Step(context, 0); +} + +function stepAfter(context) { + return new Step(context, 1); +} + +var none$1 = function(series, order) { + if (!((n = series.length) > 1)) return; + for (var i = 1, j, s0, s1 = series[order[0]], n, m = s1.length; i < n; ++i) { + s0 = s1, s1 = series[order[i]]; + for (j = 0; j < m; ++j) { + s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1]; + } + } +}; + +var none$2 = function(series) { + var n = series.length, o = new Array(n); + while (--n >= 0) o[n] = n; + return o; +}; + +function stackValue(d, key) { + return d[key]; +} + +var stack = function() { + var keys = constant$10([]), + order = none$2, + offset = none$1, + value = stackValue; + + function stack(data) { + var kz = keys.apply(this, arguments), + i, + m = data.length, + n = kz.length, + sz = new Array(n), + oz; + + for (i = 0; i < n; ++i) { + for (var ki = kz[i], si = sz[i] = new Array(m), j = 0, sij; j < m; ++j) { + si[j] = sij = [0, +value(data[j], ki, j, data)]; + sij.data = data[j]; + } + si.key = ki; + } + + for (i = 0, oz = order(sz); i < n; ++i) { + sz[oz[i]].index = i; + } + + offset(sz, oz); + return sz; + } + + stack.keys = function(_) { + return arguments.length ? (keys = typeof _ === "function" ? _ : constant$10(slice$5.call(_)), stack) : keys; + }; + + stack.value = function(_) { + return arguments.length ? (value = typeof _ === "function" ? _ : constant$10(+_), stack) : value; + }; + + stack.order = function(_) { + return arguments.length ? (order = _ == null ? none$2 : typeof _ === "function" ? _ : constant$10(slice$5.call(_)), stack) : order; + }; + + stack.offset = function(_) { + return arguments.length ? (offset = _ == null ? none$1 : _, stack) : offset; + }; + + return stack; +}; + +var expand = function(series, order) { + if (!((n = series.length) > 0)) return; + for (var i, n, j = 0, m = series[0].length, y; j < m; ++j) { + for (y = i = 0; i < n; ++i) y += series[i][j][1] || 0; + if (y) for (i = 0; i < n; ++i) series[i][j][1] /= y; + } + none$1(series, order); +}; + +var diverging = function(series, order) { + if (!((n = series.length) > 1)) return; + for (var i, j = 0, d, dy, yp, yn, n, m = series[order[0]].length; j < m; ++j) { + for (yp = yn = 0, i = 0; i < n; ++i) { + if ((dy = (d = series[order[i]][j])[1] - d[0]) >= 0) { + d[0] = yp, d[1] = yp += dy; + } else if (dy < 0) { + d[1] = yn, d[0] = yn += dy; + } else { + d[0] = yp; + } + } + } +}; + +var silhouette = function(series, order) { + if (!((n = series.length) > 0)) return; + for (var j = 0, s0 = series[order[0]], n, m = s0.length; j < m; ++j) { + for (var i = 0, y = 0; i < n; ++i) y += series[i][j][1] || 0; + s0[j][1] += s0[j][0] = -y / 2; + } + none$1(series, order); +}; + +var wiggle = function(series, order) { + if (!((n = series.length) > 0) || !((m = (s0 = series[order[0]]).length) > 0)) return; + for (var y = 0, j = 1, s0, m, n; j < m; ++j) { + for (var i = 0, s1 = 0, s2 = 0; i < n; ++i) { + var si = series[order[i]], + sij0 = si[j][1] || 0, + sij1 = si[j - 1][1] || 0, + s3 = (sij0 - sij1) / 2; + for (var k = 0; k < i; ++k) { + var sk = series[order[k]], + skj0 = sk[j][1] || 0, + skj1 = sk[j - 1][1] || 0; + s3 += skj0 - skj1; + } + s1 += sij0, s2 += s3 * sij0; + } + s0[j - 1][1] += s0[j - 1][0] = y; + if (s1) y -= s2 / s1; + } + s0[j - 1][1] += s0[j - 1][0] = y; + none$1(series, order); +}; + +var ascending$2 = function(series) { + var sums = series.map(sum$2); + return none$2(series).sort(function(a, b) { return sums[a] - sums[b]; }); +}; + +function sum$2(series) { + var s = 0, i = -1, n = series.length, v; + while (++i < n) if (v = +series[i][1]) s += v; + return s; +} + +var descending$2 = function(series) { + return ascending$2(series).reverse(); +}; + +var insideOut = function(series) { + var n = series.length, + i, + j, + sums = series.map(sum$2), + order = none$2(series).sort(function(a, b) { return sums[b] - sums[a]; }), + top = 0, + bottom = 0, + tops = [], + bottoms = []; + + for (i = 0; i < n; ++i) { + j = order[i]; + if (top < bottom) { + top += sums[j]; + tops.push(j); + } else { + bottom += sums[j]; + bottoms.push(j); + } + } + + return bottoms.reverse().concat(tops); +}; + +var reverse = function(series) { + return none$2(series).reverse(); +}; + +var constant$11 = function(x) { + return function() { + return x; + }; +}; + +function x$4(d) { + return d[0]; +} + +function y$4(d) { + return d[1]; +} + +function RedBlackTree() { + this._ = null; // root node +} + +function RedBlackNode(node) { + node.U = // parent node + node.C = // color - true for red, false for black + node.L = // left node + node.R = // right node + node.P = // previous node + node.N = null; // next node +} + +RedBlackTree.prototype = { + constructor: RedBlackTree, + + insert: function(after, node) { + var parent, grandpa, uncle; + + if (after) { + node.P = after; + node.N = after.N; + if (after.N) after.N.P = node; + after.N = node; + if (after.R) { + after = after.R; + while (after.L) after = after.L; + after.L = node; + } else { + after.R = node; + } + parent = after; + } else if (this._) { + after = RedBlackFirst(this._); + node.P = null; + node.N = after; + after.P = after.L = node; + parent = after; + } else { + node.P = node.N = null; + this._ = node; + parent = null; + } + node.L = node.R = null; + node.U = parent; + node.C = true; + + after = node; + while (parent && parent.C) { + grandpa = parent.U; + if (parent === grandpa.L) { + uncle = grandpa.R; + if (uncle && uncle.C) { + parent.C = uncle.C = false; + grandpa.C = true; + after = grandpa; + } else { + if (after === parent.R) { + RedBlackRotateLeft(this, parent); + after = parent; + parent = after.U; + } + parent.C = false; + grandpa.C = true; + RedBlackRotateRight(this, grandpa); + } + } else { + uncle = grandpa.L; + if (uncle && uncle.C) { + parent.C = uncle.C = false; + grandpa.C = true; + after = grandpa; + } else { + if (after === parent.L) { + RedBlackRotateRight(this, parent); + after = parent; + parent = after.U; + } + parent.C = false; + grandpa.C = true; + RedBlackRotateLeft(this, grandpa); + } + } + parent = after.U; + } + this._.C = false; + }, + + remove: function(node) { + if (node.N) node.N.P = node.P; + if (node.P) node.P.N = node.N; + node.N = node.P = null; + + var parent = node.U, + sibling, + left = node.L, + right = node.R, + next, + red; + + if (!left) next = right; + else if (!right) next = left; + else next = RedBlackFirst(right); + + if (parent) { + if (parent.L === node) parent.L = next; + else parent.R = next; + } else { + this._ = next; + } + + if (left && right) { + red = next.C; + next.C = node.C; + next.L = left; + left.U = next; + if (next !== right) { + parent = next.U; + next.U = node.U; + node = next.R; + parent.L = node; + next.R = right; + right.U = next; + } else { + next.U = parent; + parent = next; + node = next.R; + } + } else { + red = node.C; + node = next; + } + + if (node) node.U = parent; + if (red) return; + if (node && node.C) { node.C = false; return; } + + do { + if (node === this._) break; + if (node === parent.L) { + sibling = parent.R; + if (sibling.C) { + sibling.C = false; + parent.C = true; + RedBlackRotateLeft(this, parent); + sibling = parent.R; + } + if ((sibling.L && sibling.L.C) + || (sibling.R && sibling.R.C)) { + if (!sibling.R || !sibling.R.C) { + sibling.L.C = false; + sibling.C = true; + RedBlackRotateRight(this, sibling); + sibling = parent.R; + } + sibling.C = parent.C; + parent.C = sibling.R.C = false; + RedBlackRotateLeft(this, parent); + node = this._; + break; + } + } else { + sibling = parent.L; + if (sibling.C) { + sibling.C = false; + parent.C = true; + RedBlackRotateRight(this, parent); + sibling = parent.L; + } + if ((sibling.L && sibling.L.C) + || (sibling.R && sibling.R.C)) { + if (!sibling.L || !sibling.L.C) { + sibling.R.C = false; + sibling.C = true; + RedBlackRotateLeft(this, sibling); + sibling = parent.L; + } + sibling.C = parent.C; + parent.C = sibling.L.C = false; + RedBlackRotateRight(this, parent); + node = this._; + break; + } + } + sibling.C = true; + node = parent; + parent = parent.U; + } while (!node.C); + + if (node) node.C = false; + } +}; + +function RedBlackRotateLeft(tree, node) { + var p = node, + q = node.R, + parent = p.U; + + if (parent) { + if (parent.L === p) parent.L = q; + else parent.R = q; + } else { + tree._ = q; + } + + q.U = parent; + p.U = q; + p.R = q.L; + if (p.R) p.R.U = p; + q.L = p; +} + +function RedBlackRotateRight(tree, node) { + var p = node, + q = node.L, + parent = p.U; + + if (parent) { + if (parent.L === p) parent.L = q; + else parent.R = q; + } else { + tree._ = q; + } + + q.U = parent; + p.U = q; + p.L = q.R; + if (p.L) p.L.U = p; + q.R = p; +} + +function RedBlackFirst(node) { + while (node.L) node = node.L; + return node; +} + +function createEdge(left, right, v0, v1) { + var edge = [null, null], + index = edges.push(edge) - 1; + edge.left = left; + edge.right = right; + if (v0) setEdgeEnd(edge, left, right, v0); + if (v1) setEdgeEnd(edge, right, left, v1); + cells[left.index].halfedges.push(index); + cells[right.index].halfedges.push(index); + return edge; +} + +function createBorderEdge(left, v0, v1) { + var edge = [v0, v1]; + edge.left = left; + return edge; +} + +function setEdgeEnd(edge, left, right, vertex) { + if (!edge[0] && !edge[1]) { + edge[0] = vertex; + edge.left = left; + edge.right = right; + } else if (edge.left === right) { + edge[1] = vertex; + } else { + edge[0] = vertex; + } +} + +// Liang–Barsky line clipping. +function clipEdge(edge, x0, y0, x1, y1) { + var a = edge[0], + b = edge[1], + ax = a[0], + ay = a[1], + bx = b[0], + by = b[1], + t0 = 0, + t1 = 1, + dx = bx - ax, + dy = by - ay, + r; + + r = x0 - ax; + if (!dx && r > 0) return; + r /= dx; + if (dx < 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } else if (dx > 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } + + r = x1 - ax; + if (!dx && r < 0) return; + r /= dx; + if (dx < 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } else if (dx > 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } + + r = y0 - ay; + if (!dy && r > 0) return; + r /= dy; + if (dy < 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } else if (dy > 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } + + r = y1 - ay; + if (!dy && r < 0) return; + r /= dy; + if (dy < 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } else if (dy > 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } + + if (!(t0 > 0) && !(t1 < 1)) return true; // TODO Better check? + + if (t0 > 0) edge[0] = [ax + t0 * dx, ay + t0 * dy]; + if (t1 < 1) edge[1] = [ax + t1 * dx, ay + t1 * dy]; + return true; +} + +function connectEdge(edge, x0, y0, x1, y1) { + var v1 = edge[1]; + if (v1) return true; + + var v0 = edge[0], + left = edge.left, + right = edge.right, + lx = left[0], + ly = left[1], + rx = right[0], + ry = right[1], + fx = (lx + rx) / 2, + fy = (ly + ry) / 2, + fm, + fb; + + if (ry === ly) { + if (fx < x0 || fx >= x1) return; + if (lx > rx) { + if (!v0) v0 = [fx, y0]; + else if (v0[1] >= y1) return; + v1 = [fx, y1]; + } else { + if (!v0) v0 = [fx, y1]; + else if (v0[1] < y0) return; + v1 = [fx, y0]; + } + } else { + fm = (lx - rx) / (ry - ly); + fb = fy - fm * fx; + if (fm < -1 || fm > 1) { + if (lx > rx) { + if (!v0) v0 = [(y0 - fb) / fm, y0]; + else if (v0[1] >= y1) return; + v1 = [(y1 - fb) / fm, y1]; + } else { + if (!v0) v0 = [(y1 - fb) / fm, y1]; + else if (v0[1] < y0) return; + v1 = [(y0 - fb) / fm, y0]; + } + } else { + if (ly < ry) { + if (!v0) v0 = [x0, fm * x0 + fb]; + else if (v0[0] >= x1) return; + v1 = [x1, fm * x1 + fb]; + } else { + if (!v0) v0 = [x1, fm * x1 + fb]; + else if (v0[0] < x0) return; + v1 = [x0, fm * x0 + fb]; + } + } + } + + edge[0] = v0; + edge[1] = v1; + return true; +} + +function clipEdges(x0, y0, x1, y1) { + var i = edges.length, + edge; + + while (i--) { + if (!connectEdge(edge = edges[i], x0, y0, x1, y1) + || !clipEdge(edge, x0, y0, x1, y1) + || !(Math.abs(edge[0][0] - edge[1][0]) > epsilon$4 + || Math.abs(edge[0][1] - edge[1][1]) > epsilon$4)) { + delete edges[i]; + } + } +} + +function createCell(site) { + return cells[site.index] = { + site: site, + halfedges: [] + }; +} + +function cellHalfedgeAngle(cell, edge) { + var site = cell.site, + va = edge.left, + vb = edge.right; + if (site === vb) vb = va, va = site; + if (vb) return Math.atan2(vb[1] - va[1], vb[0] - va[0]); + if (site === va) va = edge[1], vb = edge[0]; + else va = edge[0], vb = edge[1]; + return Math.atan2(va[0] - vb[0], vb[1] - va[1]); +} + +function cellHalfedgeStart(cell, edge) { + return edge[+(edge.left !== cell.site)]; +} + +function cellHalfedgeEnd(cell, edge) { + return edge[+(edge.left === cell.site)]; +} + +function sortCellHalfedges() { + for (var i = 0, n = cells.length, cell, halfedges, j, m; i < n; ++i) { + if ((cell = cells[i]) && (m = (halfedges = cell.halfedges).length)) { + var index = new Array(m), + array = new Array(m); + for (j = 0; j < m; ++j) index[j] = j, array[j] = cellHalfedgeAngle(cell, edges[halfedges[j]]); + index.sort(function(i, j) { return array[j] - array[i]; }); + for (j = 0; j < m; ++j) array[j] = halfedges[index[j]]; + for (j = 0; j < m; ++j) halfedges[j] = array[j]; + } + } +} + +function clipCells(x0, y0, x1, y1) { + var nCells = cells.length, + iCell, + cell, + site, + iHalfedge, + halfedges, + nHalfedges, + start, + startX, + startY, + end, + endX, + endY, + cover = true; + + for (iCell = 0; iCell < nCells; ++iCell) { + if (cell = cells[iCell]) { + site = cell.site; + halfedges = cell.halfedges; + iHalfedge = halfedges.length; + + // Remove any dangling clipped edges. + while (iHalfedge--) { + if (!edges[halfedges[iHalfedge]]) { + halfedges.splice(iHalfedge, 1); + } + } + + // Insert any border edges as necessary. + iHalfedge = 0, nHalfedges = halfedges.length; + while (iHalfedge < nHalfedges) { + end = cellHalfedgeEnd(cell, edges[halfedges[iHalfedge]]), endX = end[0], endY = end[1]; + start = cellHalfedgeStart(cell, edges[halfedges[++iHalfedge % nHalfedges]]), startX = start[0], startY = start[1]; + if (Math.abs(endX - startX) > epsilon$4 || Math.abs(endY - startY) > epsilon$4) { + halfedges.splice(iHalfedge, 0, edges.push(createBorderEdge(site, end, + Math.abs(endX - x0) < epsilon$4 && y1 - endY > epsilon$4 ? [x0, Math.abs(startX - x0) < epsilon$4 ? startY : y1] + : Math.abs(endY - y1) < epsilon$4 && x1 - endX > epsilon$4 ? [Math.abs(startY - y1) < epsilon$4 ? startX : x1, y1] + : Math.abs(endX - x1) < epsilon$4 && endY - y0 > epsilon$4 ? [x1, Math.abs(startX - x1) < epsilon$4 ? startY : y0] + : Math.abs(endY - y0) < epsilon$4 && endX - x0 > epsilon$4 ? [Math.abs(startY - y0) < epsilon$4 ? startX : x0, y0] + : null)) - 1); + ++nHalfedges; + } + } + + if (nHalfedges) cover = false; + } + } + + // If there weren’t any edges, have the closest site cover the extent. + // It doesn’t matter which corner of the extent we measure! + if (cover) { + var dx, dy, d2, dc = Infinity; + + for (iCell = 0, cover = null; iCell < nCells; ++iCell) { + if (cell = cells[iCell]) { + site = cell.site; + dx = site[0] - x0; + dy = site[1] - y0; + d2 = dx * dx + dy * dy; + if (d2 < dc) dc = d2, cover = cell; + } + } + + if (cover) { + var v00 = [x0, y0], v01 = [x0, y1], v11 = [x1, y1], v10 = [x1, y0]; + cover.halfedges.push( + edges.push(createBorderEdge(site = cover.site, v00, v01)) - 1, + edges.push(createBorderEdge(site, v01, v11)) - 1, + edges.push(createBorderEdge(site, v11, v10)) - 1, + edges.push(createBorderEdge(site, v10, v00)) - 1 + ); + } + } + + // Lastly delete any cells with no edges; these were entirely clipped. + for (iCell = 0; iCell < nCells; ++iCell) { + if (cell = cells[iCell]) { + if (!cell.halfedges.length) { + delete cells[iCell]; + } + } + } +} + +var circlePool = []; + +var firstCircle; + +function Circle() { + RedBlackNode(this); + this.x = + this.y = + this.arc = + this.site = + this.cy = null; +} + +function attachCircle(arc) { + var lArc = arc.P, + rArc = arc.N; + + if (!lArc || !rArc) return; + + var lSite = lArc.site, + cSite = arc.site, + rSite = rArc.site; + + if (lSite === rSite) return; + + var bx = cSite[0], + by = cSite[1], + ax = lSite[0] - bx, + ay = lSite[1] - by, + cx = rSite[0] - bx, + cy = rSite[1] - by; + + var d = 2 * (ax * cy - ay * cx); + if (d >= -epsilon2$2) return; + + var ha = ax * ax + ay * ay, + hc = cx * cx + cy * cy, + x = (cy * ha - ay * hc) / d, + y = (ax * hc - cx * ha) / d; + + var circle = circlePool.pop() || new Circle; + circle.arc = arc; + circle.site = cSite; + circle.x = x + bx; + circle.y = (circle.cy = y + by) + Math.sqrt(x * x + y * y); // y bottom + + arc.circle = circle; + + var before = null, + node = circles._; + + while (node) { + if (circle.y < node.y || (circle.y === node.y && circle.x <= node.x)) { + if (node.L) node = node.L; + else { before = node.P; break; } + } else { + if (node.R) node = node.R; + else { before = node; break; } + } + } + + circles.insert(before, circle); + if (!before) firstCircle = circle; +} + +function detachCircle(arc) { + var circle = arc.circle; + if (circle) { + if (!circle.P) firstCircle = circle.N; + circles.remove(circle); + circlePool.push(circle); + RedBlackNode(circle); + arc.circle = null; + } +} + +var beachPool = []; + +function Beach() { + RedBlackNode(this); + this.edge = + this.site = + this.circle = null; +} + +function createBeach(site) { + var beach = beachPool.pop() || new Beach; + beach.site = site; + return beach; +} + +function detachBeach(beach) { + detachCircle(beach); + beaches.remove(beach); + beachPool.push(beach); + RedBlackNode(beach); +} + +function removeBeach(beach) { + var circle = beach.circle, + x = circle.x, + y = circle.cy, + vertex = [x, y], + previous = beach.P, + next = beach.N, + disappearing = [beach]; + + detachBeach(beach); + + var lArc = previous; + while (lArc.circle + && Math.abs(x - lArc.circle.x) < epsilon$4 + && Math.abs(y - lArc.circle.cy) < epsilon$4) { + previous = lArc.P; + disappearing.unshift(lArc); + detachBeach(lArc); + lArc = previous; + } + + disappearing.unshift(lArc); + detachCircle(lArc); + + var rArc = next; + while (rArc.circle + && Math.abs(x - rArc.circle.x) < epsilon$4 + && Math.abs(y - rArc.circle.cy) < epsilon$4) { + next = rArc.N; + disappearing.push(rArc); + detachBeach(rArc); + rArc = next; + } + + disappearing.push(rArc); + detachCircle(rArc); + + var nArcs = disappearing.length, + iArc; + for (iArc = 1; iArc < nArcs; ++iArc) { + rArc = disappearing[iArc]; + lArc = disappearing[iArc - 1]; + setEdgeEnd(rArc.edge, lArc.site, rArc.site, vertex); + } + + lArc = disappearing[0]; + rArc = disappearing[nArcs - 1]; + rArc.edge = createEdge(lArc.site, rArc.site, null, vertex); + + attachCircle(lArc); + attachCircle(rArc); +} + +function addBeach(site) { + var x = site[0], + directrix = site[1], + lArc, + rArc, + dxl, + dxr, + node = beaches._; + + while (node) { + dxl = leftBreakPoint(node, directrix) - x; + if (dxl > epsilon$4) node = node.L; else { + dxr = x - rightBreakPoint(node, directrix); + if (dxr > epsilon$4) { + if (!node.R) { + lArc = node; + break; + } + node = node.R; + } else { + if (dxl > -epsilon$4) { + lArc = node.P; + rArc = node; + } else if (dxr > -epsilon$4) { + lArc = node; + rArc = node.N; + } else { + lArc = rArc = node; + } + break; + } + } + } + + createCell(site); + var newArc = createBeach(site); + beaches.insert(lArc, newArc); + + if (!lArc && !rArc) return; + + if (lArc === rArc) { + detachCircle(lArc); + rArc = createBeach(lArc.site); + beaches.insert(newArc, rArc); + newArc.edge = rArc.edge = createEdge(lArc.site, newArc.site); + attachCircle(lArc); + attachCircle(rArc); + return; + } + + if (!rArc) { // && lArc + newArc.edge = createEdge(lArc.site, newArc.site); + return; + } + + // else lArc !== rArc + detachCircle(lArc); + detachCircle(rArc); + + var lSite = lArc.site, + ax = lSite[0], + ay = lSite[1], + bx = site[0] - ax, + by = site[1] - ay, + rSite = rArc.site, + cx = rSite[0] - ax, + cy = rSite[1] - ay, + d = 2 * (bx * cy - by * cx), + hb = bx * bx + by * by, + hc = cx * cx + cy * cy, + vertex = [(cy * hb - by * hc) / d + ax, (bx * hc - cx * hb) / d + ay]; + + setEdgeEnd(rArc.edge, lSite, rSite, vertex); + newArc.edge = createEdge(lSite, site, null, vertex); + rArc.edge = createEdge(site, rSite, null, vertex); + attachCircle(lArc); + attachCircle(rArc); +} + +function leftBreakPoint(arc, directrix) { + var site = arc.site, + rfocx = site[0], + rfocy = site[1], + pby2 = rfocy - directrix; + + if (!pby2) return rfocx; + + var lArc = arc.P; + if (!lArc) return -Infinity; + + site = lArc.site; + var lfocx = site[0], + lfocy = site[1], + plby2 = lfocy - directrix; + + if (!plby2) return lfocx; + + var hl = lfocx - rfocx, + aby2 = 1 / pby2 - 1 / plby2, + b = hl / plby2; + + if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx; + + return (rfocx + lfocx) / 2; +} + +function rightBreakPoint(arc, directrix) { + var rArc = arc.N; + if (rArc) return leftBreakPoint(rArc, directrix); + var site = arc.site; + return site[1] === directrix ? site[0] : Infinity; +} + +var epsilon$4 = 1e-6; +var epsilon2$2 = 1e-12; +var beaches; +var cells; +var circles; +var edges; + +function triangleArea(a, b, c) { + return (a[0] - c[0]) * (b[1] - a[1]) - (a[0] - b[0]) * (c[1] - a[1]); +} + +function lexicographic(a, b) { + return b[1] - a[1] + || b[0] - a[0]; +} + +function Diagram(sites, extent) { + var site = sites.sort(lexicographic).pop(), + x, + y, + circle; + + edges = []; + cells = new Array(sites.length); + beaches = new RedBlackTree; + circles = new RedBlackTree; + + while (true) { + circle = firstCircle; + if (site && (!circle || site[1] < circle.y || (site[1] === circle.y && site[0] < circle.x))) { + if (site[0] !== x || site[1] !== y) { + addBeach(site); + x = site[0], y = site[1]; + } + site = sites.pop(); + } else if (circle) { + removeBeach(circle.arc); + } else { + break; + } + } + + sortCellHalfedges(); + + if (extent) { + var x0 = +extent[0][0], + y0 = +extent[0][1], + x1 = +extent[1][0], + y1 = +extent[1][1]; + clipEdges(x0, y0, x1, y1); + clipCells(x0, y0, x1, y1); + } + + this.edges = edges; + this.cells = cells; + + beaches = + circles = + edges = + cells = null; +} + +Diagram.prototype = { + constructor: Diagram, + + polygons: function() { + var edges = this.edges; + + return this.cells.map(function(cell) { + var polygon = cell.halfedges.map(function(i) { return cellHalfedgeStart(cell, edges[i]); }); + polygon.data = cell.site.data; + return polygon; + }); + }, + + triangles: function() { + var triangles = [], + edges = this.edges; + + this.cells.forEach(function(cell, i) { + if (!(m = (halfedges = cell.halfedges).length)) return; + var site = cell.site, + halfedges, + j = -1, + m, + s0, + e1 = edges[halfedges[m - 1]], + s1 = e1.left === site ? e1.right : e1.left; + + while (++j < m) { + s0 = s1; + e1 = edges[halfedges[j]]; + s1 = e1.left === site ? e1.right : e1.left; + if (s0 && s1 && i < s0.index && i < s1.index && triangleArea(site, s0, s1) < 0) { + triangles.push([site.data, s0.data, s1.data]); + } + } + }); + + return triangles; + }, + + links: function() { + return this.edges.filter(function(edge) { + return edge.right; + }).map(function(edge) { + return { + source: edge.left.data, + target: edge.right.data + }; + }); + }, + + find: function(x, y, radius) { + var that = this, i0, i1 = that._found || 0, n = that.cells.length, cell; + + // Use the previously-found cell, or start with an arbitrary one. + while (!(cell = that.cells[i1])) if (++i1 >= n) return null; + var dx = x - cell.site[0], dy = y - cell.site[1], d2 = dx * dx + dy * dy; + + // Traverse the half-edges to find a closer cell, if any. + do { + cell = that.cells[i0 = i1], i1 = null; + cell.halfedges.forEach(function(e) { + var edge = that.edges[e], v = edge.left; + if ((v === cell.site || !v) && !(v = edge.right)) return; + var vx = x - v[0], vy = y - v[1], v2 = vx * vx + vy * vy; + if (v2 < d2) d2 = v2, i1 = v.index; + }); + } while (i1 !== null); + + that._found = i0; + + return radius == null || d2 <= radius * radius ? cell.site : null; + } +}; + +var voronoi = function() { + var x$$1 = x$4, + y$$1 = y$4, + extent = null; + + function voronoi(data) { + return new Diagram(data.map(function(d, i) { + var s = [Math.round(x$$1(d, i, data) / epsilon$4) * epsilon$4, Math.round(y$$1(d, i, data) / epsilon$4) * epsilon$4]; + s.index = i; + s.data = d; + return s; + }), extent); + } + + voronoi.polygons = function(data) { + return voronoi(data).polygons(); + }; + + voronoi.links = function(data) { + return voronoi(data).links(); + }; + + voronoi.triangles = function(data) { + return voronoi(data).triangles(); + }; + + voronoi.x = function(_) { + return arguments.length ? (x$$1 = typeof _ === "function" ? _ : constant$11(+_), voronoi) : x$$1; + }; + + voronoi.y = function(_) { + return arguments.length ? (y$$1 = typeof _ === "function" ? _ : constant$11(+_), voronoi) : y$$1; + }; + + voronoi.extent = function(_) { + return arguments.length ? (extent = _ == null ? null : [[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]], voronoi) : extent && [[extent[0][0], extent[0][1]], [extent[1][0], extent[1][1]]]; + }; + + voronoi.size = function(_) { + return arguments.length ? (extent = _ == null ? null : [[0, 0], [+_[0], +_[1]]], voronoi) : extent && [extent[1][0] - extent[0][0], extent[1][1] - extent[0][1]]; + }; + + return voronoi; +}; + +var constant$12 = function(x) { + return function() { + return x; + }; +}; + +function ZoomEvent(target, type, transform) { + this.target = target; + this.type = type; + this.transform = transform; +} + +function Transform(k, x, y) { + this.k = k; + this.x = x; + this.y = y; +} + +Transform.prototype = { + constructor: Transform, + scale: function(k) { + return k === 1 ? this : new Transform(this.k * k, this.x, this.y); + }, + translate: function(x, y) { + return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y); + }, + apply: function(point) { + return [point[0] * this.k + this.x, point[1] * this.k + this.y]; + }, + applyX: function(x) { + return x * this.k + this.x; + }, + applyY: function(y) { + return y * this.k + this.y; + }, + invert: function(location) { + return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k]; + }, + invertX: function(x) { + return (x - this.x) / this.k; + }, + invertY: function(y) { + return (y - this.y) / this.k; + }, + rescaleX: function(x) { + return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x)); + }, + rescaleY: function(y) { + return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y)); + }, + toString: function() { + return "translate(" + this.x + "," + this.y + ") scale(" + this.k + ")"; + } +}; + +var identity$8 = new Transform(1, 0, 0); + +transform$1.prototype = Transform.prototype; + +function transform$1(node) { + return node.__zoom || identity$8; +} + +function nopropagation$2() { + exports.event.stopImmediatePropagation(); +} + +var noevent$2 = function() { + exports.event.preventDefault(); + exports.event.stopImmediatePropagation(); +}; + +// Ignore right-click, since that should open the context menu. +function defaultFilter$2() { + return !exports.event.button; +} + +function defaultExtent$1() { + var e = this, w, h; + if (e instanceof SVGElement) { + e = e.ownerSVGElement || e; + w = e.width.baseVal.value; + h = e.height.baseVal.value; + } else { + w = e.clientWidth; + h = e.clientHeight; + } + return [[0, 0], [w, h]]; +} + +function defaultTransform() { + return this.__zoom || identity$8; +} + +var zoom = function() { + var filter = defaultFilter$2, + extent = defaultExtent$1, + k0 = 0, + k1 = Infinity, + x0 = -k1, + x1 = k1, + y0 = x0, + y1 = x1, + duration = 250, + interpolate$$1 = interpolateZoom, + gestures = [], + listeners = dispatch("start", "zoom", "end"), + touchstarting, + touchending, + touchDelay = 500, + wheelDelay = 150, + clickDistance2 = 0; + + function zoom(selection$$1) { + selection$$1 + .on("wheel.zoom", wheeled) + .on("mousedown.zoom", mousedowned) + .on("dblclick.zoom", dblclicked) + .on("touchstart.zoom", touchstarted) + .on("touchmove.zoom", touchmoved) + .on("touchend.zoom touchcancel.zoom", touchended) + .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)") + .property("__zoom", defaultTransform); + } + + zoom.transform = function(collection, transform) { + var selection$$1 = collection.selection ? collection.selection() : collection; + selection$$1.property("__zoom", defaultTransform); + if (collection !== selection$$1) { + schedule(collection, transform); + } else { + selection$$1.interrupt().each(function() { + gesture(this, arguments) + .start() + .zoom(null, typeof transform === "function" ? transform.apply(this, arguments) : transform) + .end(); + }); + } + }; + + zoom.scaleBy = function(selection$$1, k) { + zoom.scaleTo(selection$$1, function() { + var k0 = this.__zoom.k, + k1 = typeof k === "function" ? k.apply(this, arguments) : k; + return k0 * k1; + }); + }; + + zoom.scaleTo = function(selection$$1, k) { + zoom.transform(selection$$1, function() { + var e = extent.apply(this, arguments), + t0 = this.__zoom, + p0 = centroid(e), + p1 = t0.invert(p0), + k1 = typeof k === "function" ? k.apply(this, arguments) : k; + return constrain(translate(scale(t0, k1), p0, p1), e); + }); + }; + + zoom.translateBy = function(selection$$1, x, y) { + zoom.transform(selection$$1, function() { + return constrain(this.__zoom.translate( + typeof x === "function" ? x.apply(this, arguments) : x, + typeof y === "function" ? y.apply(this, arguments) : y + ), extent.apply(this, arguments)); + }); + }; + + function scale(transform, k) { + k = Math.max(k0, Math.min(k1, k)); + return k === transform.k ? transform : new Transform(k, transform.x, transform.y); + } + + function translate(transform, p0, p1) { + var x = p0[0] - p1[0] * transform.k, y = p0[1] - p1[1] * transform.k; + return x === transform.x && y === transform.y ? transform : new Transform(transform.k, x, y); + } + + function constrain(transform, extent) { + var dx0 = transform.invertX(extent[0][0]) - x0, + dx1 = transform.invertX(extent[1][0]) - x1, + dy0 = transform.invertY(extent[0][1]) - y0, + dy1 = transform.invertY(extent[1][1]) - y1; + return transform.translate( + dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1), + dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1) + ); + } + + function centroid(extent) { + return [(+extent[0][0] + +extent[1][0]) / 2, (+extent[0][1] + +extent[1][1]) / 2]; + } + + function schedule(transition$$1, transform, center) { + transition$$1 + .on("start.zoom", function() { gesture(this, arguments).start(); }) + .on("interrupt.zoom end.zoom", function() { gesture(this, arguments).end(); }) + .tween("zoom", function() { + var that = this, + args = arguments, + g = gesture(that, args), + e = extent.apply(that, args), + p = center || centroid(e), + w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]), + a = that.__zoom, + b = typeof transform === "function" ? transform.apply(that, args) : transform, + i = interpolate$$1(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k)); + return function(t) { + if (t === 1) t = b; // Avoid rounding error on end. + else { var l = i(t), k = w / l[2]; t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k); } + g.zoom(null, t); + }; + }); + } + + function gesture(that, args) { + for (var i = 0, n = gestures.length, g; i < n; ++i) { + if ((g = gestures[i]).that === that) { + return g; + } + } + return new Gesture(that, args); + } + + function Gesture(that, args) { + this.that = that; + this.args = args; + this.index = -1; + this.active = 0; + this.extent = extent.apply(that, args); + } + + Gesture.prototype = { + start: function() { + if (++this.active === 1) { + this.index = gestures.push(this) - 1; + this.emit("start"); + } + return this; + }, + zoom: function(key, transform) { + if (this.mouse && key !== "mouse") this.mouse[1] = transform.invert(this.mouse[0]); + if (this.touch0 && key !== "touch") this.touch0[1] = transform.invert(this.touch0[0]); + if (this.touch1 && key !== "touch") this.touch1[1] = transform.invert(this.touch1[0]); + this.that.__zoom = transform; + this.emit("zoom"); + return this; + }, + end: function() { + if (--this.active === 0) { + gestures.splice(this.index, 1); + this.index = -1; + this.emit("end"); + } + return this; + }, + emit: function(type) { + customEvent(new ZoomEvent(zoom, type, this.that.__zoom), listeners.apply, listeners, [type, this.that, this.args]); + } + }; + + function wheeled() { + if (!filter.apply(this, arguments)) return; + var g = gesture(this, arguments), + t = this.__zoom, + k = Math.max(k0, Math.min(k1, t.k * Math.pow(2, -exports.event.deltaY * (exports.event.deltaMode ? 120 : 1) / 500))), + p = mouse(this); + + // If the mouse is in the same location as before, reuse it. + // If there were recent wheel events, reset the wheel idle timeout. + if (g.wheel) { + if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) { + g.mouse[1] = t.invert(g.mouse[0] = p); + } + clearTimeout(g.wheel); + } + + // If this wheel event won’t trigger a transform change, ignore it. + else if (t.k === k) return; + + // Otherwise, capture the mouse point and location at the start. + else { + g.mouse = [p, t.invert(p)]; + interrupt(this); + g.start(); + } + + noevent$2(); + g.wheel = setTimeout(wheelidled, wheelDelay); + g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent)); + + function wheelidled() { + g.wheel = null; + g.end(); + } + } + + function mousedowned() { + if (touchending || !filter.apply(this, arguments)) return; + var g = gesture(this, arguments), + v = select(exports.event.view).on("mousemove.zoom", mousemoved, true).on("mouseup.zoom", mouseupped, true), + p = mouse(this), + x0 = exports.event.clientX, + y0 = exports.event.clientY; + + dragDisable(exports.event.view); + nopropagation$2(); + g.mouse = [p, this.__zoom.invert(p)]; + interrupt(this); + g.start(); + + function mousemoved() { + noevent$2(); + if (!g.moved) { + var dx = exports.event.clientX - x0, dy = exports.event.clientY - y0; + g.moved = dx * dx + dy * dy > clickDistance2; + } + g.zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] = mouse(g.that), g.mouse[1]), g.extent)); + } + + function mouseupped() { + v.on("mousemove.zoom mouseup.zoom", null); + yesdrag(exports.event.view, g.moved); + noevent$2(); + g.end(); + } + } + + function dblclicked() { + if (!filter.apply(this, arguments)) return; + var t0 = this.__zoom, + p0 = mouse(this), + p1 = t0.invert(p0), + k1 = t0.k * (exports.event.shiftKey ? 0.5 : 2), + t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, arguments)); + + noevent$2(); + if (duration > 0) select(this).transition().duration(duration).call(schedule, t1, p0); + else select(this).call(zoom.transform, t1); + } + + function touchstarted() { + if (!filter.apply(this, arguments)) return; + var g = gesture(this, arguments), + touches$$1 = exports.event.changedTouches, + started, + n = touches$$1.length, i, t, p; + + nopropagation$2(); + for (i = 0; i < n; ++i) { + t = touches$$1[i], p = touch(this, touches$$1, t.identifier); + p = [p, this.__zoom.invert(p), t.identifier]; + if (!g.touch0) g.touch0 = p, started = true; + else if (!g.touch1) g.touch1 = p; + } + + // If this is a dbltap, reroute to the (optional) dblclick.zoom handler. + if (touchstarting) { + touchstarting = clearTimeout(touchstarting); + if (!g.touch1) { + g.end(); + p = select(this).on("dblclick.zoom"); + if (p) p.apply(this, arguments); + return; + } + } + + if (started) { + touchstarting = setTimeout(function() { touchstarting = null; }, touchDelay); + interrupt(this); + g.start(); + } + } + + function touchmoved() { + var g = gesture(this, arguments), + touches$$1 = exports.event.changedTouches, + n = touches$$1.length, i, t, p, l; + + noevent$2(); + if (touchstarting) touchstarting = clearTimeout(touchstarting); + for (i = 0; i < n; ++i) { + t = touches$$1[i], p = touch(this, touches$$1, t.identifier); + if (g.touch0 && g.touch0[2] === t.identifier) g.touch0[0] = p; + else if (g.touch1 && g.touch1[2] === t.identifier) g.touch1[0] = p; + } + t = g.that.__zoom; + if (g.touch1) { + var p0 = g.touch0[0], l0 = g.touch0[1], + p1 = g.touch1[0], l1 = g.touch1[1], + dp = (dp = p1[0] - p0[0]) * dp + (dp = p1[1] - p0[1]) * dp, + dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl; + t = scale(t, Math.sqrt(dp / dl)); + p = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2]; + l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2]; + } + else if (g.touch0) p = g.touch0[0], l = g.touch0[1]; + else return; + g.zoom("touch", constrain(translate(t, p, l), g.extent)); + } + + function touchended() { + var g = gesture(this, arguments), + touches$$1 = exports.event.changedTouches, + n = touches$$1.length, i, t; + + nopropagation$2(); + if (touchending) clearTimeout(touchending); + touchending = setTimeout(function() { touchending = null; }, touchDelay); + for (i = 0; i < n; ++i) { + t = touches$$1[i]; + if (g.touch0 && g.touch0[2] === t.identifier) delete g.touch0; + else if (g.touch1 && g.touch1[2] === t.identifier) delete g.touch1; + } + if (g.touch1 && !g.touch0) g.touch0 = g.touch1, delete g.touch1; + if (g.touch0) g.touch0[1] = this.__zoom.invert(g.touch0[0]); + else g.end(); + } + + zoom.filter = function(_) { + return arguments.length ? (filter = typeof _ === "function" ? _ : constant$12(!!_), zoom) : filter; + }; + + zoom.extent = function(_) { + return arguments.length ? (extent = typeof _ === "function" ? _ : constant$12([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent; + }; + + zoom.scaleExtent = function(_) { + return arguments.length ? (k0 = +_[0], k1 = +_[1], zoom) : [k0, k1]; + }; + + zoom.translateExtent = function(_) { + return arguments.length ? (x0 = +_[0][0], x1 = +_[1][0], y0 = +_[0][1], y1 = +_[1][1], zoom) : [[x0, y0], [x1, y1]]; + }; + + zoom.duration = function(_) { + return arguments.length ? (duration = +_, zoom) : duration; + }; + + zoom.interpolate = function(_) { + return arguments.length ? (interpolate$$1 = _, zoom) : interpolate$$1; + }; + + zoom.on = function() { + var value = listeners.on.apply(listeners, arguments); + return value === listeners ? zoom : value; + }; + + zoom.clickDistance = function(_) { + return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2); + }; + + return zoom; +}; + +exports.version = version; +exports.bisect = bisectRight; +exports.bisectRight = bisectRight; +exports.bisectLeft = bisectLeft; +exports.ascending = ascending; +exports.bisector = bisector; +exports.cross = cross; +exports.descending = descending; +exports.deviation = deviation; +exports.extent = extent; +exports.histogram = histogram; +exports.thresholdFreedmanDiaconis = freedmanDiaconis; +exports.thresholdScott = scott; +exports.thresholdSturges = sturges; +exports.max = max; +exports.mean = mean; +exports.median = median; +exports.merge = merge; +exports.min = min; +exports.pairs = pairs; +exports.permute = permute; +exports.quantile = threshold; +exports.range = sequence; +exports.scan = scan; +exports.shuffle = shuffle; +exports.sum = sum; +exports.ticks = ticks; +exports.tickIncrement = tickIncrement; +exports.tickStep = tickStep; +exports.transpose = transpose; +exports.variance = variance; +exports.zip = zip; +exports.axisTop = axisTop; +exports.axisRight = axisRight; +exports.axisBottom = axisBottom; +exports.axisLeft = axisLeft; +exports.brush = brush; +exports.brushX = brushX; +exports.brushY = brushY; +exports.brushSelection = brushSelection; +exports.chord = chord; +exports.ribbon = ribbon; +exports.nest = nest; +exports.set = set$2; +exports.map = map$1; +exports.keys = keys; +exports.values = values; +exports.entries = entries; +exports.color = color; +exports.rgb = rgb; +exports.hsl = hsl; +exports.lab = lab; +exports.hcl = hcl; +exports.cubehelix = cubehelix; +exports.dispatch = dispatch; +exports.drag = drag; +exports.dragDisable = dragDisable; +exports.dragEnable = yesdrag; +exports.dsvFormat = dsv; +exports.csvParse = csvParse; +exports.csvParseRows = csvParseRows; +exports.csvFormat = csvFormat; +exports.csvFormatRows = csvFormatRows; +exports.tsvParse = tsvParse; +exports.tsvParseRows = tsvParseRows; +exports.tsvFormat = tsvFormat; +exports.tsvFormatRows = tsvFormatRows; +exports.easeLinear = linear$1; +exports.easeQuad = quadInOut; +exports.easeQuadIn = quadIn; +exports.easeQuadOut = quadOut; +exports.easeQuadInOut = quadInOut; +exports.easeCubic = cubicInOut; +exports.easeCubicIn = cubicIn; +exports.easeCubicOut = cubicOut; +exports.easeCubicInOut = cubicInOut; +exports.easePoly = polyInOut; +exports.easePolyIn = polyIn; +exports.easePolyOut = polyOut; +exports.easePolyInOut = polyInOut; +exports.easeSin = sinInOut; +exports.easeSinIn = sinIn; +exports.easeSinOut = sinOut; +exports.easeSinInOut = sinInOut; +exports.easeExp = expInOut; +exports.easeExpIn = expIn; +exports.easeExpOut = expOut; +exports.easeExpInOut = expInOut; +exports.easeCircle = circleInOut; +exports.easeCircleIn = circleIn; +exports.easeCircleOut = circleOut; +exports.easeCircleInOut = circleInOut; +exports.easeBounce = bounceOut; +exports.easeBounceIn = bounceIn; +exports.easeBounceOut = bounceOut; +exports.easeBounceInOut = bounceInOut; +exports.easeBack = backInOut; +exports.easeBackIn = backIn; +exports.easeBackOut = backOut; +exports.easeBackInOut = backInOut; +exports.easeElastic = elasticOut; +exports.easeElasticIn = elasticIn; +exports.easeElasticOut = elasticOut; +exports.easeElasticInOut = elasticInOut; +exports.forceCenter = center$1; +exports.forceCollide = collide; +exports.forceLink = link; +exports.forceManyBody = manyBody; +exports.forceSimulation = simulation; +exports.forceX = x$2; +exports.forceY = y$2; +exports.formatDefaultLocale = defaultLocale; +exports.formatLocale = formatLocale; +exports.formatSpecifier = formatSpecifier; +exports.precisionFixed = precisionFixed; +exports.precisionPrefix = precisionPrefix; +exports.precisionRound = precisionRound; +exports.geoArea = area; +exports.geoBounds = bounds; +exports.geoCentroid = centroid; +exports.geoCircle = circle; +exports.geoClipExtent = extent$1; +exports.geoContains = contains; +exports.geoDistance = distance; +exports.geoGraticule = graticule; +exports.geoGraticule10 = graticule10; +exports.geoInterpolate = interpolate$1; +exports.geoLength = length$1; +exports.geoPath = index$1; +exports.geoAlbers = albers; +exports.geoAlbersUsa = albersUsa; +exports.geoAzimuthalEqualArea = azimuthalEqualArea; +exports.geoAzimuthalEqualAreaRaw = azimuthalEqualAreaRaw; +exports.geoAzimuthalEquidistant = azimuthalEquidistant; +exports.geoAzimuthalEquidistantRaw = azimuthalEquidistantRaw; +exports.geoConicConformal = conicConformal; +exports.geoConicConformalRaw = conicConformalRaw; +exports.geoConicEqualArea = conicEqualArea; +exports.geoConicEqualAreaRaw = conicEqualAreaRaw; +exports.geoConicEquidistant = conicEquidistant; +exports.geoConicEquidistantRaw = conicEquidistantRaw; +exports.geoEquirectangular = equirectangular; +exports.geoEquirectangularRaw = equirectangularRaw; +exports.geoGnomonic = gnomonic; +exports.geoGnomonicRaw = gnomonicRaw; +exports.geoIdentity = identity$5; +exports.geoProjection = projection; +exports.geoProjectionMutator = projectionMutator; +exports.geoMercator = mercator; +exports.geoMercatorRaw = mercatorRaw; +exports.geoOrthographic = orthographic; +exports.geoOrthographicRaw = orthographicRaw; +exports.geoStereographic = stereographic; +exports.geoStereographicRaw = stereographicRaw; +exports.geoTransverseMercator = transverseMercator; +exports.geoTransverseMercatorRaw = transverseMercatorRaw; +exports.geoRotation = rotation; +exports.geoStream = geoStream; +exports.geoTransform = transform; +exports.cluster = cluster; +exports.hierarchy = hierarchy; +exports.pack = index$2; +exports.packSiblings = siblings; +exports.packEnclose = enclose; +exports.partition = partition; +exports.stratify = stratify; +exports.tree = tree; +exports.treemap = index$3; +exports.treemapBinary = binary; +exports.treemapDice = treemapDice; +exports.treemapSlice = treemapSlice; +exports.treemapSliceDice = sliceDice; +exports.treemapSquarify = squarify; +exports.treemapResquarify = resquarify; +exports.interpolate = interpolateValue; +exports.interpolateArray = array$1; +exports.interpolateBasis = basis$1; +exports.interpolateBasisClosed = basisClosed; +exports.interpolateDate = date; +exports.interpolateNumber = reinterpolate; +exports.interpolateObject = object; +exports.interpolateRound = interpolateRound; +exports.interpolateString = interpolateString; +exports.interpolateTransformCss = interpolateTransformCss; +exports.interpolateTransformSvg = interpolateTransformSvg; +exports.interpolateZoom = interpolateZoom; +exports.interpolateRgb = interpolateRgb; +exports.interpolateRgbBasis = rgbBasis; +exports.interpolateRgbBasisClosed = rgbBasisClosed; +exports.interpolateHsl = hsl$2; +exports.interpolateHslLong = hslLong; +exports.interpolateLab = lab$1; +exports.interpolateHcl = hcl$2; +exports.interpolateHclLong = hclLong; +exports.interpolateCubehelix = cubehelix$2; +exports.interpolateCubehelixLong = cubehelixLong; +exports.quantize = quantize; +exports.path = path; +exports.polygonArea = area$1; +exports.polygonCentroid = centroid$1; +exports.polygonHull = hull; +exports.polygonContains = contains$1; +exports.polygonLength = length$2; +exports.quadtree = quadtree; +exports.queue = queue; +exports.randomUniform = uniform; +exports.randomNormal = normal; +exports.randomLogNormal = logNormal; +exports.randomBates = bates; +exports.randomIrwinHall = irwinHall; +exports.randomExponential = exponential$1; +exports.request = request; +exports.html = html; +exports.json = json; +exports.text = text; +exports.xml = xml; +exports.csv = csv$1; +exports.tsv = tsv$1; +exports.scaleBand = band; +exports.scalePoint = point$1; +exports.scaleIdentity = identity$6; +exports.scaleLinear = linear$2; +exports.scaleLog = log$1; +exports.scaleOrdinal = ordinal; +exports.scaleImplicit = implicit; +exports.scalePow = pow$1; +exports.scaleSqrt = sqrt$1; +exports.scaleQuantile = quantile$$1; +exports.scaleQuantize = quantize$1; +exports.scaleThreshold = threshold$1; +exports.scaleTime = time; +exports.scaleUtc = utcTime; +exports.schemeCategory10 = category10; +exports.schemeCategory20b = category20b; +exports.schemeCategory20c = category20c; +exports.schemeCategory20 = category20; +exports.interpolateCubehelixDefault = cubehelix$3; +exports.interpolateRainbow = rainbow$1; +exports.interpolateWarm = warm; +exports.interpolateCool = cool; +exports.interpolateViridis = viridis; +exports.interpolateMagma = magma; +exports.interpolateInferno = inferno; +exports.interpolatePlasma = plasma; +exports.scaleSequential = sequential; +exports.creator = creator; +exports.local = local$1; +exports.matcher = matcher$1; +exports.mouse = mouse; +exports.namespace = namespace; +exports.namespaces = namespaces; +exports.select = select; +exports.selectAll = selectAll; +exports.selection = selection; +exports.selector = selector; +exports.selectorAll = selectorAll; +exports.style = styleValue; +exports.touch = touch; +exports.touches = touches; +exports.window = defaultView; +exports.customEvent = customEvent; +exports.arc = arc; +exports.area = area$2; +exports.line = line; +exports.pie = pie; +exports.radialArea = radialArea; +exports.radialLine = radialLine$1; +exports.linkHorizontal = linkHorizontal; +exports.linkVertical = linkVertical; +exports.linkRadial = linkRadial; +exports.symbol = symbol; +exports.symbols = symbols; +exports.symbolCircle = circle$2; +exports.symbolCross = cross$2; +exports.symbolDiamond = diamond; +exports.symbolSquare = square; +exports.symbolStar = star; +exports.symbolTriangle = triangle; +exports.symbolWye = wye; +exports.curveBasisClosed = basisClosed$1; +exports.curveBasisOpen = basisOpen; +exports.curveBasis = basis$2; +exports.curveBundle = bundle; +exports.curveCardinalClosed = cardinalClosed; +exports.curveCardinalOpen = cardinalOpen; +exports.curveCardinal = cardinal; +exports.curveCatmullRomClosed = catmullRomClosed; +exports.curveCatmullRomOpen = catmullRomOpen; +exports.curveCatmullRom = catmullRom; +exports.curveLinearClosed = linearClosed; +exports.curveLinear = curveLinear; +exports.curveMonotoneX = monotoneX; +exports.curveMonotoneY = monotoneY; +exports.curveNatural = natural; +exports.curveStep = step; +exports.curveStepAfter = stepAfter; +exports.curveStepBefore = stepBefore; +exports.stack = stack; +exports.stackOffsetExpand = expand; +exports.stackOffsetDiverging = diverging; +exports.stackOffsetNone = none$1; +exports.stackOffsetSilhouette = silhouette; +exports.stackOffsetWiggle = wiggle; +exports.stackOrderAscending = ascending$2; +exports.stackOrderDescending = descending$2; +exports.stackOrderInsideOut = insideOut; +exports.stackOrderNone = none$2; +exports.stackOrderReverse = reverse; +exports.timeInterval = newInterval; +exports.timeMillisecond = millisecond; +exports.timeMilliseconds = milliseconds; +exports.utcMillisecond = millisecond; +exports.utcMilliseconds = milliseconds; +exports.timeSecond = second; +exports.timeSeconds = seconds; +exports.utcSecond = second; +exports.utcSeconds = seconds; +exports.timeMinute = minute; +exports.timeMinutes = minutes; +exports.timeHour = hour; +exports.timeHours = hours; +exports.timeDay = day; +exports.timeDays = days; +exports.timeWeek = sunday; +exports.timeWeeks = sundays; +exports.timeSunday = sunday; +exports.timeSundays = sundays; +exports.timeMonday = monday; +exports.timeMondays = mondays; +exports.timeTuesday = tuesday; +exports.timeTuesdays = tuesdays; +exports.timeWednesday = wednesday; +exports.timeWednesdays = wednesdays; +exports.timeThursday = thursday; +exports.timeThursdays = thursdays; +exports.timeFriday = friday; +exports.timeFridays = fridays; +exports.timeSaturday = saturday; +exports.timeSaturdays = saturdays; +exports.timeMonth = month; +exports.timeMonths = months; +exports.timeYear = year; +exports.timeYears = years; +exports.utcMinute = utcMinute; +exports.utcMinutes = utcMinutes; +exports.utcHour = utcHour; +exports.utcHours = utcHours; +exports.utcDay = utcDay; +exports.utcDays = utcDays; +exports.utcWeek = utcSunday; +exports.utcWeeks = utcSundays; +exports.utcSunday = utcSunday; +exports.utcSundays = utcSundays; +exports.utcMonday = utcMonday; +exports.utcMondays = utcMondays; +exports.utcTuesday = utcTuesday; +exports.utcTuesdays = utcTuesdays; +exports.utcWednesday = utcWednesday; +exports.utcWednesdays = utcWednesdays; +exports.utcThursday = utcThursday; +exports.utcThursdays = utcThursdays; +exports.utcFriday = utcFriday; +exports.utcFridays = utcFridays; +exports.utcSaturday = utcSaturday; +exports.utcSaturdays = utcSaturdays; +exports.utcMonth = utcMonth; +exports.utcMonths = utcMonths; +exports.utcYear = utcYear; +exports.utcYears = utcYears; +exports.timeFormatDefaultLocale = defaultLocale$1; +exports.timeFormatLocale = formatLocale$1; +exports.isoFormat = formatIso; +exports.isoParse = parseIso; +exports.now = now; +exports.timer = timer; +exports.timerFlush = timerFlush; +exports.timeout = timeout$1; +exports.interval = interval$1; +exports.transition = transition; +exports.active = active; +exports.interrupt = interrupt; +exports.voronoi = voronoi; +exports.zoom = zoom; +exports.zoomTransform = transform$1; +exports.zoomIdentity = identity$8; + +Object.defineProperty(exports, '__esModule', { value: true }); + +}))); + + +/***/ }), +/* 3 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +exports.__esModule = !0; +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +var CLASS = { + target: "bb-target", + chart: "bb-chart", + chartLine: "bb-chart-line", + chartLines: "bb-chart-lines", + chartBar: "bb-chart-bar", + chartBars: "bb-chart-bars", + chartText: "bb-chart-text", + chartTexts: "bb-chart-texts", + chartArc: "bb-chart-arc", + chartArcs: "bb-chart-arcs", + chartArcsTitle: "bb-chart-arcs-title", + chartArcsBackground: "bb-chart-arcs-background", + chartArcsGaugeUnit: "bb-chart-arcs-gauge-unit", + chartArcsGaugeMax: "bb-chart-arcs-gauge-max", + chartArcsGaugeMin: "bb-chart-arcs-gauge-min", + selectedCircle: "bb-selected-circle", + selectedCircles: "bb-selected-circles", + eventRect: "bb-event-rect", + eventRects: "bb-event-rects", + eventRectsSingle: "bb-event-rects-single", + eventRectsMultiple: "bb-event-rects-multiple", + zoomRect: "bb-zoom-rect", + brush: "bb-brush", + focused: "bb-focused", + defocused: "bb-defocused", + region: "bb-region", + regions: "bb-regions", + title: "bb-title", + tooltipContainer: "bb-tooltip-container", + tooltip: "bb-tooltip", + tooltipName: "bb-tooltip-name", + shape: "bb-shape", + shapes: "bb-shapes", + line: "bb-line", + lines: "bb-lines", + bar: "bb-bar", + bars: "bb-bars", + circle: "bb-circle", + circles: "bb-circles", + arc: "bb-arc", + arcs: "bb-arcs", + area: "bb-area", + areas: "bb-areas", + empty: "bb-empty", + text: "bb-text", + texts: "bb-texts", + gaugeValue: "bb-gauge-value", + grid: "bb-grid", + gridLines: "bb-grid-lines", + xgrid: "bb-xgrid", + xgrids: "bb-xgrids", + xgridLine: "bb-xgrid-line", + xgridLines: "bb-xgrid-lines", + xgridFocus: "bb-xgrid-focus", + ygrid: "bb-ygrid", + ygrids: "bb-ygrids", + ygridLine: "bb-ygrid-line", + ygridLines: "bb-ygrid-lines", + axis: "bb-axis", + axisX: "bb-axis-x", + axisXLabel: "bb-axis-x-label", + axisY: "bb-axis-y", + axisYLabel: "bb-axis-y-label", + axisY2: "bb-axis-y2", + axisY2Label: "bb-axis-y2-label", + legendBackground: "bb-legend-background", + legendItem: "bb-legend-item", + legendItemEvent: "bb-legend-item-event", + legendItemTile: "bb-legend-item-tile", + legendItemHidden: "bb-legend-item-hidden", + legendItemFocused: "bb-legend-item-focused", + dragarea: "bb-dragarea", + EXPANDED: "_expanded_", + SELECTED: "_selected_", + INCLUDED: "_included_" +}; + +exports.default = CLASS; +module.exports = exports["default"]; + +/***/ }), +/* 4 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +exports.__esModule = !0; + +var _classCallCheck2 = __webpack_require__(6), + _classCallCheck3 = _interopRequireDefault(_classCallCheck2), + _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Main chart class. + * - Note: Instantiated via `bb.generate()`. + * @class Chart + * @example + * var chart = bb.generate({ + * data: { + * columns: [ + * ["x", "2015-11-02", "2015-12-01", "2016-01-01", "2016-02-01", "2016-03-01"], + * ["count1", 11, 8, 7, 6, 5 ], + * ["count2", 9, 3, 6, 2, 8 ] + * ]} + * } + * @see {@link bb.generate} for the initialization. +*/ +var Chart = function Chart(config) { + (0, _classCallCheck3.default)(this, Chart); + + var $$ = new _ChartInternal2.default(this); + + this.internal = $$, $$.loadConfig(config), $$.beforeInit(config), $$.init(), $$.afterInit(config), function bindThis(fn, target, argThis) { + Object.keys(fn).forEach(function (key) { + target[key] = fn[key].bind(argThis), Object.keys(fn[key]).length && bindThis(fn[key], target[key], argThis); + }); + }(Chart.prototype, this, this); +}; /** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + * @license MIT + * @ignore + */ + + +exports.default = Chart; +module.exports = exports["default"]; + +/***/ }), +/* 5 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +exports.__esModule = true; + +function _typeof(obj) { return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj; } + +exports.default = function (obj) { + return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj === "undefined" ? "undefined" : _typeof(obj); +}; + +/***/ }), +/* 6 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +exports.__esModule = true; + +exports.default = function (instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +}; + +/***/ }), +/* 7 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +exports.__esModule = !0; + +var _typeof2 = __webpack_require__(5), + _typeof3 = _interopRequireDefault(_typeof2), + _classCallCheck2 = __webpack_require__(6), + _classCallCheck3 = _interopRequireDefault(_classCallCheck2), + _d = __webpack_require__(2), + _util = __webpack_require__(0), + _bb = __webpack_require__(8), + _bb2 = _interopRequireDefault(_bb), + _classes = __webpack_require__(3), + _classes2 = _interopRequireDefault(_classes); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +var Axis = function () { + function Axis(owner) { + (0, _classCallCheck3.default)(this, Axis), this.owner = owner; + } + + return Axis.prototype.init = function init() { + var $$ = this.owner, + config = $$.config, + main = $$.main; + $$.axes.x = main.append("g").attr("class", _classes2.default.axis + " " + _classes2.default.axisX).attr("clip-path", $$.clipPathForXAxis).attr("transform", $$.getTranslate("x")).style("visibility", config.axis_x_show ? "visible" : "hidden"), $$.axes.x.append("text").attr("class", _classes2.default.axisXLabel).attr("transform", config.axis_rotated ? "rotate(-90)" : "").style("text-anchor", this.textAnchorForXAxisLabel.bind(this)), $$.axes.y = main.append("g").attr("class", _classes2.default.axis + " " + _classes2.default.axisY).attr("clip-path", config.axis_y_inner ? "" : $$.clipPathForYAxis).attr("transform", $$.getTranslate("y")).style("visibility", config.axis_y_show ? "visible" : "hidden"), $$.axes.y.append("text").attr("class", _classes2.default.axisYLabel).attr("transform", config.axis_rotated ? "" : "rotate(-90)").style("text-anchor", this.textAnchorForYAxisLabel.bind(this)), $$.axes.y2 = main.append("g").attr("class", _classes2.default.axis + " " + _classes2.default.axisY2 + // clip-path? + ).attr("transform", $$.getTranslate("y2")).style("visibility", config.axis_y2_show ? "visible" : "hidden"), $$.axes.y2.append("text").attr("class", _classes2.default.axisY2Label).attr("transform", config.axis_rotated ? "" : "rotate(-90)").style("text-anchor", this.textAnchorForY2AxisLabel.bind(this)); + }, Axis.prototype.getXAxis = function getXAxis(scale, orient, tickFormat, tickValues, withOuterTick, withoutTransition, withoutRotateTickText) { + var $$ = this.owner, + config = $$.config, + axisParams = { + isCategory: $$.isCategorized(), + withOuterTick: withOuterTick, + tickMultiline: config.axis_x_tick_multiline, + tickWidth: config.axis_x_tick_width, + tickTextRotate: withoutRotateTickText ? 0 : config.axis_x_tick_rotate, + withoutTransition: withoutTransition + }, + axis = (0, _bb2.default)(axisParams).scale(scale).orient(orient), + newTickValues = tickValues; + + + return $$.isTimeSeries() && tickValues && typeof tickValues !== "function" && (newTickValues = tickValues.map(function (v) { + return $$.parseDate(v); + })), axis.tickFormat(tickFormat).tickValues(newTickValues), $$.isCategorized() && (axis.tickCentered(config.axis_x_tick_centered), (0, _util.isEmpty)(config.axis_x_tick_culling) && (config.axis_x_tick_culling = !1)), axis; + }, Axis.prototype.updateXAxisTickValues = function updateXAxisTickValues(targets, axis) { + var $$ = this.owner, + config = $$.config, + tickValues = void 0; + + return (config.axis_x_tick_fit || config.axis_x_tick_count) && (tickValues = this.generateTickValues($$.mapTargetsToUniqueXs(targets), config.axis_x_tick_count, $$.isTimeSeries())), axis ? axis.tickValues(tickValues) : ($$.xAxis.tickValues(tickValues), $$.subXAxis.tickValues(tickValues)), tickValues; + }, Axis.prototype.getYAxis = function getYAxis(scale, orient, tickFormat, tickValues, withOuterTick, withoutTransition, withoutRotateTickText) { + var $$ = this.owner, + config = $$.config, + axisParams = { + withOuterTick: withOuterTick, + withoutTransition: withoutTransition, + tickTextRotate: withoutRotateTickText ? 0 : config.axis_y_tick_rotate + }, + axis = (0, _bb2.default)(axisParams).scale(scale).orient(orient).tickFormat(tickFormat); + + return $$.isTimeSeriesY() ? axis.ticks(config.axis_y_tick_time_value) : axis.tickValues(tickValues), axis; + }, Axis.prototype.getId = function getId(id) { + var config = this.owner.config; + + return id in config.data_axes ? config.data_axes[id] : "y"; + }, Axis.prototype.getXAxisTickFormat = function getXAxisTickFormat() { + var $$ = this.owner, + config = $$.config, + format = void 0; + + + return format = $$.isTimeSeries() ? $$.defaultAxisTimeFormat : $$.isCategorized() ? $$.categoryName : function (v) { + return v < 0 ? v.toFixed(0) : v; + }, config.axis_x_tick_format && ((0, _util.isFunction)(config.axis_x_tick_format) ? format = config.axis_x_tick_format : $$.isTimeSeries() && (format = function (date) { + return date ? $$.axisTimeFormat(config.axis_x_tick_format)(date) : ""; + })), (0, _util.isFunction)(format) ? function (v) { + return format.call($$, v); + } : format; + }, Axis.prototype.getTickValues = function getTickValues(tickValues, axis) { + var values = void 0; + + return values = tickValues ? tickValues : axis ? axis.tickValues() : undefined, values; + }, Axis.prototype.getXAxisTickValues = function getXAxisTickValues() { + return this.getTickValues(this.owner.config.axis_x_tick_values, this.owner.xAxis); + }, Axis.prototype.getYAxisTickValues = function getYAxisTickValues() { + return this.getTickValues(this.owner.config.axis_y_tick_values, this.owner.yAxis); + }, Axis.prototype.getY2AxisTickValues = function getY2AxisTickValues() { + return this.getTickValues(this.owner.config.axis_y2_tick_values, this.owner.y2Axis); + }, Axis.prototype.getLabelOptionByAxisId = function getLabelOptionByAxisId(axisId) { + var $$ = this.owner, + config = $$.config, + option = void 0; + + return axisId === "y" ? option = config.axis_y_label : axisId === "y2" ? option = config.axis_y2_label : axisId === "x" && (option = config.axis_x_label), option; + }, Axis.prototype.getLabelText = function getLabelText(axisId) { + var option = this.getLabelOptionByAxisId(axisId), + text = void 0; + + return text = (0, _util.isString)(option) ? option : option ? option.text : null, text; + }, Axis.prototype.setLabelText = function setLabelText(axisId, text) { + var $$ = this.owner, + config = $$.config, + option = this.getLabelOptionByAxisId(axisId); + (0, _util.isString)(option) ? axisId === "y" ? config.axis_y_label = text : axisId === "y2" ? config.axis_y2_label = text : axisId === "x" && (config.axis_x_label = text) : option && (option.text = text); + }, Axis.prototype.getLabelPosition = function getLabelPosition(axisId, defaultPosition) { + var option = this.getLabelOptionByAxisId(axisId), + position = (typeof option === "undefined" ? "undefined" : (0, _typeof3.default)(option)) === "object" && option.position ? option.position : defaultPosition; + + + return { + isInner: !!~position.indexOf("inner"), + isOuter: !!~position.indexOf("outer"), + isLeft: !!~position.indexOf("left"), + isCenter: !!~position.indexOf("center"), + isRight: !!~position.indexOf("right"), + isTop: !!~position.indexOf("top"), + isMiddle: !!~position.indexOf("middle"), + isBottom: !!~position.indexOf("bottom") + }; + }, Axis.prototype.getXAxisLabelPosition = function getXAxisLabelPosition() { + return this.getLabelPosition("x", this.owner.config.axis_rotated ? "inner-top" : "inner-right"); + }, Axis.prototype.getYAxisLabelPosition = function getYAxisLabelPosition() { + return this.getLabelPosition("y", this.owner.config.axis_rotated ? "inner-right" : "inner-top"); + }, Axis.prototype.getY2AxisLabelPosition = function getY2AxisLabelPosition() { + return this.getLabelPosition("y2", this.owner.config.axis_rotated ? "inner-right" : "inner-top"); + }, Axis.prototype.getLabelPositionById = function getLabelPositionById(id) { + var label = void 0; + + return label = id === "y2" ? this.getY2AxisLabelPosition() : id === "y" ? this.getYAxisLabelPosition() : this.getXAxisLabelPosition(), label; + }, Axis.prototype.textForXAxisLabel = function textForXAxisLabel() { + return this.getLabelText("x"); + }, Axis.prototype.textForYAxisLabel = function textForYAxisLabel() { + return this.getLabelText("y"); + }, Axis.prototype.textForY2AxisLabel = function textForY2AxisLabel() { + return this.getLabelText("y2"); + }, Axis.prototype.xForAxisLabel = function xForAxisLabel(forHorizontal, position) { + var $$ = this.owner, + x = void 0; + + return x = forHorizontal ? position.isLeft ? 0 : position.isCenter ? $$.width / 2 : $$.width : position.isBottom ? -$$.height : position.isMiddle ? -$$.height / 2 : 0, x; + }, Axis.prototype.dxForAxisLabel = function dxForAxisLabel(forHorizontal, position) { + var dx = void 0; + + return dx = forHorizontal ? position.isLeft ? "0.5em" : position.isRight ? "-0.5em" : "0" : position.isTop ? "-0.5em" : position.isBottom ? "0.5em" : "0", dx; + }, Axis.prototype.textAnchorForAxisLabel = function textAnchorForAxisLabel(forHorizontal, position) { + var anchor = void 0; + + return anchor = forHorizontal ? position.isLeft ? "start" : position.isCenter ? "middle" : "end" : position.isBottom ? "start" : position.isMiddle ? "middle" : "end", anchor; + }, Axis.prototype.xForXAxisLabel = function xForXAxisLabel() { + return this.xForAxisLabel(!this.owner.config.axis_rotated, this.getXAxisLabelPosition()); + }, Axis.prototype.xForYAxisLabel = function xForYAxisLabel() { + return this.xForAxisLabel(this.owner.config.axis_rotated, this.getYAxisLabelPosition()); + }, Axis.prototype.xForY2AxisLabel = function xForY2AxisLabel() { + return this.xForAxisLabel(this.owner.config.axis_rotated, this.getY2AxisLabelPosition()); + }, Axis.prototype.dxForXAxisLabel = function dxForXAxisLabel() { + return this.dxForAxisLabel(!this.owner.config.axis_rotated, this.getXAxisLabelPosition()); + }, Axis.prototype.dxForYAxisLabel = function dxForYAxisLabel() { + return this.dxForAxisLabel(this.owner.config.axis_rotated, this.getYAxisLabelPosition()); + }, Axis.prototype.dxForY2AxisLabel = function dxForY2AxisLabel() { + return this.dxForAxisLabel(this.owner.config.axis_rotated, this.getY2AxisLabelPosition()); + }, Axis.prototype.dyForXAxisLabel = function dyForXAxisLabel() { + var $$ = this.owner, + config = $$.config, + position = this.getXAxisLabelPosition(); + return config.axis_rotated ? position.isInner ? "1.2em" : -25 - this.getMaxTickWidth("x") : position.isInner ? "-0.5em" : config.axis_x_height ? config.axis_x_height - 10 : "3em"; + }, Axis.prototype.dyForYAxisLabel = function dyForYAxisLabel() { + var $$ = this.owner, + position = this.getYAxisLabelPosition(); + return $$.config.axis_rotated ? position.isInner ? "-0.5em" : "3em" : position.isInner ? "1.2em" : -10 - ($$.config.axis_y_inner ? 0 : this.getMaxTickWidth("y") + 10); + }, Axis.prototype.dyForY2AxisLabel = function dyForY2AxisLabel() { + var $$ = this.owner, + position = this.getY2AxisLabelPosition(); + return $$.config.axis_rotated ? position.isInner ? "1.2em" : "-2.2em" : position.isInner ? "-0.5em" : 15 + ($$.config.axis_y2_inner ? 0 : this.getMaxTickWidth("y2") + 15); + }, Axis.prototype.textAnchorForXAxisLabel = function textAnchorForXAxisLabel() { + var $$ = this.owner; + + return this.textAnchorForAxisLabel(!$$.config.axis_rotated, this.getXAxisLabelPosition()); + }, Axis.prototype.textAnchorForYAxisLabel = function textAnchorForYAxisLabel() { + var $$ = this.owner; + + return this.textAnchorForAxisLabel($$.config.axis_rotated, this.getYAxisLabelPosition()); + }, Axis.prototype.textAnchorForY2AxisLabel = function textAnchorForY2AxisLabel() { + var $$ = this.owner; + + return this.textAnchorForAxisLabel($$.config.axis_rotated, this.getY2AxisLabelPosition()); + }, Axis.prototype.getMaxTickWidth = function getMaxTickWidth(id, withoutRecompute) { + var $$ = this.owner, + config = $$.config, + maxWidth = 0, + dummy = void 0, + svg = void 0; + + + if (withoutRecompute && $$.currentMaxTickWidths[id]) return $$.currentMaxTickWidths[id]; + + if ($$.svg) { + var targetsToShow = $$.filterTargetsToShow($$.data.targets), + scale = void 0, + axis = void 0; + id === "y" ? (scale = $$.y.copy().domain($$.getYDomain(targetsToShow, "y")), axis = this.getYAxis(scale, $$.yOrient, config.axis_y_tick_format, $$.yAxisTickValues, !1, !0, !0)) : id === "y2" ? (scale = $$.y2.copy().domain($$.getYDomain(targetsToShow, "y2")), axis = this.getYAxis(scale, $$.y2Orient, config.axis_y2_tick_format, $$.y2AxisTickValues, !1, !0, !0)) : (scale = $$.x.copy().domain($$.getXDomain(targetsToShow)), axis = this.getXAxis(scale, $$.xOrient, $$.xAxisTickFormat, $$.xAxisTickValues, !1, !0, !0), this.updateXAxisTickValues(targetsToShow, axis)), dummy = (0, _d.select)("body").append("div").classed("bb", !0), svg = dummy.append("svg").style("visibility", "hidden").style("position", "fixed").style("top", "0px").style("left", "0px"), svg.append("g").call(axis).each(function () { + (0, _d.select)(this).selectAll("text").each(function () { + var box = this.getBoundingClientRect(); + + maxWidth < box.width && (maxWidth = box.width); + }), dummy.remove(); + }); + } + + return $$.currentMaxTickWidths[id] = maxWidth <= 0 ? $$.currentMaxTickWidths[id] : maxWidth, $$.currentMaxTickWidths[id]; + }, Axis.prototype.updateLabels = function updateLabels(withTransition) { + var $$ = this.owner, + axisXLabel = $$.main.select("." + _classes2.default.axisX + " ." + _classes2.default.axisXLabel), + axisYLabel = $$.main.select("." + _classes2.default.axisY + " ." + _classes2.default.axisYLabel), + axisY2Label = $$.main.select("." + _classes2.default.axisY2 + " ." + _classes2.default.axisY2Label); + (withTransition ? axisXLabel.transition() : axisXLabel).attr("x", this.xForXAxisLabel.bind(this)).attr("dx", this.dxForXAxisLabel.bind(this)).attr("dy", this.dyForXAxisLabel.bind(this)).text(this.textForXAxisLabel.bind(this)), (withTransition ? axisYLabel.transition() : axisYLabel).attr("x", this.xForYAxisLabel.bind(this)).attr("dx", this.dxForYAxisLabel.bind(this)).attr("dy", this.dyForYAxisLabel.bind(this)).text(this.textForYAxisLabel.bind(this)), (withTransition ? axisY2Label.transition() : axisY2Label).attr("x", this.xForY2AxisLabel.bind(this)).attr("dx", this.dxForY2AxisLabel.bind(this)).attr("dy", this.dyForY2AxisLabel.bind(this)).text(this.textForY2AxisLabel.bind(this)); + }, Axis.prototype.getPadding = function getPadding(padding, key, defaultValue, domainLength) { + var p = typeof padding === "number" ? padding : padding[key]; + + // assume padding is pixels if unit is not specified + return (0, _util.isValue)(p) ? padding.unit === "ratio" ? padding[key] * domainLength : this.convertPixelsToAxisPadding(p, domainLength) : defaultValue; + }, Axis.prototype.convertPixelsToAxisPadding = function convertPixelsToAxisPadding(pixels, domainLength) { + var $$ = this.owner, + length = $$.config.axis_rotated ? $$.width : $$.height; + + + return domainLength * (pixels / length); + }, Axis.prototype.generateTickValues = function generateTickValues(values, tickCount, forTimeSeries) { + var tickValues = values, + start = void 0, + end = void 0, + count = void 0, + interval = void 0, + i = void 0, + tickValue = void 0; + + + if (tickCount) { + var targetCount = (0, _util.isFunction)(tickCount) ? tickCount() : tickCount; + + // compute ticks according to tickCount + if (targetCount === 1) tickValues = [values[0]];else if (targetCount === 2) tickValues = [values[0], values[values.length - 1]];else if (targetCount > 2) { + + for (count = targetCount - 2, start = values[0], end = values[values.length - 1], interval = (end - start) / (count + 1), tickValues = [start], i = 0; i < count; i++) tickValue = +start + interval * (i + 1), tickValues.push(forTimeSeries ? new Date(tickValue) : tickValue); + tickValues.push(end); + } + } + + return forTimeSeries || (tickValues = tickValues.sort(function (a, b) { + return a - b; + })), tickValues; + }, Axis.prototype.generateTransitions = function generateTransitions(duration) { + var $$ = this.owner, + axes = $$.axes; + + + return { + axisX: duration ? axes.x.transition().duration(duration) : axes.x, + axisY: duration ? axes.y.transition().duration(duration) : axes.y, + axisY2: duration ? axes.y2.transition().duration(duration) : axes.y2, + axisSubX: duration ? axes.subx.transition().duration(duration) : axes.subx + }; + }, Axis.prototype.redraw = function redraw(transitions, isHidden) { + var $$ = this.owner; + + $$.axes.x.style("opacity", isHidden ? "0" : "1"), $$.axes.y.style("opacity", isHidden ? "0" : "1"), $$.axes.y2.style("opacity", isHidden ? "0" : "1"), $$.axes.subx.style("opacity", isHidden ? "0" : "1"), transitions.axisX.call($$.xAxis), transitions.axisY.call($$.yAxis), transitions.axisY2.call($$.y2Axis), transitions.axisSubX.call($$.subXAxis); + }, Axis; +}(); + +exports.default = Axis; +module.exports = exports["default"]; + +/***/ }), +/* 8 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +exports.__esModule = !0; + +var _typeof2 = __webpack_require__(5), + _typeof3 = _interopRequireDefault(_typeof2); + +exports.default = function () { + + function axisX(selection, x) { + selection.attr("transform", function (d) { + return "translate(" + Math.ceil(x(d) + tickOffset) + ", 0)"; + }); + } + + function axisY(selection, y) { + selection.attr("transform", function (d) { + return "translate(0," + Math.ceil(y(d)) + ")"; + }); + } + + function scaleExtent(domain) { + var start = domain[0], + stop = domain[domain.length - 1]; + + + return start < stop ? [start, stop] : [stop, start]; + } + + function generateTicks(scale) { + var ticks = []; + + if (scale.ticks) return scale.ticks.apply(scale, tickArguments ? Array.prototype.slice.call(tickArguments) : []).map(function (v) { + return ( + // round the tick value if is number + /(string|number)/.test(typeof v === "undefined" ? "undefined" : (0, _typeof3.default)(v)) && !isNaN(v) ? Math.round(v * 10) / 10 : v + ); + }); + + for (var domain = scale.domain(), i = Math.ceil(domain[0]); i < domain[1]; i++) ticks.push(i); + + return ticks.length > 0 && ticks[0] > 0 && ticks.unshift(ticks[0] - (ticks[1] - ticks[0])), ticks; + } + + function copyScale() { + var newScale = scale.copy(); + + if (params.isCategory || !newScale.domain().length) { + var domain = scale.domain(); + + newScale.domain([domain[0], domain[1] - 1]); + } + + return newScale; + } + + function textFormatted(v) { + var formatted = tickFormat ? tickFormat(v) : v; + + return typeof formatted === "undefined" ? "" : formatted; + } + + function getSizeFor1Char(tick) { + if (tickTextCharSize) return tickTextCharSize; + var size = { + h: 11.5, + w: 5.5 + }; + + return tick.select("text").text(textFormatted).each(function (d) { + var box = this.getBoundingClientRect(), + text = textFormatted(d), + h = box.height, + w = text ? box.width / text.length : undefined; + h && w && (size.h = h, size.w = w); + }).text(""), tickTextCharSize = size, size; + } + + function transitionise(selection) { + return params.withoutTransition ? selection : selection.transition(transition); + } + + function axis(g) { + g.each(function () { + + // this should be called only when category axis + function splitTickText(d, maxWidthValue) { + + function split(splitted, text) { + spaceIndex = undefined; + + for (var i = 1; i < text.length; i++) + + // if text width gets over tick width, split by space index or crrent index + if (text.charAt(i) === " " && (spaceIndex = i), subtext = text.substr(0, i + 1), textWidth = sizeFor1Char.w * subtext.length, maxWidth < textWidth) return split(splitted.concat(text.substr(0, spaceIndex || i)), text.slice(spaceIndex ? spaceIndex + 1 : i)); + + return splitted.concat(text); + } + + var tickText = textFormatted(d), + maxWidth = maxWidthValue, + subtext = void 0, + spaceIndex = void 0, + textWidth = void 0; + return Object.prototype.toString.call(tickText) === "[object Array]" ? tickText : ((!maxWidth || maxWidth <= 0) && (maxWidth = isVertical ? 95 : params.isCategory ? Math.ceil(scale1(ticks[1]) - scale1(ticks[0])) - 12 : 110), split([], tickText + "")); + } + + function tspanDy(d, i) { + var dy = sizeFor1Char.h; + + return i === 0 && (dy = orient === "left" || orient === "right" ? -((counts[d.index] - 1) * (sizeFor1Char.h / 2) - 3) : ".71em"), dy; + } + + var g = (0, _d.select)(this); + + axis.g = g; + + + var scale0 = this.__chart__ || scale, + scale1 = copyScale(); + this.__chart__ = scale1; + + + // count of tick data in array + var ticks = tickValues || generateTicks(scale1), + tick = g.selectAll(".tick").data(ticks, scale1), + tickEnter = tick.enter().insert("g", ".domain").attr("class", "tick").style("opacity", "1"), + tickExit = tick.exit().remove(); + + // update selection + + + // enter selection + + + // MEMO: No exit transition. The reason is this transition affects max tick width calculation because old tick will be included in the ticks. + tick = tickEnter.merge(tick); + + + var tickUpdate = transitionise(tick).style("opacity", "1"), + tickTransform = void 0, + tickX = void 0, + tickY = void 0, + range = scale.rangeExtent ? scale.rangeExtent() : scaleExtent(scale.range()), + path = g.selectAll(".domain").data([0]), + pathUpdate = path.enter().append("path").attr("class", "domain").merge(transitionise(path)); + + // update selection - data join + + + // enter + update selection + tickEnter.append("line"), tickEnter.append("text"); + + + var lineEnter = tickEnter.select("line"), + lineUpdate = tickUpdate.select("line"), + textEnter = tickEnter.select("text"), + textUpdate = tickUpdate.select("text"); + params.isCategory ? (tickOffset = Math.ceil((scale1(1) - scale1(0)) / 2), tickX = tickCentered ? 0 : tickOffset, tickY = tickCentered ? tickOffset : 0) : (tickX = 0, tickOffset = tickX); + + + var tspan = void 0, + sizeFor1Char = getSizeFor1Char(g.select(".tick")), + counts = [], + tickLength = Math.max(innerTickSize, 0) + tickPadding, + isVertical = orient === "left" || orient === "right", + text = tick.select("text");tspan = text.selectAll("tspan").data(function (d, i) { + var splitted = params.tickMultiline ? splitTickText(d, params.tickWidth) : [].concat(textFormatted(d)); + + return counts[i] = splitted.length, splitted.map(function (s) { + return { + index: i, + splitted: s + }; + }); + }), tspan.exit().remove(), tspan = tspan.enter().append("tspan").merge(tspan).text(function (d) { + return d.splitted; + }); + + + var rotate = params.tickTextRotate; + + if (orient === "bottom" ? (tickTransform = axisX, lineEnter.attr("y2", innerTickSize), textEnter.attr("y", tickLength), lineUpdate.attr("x1", tickX).attr("x2", tickX).attr("y2", function (d) { + var tickPosition = scale(d) + (tickCentered ? 0 : tickOffset); + + return range[0] < tickPosition && tickPosition < range[1] ? innerTickSize : 0; + }), textUpdate.attr("x", 0).attr("y", function (r) { + return r ? 11.5 - 2.5 * (r / 15) * (r > 0 ? 1 : -1) : tickLength; + }(rotate)).style("text-anchor", function (r) { + return r ? r > 0 ? "start" : "end" : "middle"; + }(rotate)).attr("transform", function (r) { + return r ? "rotate(" + r + ")" : ""; + }(rotate)), tspan.attr("x", 0).attr("dy", tspanDy).attr("dx", function (r) { + return r ? 8 * Math.sin(Math.PI * (r / 180)) : 0; + }(rotate)), pathUpdate.attr("d", "M" + range[0] + "," + outerTickSize + "V0H" + range[1] + "V" + outerTickSize)) : orient === "top" ? (tickTransform = axisX, lineEnter.attr("y2", -innerTickSize), textEnter.attr("y", -tickLength), lineUpdate.attr("x2", 0).attr("y2", -innerTickSize), textUpdate.attr("x", 0).attr("y", -tickLength), text.style("text-anchor", "middle"), tspan.attr("x", 0).attr("dy", "0em"), pathUpdate.attr("d", "M" + range[0] + "," + -outerTickSize + "V0H" + range[1] + "V" + -outerTickSize)) : orient === "left" ? (tickTransform = axisY, lineEnter.attr("x2", -innerTickSize), textEnter.attr("x", -tickLength), lineUpdate.attr("x2", -innerTickSize).attr("y1", tickY).attr("y2", tickY), textUpdate.attr("x", -tickLength).attr("y", tickOffset), text.style("text-anchor", "end"), tspan.attr("x", -tickLength).attr("dy", tspanDy), pathUpdate.attr("d", "M" + -outerTickSize + "," + range[0] + "H0V" + range[1] + "H" + -outerTickSize)) : orient === "right" ? (tickTransform = axisY, lineEnter.attr("x2", innerTickSize), textEnter.attr("x", tickLength), lineUpdate.attr("x2", innerTickSize).attr("y2", 0), textUpdate.attr("x", tickLength).attr("y", 0), text.style("text-anchor", "start"), tspan.attr("x", tickLength).attr("dy", tspanDy), pathUpdate.attr("d", "M" + outerTickSize + "," + range[0] + "H0V" + range[1] + "H" + outerTickSize)) : void 0, scale1.bandwidth) { + var x = scale1, + dx = x.bandwidth() / 2; + scale0 = function scale0(d) { + return x(d) + dx; + }, scale1 = scale0; + } else scale0.bandwidth ? scale0 = scale1 : tickExit.call(tickTransform, scale1); + + tickEnter.call(tickTransform, scale0), tickUpdate.call(tickTransform, scale1); + }); + } + + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, + scale = (0, _d.scaleLinear)(), + orient = "bottom", + innerTickSize = 6, + outerTickSize = params.withOuterTick ? 6 : 0, + tickPadding = 3, + tickValues = null, + tickFormat = void 0, + tickArguments = void 0, + tickOffset = 0, + tickCulling = !0, + tickCentered = void 0, + transition = void 0; + + + return axis.scale = function (x) { + return arguments.length ? (scale = x, axis) : scale; + }, axis.orient = function (x) { + return arguments.length ? (orient = x in { + top: 1, + right: 1, + bottom: 1, + left: 1 + } ? x + "" : "bottom", axis) : orient; + }, axis.tickFormat = function (format) { + return arguments.length ? (tickFormat = format, axis) : tickFormat; + }, axis.tickCentered = function (isCentered) { + return arguments.length ? (tickCentered = isCentered, axis) : tickCentered; + }, axis.tickOffset = function () { + return tickOffset; + }, axis.tickInterval = function () { + var interval = void 0; + + if (params.isCategory) interval = tickOffset * 2;else { + var length = axis.g.select("path.domain").node().getTotalLength() - outerTickSize * 2; + + interval = length / axis.g.selectAll("line").size(); + } + + return interval === Infinity ? 0 : interval; + }, axis.ticks = function () { + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) args[_key] = arguments[_key]; + + return args.length ? (tickArguments = Array.prototype.slice.call(args), axis) : tickArguments; + }, axis.tickCulling = function (culling) { + return arguments.length ? (tickCulling = culling, axis) : tickCulling; + }, axis.tickValues = function (x) { + if (typeof x === "function") tickValues = function tickValues() { + return x(scale.domain()); + };else { + if (!arguments.length) return tickValues; + + tickValues = x; + } + + return this; + }, axis.setTransition = function (t) { + return transition = t, this; + }, axis; +}; + +var _d = __webpack_require__(2); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +// Features: +// 1. category axis +// 2. ceil values of translate/x/y to int for half pixel antialiasing +// 3. multiline tick text +var tickTextCharSize = void 0; /** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +module.exports = exports["default"]; + +/***/ }), +/* 9 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _typeof2 = __webpack_require__(5), + _typeof3 = _interopRequireDefault(_typeof2), + _Chart = __webpack_require__(4), + _Chart2 = _interopRequireDefault(_Chart), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Set the min/max value + * @param $$ + * @param type + * @param value + * @return {undefined} + */ +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +var setMinMax = function ($$, type, value) { + var config = $$.config, + axisY = "axis_y_" + type, + axisY2 = "axis_y2_" + type; + + + return typeof value !== "undefined" && ((typeof value === "undefined" ? "undefined" : (0, _typeof3.default)(value)) === "object" ? ((0, _util.isValue)(value.x) && (config["axis_x_" + type] = value.x), (0, _util.isValue)(value.y) && (config[axisY] = value.y), (0, _util.isValue)(value.y2) && (config[axisY2] = value.y2)) : (config[axisY] = value, config[axisY2] = value), $$.redraw({ + withUpdateOrgXDomain: !0, + withUpdateXDomain: !0 + })), undefined; +}, + getMinMax = function ($$, type) { + var config = $$.config; + + + return { + x: config["axis_x_" + type], + y: config["axis_y_" + type], + y2: config["axis_y2_" + type] + }; +}, + axis = function () {}; + +/** + * Get the min/max value + * @param $$ + * @param type + * @return {{x, y, y2}} + */ + + +/** + * Define axis + */ + + +/** + * Get and set axis labels. + * @method axis:labels + * @instance + * @memberof Chart + * @param {Object} labels specified axis' label to be updated. + * @example + * // Update axis' label + * chart.axis.labels({ + * x: "New X Axis Label", + * y: "New Y Axis Label" + * }); + */ +axis.labels = function (labels) { + var $$ = this.internal; + + arguments.length && (Object.keys(labels).forEach(function (axisId) { + $$.axis.setLabelText(axisId, labels[axisId]); + }), $$.axis.updateLabels()); +}, axis.min = function (min) { + return arguments.length ? setMinMax(this.internal, "min", min) : getMinMax(this.internal, "min"); +}, axis.max = function (max) { + return arguments.length ? setMinMax(this.internal, "max", max) : getMinMax(this.internal, "max"); +}, axis.range = function (range) { + if (arguments.length) (0, _util.isDefined)(range.max) && this.axis.max(range.max), (0, _util.isDefined)(range.min) && this.axis.min(range.min);else return { + max: this.axis.max(), + min: this.axis.min() + }; + + return undefined; +}, (0, _util.extend)(_Chart2.default.prototype, { axis: axis }); + +/***/ }), +/* 10 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _Chart = __webpack_require__(4), + _Chart2 = _interopRequireDefault(_Chart), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +(0, _util.extend)(_Chart2.default.prototype, { + /** + * Set specified category name on category axis. + * @method category + * @instance + * @memberof Chart + * @param {Number} i index of category to be changed + * @param {String} category category value to be changed + * @example + * chart.category(2, "Category 3"); + */ + category: function category(i, _category) { + var $$ = this.internal, + config = $$.config; + + + return arguments.length > 1 && (config.axis_x_categories[i] = _category, $$.redraw()), config.axis_x_categories[i]; + }, + + + /** + * Set category names on category axis. + * @method categories + * @instance + * @memberof Chart + * @param {Array} categories This must be an array that includes category names in string. If category names are included in the date by data.x option, this is not required. + * @example + * chart.categories([ + * "Category 1", "Category 2", ... + * ]); + */ + categories: function categories(_categories) { + var $$ = this.internal, + config = $$.config; + return arguments.length ? (config.axis_x_categories = _categories, $$.redraw(), config.axis_x_categories) : config.axis_x_categories; + } +}); + +/***/ }), +/* 11 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _Chart = __webpack_require__(4), + _Chart2 = _interopRequireDefault(_Chart), + _browser = __webpack_require__(60), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +(0, _util.extend)(_Chart2.default.prototype, { + /** + * Resize the chart. + * @method resize + * @instance + * @memberof Chart + * @param {Object} size This argument should include width and height in pixels. + * @example + * // Resize to 640x480 + * chart.resize({ + * width: 640, + * height: 480 + * }); + */ + resize: function resize(size) { + var config = this.internal.config; + + config.size_width = size ? size.width : null, config.size_height = size ? size.height : null, this.flush(); + }, + + + /** + * Force to redraw. + * @method flush + * @instance + * @memberof Chart + * @example + * chart.flush(); + */ + flush: function flush() { + this.internal.updateAndRedraw({ + withLegend: !0, + withTransition: !1, + withTransitionForTransform: !1 + }); + }, + + + /** + * Reset the chart object and remove element and events completely. + * @method destroy + * @instance + * @memberof Chart + * @example + * chart.destroy(); + */ + destroy: function destroy() { + var $$ = this.internal; + + return _browser.window.clearInterval($$.intervalForObserveInserted), $$.resizeTimeout !== undefined && _browser.window.clearTimeout($$.resizeTimeout), (0, _util.removeEvent)(_browser.window, "resize", $$.resizeFunction), $$.selectChart.classed("bb", !1).html(""), Object.keys($$).forEach(function (key) { + $$[key] = null; + }), null; + } +}); /** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ + +/***/ }), +/* 12 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _Chart = __webpack_require__(4), + _Chart2 = _interopRequireDefault(_Chart), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +(0, _util.extend)(_Chart2.default.prototype, { + /** + * Get the color + * @method color + * @instance + * @memberof Chart + * @param {String} id id to get the color + * @example + * chart.color("data1"); + */ + color: function color(id) { + var $$ = this.internal; + + return $$.color(id); // more patterns + } +}); + +/***/ }), +/* 13 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _Chart = __webpack_require__(4), + _Chart2 = _interopRequireDefault(_Chart), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Get data loaded in the chart. + * @method data + * @instance + * @memberof Chart + * @param {String|Array} targetIds If this argument is given, this API returns the specified target data. If this argument is not given, all of data will be returned. + * @example + * // Get only data1 data + * chart.data("data1"); + * + * // Get data1 and data2 data + * chart.data(["data1", "data2"]); + * + * // Get all data + * chart.data(); + */ +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +var data = function (targetIds) { + var targets = this.internal.data.targets; + + return typeof targetIds === "undefined" ? targets : targets.filter(function (t) { + return [].concat(targetIds).indexOf(t.id) >= 0; + }); +}; + +/** + * Get data shown in the chart. + * @method data:shown + * @instance + * @memberof Chart + * @param {String|Array} targetIds If this argument is given, this API filters the data with specified target ids. If this argument is not given, all shown data will be returned. + * @example + * // Get shown data by filtering to include only data1 data + * chart.data.shown("data1"); + * + * // Get shown data by filtering to include data1 and data2 data + * chart.data.shown(["data1", "data2"]); + * + * // Get all shown data + * chart.data.shown(); + */ +data.shown = function (targetIds) { + return this.internal.filterTargetsToShow(this.data(targetIds)); +}, data.values = function (targetId) { + var values = null; + + if (targetId) { + var targets = this.data(targetId); + + targets && targets[0] && (values = targets[0].values.map(function (d) { + return d.value; + })); + } + + return values; +}, data.names = function (names) { + + return this.internal.clearLegendItemTextBoxCache(), this.internal.updateDataAttributes("names", names); +}, data.colors = function (colors) { + return this.internal.updateDataAttributes("colors", colors); +}, data.axes = function (axes) { + return this.internal.updateDataAttributes("axes", axes); +}, (0, _util.extend)(_Chart2.default.prototype, { data: data }); + +/***/ }), +/* 14 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _d = __webpack_require__(2), + _Chart = __webpack_require__(4), + _Chart2 = _interopRequireDefault(_Chart), + _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _util = __webpack_require__(0), + _classes = __webpack_require__(3), + _classes2 = _interopRequireDefault(_classes); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +(0, _util.extend)(_Chart2.default.prototype, { + /** + * Flow data to the chart.

+ * By this API, you can append new data points to the chart. + * @method flow + * @instance + * @memberof Chart + * @param {Object} args + * - If json, rows and columns given, the data will be loaded. If data that has the same target id is given, the chart will be appended. Otherwise, new target will be added. One of these is required when calling. If json specified, keys is required as well as data.json + * - If to is given, the lower x edge will move to that point. If not given, the lower x edge will move by the number of given data points. + * - If length is given, the lower x edge will move by the number of this argument. + * - If duration is given, the duration of the transition will be specified value. If not given, transition.duration will be used as default. + * - If done is given, the specified function will be called when flow ends. + * @example + * // 2 data points will be apprended to the tail and popped from the head. + * // After that, 4 data points will be appended and no data points will be poppoed. + * chart.flow({ + * columns: [ + * ["x", "2013-01-11", "2013-01-21"], + * ["data1", 500, 200], + * ["data2", 100, 300], + * ["data3", 200, 120] + * ], + * done: function () { + * chart.flow({ + * columns: [ + * ["x", "2013-02-11", "2013-02-12", "2013-02-13", "2013-02-14"], + * ["data1", 200, 300, 100, 250], + * ["data2", 100, 90, 40, 120], + * ["data3", 100, 100, 300, 500] + * ], + * length: 0 + * }); + * } + * }); + */ + flow: function flow(args) { + var $$ = this.internal, + notfoundIds = [], + orgDataCount = $$.getMaxDataCount(), + data = void 0, + domain = void 0, + length = 0, + tail = 0, + diff = void 0, + to = void 0; + + + if (args.json) data = $$.convertJsonToData(args.json, args.keys);else if (args.rows) data = $$.convertRowsToData(args.rows);else if (args.columns) data = $$.convertColumnsToData(args.columns);else return; + + var targets = $$.convertDataToTargets(data, !0); + + // Update/Add data + $$.data.targets.forEach(function (t) { + var found = !1, + i = void 0, + j = void 0; + + + for (i = 0; i < targets.length; i++) if (t.id === targets[i].id) { + + for (found = !0, t.values[t.values.length - 1] && (tail = t.values[t.values.length - 1].index + 1), length = targets[i].values.length, j = 0; j < length; j++) targets[i].values[j].index = tail + j, $$.isTimeSeries() || (targets[i].values[j].x = tail + j); + t.values = t.values.concat(targets[i].values), targets.splice(i, 1); + + break; + } + + found || notfoundIds.push(t.id); + }), $$.data.targets.forEach(function (t) { + var i = void 0, + j = void 0; + + + for (i = 0; i < notfoundIds.length; i++) if (t.id === notfoundIds[i]) for (tail = t.values[t.values.length - 1].index + 1, j = 0; j < length; j++) t.values.push({ + id: t.id, + index: tail + j, + x: $$.isTimeSeries() ? $$.getOtherTargetX(tail + j) : tail + j, + value: null + }); + }), $$.data.targets.length && targets.forEach(function (t) { + var i = void 0, + missing = []; + + + for (i = $$.data.targets[0].values[0].index; i < tail; i++) missing.push({ + id: t.id, + index: i, + x: $$.isTimeSeries() ? $$.getOtherTargetX(i) : i, + value: null + }); + + t.values.forEach(function (v) { + v.index += tail, $$.isTimeSeries() || (v.x += tail); + }), t.values = missing.concat(t.values); + }), $$.data.targets = $$.data.targets.concat(targets); + // add remained + + // check data count because behavior needs to change when it"s only one + // const dataCount = $$.getMaxDataCount(); + var baseTarget = $$.data.targets[0], + baseValue = baseTarget.values[0]; + + + // Update length to flow if needed + (0, _util.isDefined)(args.to) ? (length = 0, to = $$.isTimeSeries() ? $$.parseDate(args.to) : args.to, baseTarget.values.forEach(function (v) { + v.x < to && length++; + })) : (0, _util.isDefined)(args.length) && (length = args.length), orgDataCount ? orgDataCount === 1 && $$.isTimeSeries() && (diff = (baseTarget.values[baseTarget.values.length - 1].x - baseValue.x) / 2, domain = [new Date(+baseValue.x - diff), new Date(+baseValue.x + diff)], $$.updateXDomain(null, !0, !0, !1, domain)) : (diff = $$.isTimeSeries() ? baseTarget.values.length > 1 ? baseTarget.values[baseTarget.values.length - 1].x - baseValue.x : baseValue.x - $$.getXDomain($$.data.targets)[0] : 1, domain = [baseValue.x - diff, baseValue.x], $$.updateXDomain(null, !0, !0, !1, domain)), $$.updateTargets($$.data.targets), $$.redraw({ + flow: { + index: baseValue.index, + length: length, + duration: (0, _util.isValue)(args.duration) ? args.duration : $$.config.transition_duration, + done: args.done, + orgDataCount: orgDataCount + }, + withLegend: !0, + withTransition: orgDataCount > 1, + withTrimXDomain: !1, + withUpdateXAxis: !0 + }); + } +}), (0, _util.extend)(_ChartInternal2.default.prototype, { + /** + * Generate flow + * @memberof ChartInternal + * @private + * @param {Object} args + * @return {Function} + */ + generateFlow: function generateFlow(args) { + var $$ = this, + config = $$.config; + + + return function () { + var targets = args.targets, + flow = args.flow, + drawBar = args.drawBar, + drawLine = args.drawLine, + drawArea = args.drawArea, + cx = args.cx, + cy = args.cy, + xv = args.xv, + xForText = args.xForText, + yForText = args.yForText, + duration = args.duration, + translateX = void 0, + scaleX = 1, + flowIndex = flow.index, + flowLength = flow.length, + flowStart = $$.getValueOnIndex($$.data.targets[0].values, flowIndex), + flowEnd = $$.getValueOnIndex($$.data.targets[0].values, flowIndex + flowLength), + orgDomain = $$.x.domain(), + durationForFlow = flow.duration || duration, + done = flow.done || function () {}, + wait = $$.generateWait(), + xgrid = $$.xgrid || (0, _d.selectAll)([]), + xgridLines = $$.xgridLines || (0, _d.selectAll)([]), + mainRegion = $$.mainRegion || (0, _d.selectAll)([]), + mainText = $$.mainText || (0, _d.selectAll)([]), + mainBar = $$.mainBar || (0, _d.selectAll)([]), + mainLine = $$.mainLine || (0, _d.selectAll)([]), + mainArea = $$.mainArea || (0, _d.selectAll)([]), + mainCircle = $$.mainCircle || (0, _d.selectAll)([]); + + + // set flag + $$.flowing = !0, $$.data.targets.forEach(function (d) { + d.values.splice(0, flowLength); + }); + + + // update x domain to generate axis elements for flow + var domain = $$.updateXDomain(targets, !0, !0); + + // update elements related to x scale + $$.updateXGrid && $$.updateXGrid(!0), flow.orgDataCount ? flow.orgDataCount === 1 || (flowStart && flowStart.x) === (flowEnd && flowEnd.x) ? translateX = $$.x(orgDomain[0]) - $$.x(domain[0]) : $$.isTimeSeries() ? translateX = $$.x(orgDomain[0]) - $$.x(domain[0]) : translateX = $$.x(flowStart.x) - $$.x(flowEnd.x) : $$.data.targets[0].values.length === 1 ? $$.isTimeSeries() ? (flowStart = $$.getValueOnIndex($$.data.targets[0].values, 0), flowEnd = $$.getValueOnIndex($$.data.targets[0].values, $$.data.targets[0].values.length - 1), translateX = $$.x(flowStart.x) - $$.x(flowEnd.x)) : translateX = (0, _util.diffDomain)(domain) / 2 : translateX = $$.x(orgDomain[0]) - $$.x(domain[0]), scaleX = (0, _util.diffDomain)(orgDomain) / (0, _util.diffDomain)(domain); + + var transform = "translate(" + translateX + ",0) scale(" + scaleX + ",1)"; + + $$.hideXGridFocus(); + + + var gt = (0, _d.transition)().ease(_d.easeLinear).duration(durationForFlow); + + wait.add([$$.axes.x.transition(gt).call($$.xAxis.setTransition(gt)), mainBar.transition(gt).attr("transform", transform), mainLine.transition(gt).attr("transform", transform), mainArea.transition(gt).attr("transform", transform), mainCircle.transition(gt).attr("transform", transform), mainText.transition(gt).attr("transform", transform), mainRegion.filter($$.isRegionOnX).transition(gt).attr("transform", transform), xgrid.transition(gt).attr("transform", transform), xgridLines.transition(gt).attr("transform", transform)]), gt.call(wait, function () { + var i = void 0, + shapes = [], + texts = [], + eventRects = []; + + + // remove flowed elements + if (flowLength) { + for (i = 0; i < flowLength; i++) shapes.push("." + _classes2.default.shape + "-" + (flowIndex + i)), texts.push("." + _classes2.default.text + "-" + (flowIndex + i)), eventRects.push("." + _classes2.default.eventRect + "-" + (flowIndex + i)); + + $$.svg.selectAll("." + _classes2.default.shapes).selectAll(shapes).remove(), $$.svg.selectAll("." + _classes2.default.texts).selectAll(texts).remove(), $$.svg.selectAll("." + _classes2.default.eventRects).selectAll(eventRects).remove(), $$.svg.select("." + _classes2.default.xgrid).remove(); + } + + // draw again for removing flowed elements and reverting attr + xgrid.size() && xgrid.attr("transform", null).attr($$.xgridAttr), xgridLines.attr("transform", null), xgridLines.select("line").attr("x1", config.axis_rotated ? 0 : xv).attr("x2", config.axis_rotated ? $$.width : xv), xgridLines.select("text").attr("x", config.axis_rotated ? $$.width : 0).attr("y", xv), mainBar.attr("transform", null).attr("d", drawBar), mainLine.attr("transform", null).attr("d", drawLine), mainArea.attr("transform", null).attr("d", drawArea), mainCircle.attr("transform", null).attr("cx", cx).attr("cy", cy), mainText.attr("transform", null).attr("x", xForText).attr("y", yForText).style("fill-opacity", $$.opacityForText.bind($$)), mainRegion.attr("transform", null), mainRegion.select("rect").filter($$.isRegionOnX).attr("x", $$.regionX.bind($$)).attr("width", $$.regionWidth.bind($$)), config.interaction_enabled && $$.redrawEventRect(), done(), $$.flowing = !1; + }); + }; + } +}); /** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ + +/***/ }), +/* 15 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _d = __webpack_require__(2), + _Chart = __webpack_require__(4), + _Chart2 = _interopRequireDefault(_Chart), + _classes = __webpack_require__(3), + _classes2 = _interopRequireDefault(_classes), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +(0, _util.extend)(_Chart2.default.prototype, { + /** + * This API highlights specified targets and fade out the others.

+ * You can specify multiple targets by giving an array that includes id as String. If no argument is given, all of targets will be highlighted. + * @method focus + * @instance + * @memberof Chart + * @param {String|Array} targetIdsValue Target ids to be highlighted. + * @example + * // data1 will be highlighted and the others will be faded out + * chart.focus("data1"); + * + * // data1 and data2 will be highlighted and the others will be faded out + * chart.focus(["data1", "data2"]); + * + * // all targets will be highlighted + * chart.focus(); + */ + focus: function focus(targetIdsValue) { + var $$ = this.internal, + targetIds = $$.mapToTargetIds(targetIdsValue), + candidates = $$.svg.selectAll($$.selectorTargets(targetIds.filter($$.isTargetToShow, $$))); + this.revert(), this.defocus(), candidates.classed(_classes2.default.focused, !0).classed(_classes2.default.defocused, !1), $$.hasArcType() && $$.expandArc(targetIds), $$.toggleFocusLegend(targetIds, !0), $$.focusedTargetIds = targetIds, $$.defocusedTargetIds = $$.defocusedTargetIds.filter(function (id) { + return targetIds.indexOf(id) < 0; + }); + }, + + + /** + * This API fades out specified targets and reverts the others.

+ * You can specify multiple targets by giving an array that includes id as String. If no argument is given, all of targets will be faded out. + * @method defocus + * @instance + * @memberof Chart + * @param {String|Array} Target ids to be faded out. + * @example + * // data1 will be faded out and the others will be reverted. + * chart.defocus("data1"); + * + * // data1 and data2 will be faded out and the others will be reverted. + * chart.defocus(["data1", "data2"]); + * + * // all targets will be faded out. + * chart.defocus(); + */ + defocus: function defocus(targetIdsValue) { + var $$ = this.internal, + targetIds = $$.mapToTargetIds(targetIdsValue), + candidates = $$.svg.selectAll($$.selectorTargets(targetIds.filter($$.isTargetToShow, $$))); + candidates.classed(_classes2.default.focused, !1).classed(_classes2.default.defocused, !0), $$.hasArcType() && $$.unexpandArc(targetIds), $$.toggleFocusLegend(targetIds, !1), $$.focusedTargetIds = $$.focusedTargetIds.filter(function (id) { + return targetIds.indexOf(id) < 0; + }), $$.defocusedTargetIds = targetIds; + }, + + + /** + * This API reverts specified targets.

+ * You can specify multiple targets by giving an array that includes id as String. If no argument is given, all of targets will be reverted. + * @method revert + * @instance + * @memberof Chart + * @param {String|Array} Target ids to be reverted + * @example + * // data1 will be reverted. + * chart.revert("data1"); + * + * // data1 and data2 will be reverted. + * chart.revert(["data1", "data2"]); + * + * // all targets will be reverted. + * chart.revert(); + */ + revert: function revert(targetIdsValue) { + var $$ = this.internal, + targetIds = $$.mapToTargetIds(targetIdsValue), + candidates = $$.svg.selectAll($$.selectorTargets(targetIds)); + // should be for all targets + + candidates.classed(_classes2.default.focused, !1).classed(_classes2.default.defocused, !1), $$.hasArcType() && $$.unexpandArc(targetIds), $$.config.legend_show && ($$.showLegend(targetIds.filter($$.isLegendToShow.bind($$))), $$.legend.selectAll($$.selectorLegends(targetIds)).filter(function () { + return (0, _d.select)(this).classed(_classes2.default.legendItemFocused); + }).classed(_classes2.default.legendItemFocused, !1)), $$.focusedTargetIds = [], $$.defocusedTargetIds = []; + } +}); + +/***/ }), +/* 16 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _Chart = __webpack_require__(4), + _Chart2 = _interopRequireDefault(_Chart), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Update x grid lines. + * @method xgrids + * @instance + * @memberof Chart + * @param {Array} grids X grid lines will be replaced with this argument. The format of this argument is the same as grid.x.lines. + * @example + * // Show 2 x grid lines + * chart.xgrids([ + * {value: 1, text: "Label 1"}, + * {value: 4, text: "Label 4"} + * ]); + */ +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +var xgrids = function (grids) { + var $$ = this.internal, + config = $$.config; + return grids ? (config.grid_x_lines = grids, $$.redrawWithoutRescale(), config.grid_x_lines) : config.grid_x_lines; +}; + +/** + * Add x grid lines.
+ * This API adds new x grid lines instead of replacing like xgrids. + * @method xgrids:add + * @instance + * @memberof Chart + * @param {Array|Object} grids New x grid lines will be added. The format of this argument is the same as grid.x.lines and it's possible to give an Object if only one line will be added. + * @example + * // Add a new x grid line + * chart.xgrids.add( + * {value: 4, text: "Label 4"} + * ); + * + * // Add new x grid lines + * chart.xgrids.add([ + * {value: 2, text: "Label 2"}, + * {value: 4, text: "Label 4"} + * ]); + */ +xgrids.add = function (grids) { + return this.xgrids(this.internal.config.grid_x_lines.concat(grids || [])); +}, xgrids.remove = function (params) { + this.internal.removeGridLines(params, !0); +}; + + +/** + * Update y grid lines. + * @method ygrids + * @instance + * @memberof Chart + * @param {Array} grids Y grid lines will be replaced with this argument. The format of this argument is the same as grid.y.lines. + * @example + * // Show 2 y grid lines + * chart.ygrids([ + * {value: 100, text: "Label 1"}, + * {value: 400, text: "Label 4"} + * ]); + */ +var ygrids = function (grids) { + var $$ = this.internal, + config = $$.config; + return grids ? (config.grid_y_lines = grids, $$.redrawWithoutRescale(), config.grid_y_lines) : config.grid_y_lines; +}; + +/** + * Add y grid lines.
+ * This API adds new y grid lines instead of replacing like ygrids. + * @method ygrids:add + * @instance + * @memberof Chart + * @param {Array|Object} grids New y grid lines will be added. The format of this argument is the same as grid.y.lines and it's possible to give an Object if only one line will be added. + * @example + * // Add a new x grid line + * chart.ygrids.add( + * {value: 400, text: "Label 4"} + * ); + * + * // Add new x grid lines + * chart.ygrids.add([ + * {value: 200, text: "Label 2"}, + * {value: 400, text: "Label 4"} + * ]); + */ +ygrids.add = function (grids) { + return this.ygrids(this.internal.config.grid_y_lines.concat(grids || [])); +}, ygrids.remove = function (params) { + this.internal.removeGridLines(params, !1); +}, (0, _util.extend)(_Chart2.default.prototype, { + xgrids: xgrids, + ygrids: ygrids +}); + +/***/ }), +/* 17 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _Chart = __webpack_require__(4), + _Chart2 = _interopRequireDefault(_Chart), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +(0, _util.extend)(_Chart2.default.prototype, { + /** + * Update groups for the targets. + * @method groups + * @instance + * @memberof Chart + * @param {Array} groups This argument needs to be an Array that includes one or more Array that includes target ids to be grouped. + * @example + * // data1 and data2 will be a new group. + * chart.groups([ + * ["data1", "data2"] + * ]); + */ + groups: function groups(_groups) { + var $$ = this.internal, + config = $$.config; + return (0, _util.isUndefined)(_groups) ? config.data_groups : (config.data_groups = _groups, $$.redraw(), config.data_groups); + } +}); + +/***/ }), +/* 18 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _Chart = __webpack_require__(4), + _Chart2 = _interopRequireDefault(_Chart), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Define legend + */ +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +var legend = function () {}; + +/** + * Show legend for each target. + * @method legend:show + * @instance + * @memberof Chart + * @param {String|Array} targetIds + * - If targetIds is given, specified target's legend will be shown. + * - If only one target is the candidate, String can be passed. + * - If no argument is given, all of target's legend will be shown. + * @example + * // Show legend for data1. + * chart.legend.show("data1"); + * + * // Show legend for data1 and data2. + * chart.legend.show(["data1", "data2"]); + * + * // Show all legend. + * chart.legend.show(); + */ +legend.show = function (targetIds) { + var $$ = this.internal; + + $$.showLegend($$.mapToTargetIds(targetIds)), $$.updateAndRedraw({ withLegend: !0 }); +}, legend.hide = function (targetIds) { + var $$ = this.internal; + + $$.hideLegend($$.mapToTargetIds(targetIds)), $$.updateAndRedraw({ withLegend: !0 }); +}, (0, _util.extend)(_Chart2.default.prototype, { legend: legend }); + +/***/ }), +/* 19 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _Chart = __webpack_require__(4), + _Chart2 = _interopRequireDefault(_Chart), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +(0, _util.extend)(_Chart2.default.prototype, { + /** + * Load data to the chart.

+ * You can specify multiple targets by giving an array that includes id as String. If no argument is given, all of targets will be toggles. + * - Note: + * unload should be used if some data needs to be unloaded simultaneously. If you call unload API soon after/before load instead of unload param, chart will not be rendered properly because of cancel of animation.
+ * done will be called after data loaded, but it's not after rendering. It's because rendering will finish after some transition and there is some time lag between loading and rendering + * @method load + * @instance + * @memberof Chart + * @param {Object} args + * - If url, json, rows and columns given, the data will be loaded. If data that has the same target id is given, the chart will be updated. Otherwise, new target will be added. + * - If classes given, the classes specifed by data.classes will be updated. classes must be Object that has target id as keys. + * - If categories given, the categories specifed by axis.x.categories or data.x will be updated. categories must be Array. + * - If axes given, the axes specifed by data.axes will be updated. axes must be Object that has target id as keys. + * - If colors given, the colors specifed by data.colors will be updated. colors must be Object that has target id as keys. + * - If type or types given, the type of targets will be updated. type must be String and types must be Object. + * - If unload given, data will be unloaded before loading new data. If true given, all of data will be unloaded. If target ids given as String or Array, specified targets will be unloaded. + * - If done given, the specified function will be called after data loded. + * @example + * // Load data1 and unload data2 and data3 + * chart.load({ + * columns: [ + * ["data1", 100, 200, 150, ...], + * ... + * ], + * unload: ["data2", "data3"] + * }); + */ + load: function load(args) { + var $$ = this.internal, + config = $$.config; + + // update xs if specified + + + // use cache if exists + return args.xs && $$.addXs(args.xs), "names" in args && this.data.names(args.names), "classes" in args && Object.keys(args.classes).forEach(function (id) { + config.data_classes[id] = args.classes[id]; + }), "categories" in args && $$.isCategorized() && (config.axis_x_categories = args.categories), "axes" in args && Object.keys(args.axes).forEach(function (id) { + config.data_axes[id] = args.axes[id]; + }), "colors" in args && Object.keys(args.colors).forEach(function (id) { + config.data_colors[id] = args.colors[id]; + }), "cacheIds" in args && $$.hasCaches(args.cacheIds) ? void $$.load($$.getCaches(args.cacheIds), args.done) : void ("unload" in args ? $$.unload($$.mapToTargetIds(typeof args.unload === "boolean" && args.unload ? null : args.unload), function () { + return $$.loadFromArgs(args); + }) : $$.loadFromArgs(args)); + + // unload if needed + }, + + + /** + * Unload data to the chart.

+ * You can specify multiple targets by giving an array that includes id as String. If no argument is given, all of targets will be toggles. + * - Note: + * If you call load API soon after/before unload, unload param of load should be used. Otherwise chart will not be rendered properly because of cancel of animation.
+ * `done` will be called after data loaded, but it's not after rendering. It's because rendering will finish after some transition and there is some time lag between loading and rendering. + * @method unload + * @instance + * @memberof Chart + * @param {Object} args + * - If ids given, the data that has specified target id will be unloaded. ids should be String or Array. If ids is not specified, all data will be unloaded. + * - If done given, the specified function will be called after data loded. + * @example + * // Unload data2 and data3 + * chart.unload({ + * ids: ["data2", "data3"] + * }); + */ + unload: function unload(argsValue) { + var $$ = this.internal, + args = argsValue || {}; + args instanceof Array ? args = { ids: args } : typeof args === "string" && (args = { ids: [args] }), $$.unload($$.mapToTargetIds(args.ids), function () { + $$.redraw({ + withUpdateOrgXDomain: !0, + withUpdateXDomain: !0, + withLegend: !0 + }), args.done && args.done(); + }); + } +}); + +/***/ }), +/* 20 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _Chart = __webpack_require__(4), + _Chart2 = _interopRequireDefault(_Chart), + _classes = __webpack_require__(3), + _classes2 = _interopRequireDefault(_classes), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Update regions. + * @method regions + * @instance + * @memberof Chart + * @param {Array} regions Regions will be replaced with this argument. The format of this argument is the same as regions. + * @return {Array} regions + * @example + * // Show 2 regions + * chart.regions([ + * {axis: "x", start: 5, class: "regionX"}, + * {axis: "y", end: 50, class: "regionY"} + * ]); + */ +var regions = function (_regions) { + var $$ = this.internal, + config = $$.config; + return _regions ? (config.regions = _regions, $$.redrawWithoutRescale(), config.regions) : config.regions; +}; + +/** + * Add new region.

+ * This API adds new region instead of replacing like regions. + * @method regions:add + * @instance + * @memberof Chart + * @param {Array|Object} regions New region will be added. The format of this argument is the same as regions and it's possible to give an Object if only one region will be added. + * @return {Array} regions + * @example + * // Add a new region + * chart.regions.add( + * {axis: "x", start: 5, class: "regionX"} + * ); + * + * // Add new regions + * chart.regions.add([ + * {axis: "x", start: 5, class: "regionX"}, + * {axis: "y", end: 50, class: "regionY"} + *]); + */ +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +regions.add = function (regions) { + var $$ = this.internal, + config = $$.config; + return regions ? (config.regions = config.regions.concat(regions), $$.redrawWithoutRescale(), config.regions) : config.regions; +}, regions.remove = function (optionsValue) { + var $$ = this.internal, + config = $$.config, + options = optionsValue || {}, + duration = $$.getOption(options, "duration", config.transition_duration), + classes = $$.getOption(options, "classes", [_classes2.default.region]), + regions = $$.main.select("." + _classes2.default.regions).selectAll(classes.map(function (c) { + return "." + c; + })); + + + return (duration ? regions.transition().duration(duration) : regions).style("opacity", "0").remove(), config.regions = config.regions.filter(function (region) { + var found = !1; + + return !region.class || (region.class.split(" ").forEach(function (c) { + classes.indexOf(c) >= 0 && (found = !0); + }), !found); + }), config.regions; +}, (0, _util.extend)(_Chart2.default.prototype, { regions: regions }); + +/***/ }), +/* 21 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _d = __webpack_require__(2), + _Chart = __webpack_require__(4), + _Chart2 = _interopRequireDefault(_Chart), + _util = __webpack_require__(0), + _classes = __webpack_require__(3), + _classes2 = _interopRequireDefault(_classes); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +(0, _util.extend)(_Chart2.default.prototype, { + /** + * Get selected data points.

+ * By this API, you can get selected data points information. To use this API, data.selection.enabled needs to be set true. + * @method selected + * @instance + * @memberof Chart + * @param {String} targetId You can filter the result by giving target id that you want to get. If not given, all of data points will be returned. + * @return {Array} dataPoint + * @example + * // all selected data points will be returned. + * chart.selected(); + * + * // all selected data points of data1 will be returned. + * chart.selected("data1"); + */ + selected: function selected(targetId) { + var $$ = this.internal, + dataPoint = []; + + + return $$.main.selectAll("." + (_classes2.default.shapes + $$.getTargetSelectorSuffix(targetId))).selectAll("." + _classes2.default.shape).filter(function () { + return (0, _d.select)(this).classed(_classes2.default.SELECTED); + }).each(function (d) { + return dataPoint.push(d); + }), dataPoint; + }, + + + /** + * Set data points to be selected. + * @method select + * @instance + * @memberof Chart + * @param {String} ids + * @param {Number} indices + * @param {Boolean} resetOther + * @example + * // select from 'data1', indices 2 and unselect others selected + * chart.select("data1", 2, true); + */ + select: function select(ids, indices, resetOther) { + var $$ = this.internal, + config = $$.config; + config.data_selection_enabled && $$.main.selectAll("." + _classes2.default.shapes).selectAll("." + _classes2.default.shape).each(function (d, i) { + var shape = (0, _d.select)(this), + id = d.data ? d.data.id : d.id, + toggle = $$.getToggle(this, d).bind($$), + isTargetId = config.data_selection_grouped || !ids || ids.indexOf(id) >= 0, + isTargetIndex = !indices || indices.indexOf(i) >= 0, + isSelected = shape.classed(_classes2.default.SELECTED); + + + // line/area selection not supported yet + shape.classed(_classes2.default.line) || shape.classed(_classes2.default.area) || (isTargetId && isTargetIndex ? config.data_selection_isselectable(d) && !isSelected && toggle(!0, shape.classed(_classes2.default.SELECTED, !0), d, i) : (0, _util.isDefined)(resetOther) && resetOther && isSelected && toggle(!1, shape.classed(_classes2.default.SELECTED, !1), d, i)); + }); + }, + + + /** + * Set data points to be un-selected. + * @method unselect + * @instance + * @memberof Chart + * @param {String} ids + * @param {Number} indices + * @example + * // unselect from 'data1', indices 2 + * chart.unselect("data1", 2); + */ + unselect: function unselect(ids, indices) { + var $$ = this.internal, + config = $$.config; + config.data_selection_enabled && $$.main.selectAll("." + _classes2.default.shapes).selectAll("." + _classes2.default.shape).each(function (d, i) { + var shape = (0, _d.select)(this), + id = d.data ? d.data.id : d.id, + toggle = $$.getToggle(this, d).bind($$), + isTargetId = config.data_selection_grouped || !ids || ids.indexOf(id) >= 0, + isTargetIndex = !indices || indices.indexOf(i) >= 0, + isSelected = shape.classed(_classes2.default.SELECTED); + + + // line/area selection not supported yet + shape.classed(_classes2.default.line) || shape.classed(_classes2.default.area) || isTargetId && isTargetIndex && config.data_selection_isselectable(d) && isSelected && toggle(!1, shape.classed(_classes2.default.SELECTED, !1), d, i); + }); + } +}); + +/***/ }), +/* 22 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _Chart = __webpack_require__(4), + _Chart2 = _interopRequireDefault(_Chart), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +(0, _util.extend)(_Chart2.default.prototype, { + /** + * Show data points + * @method show + * @instance + * @memberof Chart + * @param {String|Array} targetIdsValue + * @param {Object} options + */ + show: function show(targetIdsValue) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, + $$ = this.internal, + targetIds = $$.mapToTargetIds(targetIdsValue); + $$.removeHiddenTargetIds(targetIds); + + var targets = $$.svg.selectAll($$.selectorTargets(targetIds)); + + targets.transition().style("opacity", "1", "important").call($$.endall, function () { + targets.style("opacity", null).style("opacity", "1"); + }), options.withLegend && $$.showLegend(targetIds), $$.redraw({ + withUpdateOrgXDomain: !0, + withUpdateXDomain: !0, + withLegend: !0 + }); + }, + + + /** + * Hide data points + * @method hide + * @instance + * @memberof Chart + * @param {String|Array} targetIdsValue + * @param {Object} options + */ + hide: function hide(targetIdsValue) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, + $$ = this.internal, + targetIds = $$.mapToTargetIds(targetIdsValue); + $$.addHiddenTargetIds(targetIds); + + var targets = $$.svg.selectAll($$.selectorTargets(targetIds)); + + targets.transition().style("opacity", "0", "important").call($$.endall, function () { + targets.style("opacity", null).style("opacity", "0"); + }), options.withLegend && $$.hideLegend(targetIds), $$.redraw({ + withUpdateOrgXDomain: !0, + withUpdateXDomain: !0, + withLegend: !0 + }); + }, + + + /** + * Toggle data points + * @method toggle + * @instance + * @memberof Chart + * @param {Array} targetIds + * @param {Object} options + */ + toggle: function toggle(targetIds) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, + that = this, + $$ = this.internal; + $$.mapToTargetIds(targetIds).forEach(function (targetId) { + $$.isTargetToShow(targetId) ? that.hide(targetId, options) : that.show(targetId, options); + }); + } +}); + +/***/ }), +/* 23 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _Chart = __webpack_require__(4), + _Chart2 = _interopRequireDefault(_Chart), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Define tooltip + */ +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +var tooltip = function () {}; + +/** + * Show tooltip + * @method tooltip:show + * @instance + * @memberof Chart + * @param {Array} args + */ +tooltip.show = function (args) { + var $$ = this.internal, + index = void 0, + mouse = void 0; + + + // determine mouse position on the chart + args.mouse && (mouse = args.mouse), args.data ? $$.isMultipleX() ? (mouse = [$$.x(args.data.x), $$.getYScale(args.data.id)(args.data.value)], index = null) : index = (0, _util.isValue)(args.data.index) ? args.data.index : $$.getIndexByX(args.data.x) : typeof args.x === "undefined" ? typeof args.index !== "undefined" && (index = args.index) : index = $$.getIndexByX(args.x), $$.dispatchEvent("mouseover", index, mouse), $$.dispatchEvent("mousemove", index, mouse), $$.config.tooltip_onshow.call($$, args.data); +}, tooltip.hide = function () { + this.internal.dispatchEvent("mouseout", 0), this.internal.config.tooltip_onhide.call(this); +}, (0, _util.extend)(_Chart2.default.prototype, { tooltip: tooltip }); + +/***/ }), +/* 24 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _Chart = __webpack_require__(4), + _Chart2 = _interopRequireDefault(_Chart), + _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +(0, _util.extend)(_Chart2.default.prototype, { + /** + * Change the type of the chart. + * @method transform + * @instance + * @memberof Chart + * @param {String} type Specify the type to be transformed. The types listed in data.type can be used. + * @param {String|Array} targetIds Specify targets to be transformed. If not given, all targets will be the candidate. + * @example + * // all targets will be bar chart. + * chart.transform("bar"); + * + * // only data1 will be bar chart. + * chart.transform("bar", "data1"); + * + * // only data1 and data2 will be bar chart. + * chart.transform("bar", ["data1", "data2"]); + */ + transform: function transform(type, targetIds) { + var $$ = this.internal, + options = ["pie", "donut"].indexOf(type) >= 0 ? { withTransform: !0 } : null; + $$.transformTo(targetIds, type, options); + } +}), (0, _util.extend)(_ChartInternal2.default.prototype, { + /** + * Change the type of the chart. + * @private + * @param {String|Array} targetIds + * @param {String} type + * @param {Object} optionsForRedraw + */ + transformTo: function transformTo(targetIds, type, optionsForRedraw) { + var $$ = this, + withTransitionForAxis = !$$.hasArcType(), + options = optionsForRedraw || { withTransitionForAxis: withTransitionForAxis }; + options.withTransitionForTransform = !1, $$.transiting = !1, $$.setTargetType(targetIds, type), $$.updateTargets($$.data.targets), $$.updateAndRedraw(options); + } +}); /** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ + +/***/ }), +/* 25 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _Chart = __webpack_require__(4), + _Chart2 = _interopRequireDefault(_Chart), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +(0, _util.extend)(_Chart2.default.prototype, { + /** + * Get and set x values for the chart. + * @method x + * @instance + * @memberof Chart + * @param {Array} x If x is given, x values of every target will be updated. If no argument is given, current x values will be returned as an Object whose keys are the target ids. + * @return {Object} xs + * @example + * // Get current x values + * chart.x(); + * + * // Update x values for all targets + * chart.x([100, 200, 300, 400, ...]); + */ + x: function x(_x) { + var $$ = this.internal; + + return arguments.length && ($$.updateTargetX($$.data.targets, _x), $$.redraw({ + withUpdateOrgXDomain: !0, + withUpdateXDomain: !0 + })), $$.data.xs; + }, + + + /** + * Get and set x values for the chart. + * @method xs + * @instance + * @memberof Chart + * @param {Array} xs If xs is given, specified target's x values will be updated. If no argument is given, current x values will be returned as an Object whose keys are the target ids. + * @return {Object} xs + * @example + * // Get current x values + * chart.xs(); + * + * // Update x values for all targets + * chart.xs({ + * data1: [10, 20, 30, 40, ...], + * data2: [100, 200, 300, 400, ...] + * }); + */ + xs: function xs(_xs) { + var $$ = this.internal; + + return arguments.length && ($$.updateTargetXs($$.data.targets, _xs), $$.redraw({ + withUpdateOrgXDomain: !0, + withUpdateXDomain: !0 + })), $$.data.xs; + } +}); + +/***/ }), +/* 26 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _d = __webpack_require__(2), + _Chart = __webpack_require__(4), + _Chart2 = _interopRequireDefault(_Chart), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Zoom by giving x domain. + * @method zoom + * @instance + * @memberof Chart + * @param {Array} domainValue If domain is given, the chart will be zoomed to the given domain. If no argument is given, the current zoomed domain will be returned. + * @example + * // Zoom to specified domain + * chart.zoom([10, 20]); + * + * // Get the current zoomed domain + * chart.zoom(); + */ +var zoom = function (domainValue) { + var $$ = this.internal, + domain = domainValue, + resultDomain = void 0; + + + if (domain) { + + if ($$.isTimeSeries() && (domain = domain.map(function (x) { + return $$.parseDate(x); + })), $$.config.subchart_show) { + var xScale = $$.zoomScale || $$.x; + + $$.brush.getSelection().call($$.brush.move, [xScale(domain[0]), xScale(domain[1])]), resultDomain = domain; + } else { + var orgDomain = $$.x.orgDomain(), + k = (orgDomain[1] - orgDomain[0]) / (domain[1] - domain[0]), + tx = $$.isTimeSeries() ? 0 - k * $$.x(domain[0].getTime()) : domain[0] - k * $$.x(domain[0]); + $$.zoom.updateTransformScale(_d.zoomIdentity.translate(tx, 0).scale(k)), resultDomain = $$.zoomScale.domain(); + } + + $$.redraw({ + withTransition: !0, + withY: $$.config.zoom_rescale + }), $$.config.zoom_onzoom.call(this, $$.x.orgDomain()); + } else resultDomain = ($$.zoomScale || $$.x).domain(); + return resultDomain; +}; + +/** + * Enable and disable zooming. + * @method zoom:enable + * @instance + * @memberof Chart + * @param {Boolean} enabled If enabled is true, the feature of zooming will be enabled. If false is given, it will be disabled. + * @example + * // Enable zooming + * chart.zoom.enable(true); + */ +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +zoom.enable = function (enabled) { + var $$ = this.internal; + + $$.config.zoom_enabled = enabled, $$.updateAndRedraw(); +}, zoom.max = function (max) { + var $$ = this.internal, + config = $$.config; + + + if (max === 0 || max) config.zoom_x_max = (0, _d.max)([$$.orgXDomain[1], max]);else return config.zoom_x_max; + + return undefined; +}, zoom.min = function (min) { + var $$ = this.internal, + config = $$.config; + + + if (min === 0 || min) config.zoom_x_min = (0, _d.min)([$$.orgXDomain[0], min]);else return config.zoom_x_min; + + return undefined; +}, zoom.range = function (range) { + if (arguments.length) (0, _util.isDefined)(range.max) && this.domain.max(range.max), (0, _util.isDefined)(range.min) && this.domain.min(range.min);else return { + max: this.domain.max(), + min: this.domain.min() + }; + + return undefined; +}, (0, _util.extend)(_Chart2.default.prototype, { + zoom: zoom, + /** + * Unzoom zoomed area + * @method unzoom + * @instance + * @memberof Chart + * @example + * chart.unzoom(); + */ + unzoom: function unzoom() { + var $$ = this.internal; + + $$.config.subchart_show ? $$.brush.getSelection().call($$.brush.move, null) : $$.zoom.updateTransformScale(_d.zoomIdentity), $$.redraw({ + withTransition: !0, + withY: $$.config.zoom_rescale + }); + } +}); + +/***/ }), +/* 27 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _typeof2 = __webpack_require__(5), + _typeof3 = _interopRequireDefault(_typeof2), + _Options = __webpack_require__(58), + _Options2 = _interopRequireDefault(_Options), + _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +(0, _util.extend)(_ChartInternal2.default.prototype, { + getOptions: function getOptions() { + var config = new _Options2.default(); + + return (0, _util.merge)(config.value, this.additionalConfig); + }, + + + additionalConfig: {}, + + loadConfig: function loadConfig(config) { + + function find() { + var key = keys.shift(); + + return key && target && (typeof target === "undefined" ? "undefined" : (0, _typeof3.default)(target)) === "object" && key in target ? (target = target[key], find()) : key ? undefined : target; + } + + var thisConfig = this.config, + target = void 0, + keys = void 0, + read = void 0; + Object.keys(thisConfig).forEach(function (key) { + target = config, keys = key.split("_"), read = find(), (0, _util.isDefined)(read) && (thisConfig[key] = read); + }); + } +}); /** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ + +/***/ }), +/* 28 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _d = __webpack_require__(2), + _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +(0, _util.extend)(_ChartInternal2.default.prototype, { + convertUrlToData: function convertUrlToData(url) { + var _this = this, + mimeType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "csv", + headers = arguments[2], + keys = arguments[3], + done = arguments[4], + type = mimeType, + req = (0, _d.request)(url); + + if (headers) for (var _iterator = Object.keys(headers), _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { + var _ref; + + if (_isArray) { + if (_i >= _iterator.length) break; + _ref = _iterator[_i++]; + } else { + if (_i = _iterator.next(), _i.done) break; + _ref = _i.value; + } + + var header = _ref; + req.header(header, headers[header]); + } + + req.get(function (error, data) { + var d = void 0; + + if (!data) throw new Error(error.responseURL + " " + error.status + " (" + error.statusText + ")"); + + var response = data.response || data.responseText; + + d = type === "json" ? _this.convertJsonToData(JSON.parse(response), keys) : type === "tsv" ? _this.convertTsvToData(response) : _this.convertCsvToData(response), done.call(_this, d); + }); + }, + convertCsvToData: function convertCsvToData(xsv) { + var rows = (0, _d.csvParseRows)(xsv), + d = void 0; + + + return rows.length === 1 ? (d = [{}], rows[0].forEach(function (id) { + d[0][id] = null; + })) : d = (0, _d.csvParse)(xsv), d; + }, + convertTsvToData: function convertTsvToData(xsv) { + var rows = (0, _d.tsvParseRows)(xsv), + d = void 0; + + + return rows.length === 1 ? (d = [{}], rows[0].forEach(function (id) { + d[0][id] = null; + })) : d = (0, _d.tsvParse)(xsv), d; + }, + convertJsonToData: function convertJsonToData(json, keys) { + var _this2 = this, + newRows = [], + targetKeys = void 0, + data = void 0; + + return keys ? (keys.x ? (targetKeys = keys.value.concat(keys.x), this.config.data_x = keys.x) : targetKeys = keys.value, newRows.push(targetKeys), json.forEach(function (o) { + + for (var newRow = [], v = void 0, _iterator2 = targetKeys, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { + var _ref2; + + if (_isArray2) { + if (_i2 >= _iterator2.length) break; + _ref2 = _iterator2[_i2++]; + } else { + if (_i2 = _iterator2.next(), _i2.done) break; + _ref2 = _i2.value; + } + + var key = _ref2; + v = _this2.findValueInJson(o, key), (0, _util.isUndefined)(v) && (v = null), newRow.push(v); + } + newRows.push(newRow); + }), data = this.convertRowsToData(newRows)) : (Object.keys(json).forEach(function (key) { + return newRows.push([key].concat(json[key])); + }), data = this.convertColumnsToData(newRows)), data; + }, + findValueInJson: function findValueInJson(object, path) { + var convertedPath = path.replace(/\[(\w+)\]/g, ".$1"), + pathArray = convertedPath.replace(/^\./, "").split("."), + target = object; // convert indexes to properties (replace [] with .) + // strip a leading dot + + + for (var _iterator3 = pathArray, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { + var _ref3; + + if (_isArray3) { + if (_i3 >= _iterator3.length) break; + _ref3 = _iterator3[_i3++]; + } else { + if (_i3 = _iterator3.next(), _i3.done) break; + _ref3 = _i3.value; + } + + var k = _ref3; + + if (k in target) target = target[k];else { + target = undefined; + + break; + } + } + return target; + }, + convertRowsToData: function convertRowsToData(rows) { + var keys = rows[0], + newRows = [], + newRow = {}, + i = void 0, + j = void 0; + + + for (i = 1; i < rows.length; i++) { + for (newRow = {}, j = 0; j < rows[i].length; j++) { + if ((0, _util.isUndefined)(rows[i][j])) throw new Error("Source data is missing a component at (" + i + ", " + j + ")!"); + newRow[keys[j]] = rows[i][j]; + } + newRows.push(newRow); + } + + return newRows; + }, + convertColumnsToData: function convertColumnsToData(columns) { + var newRows = [], + i = void 0, + j = void 0, + key = void 0; + + + for (i = 0; i < columns.length; i++) for (key = columns[i][0], j = 1; j < columns[i].length; j++) { + if ((0, _util.isUndefined)(newRows[j - 1]) && (newRows[j - 1] = {}), (0, _util.isUndefined)(columns[i][j])) throw new Error("Source data is missing a component at (" + i + ", " + j + ")!"); + newRows[j - 1][key] = columns[i][j]; + } + return newRows; + }, + convertDataToTargets: function convertDataToTargets(data, appendXs) { + var _this3 = this, + $$ = this, + config = $$.config, + ids = (0, _d.keys)(data[0]).filter($$.isNotX, $$), + xs = (0, _d.keys)(data[0]).filter($$.isX, $$); + + ids.forEach(function (id) { + var xKey = _this3.getXKey(id); + + _this3.isCustomX() || _this3.isTimeSeries() ? xs.indexOf(xKey) >= 0 ? _this3.data.xs[id] = (appendXs && $$.data.xs[id] ? $$.data.xs[id] : []).concat(data.map(function (d) { + return d[xKey]; + }).filter(_util.isValue).map(function (rawX, i) { + return $$.generateTargetX(rawX, id, i); + })) : config.data_x ? _this3.data.xs[id] = _this3.getOtherTargetXs() : (0, _util.notEmpty)(config.data_xs) && ($$.data.xs[id] = $$.getXValuesOfXKey(xKey, $$.data.targets)) : $$.data.xs[id] = data.map(function (d, i) { + return i; + }); + }), ids.forEach(function (id) { + if (!$$.data.xs[id]) throw new Error("x is not defined for id = \"" + id + "\"."); + }); + + + // convert to target + var targets = ids.map(function (id, index) { + var convertedId = config.data_idConverter(id); + + return { + id: convertedId, + id_org: id, + values: data.map(function (d, i) { + var xKey = $$.getXKey(id), + rawX = d[xKey], + value = d[id] === null || isNaN(d[id]) ? null : +d[id], + x = void 0; + + // use x as categories if custom x and categorized + + return $$.isCustomX() && $$.isCategorized() && index === 0 && !(0, _util.isUndefined)(rawX) ? (index === 0 && i === 0 && (config.axis_x_categories = []), x = config.axis_x_categories.indexOf(rawX), x === -1 && (x = config.axis_x_categories.length, config.axis_x_categories.push(rawX))) : x = $$.generateTargetX(rawX, id, i), ((0, _util.isUndefined)(d[id]) || $$.data.xs[id].length <= i) && (x = undefined), { x: x, value: value, id: convertedId }; + }).filter(function (v) { + return (0, _util.isDefined)(v.x); + }) + }; + }); + + // finish targets + + + return targets.forEach(function (t) { + var i = void 0; + + // sort values by its x + config.data_xSort && (t.values = t.values.sort(function (v1, v2) { + var x1 = v1.x || v1.x === 0 ? v1.x : Infinity, + x2 = v2.x || v2.x === 0 ? v2.x : Infinity; + + + return x1 - x2; + })), i = 0, t.values.forEach(function (v) { + v.index = i++; + }), $$.data.xs[t.id].sort(function (v1, v2) { + return v1 - v2; + }); + }), $$.hasNegativeValue = $$.hasNegativeValueInTargets(targets), $$.hasPositiveValue = $$.hasPositiveValueInTargets(targets), config.data_type && $$.setTargetType($$.mapToIds(targets).filter(function (id) { + return !(id in config.data_types); + }), config.data_type), targets.forEach(function (d) { + $$.addCache(d.id_org, d); + }), targets; + } +}); /** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ + +/***/ }), +/* 29 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _typeof2 = __webpack_require__(5), + _typeof3 = _interopRequireDefault(_typeof2), + _d = __webpack_require__(2), + _classes = __webpack_require__(3), + _classes2 = _interopRequireDefault(_classes), + _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +(0, _util.extend)(_ChartInternal2.default.prototype, { + isX: function isX(key) { + var $$ = this, + config = $$.config, + dataKey = config.data_x && key === config.data_x, + existValue = (0, _util.notEmpty)(config.data_xs) && (0, _util.hasValue)(config.data_xs, key); + + + return dataKey || existValue; + }, + isNotX: function isNotX(key) { + return !this.isX(key); + }, + getXKey: function getXKey(id) { + var $$ = this, + config = $$.config; + + + return config.data_x ? config.data_x : (0, _util.notEmpty)(config.data_xs) ? config.data_xs[id] : null; + }, + getXValuesOfXKey: function getXValuesOfXKey(key, targets) { + var $$ = this, + ids = targets && (0, _util.notEmpty)(targets) ? $$.mapToIds(targets) : [], + xValues = void 0; + + return ids.forEach(function (id) { + $$.getXKey(id) === key && (xValues = $$.data.xs[id]); + }), xValues; + }, + getIndexByX: function getIndexByX(x) { + var $$ = this, + data = $$.filterByX($$.data.targets, x); + + + return data.length ? data[0].index : null; + }, + getXValue: function getXValue(id, i) { + var $$ = this; + + return id in $$.data.xs && $$.data.xs[id] && (0, _util.isValue)($$.data.xs[id][i]) ? $$.data.xs[id][i] : i; + }, + getOtherTargetXs: function getOtherTargetXs() { + var $$ = this, + idsForX = Object.keys($$.data.xs); + + + return idsForX.length ? $$.data.xs[idsForX[0]] : null; + }, + getOtherTargetX: function getOtherTargetX(index) { + var xs = this.getOtherTargetXs(); + + return xs && index < xs.length ? xs[index] : null; + }, + addXs: function addXs(xs) { + var $$ = this; + + Object.keys(xs).forEach(function (id) { + $$.config.data_xs[id] = xs[id]; + }); + }, + hasMultipleX: function hasMultipleX(xs) { + // https://github.com/d3/d3-collection + return (0, _d.set)(Object.keys(xs).map(function (id) { + return xs[id]; + })).size() > 1; + }, + isMultipleX: function isMultipleX() { + return (0, _util.notEmpty)(this.config.data_xs) || !this.config.data_xSort || this.hasType("scatter"); + }, + addName: function addName(data) { + var $$ = this, + name = void 0; + + return data && (name = $$.config.data_names[data.id], data.name = name === undefined ? data.id : name), data; + }, + getValueOnIndex: function getValueOnIndex(values, index) { + var valueOnIndex = values.filter(function (v) { + return v.index === index; + }); + + return valueOnIndex.length ? valueOnIndex[0] : null; + }, + updateTargetX: function updateTargetX(targets, x) { + var $$ = this; + + targets.forEach(function (t) { + t.values.forEach(function (v, i) { + v.x = $$.generateTargetX(x[i], t.id, i); + }), $$.data.xs[t.id] = x; + }); + }, + updateTargetXs: function updateTargetXs(targets, xs) { + var $$ = this; + + targets.forEach(function (t) { + xs[t.id] && $$.updateTargetX([t], xs[t.id]); + }); + }, + generateTargetX: function generateTargetX(rawX, id, index) { + var $$ = this, + x = void 0; + + return x = $$.isTimeSeries() ? rawX ? $$.parseDate(rawX) : $$.parseDate($$.getXValue(id, index)) : $$.isCustomX() && !$$.isCategorized() ? (0, _util.isValue)(rawX) ? +rawX : $$.getXValue(id, index) : index, x; + }, + cloneTarget: function cloneTarget(target) { + return { + id: target.id, + id_org: target.id_org, + values: target.values.map(function (d) { + return { x: d.x, value: d.value, id: d.id }; + }) + }; + }, + updateXs: function updateXs() { + var $$ = this; + + $$.data.targets.length && ($$.xs = [], $$.data.targets[0].values.forEach(function (v) { + $$.xs[v.index] = v.x; + })); + }, + getPrevX: function getPrevX(i) { + var x = this.xs[i - 1]; + + return typeof x === "undefined" ? null : x; + }, + getNextX: function getNextX(i) { + var x = this.xs[i + 1]; + + return typeof x === "undefined" ? null : x; + }, + getMaxDataCount: function getMaxDataCount() { + var $$ = this; + + return (0, _d.max)($$.data.targets, function (t) { + return t.values.length; + }); + }, + getMaxDataCountTarget: function getMaxDataCountTarget(targets) { + var length = targets.length, + max = 0, + maxTarget = void 0; + + return length > 1 ? targets.forEach(function (t) { + t.values.length > max && (maxTarget = t, max = t.values.length); + }) : maxTarget = length ? targets[0] : null, maxTarget; + }, + getEdgeX: function getEdgeX(targets) { + return targets.length ? [(0, _d.min)(targets, function (t) { + return t.values[0].x; + }), (0, _d.max)(targets, function (t) { + return t.values[t.values.length - 1].x; + })] : [0, 0]; + }, + mapToIds: function mapToIds(targets) { + return targets.map(function (d) { + return d.id; + }); + }, + mapToTargetIds: function mapToTargetIds(ids) { + var $$ = this; + + return ids ? [].concat(ids) : $$.mapToIds($$.data.targets); + }, + hasTarget: function hasTarget(targets, id) { + var ids = this.mapToIds(targets), + i = void 0; + + + for (i = 0; i < ids.length; i++) if (ids[i] === id) return !0; + return !1; + }, + isTargetToShow: function isTargetToShow(targetId) { + return this.hiddenTargetIds.indexOf(targetId) < 0; + }, + isLegendToShow: function isLegendToShow(targetId) { + return this.hiddenLegendIds.indexOf(targetId) < 0; + }, + filterTargetsToShow: function filterTargetsToShow(targets) { + var $$ = this; + + return targets.filter(function (t) { + return $$.isTargetToShow(t.id); + }); + }, + mapTargetsToUniqueXs: function mapTargetsToUniqueXs(targets) { + var $$ = this, + xs = (0, _d.set)((0, _d.merge)(targets.map(function (t) { + return t.values.map(function (v) { + return +v.x; + }); + }))).values(); + + return xs = $$.isTimeSeries() ? xs.map(function (x) { + return new Date(+x); + }) : xs.map(function (x) { + return +x; + }), xs.sort(function (a, b) { + return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; + }); + }, + addHiddenTargetIds: function addHiddenTargetIds(targetIds) { + this.hiddenTargetIds = this.hiddenTargetIds.concat(targetIds); + }, + removeHiddenTargetIds: function removeHiddenTargetIds(targetIds) { + this.hiddenTargetIds = this.hiddenTargetIds.filter(function (id) { + return targetIds.indexOf(id) < 0; + }); + }, + addHiddenLegendIds: function addHiddenLegendIds(targetIds) { + this.hiddenLegendIds = this.hiddenLegendIds.concat(targetIds); + }, + removeHiddenLegendIds: function removeHiddenLegendIds(targetIds) { + this.hiddenLegendIds = this.hiddenLegendIds.filter(function (id) { + return targetIds.indexOf(id) < 0; + }); + }, + getValuesAsIdKeyed: function getValuesAsIdKeyed(targets) { + var ys = {}; + + return targets.forEach(function (t) { + ys[t.id] = [], t.values.forEach(function (v) { + ys[t.id].push(v.value); + }); + }), ys; + }, + checkValueInTargets: function checkValueInTargets(targets, checker) { + var ids = Object.keys(targets), + i = void 0, + j = void 0, + values = void 0; + + + for (i = 0; i < ids.length; i++) for (values = targets[ids[i]].values, j = 0; j < values.length; j++) if (checker(values[j].value)) return !0; + return !1; + }, + hasNegativeValueInTargets: function hasNegativeValueInTargets(targets) { + return this.checkValueInTargets(targets, function (v) { + return v < 0; + }); + }, + hasPositiveValueInTargets: function hasPositiveValueInTargets(targets) { + return this.checkValueInTargets(targets, function (v) { + return v > 0; + }); + }, + isOrderDesc: function isOrderDesc() { + var config = this.config; + + return typeof config.data_order === "string" && config.data_order.toLowerCase() === "desc"; + }, + isOrderAsc: function isOrderAsc() { + var config = this.config; + + return typeof config.data_order === "string" && config.data_order.toLowerCase() === "asc"; + }, + orderTargets: function orderTargets(targets) { + var $$ = this, + config = $$.config, + orderAsc = $$.isOrderAsc(), + orderDesc = $$.isOrderDesc(); + // TODO: accept name array for order + return orderAsc || orderDesc ? targets.sort(function (t1, t2) { + var reducer = function (p, c) { + return p + Math.abs(c.value); + }, + t1Sum = t1.values.reduce(reducer, 0), + t2Sum = t2.values.reduce(reducer, 0); + + + return orderAsc ? t2Sum - t1Sum : t1Sum - t2Sum; + }) : (0, _util.isFunction)(config.data_order) && targets.sort(config.data_order), targets; + }, + filterByX: function filterByX(targets, x) { + return (0, _d.merge)(targets.map(function (t) { + return t.values; + })).filter(function (v) { + return v.x - x === 0; + }); + }, + filterRemoveNull: function filterRemoveNull(data) { + return data.filter(function (d) { + return (0, _util.isValue)(d.value); + }); + }, + filterByXDomain: function filterByXDomain(targets, xDomain) { + return targets.map(function (t) { + return { + id: t.id, + id_org: t.id_org, + values: t.values.filter(function (v) { + return xDomain[0] <= v.x && v.x <= xDomain[1]; + }) + }; + }); + }, + hasDataLabel: function hasDataLabel() { + var config = this.config; + + if (typeof config.data_labels === "boolean" && config.data_labels) return !0; + return (0, _typeof3.default)(config.data_labels) === "object" && (0, _util.notEmpty)(config.data_labels); + }, + getDataLabelLength: function getDataLabelLength(min, max, key) { + var $$ = this, + lengths = [0, 0]; + + return $$.selectChart.select("svg").selectAll(".dummy").data([min, max]).enter().append("text").text(function (d) { + return $$.dataLabelFormat(d.id)(d); + }).each(function (d, i) { + lengths[i] = this.getBoundingClientRect()[key] * 1.3; + }).remove(), lengths; + }, + isNoneArc: function isNoneArc(d) { + return this.hasTarget(this.data.targets, d.id); + }, + isArc: function isArc(d) { + return "data" in d && this.hasTarget(this.data.targets, d.data.id); + }, + findSameXOfValues: function findSameXOfValues(values, index) { + var targetX = values[index].x, + sames = [], + i = void 0; + + + for (i = index - 1; i >= 0 && !(targetX !== values[i].x); i--) sames.push(values[i]); + for (i = index; i < values.length && !(targetX !== values[i].x); i++) sames.push(values[i]); + return sames; + }, + findClosestFromTargets: function findClosestFromTargets(targets, pos) { + var $$ = this, + candidates = targets.map(function (target) { + return $$.findClosest(target.values, pos); + }); + // map to array of closest points of each target + + // decide closest point and return + return $$.findClosest(candidates, pos); + }, + findClosest: function findClosest(values, pos) { + var $$ = this, + minDist = $$.config.point_sensitivity, + closest = void 0; + + // find mouseovering bar + + + return values.filter(function (v) { + return v && $$.isBarType(v.id); + }).forEach(function (v) { + var shape = $$.main.select().node("." + _classes2.default.bars + $$.getTargetSelectorSuffix(v.id) + "." + _classes2.default.bar + "-" + v.index); + + !closest && $$.isWithinBar(shape) && (closest = v); + }), values.filter(function (v) { + return v && !$$.isBarType(v.id); + }).forEach(function (v) { + var d = $$.dist(v, pos); + + d < minDist && (minDist = d, closest = v); + }), closest; + }, + dist: function dist(data, pos) { + var $$ = this, + config = $$.config, + xIndex = config.axis_rotated ? 1 : 0, + yIndex = config.axis_rotated ? 0 : 1, + y = $$.circleY(data, data.index), + x = $$.x(data.x); + + + return Math.sqrt(Math.pow(x - pos[xIndex], 2) + Math.pow(y - pos[yIndex], 2)); + }, + convertValuesToStep: function convertValuesToStep(values) { + var converted = [].concat(values), + i = void 0; + + + if (!this.isCategorized()) return values; + + for (i = values.length + 1; i > 0; i--) converted[i] = converted[i - 1]; + + return converted[0] = { + x: converted[0].x - 1, + value: converted[0].value, + id: converted[0].id + }, converted[values.length + 1] = { + x: converted[values.length].x + 1, + value: converted[values.length].value, + id: converted[values.length].id + }, converted; + }, + updateDataAttributes: function updateDataAttributes(name, attrs) { + var $$ = this, + config = $$.config, + current = config["data_" + name]; + return typeof attrs === "undefined" ? current : (Object.keys(attrs).forEach(function (id) { + current[id] = attrs[id]; + }), $$.redraw({ withLegend: !0 }), current); + } +}); + +/***/ }), +/* 30 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _classes = __webpack_require__(3), + _classes2 = _interopRequireDefault(_classes), + _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +(0, _util.extend)(_ChartInternal2.default.prototype, { + load: function load(rawTargets, args) { + var $$ = this, + targets = rawTargets; + targets && (args.filter && (targets = targets.filter(args.filter)), (args.type || args.types) && targets.forEach(function (t) { + var type = args.types && args.types[t.id] ? args.types[t.id] : args.type; + + $$.setTargetType(t.id, type); + }), $$.data.targets.forEach(function (d) { + for (var i = 0; i < targets.length; i++) if (d.id === targets[i].id) { + d.values = targets[i].values, targets.splice(i, 1); + + break; + } + }), $$.data.targets = $$.data.targets.concat(targets)), $$.updateTargets($$.data.targets), $$.redraw({ withUpdateOrgXDomain: !0, withUpdateXDomain: !0, withLegend: !0 }), args.done && args.done(); + }, + loadFromArgs: function loadFromArgs(args) { + var $$ = this; + + args.data ? $$.load($$.convertDataToTargets(args.data), args) : args.url ? $$.convertUrlToData(args.url, args.mimeType, args.headers, args.keys, function (data) { + $$.load($$.convertDataToTargets(data), args); + }) : args.json ? $$.load($$.convertDataToTargets($$.convertJsonToData(args.json, args.keys)), args) : args.rows ? $$.load($$.convertDataToTargets($$.convertRowsToData(args.rows)), args) : args.columns ? $$.load($$.convertDataToTargets($$.convertColumnsToData(args.columns)), args) : $$.load(null, args); + }, + unload: function unload(rawTargetIds, customDoneCb) { + var $$ = this, + done = customDoneCb, + targetIds = rawTargetIds; + + + // If no target, call done and return + return done || (done = function () {}), targetIds = targetIds.filter(function (id) { + return $$.hasTarget($$.data.targets, id); + }), targetIds && targetIds.length !== 0 ? void ($$.svg.selectAll(targetIds.map(function (id) { + return $$.selectorTarget(id); + })).transition().style("opacity", "0").remove().call($$.endall, done), targetIds.forEach(function (id) { + $$.withoutFadeIn[id] = !1, $$.legend && $$.legend.selectAll("." + _classes2.default.legendItem + $$.getTargetSelectorSuffix(id)).remove(), $$.data.targets = $$.data.targets.filter(function (t) { + return t.id !== id; + }); + })) : void done(); + } +}); /** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ + +/***/ }), +/* 31 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _d = __webpack_require__(2), + _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _classes = __webpack_require__(3), + _classes2 = _interopRequireDefault(_classes), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +(0, _util.extend)(_ChartInternal2.default.prototype, { + /** + * Called when dragging. + * Data points can be selected. + * @private + * @param {Object} mouse Object + */ + drag: function drag(mouse) { + var $$ = this, + config = $$.config, + main = $$.main; + // do nothing if not selectable + // skip when single selection because drag is used for multiple selection + + if (!$$.hasArcType() && config.data_selection_enabled && (!config.zoom_enabled || $$.zoom.altDomain) && config.data_selection_multiple) { + var sx = $$.dragStart[0], + sy = $$.dragStart[1], + mx = mouse[0], + my = mouse[1], + minX = Math.min(sx, mx), + maxX = Math.max(sx, mx), + minY = config.data_selection_grouped ? $$.margin.top : Math.min(sy, my), + maxY = config.data_selection_grouped ? $$.height : Math.max(sy, my); + main.select("." + _classes2.default.dragarea).attr("x", minX).attr("y", minY).attr("width", maxX - minX).attr("height", maxY - minY), main.selectAll("." + _classes2.default.shapes).selectAll("." + _classes2.default.shape).filter(function (d) { + return config.data_selection_isselectable(d); + }).each(function (d, i) { + var shape = (0, _d.select)(this), + isSelected = shape.classed(_classes2.default.SELECTED), + isIncluded = shape.classed(_classes2.default.INCLUDED), + _x = void 0, + _y = void 0, + _w = void 0, + _h = void 0, + toggle = void 0, + isWithin = !1, + box = void 0; + + + if (shape.classed(_classes2.default.circle)) _x = shape.attr("cx") * 1, _y = shape.attr("cy") * 1, toggle = $$.togglePoint, isWithin = minX < _x && _x < maxX && minY < _y && _y < maxY;else if (shape.classed(_classes2.default.bar)) box = (0, _util.getPathBox)(this), _x = box.x, _y = box.y, _w = box.width, _h = box.height, toggle = $$.togglePath, isWithin = !(maxX < _x || _x + _w < minX) && !(maxY < _y || _y + _h < minY);else + // line/area selection not supported yet + return; + isWithin ^ isIncluded && (shape.classed(_classes2.default.INCLUDED, !isIncluded), shape.classed(_classes2.default.SELECTED, !isSelected), toggle.call($$, !isSelected, shape, d, i)); + }); + } // skip if zoomable because of conflict drag dehavior + }, + + + /** + * Called when the drag starts. + * Adds and Shows the drag area. + * @private + * @param {Object} mouse Object + */ + dragstart: function dragstart(mouse) { + var $$ = this, + config = $$.config; + // do nothing if not selectable + $$.hasArcType() || !config.data_selection_enabled || ($$.dragStart = mouse, $$.main.select("." + _classes2.default.chart).append("rect").attr("class", _classes2.default.dragarea).style("opacity", "0.1"), $$.dragging = !0); + }, + + + /** + * Called when the drag finishes. + * Removes the drag area. + * @private + */ + dragend: function dragend() { + var $$ = this, + config = $$.config; + // do nothing if not selectable + $$.hasArcType() || !config.data_selection_enabled || ($$.main.select("." + _classes2.default.dragarea).transition().duration(100).style("opacity", "0").remove(), $$.main.selectAll("." + _classes2.default.shape).classed(_classes2.default.INCLUDED, !1), $$.dragging = !1); + } +}); // interpolate + +/***/ }), +/* 32 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _d = __webpack_require__(2), + _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _classes = __webpack_require__(3), + _classes2 = _interopRequireDefault(_classes), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +(0, _util.extend)(_ChartInternal2.default.prototype, { + /** + * Initialize the area that detects the event. + * Add a container for the zone that detects the event. + * @private + */ + initEventRect: function initEventRect() { + var $$ = this; + + $$.main.select("." + _classes2.default.chart).append("g").attr("class", _classes2.default.eventRects).style("fill-opacity", "0"); + }, + + + /** + * Redraws the area that detects the event. + * @private + */ + redrawEventRect: function redrawEventRect() { + var $$ = this, + config = $$.config, + isMultipleX = $$.isMultipleX(), + eventRects = $$.main.select("." + _classes2.default.eventRects).style("cursor", config.zoom_enabled ? config.axis_rotated ? "ns-resize" : "ew-resize" : null).classed(_classes2.default.eventRectsMultiple, isMultipleX).classed(_classes2.default.eventRectsSingle, !isMultipleX), + eventRectUpdate = void 0, + maxDataCountTarget = void 0; + + // rects for mouseover + + + // clear old rects + + + if (eventRects.selectAll("." + _classes2.default.eventRect).remove(), $$.eventRect = eventRects.selectAll("." + _classes2.default.eventRect), isMultipleX ? (eventRectUpdate = $$.eventRect.data([0]), eventRectUpdate = $$.generateEventRectsForMultipleXs(eventRectUpdate.enter() // enter : only one rect will be added + ).merge(eventRectUpdate), $$.updateEventRect(eventRectUpdate)) : (maxDataCountTarget = $$.getMaxDataCountTarget($$.data.targets), eventRects.datum(maxDataCountTarget ? maxDataCountTarget.values : []), $$.eventRect = eventRects.selectAll("." + _classes2.default.eventRect), eventRectUpdate = $$.eventRect.data(function (d) { + return d; + }), eventRectUpdate.exit().remove(), eventRectUpdate = $$.generateEventRectsForSingleX(eventRectUpdate.enter()).merge(eventRectUpdate), $$.updateEventRect(eventRectUpdate)), $$.inputType === "touch" && !$$.hasArcType()) { + var getEventRect = function () { + var touch = _d.event.changedTouches[0]; + + return (0, _d.select)(document.elementFromPoint(touch.clientX, touch.clientY)); + }, + getIndex = function (eventRect) { + var index = eventRect && eventRect.attr("class") && eventRect.attr("class").replace(new RegExp("(" + _classes2.default.eventRect + "-?|s)", "g"), "") * 1; + + return (isNaN(index) || index === null) && (index = -1), index; + }, + startClientY = void 0, + selectRect = function (context) { + var eventType = _d.event.type, + touch = _d.event.changedTouches[0], + axisRotated = $$.config.axis_rotated, + currentClientY = touch.clientY; + + // If movement is less than 5px, scrolling outside the chart is prevented from working. + + + if (eventType === "touchstart") startClientY = currentClientY, axisRotated && _d.event.preventDefault();else if (eventType === "touchmove" && startClientY) { + var moveY = Math.abs(startClientY - currentClientY); + + !axisRotated && moveY < 5 && _d.event.preventDefault(); + } + + if (isMultipleX) $$.selectRectForMultipleXs(context);else { + var eventRect = getEventRect(), + index = getIndex(eventRect); + index === -1 ? $$.unselectRect() : $$.selectRectForSingle(context, eventRect, index); + } + }, + touchHandler = function () { + var eventRect = getEventRect(); + + if (eventRect.classed(_classes2.default.eventRect)) { + if ($$.dragging || $$.flowing || $$.hasArcType()) return; + + selectRect(this); + } else $$.unselectRect(); + }; + + $$.svg.on("touchstart", touchHandler).on("touchmove", touchHandler).on("touchend", function () { + var eventRect = getEventRect(); + + if (eventRect.classed(_classes2.default.eventRect)) { + if ($$.hasArcType() || !$$.toggleShape || $$.cancelClick) return void ($$.cancelClick && ($$.cancelClick = !1)); + + // Call event handler + var index = getIndex(eventRect); + + isMultipleX || index === -1 || $$.main.selectAll("." + _classes2.default.shape + "-" + index).each(function (d2) { + return config.data_onout.call($$.api, d2); + }); + } + }); + } + }, + + + /** + * Updates the location and size of the eventRect. + * @private + * @param {Object} D3.select(CLASS.eventRects) object. + */ + updateEventRect: function updateEventRect(eventRectUpdate) { + var $$ = this, + config = $$.config, + eventRectData = eventRectUpdate || $$.eventRect.data(), + x = void 0, + y = void 0, + w = void 0, + h = void 0; // set update selection if null + + + if ($$.isMultipleX()) x = 0, y = 0, w = $$.width, h = $$.height;else { + var rectW = void 0, + rectX = void 0; + + + if (($$.isCustomX() || $$.isTimeSeries()) && !$$.isCategorized()) $$.updateXs(), rectW = function (d) { + var prevX = $$.getPrevX(d.index), + nextX = $$.getNextX(d.index); + + + // if there this is a single data point make the eventRect full width (or height) + return prevX === null && nextX === null ? config.axis_rotated ? $$.height : $$.width : (prevX === null && (prevX = $$.x.domain()[0]), nextX === null && (nextX = $$.x.domain()[1]), Math.max(0, ($$.x(nextX) - $$.x(prevX)) / 2)); + }, rectX = function (d) { + var nextX = $$.getNextX(d.index), + thisX = $$.data.xs[d.id][d.index], + prevX = $$.getPrevX(d.index); + + + // if there this is a single data point position the eventRect at 0 + return prevX === null && nextX === null ? 0 : (prevX === null && (prevX = $$.x.domain()[0]), ($$.x(thisX) + $$.x(prevX)) / 2); + };else { + var edgs = $$.getEdgeX($$.data.targets); + + rectW = ($$.x(edgs[1]) - $$.x(edgs[0])) / $$.getMaxDataCount(), rectX = function (d) { + return $$.x(d.x) - rectW / 2; + }; + } + + x = config.axis_rotated ? 0 : rectX, y = config.axis_rotated ? rectX : 0, w = config.axis_rotated ? $$.width : rectW, h = config.axis_rotated ? rectW : $$.height; + } + + eventRectData.attr("class", $$.classEvent.bind($$)).attr("x", x).attr("y", y).attr("width", w).attr("height", h); + }, + selectRectForSingle: function selectRectForSingle(context, eventRect, index) { + var $$ = this, + config = $$.config, + selectedData = $$.filterTargetsToShow($$.data.targets).map(function (t) { + return $$.addName($$.getValueOnIndex(t.values, index)); + }); + // Show tooltip + config.tooltip_grouped && ($$.showTooltip(selectedData, context), $$.showXGridFocus(selectedData), !config.data_selection_enabled || config.data_selection_grouped) || $$.main.selectAll("." + _classes2.default.shape + "-" + index).each(function () { + (0, _d.select)(this).classed(_classes2.default.EXPANDED, !0), config.data_selection_enabled && eventRect.style("cursor", config.data_selection_grouped ? "pointer" : null), config.tooltip_grouped || ($$.hideXGridFocus(), $$.hideTooltip(), !config.data_selection_grouped && ($$.unexpandCircles(index), $$.unexpandBars(index))); + }).filter(function (d) { + return $$.isWithinShape(this, d); + }).each(function (d) { + config.data_selection_enabled && (config.data_selection_grouped || config.data_selection_isselectable(d)) && eventRect.style("cursor", "pointer"), config.tooltip_grouped || ($$.showTooltip([d], this), $$.showXGridFocus([d]), config.point_focus_expand_enabled && $$.expandCircles(index, d.id, !0), $$.expandBars(index, d.id, !0)); + }); + }, + selectRectForMultipleXs: function selectRectForMultipleXs(context) { + var $$ = this, + config = $$.config, + targetsToShow = $$.filterTargetsToShow($$.data.targets); + + // show tooltip when cursor is close to some point + if (!$$.dragging && !$$.hasArcType(targetsToShow)) { + + var mouse = (0, _d.mouse)($$.main.select("." + _classes2.default.eventRects + " ." + _classes2.default.eventRect).node()), + closest = $$.findClosestFromTargets(targetsToShow, mouse), + sameXData = void 0; + + + if ($$.mouseover && (!closest || closest.id !== $$.mouseover.id) && (config.data_onout.call($$.api, $$.mouseover), $$.mouseover = undefined), !closest) return void $$.unselectRect(); + + sameXData = $$.isScatterType(closest) || !config.tooltip_grouped ? [closest] : $$.filterByX(targetsToShow, closest.x); + var selectedData = sameXData.map(function (d) { + return $$.addName(d); + }); + + $$.showTooltip(selectedData, context), config.point_focus_expand_enabled && $$.expandCircles(closest.index, closest.id, !0), $$.expandBars(closest.index, closest.id, !0), $$.showXGridFocus(selectedData), ($$.isBarType(closest.id) || $$.dist(closest, mouse) < config.point_sensitivity) && ($$.svg.select("" + _classes2.default.eventRect).style("cursor", "pointer"), !$$.mouseover && (config.data_onover.call($$.api, closest), $$.mouseover = closest)); + } // do nothing when dragging + }, + + + /** + * Unselect EventRect. + * @private + */ + unselectRect: function unselectRect() { + var $$ = this; + + $$.svg.select("." + _classes2.default.eventRect).style("cursor", null), $$.hideXGridFocus(), $$.hideTooltip(), $$.unexpandCircles(), $$.unexpandBars(); + }, + + + /** + * Create eventRect for each data on the x-axis. + * Register touch and drag events. + * @private + * @param {Object} D3.select(CLASS.eventRects) object. + * @returns {Object} D3.select(CLASS.eventRects) object. + */ + generateEventRectsForSingleX: function generateEventRectsForSingleX(eventRectEnter) { + var $$ = this, + config = $$.config, + isMouse = $$.inputType === "mouse"; + + + return eventRectEnter.append("rect").attr("class", $$.classEvent.bind($$)).style("cursor", config.data_selection_enabled && config.data_selection_grouped ? "pointer" : null).on(isMouse ? "mouseover" : undefined, function (d) { + if (!($$.dragging || $$.flowing || $$.hasArcType())) { + // do nothing while dragging/flowing + + var index = d.index; + + // Expand shapes for selection + config.point_focus_expand_enabled && $$.expandCircles(index, null, !0), $$.expandBars(index, null, !0), index !== -1 && $$.main.selectAll("." + _classes2.default.shape + "-" + index).each(function (d2) { + return config.data_onover.call($$.api, d2); + }); + } + }).on(isMouse ? "mousemove" : undefined, function (d) { + if (!($$.dragging || $$.flowing || $$.hasArcType())) { + // do nothing while dragging/flowing + + var index = d.index, + eventRect = $$.svg.select("." + _classes2.default.eventRect + "-" + index); + $$.isStepType(d) && $$.config.line_step_type === "step-after" && (0, _d.mouse)(this)[0] < $$.x($$.getXValue(d.id, index)) && (index -= 1), index === -1 ? $$.unselectRect() : $$.selectRectForSingle(this, eventRect, index); + } + }).on(isMouse ? "mouseout" : undefined, function (d) { + if ($$.config && !$$.hasArcType()) { + // chart is destroyed + + var index = d.index; + + $$.unselectRect(), $$.main.selectAll("." + _classes2.default.shape + "-" + index).each(function (d2) { + return config.data_onout.call($$.api, d2); + }); + } + }).on(isMouse ? "click" : undefined, function (d) { + if ($$.hasArcType() || !$$.toggleShape || $$.cancelClick) return void ($$.cancelClick && ($$.cancelClick = !1)); + + var index = d.index; + + $$.main.selectAll("." + _classes2.default.shape + "-" + index).each(function (d2) { + (config.data_selection_grouped || $$.isWithinShape(this, d2)) && ($$.toggleShape(this, d2, index), $$.config.data_onclick.call($$.api, d2, this)); + }); + }).call(config.data_selection_draggable && $$.drag ? (0, _d.drag)().origin(Object).on("drag", function () { + $$.drag((0, _d.mouse)(this)); + }).on("dragstart", function () { + $$.dragstart((0, _d.mouse)(this)); + }).on("dragend", function () { + $$.dragend(); + }) : function () {}); + }, + + + /** + * Create an eventRect, + * Register touch and drag events. + * @private + * @param {Object} D3.select(CLASS.eventRects) object. + * @returns {Object} D3.select(CLASS.eventRects) object. + */ + generateEventRectsForMultipleXs: function generateEventRectsForMultipleXs(eventRectEnter) { + var $$ = this, + config = $$.config, + isMouse = $$.inputType === "mouse"; + + + return eventRectEnter.append("rect").attr("x", 0).attr("y", 0).attr("width", $$.width).attr("height", $$.height).attr("class", _classes2.default.eventRect).on(isMouse ? "mouseover" : undefined, function () { + $$.selectRectForMultipleXs(this); + }).on(isMouse ? "mouseout" : undefined, function () { + !$$.config || $$.hasArcType() || $$.unselectRect(); // chart is destroyed + }).on(isMouse ? "mousemove" : undefined, function () { + $$.selectRectForMultipleXs(this); + }).on(isMouse ? "click" : undefined, function () { + var _this = this, + targetsToShow = $$.filterTargetsToShow($$.data.targets); + + // select if selection enabled + if (!$$.hasArcType(targetsToShow)) { + + var mouse = (0, _d.mouse)(this), + closest = $$.findClosestFromTargets(targetsToShow, mouse); + !closest || ($$.isBarType(closest.id) || $$.dist(closest, mouse) < config.point_sensitivity) && $$.main.selectAll("." + _classes2.default.shapes + $$.getTargetSelectorSuffix(closest.id)).selectAll("." + _classes2.default.shape + "-" + closest.index).each(function () { + (config.data_selection_grouped || $$.isWithinShape(_this, closest)) && ($$.toggleShape(_this, closest, closest.index), $$.config.data_onclick.call($$.api, closest, _this)); + }); + } + }).call(config.data_selection_draggable && $$.drag ? (0, _d.drag)().origin(Object).on("drag", function () { + $$.drag((0, _d.mouse)(this)); + }).on("dragstart", function () { + $$.dragstart((0, _d.mouse)(this)); + }).on("dragend", function () { + $$.dragend(); + }) : function () {}); + }, + + + /** + * Dispatch an event. + * @private + * @param {String} type event type + * @param {Number} index Index of eventRect + * @param {Object} mouse Object + */ + dispatchEvent: function dispatchEvent(type, index, mouse) { + var $$ = this, + selector = $$.isMultipleX() ? "." + _classes2.default.eventRect : _classes2.default.eventRect + "-" + index, + eventRect = $$.main.select(selector).node(), + box = eventRect.getBoundingClientRect(), + x = box.left + (mouse ? mouse[0] : 0), + y = box.top + (mouse ? mouse[1] : 0), + event = document.createEvent("MouseEvents").initMouseEvent(type, !0, !0, window, 0, x, y, x, y, !1, !1, !1, !1, 0, null); + eventRect.dispatchEvent(event); + } +}); + +/***/ }), +/* 33 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _d = __webpack_require__(2), + _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _classes = __webpack_require__(3), + _classes2 = _interopRequireDefault(_classes), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +(0, _util.extend)(_ChartInternal2.default.prototype, { + /** + * Initialize the brush. + * @private + */ + initBrush: function initBrush() { + var $$ = this; + + // set the brush + $$.brush = $$.config.axis_rotated ? (0, _d.brushY)() : (0, _d.brushX)(); + + + // set "brush" event + var brushHandler = function () { + $$.redrawForBrush(); + }; + + $$.brush.on("start", function () { + $$.inputType === "touch" && $$.hideTooltip(), brushHandler(); + }).on("brush", brushHandler), $$.brush.update = function () { + var extent = this.extent()(); + + return extent[1].filter(function (v) { + return isNaN(v); + }).length === 0 && $$.context && $$.context.select("." + _classes2.default.brush).call(this), this; + }, $$.brush.scale = function (scale, height) { + var overlay = $$.svg.select(".bb-brush .overlay"), + extent = [[0, 0]]; + scale.range ? extent.push([scale.range()[1], (height || !overlay.empty()) && ~~overlay.attr("height") || 60]) : scale.constructor === Array && extent.push(scale), $$.config.axis_rotated && extent.reverse(), this.extent($$.config.axis_x_extent || extent), this.update(); + }, $$.brush.getSelection = function () { + return $$.context ? $$.context.select("." + _classes2.default.brush) : (0, _d.select)([]); + }; + }, + + + /** + * Initialize the subchart. + * @private + */ + initSubchart: function initSubchart() { + var $$ = this, + config = $$.config, + visibility = config.subchart_show ? "visible" : "hidden"; + $$.context = $$.svg.append("g").attr("transform", $$.getTranslate("context")); + + + var context = $$.context; + + context.style("visibility", visibility), context.append("g").attr("clip-path", $$.clipPathForSubchart).attr("class", _classes2.default.chart), context.select("." + _classes2.default.chart).append("g").attr("class", _classes2.default.chartBars), context.select("." + _classes2.default.chart).append("g").attr("class", _classes2.default.chartLines), context.append("g").attr("clip-path", $$.clipPath).attr("class", _classes2.default.brush).call($$.brush), $$.axes.subx = context.append("g").attr("class", _classes2.default.axisX).attr("transform", $$.getTranslate("subx")).attr("clip-path", config.axis_rotated ? "" : $$.clipPathForXAxis).style("visibility", config.subchart_axis_x_show ? visibility : "hidden"); + }, + + + /** + * Update sub chart + * @private + * @param {Object} $$.data.targets + */ + updateTargetsForSubchart: function updateTargetsForSubchart(targets) { + var $$ = this, + context = $$.context, + config = $$.config, + classChartBar = $$.classChartBar.bind($$), + classBars = $$.classBars.bind($$), + classChartLine = $$.classChartLine.bind($$), + classLines = $$.classLines.bind($$), + classAreas = $$.classAreas.bind($$); + + + if (config.subchart_show) { + // -- Bar --// + var contextBarUpdate = context.select("." + _classes2.default.chartBars).selectAll("." + _classes2.default.chartBar).data(targets).attr("class", classChartBar), + contextBarEnter = contextBarUpdate.enter().append("g").style("opacity", "0").attr("class", classChartBar).merge(contextBarUpdate); + + + // Bars for each data + contextBarEnter.append("g").attr("class", classBars); + + + // -- Line --// + var contextLineUpdate = context.select("." + _classes2.default.chartLines).selectAll("." + _classes2.default.chartLine).data(targets).attr("class", classChartLine), + contextLineEnter = contextLineUpdate.enter().append("g").style("opacity", "0").attr("class", classChartLine).merge(contextLineUpdate); + + + // Lines for each data + contextLineEnter.append("g").attr("class", classLines), contextLineEnter.append("g").attr("class", classAreas), context.selectAll("." + _classes2.default.brush + " rect").attr(config.axis_rotated ? "width" : "height", config.axis_rotated ? $$.width2 : $$.height2); + } + }, + + + /** + * Update the bar of the sub chart + * @private + * @param {Object} durationForExit + */ + updateBarForSubchart: function updateBarForSubchart(durationForExit) { + var $$ = this; + + $$.contextBar = $$.context.selectAll("." + _classes2.default.bars).selectAll("." + _classes2.default.bar).data($$.barData.bind($$)), $$.contextBar.exit().transition().duration(durationForExit).style("opacity", "0").remove(), $$.contextBar = $$.contextBar.enter().append("path").attr("class", $$.classBar.bind($$)).style("stroke", "none").style("fill", $$.color).merge($$.contextBar).style("opacity", $$.initialOpacity.bind($$)); + }, + + + /** + * Redraw the bar of the subchart + * @private + * @param {String} path in subchart bar + * @param {Boolean} whether or not to transition. + * @param {Number} transition duration + */ + redrawBarForSubchart: function redrawBarForSubchart(drawBarOnSub, withTransition, duration) { + var contextBar = void 0; + + contextBar = withTransition ? this.contextBar.transition(Math.random().toString()).duration(duration) : this.contextBar, contextBar.attr("d", drawBarOnSub).style("opacity", "1"); + }, + + + /** + * Update the line of the sub chart + * @private + * @param {Number} Fade-out transition duration + */ + updateLineForSubchart: function updateLineForSubchart(durationForExit) { + var $$ = this; + + $$.contextLine = $$.context.selectAll("." + _classes2.default.lines).selectAll("." + _classes2.default.line).data($$.lineData.bind($$)), $$.contextLine.exit().transition().duration(durationForExit).style("opacity", "0").remove(), $$.contextLine = $$.contextLine.enter().append("path").attr("class", $$.classLine.bind($$)).style("stroke", $$.color).merge($$.contextLine).style("opacity", $$.initialOpacity.bind($$)); + }, + + + /** + * Redraw the line of the subchart + * @private + * @param {String} path in subchart line + * @param {Boolean} whether or not to transition + * @param {Number} transition duration + */ + redrawLineForSubchart: function redrawLineForSubchart(drawLineOnSub, withTransition, duration) { + var contextLine = void 0; + + contextLine = withTransition ? this.contextLine.transition(Math.random().toString()).duration(duration) : this.contextLine, contextLine.attr("d", drawLineOnSub).style("opacity", "1"); + }, + + + /** + * Update the area of the sub chart + * @private + * @param {Number} Fade-out transition duration + */ + updateAreaForSubchart: function updateAreaForSubchart(durationForExit) { + var $$ = this; + + $$.contextArea = $$.context.selectAll("." + _classes2.default.areas).selectAll("." + _classes2.default.area).data($$.lineData.bind($$)), $$.contextArea.exit().transition().duration(durationForExit).style("opacity", "0").remove(), $$.contextArea = $$.contextArea.enter().append("path").attr("class", $$.classArea.bind($$)).style("fill", $$.color).style("opacity", function () { + return $$.orgAreaOpacity = (0, _d.select)(this).style("opacity"), "0"; + }).merge($$.contextArea).style("opacity", "0"); + }, + + /** + * Redraw the area of the subchart + * @private + * @param {String} path in subchart line + * @param {Boolean} whether or not to transition + * @param {Number} transition duration + */ + redrawAreaForSubchart: function redrawAreaForSubchart(drawAreaOnSub, withTransition, duration) { + var contextArea = void 0; + + contextArea = withTransition ? this.contextArea.transition(Math.random().toString()).duration(duration) : this.contextArea, contextArea.attr("d", drawAreaOnSub).style("fill", this.color).style("opacity", this.orgAreaOpacity); + }, + + + /** + * Redraw subchart. + * @private + * @param {Boolean} whether or not to show subchart + * @param Do not use. + * @param {Number} transition duration + * @param Do not use. + * @param {Object} area Indices + * @param {Object} bar Indices + * @param {Object} line Indices + */ + redrawSubchart: function redrawSubchart(withSubchart, transitions, duration, durationForExit, areaIndices, barIndices, lineIndices) { + var $$ = this, + config = $$.config; + + + // subchart + if ($$.context.style("visibility", config.subchart_show ? "visible" : "hidden"), config.subchart_show && (_d.event && _d.event.type === "zoom" && $$.brush.update(), withSubchart)) { + $$.brushEmpty() || $$.brush.update(); + + + // setup drawer - MEMO: this must be called after axis updated + var drawAreaOnSub = $$.generateDrawArea(areaIndices, !0), + drawBarOnSub = $$.generateDrawBar(barIndices, !0), + drawLineOnSub = $$.generateDrawLine(lineIndices, !0); + $$.updateBarForSubchart(duration), $$.updateLineForSubchart(duration), $$.updateAreaForSubchart(duration), $$.redrawBarForSubchart(drawBarOnSub, duration, duration), $$.redrawLineForSubchart(drawLineOnSub, duration, duration), $$.redrawAreaForSubchart(drawAreaOnSub, duration, duration); + } + }, + + /** + * Redraw the brush. + * @private + */ + redrawForBrush: function redrawForBrush() { + var $$ = this, + x = $$.x; + $$.redraw({ + withTransition: !1, + withY: $$.config.zoom_rescale, + withSubchart: !1, + withUpdateXDomain: !0, + withDimension: !1 + }), $$.config.subchart_onbrush.call($$.api, x.orgDomain()); + }, + + + /** + * Transform context + * @private + * @param {Boolean} indicates transition is enabled + * @param {Object} The return value of the generateTransitions method of Axis. + */ + transformContext: function transformContext(withTransition, transitions) { + var $$ = this, + subXAxis = void 0; + transitions && transitions.axisSubX ? subXAxis = transitions.axisSubX : (subXAxis = $$.context.select("." + _classes2.default.axisX), withTransition && (subXAxis = subXAxis.transition())), $$.context.attr("transform", $$.getTranslate("context")), subXAxis.attr("transform", $$.getTranslate("subx")); + }, + + + /** + * Get default extent + * @private + * @returns {Array} default extent + */ + getDefaultExtent: function getDefaultExtent() { + var $$ = this, + config = $$.config, + extent = (0, _util.isFunction)(config.axis_x_extent) ? config.axis_x_extent($$.getXDomain($$.data.targets)) : config.axis_x_extent; + + + return $$.isTimeSeries() && (extent = [$$.parseDate(extent[0]), $$.parseDate(extent[1])]), extent; + } +}); + +/***/ }), +/* 34 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _d = __webpack_require__(2), + _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _classes = __webpack_require__(3), + _classes2 = _interopRequireDefault(_classes), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +(0, _util.extend)(_ChartInternal2.default.prototype, { + /** + * Initialize zoom. + * @private + */ + initZoom: function initZoom() { + var $$ = this, + config = $$.config, + startEvent = void 0; + $$.zoomScale = null, $$.zoom = (0, _d.zoom)().duration(0).on("start", function () { + startEvent = _d.event.sourceEvent, $$.zoom.altDomain = _d.event.sourceEvent.altKey ? $$.x.orgDomain() : null, config.zoom_onzoomstart.call($$.api, _d.event.sourceEvent); + }).on("zoom", function () { + $$.redrawForZoom.call($$); + }).on("end", function () { + var event = _d.event.sourceEvent; + + // if click, do nothing. otherwise, click interaction will be canceled. + event && startEvent.clientX === event.clientX && startEvent.clientY === event.clientY || ($$.redrawEventRect(), $$.updateZoom(), config.zoom_onzoomend.call($$.api, $$.x.orgDomain())); + }), $$.zoom.orgScaleExtent = function () { + var extent = config.zoom_extent ? config.zoom_extent : [1, 10]; + + return [extent[0], Math.max($$.getMaxDataCount() / extent[1], extent[1])]; + }, $$.zoom.updateScaleExtent = function () { + var ratio = (0, _util.diffDomain)($$.x.orgDomain()) / (0, _util.diffDomain)($$.getZoomDomain()), + extent = this.orgScaleExtent(); + + return this.scaleExtent([extent[0] * ratio, extent[1] * ratio]), this; + }, $$.zoom.updateTransformScale = function (transform) { + var newScale = transform.rescaleX($$.x); + + newScale.domain($$.trimXDomain(newScale.domain())), $$.zoomScale = newScale, $$.xAxis.scale($$.zoomScale), $$.main.select("." + _classes2.default.eventRects).node().__zoom = transform; + }; + }, + + + /** + * Get zoom domain + * @private + * @returns {Array} zoom domain + */ + getZoomDomain: function getZoomDomain() { + var $$ = this, + config = $$.config, + min = (0, _d.min)([$$.orgXDomain[0], config.zoom_x_min]), + max = (0, _d.max)([$$.orgXDomain[1], config.zoom_x_max]); + + + return [min, max]; + }, + + + /** + * Update zoom + * @private + */ + updateZoom: function updateZoom() { + var $$ = this, + z = $$.config.zoom_enabled ? $$.zoom : function () {}; + + + // bind zoom module + // $$.main.select(`.${CLASS.zoomRect}`) + // .call(z) + // .on("dblclick.zoom", null); + + $$.main.select("." + _classes2.default.eventRects).call(z).on("dblclick.zoom", null); + }, + + + /** + * Redraw the zoom. + * @private + */ + redrawForZoom: function redrawForZoom() { + var $$ = this, + config = $$.config; + + + if (config.zoom_enabled) { + var zoom = $$.zoom, + x = $$.x, + event = _d.event, + transform = event.transform; + return $$.zoom.updateTransformScale(transform), $$.filterTargetsToShow($$.data.targets).length === 0 ? void 0 : event.sourceEvent.type === "mousemove" && zoom.altDomain ? (x.domain(zoom.altDomain), void transform.scale($$.zoomScale).updateScaleExtent()) : void ($$.isCategorized() && x.orgDomain()[0] === $$.orgXDomain[0] && x.domain([$$.orgXDomain[0] - 1e-10, x.orgDomain()[1]]), $$.redraw({ + withTransition: !1, + withY: config.zoom_rescale, + withSubchart: !1, + withEventRect: !1, + withDimension: !1 + }), event.sourceEvent.type === "mousemove" && ($$.cancelClick = !0), config.zoom_onzoom.call($$.api, x.orgDomain())); + } + } +}); + +/***/ }), +/* 35 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _d = __webpack_require__(2), + _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _classes = __webpack_require__(3), + _classes2 = _interopRequireDefault(_classes), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +(0, _util.extend)(_ChartInternal2.default.prototype, { + initPie: function initPie() { + var $$ = this, + config = $$.config; + $$.pie = (0, _d.pie)().padAngle(config[config.data_type + "_padAngle"] || 0).value(function (d) { + return d.values.reduce(function (a, b) { + return a + b.value; + }, 0); + }), config.data_order || $$.pie.sort(null); + }, + updateRadius: function updateRadius() { + var $$ = this, + config = $$.config, + w = config.gauge_width || config.donut_width; + $$.radiusExpanded = Math.min($$.arcWidth, $$.arcHeight) / 2, $$.radius = $$.radiusExpanded * 0.95, $$.innerRadiusRatio = w ? ($$.radius - w) / $$.radius : 0.6, $$.innerRadius = $$.hasType("donut") || $$.hasType("gauge") ? $$.radius * $$.innerRadiusRatio : 0; + }, + updateArc: function updateArc() { + var $$ = this; + + $$.svgArc = $$.getSvgArc(), $$.svgArcExpanded = $$.getSvgArcExpanded(), $$.svgArcExpandedSub = $$.getSvgArcExpanded(0.98); + }, + updateAngle: function updateAngle(dValue) { + var $$ = this, + config = $$.config, + d = dValue, + found = !1, + index = 0, + gMin = void 0, + gMax = void 0, + gTic = void 0, + gValue = void 0; + return config ? ($$.pie($$.filterTargetsToShow($$.data.targets)).forEach(function (t) { + found || t.data.id !== d.data.id || (found = !0, d = t, d.index = index), index++; + }), isNaN(d.startAngle) && (d.startAngle = 0), isNaN(d.endAngle) && (d.endAngle = d.startAngle), $$.isGaugeType(d.data) && (gMin = config.gauge_min, gMax = config.gauge_max, gTic = Math.PI * (config.gauge_fullCircle ? 2 : 1) / (gMax - gMin), gValue = d.value < gMin ? 0 : d.value < gMax ? d.value - gMin : gMax - gMin, d.startAngle = config.gauge_startingAngle, d.endAngle = d.startAngle + gTic * gValue), found ? d : null) : null; + }, + getSvgArc: function getSvgArc() { + var $$ = this, + arc = (0, _d.arc)().outerRadius($$.radius).innerRadius($$.innerRadius), + newArc = function (d, withoutUpdate) { + if (withoutUpdate) return arc(d); // for interpolate + + var updated = $$.updateAngle(d); + + return updated ? arc(updated) : "M 0 0"; + }; + + // TODO: extends all function + + + return newArc.centroid = arc.centroid, newArc; + }, + getSvgArcExpanded: function getSvgArcExpanded(rate) { + var $$ = this, + arc = (0, _d.arc)().outerRadius($$.radiusExpanded * (rate || 1)).innerRadius($$.innerRadius); + + + return function (d) { + var updated = $$.updateAngle(d); + + return updated ? arc(updated) : "M 0 0"; + }; + }, + getArc: function getArc(d, withoutUpdate, force) { + return force || this.isArcType(d.data) ? this.svgArc(d, withoutUpdate) : "M 0 0"; + }, + transformForArcLabel: function transformForArcLabel(d) { + var $$ = this, + config = $$.config, + updated = $$.updateAngle(d), + c = void 0, + x = void 0, + y = void 0, + h = void 0, + ratio = void 0, + translate = ""; + + return updated && !$$.hasType("gauge") && (c = this.svgArc.centroid(updated), x = isNaN(c[0]) ? 0 : c[0], y = isNaN(c[1]) ? 0 : c[1], h = Math.sqrt(x * x + y * y), ratio = $$.hasType("donut") && config.donut_label_ratio ? (0, _util.isFunction)(config.donut_label_ratio) ? config.donut_label_ratio(d, $$.radius, h) : config.donut_label_ratio : $$.hasType("pie") && config.pie_label_ratio ? (0, _util.isFunction)(config.pie_label_ratio) ? config.pie_label_ratio(d, $$.radius, h) : config.pie_label_ratio : $$.radius && (h ? (36 / $$.radius > 0.375 ? 1.175 - 36 / $$.radius : 0.8) * $$.radius / h : 0), translate = "translate(" + x * ratio + "," + y * ratio + ")"), translate; + }, + getArcRatio: function getArcRatio(d) { + var $$ = this, + config = $$.config, + whole = Math.PI * ($$.hasType("gauge") && !config.gauge_fullCircle ? 1 : 2); + + + return d ? (d.endAngle - d.startAngle) / whole : null; + }, + convertToArcData: function convertToArcData(d) { + return this.addName({ + id: d.data.id, + value: d.value, + ratio: this.getArcRatio(d), + index: d.index + }); + }, + textForArcLabel: function textForArcLabel(d) { + var $$ = this; + + if (!$$.shouldShowArcLabel()) return ""; + var updated = $$.updateAngle(d), + value = updated ? updated.value : null, + ratio = $$.getArcRatio(updated), + id = d.data.id; + + + if (!$$.hasType("gauge") && !$$.meetsArcLabelThreshold(ratio)) return ""; + var format = $$.getArcLabelFormat(); + + return format ? format(value, ratio, id) : $$.defaultArcValueFormat(value, ratio); + }, + textForGaugeMinMax: function textForGaugeMinMax(value, isMax) { + var format = this.getGaugeLabelExtents(); + + return format ? format(value, isMax) : value; + }, + expandArc: function expandArc(targetIds) { + var $$ = this, + interval = void 0; + + + // MEMO: avoid to cancel transition + if ($$.transiting) return void (interval = window.setInterval(function () { + $$.transiting || (window.clearInterval(interval), $$.legend.selectAll(".bb-legend-item-focused").size() > 0 && $$.expandArc(targetIds)); + }, 10)); + + var newTargetIds = $$.mapToTargetIds(targetIds); + + $$.svg.selectAll($$.selectorTargets(newTargetIds, "." + _classes2.default.chartArc)).each(function (d) { + $$.shouldExpand(d.data.id) && (0, _d.select)(this).selectAll("path").transition().duration($$.expandDuration(d.data.id)).attr("d", $$.svgArcExpanded).transition().duration($$.expandDuration(d.data.id) * 2).attr("d", $$.svgArcExpandedSub).each(function (v) { + $$.isDonutType(v.data); + }); + }); + }, + unexpandArc: function unexpandArc(targetIds) { + var $$ = this; + + if (!$$.transiting) { + + var newTargetIds = $$.mapToTargetIds(targetIds); + + $$.svg.selectAll($$.selectorTargets(newTargetIds, "." + _classes2.default.chartArc)).selectAll("path").transition().duration(function (d) { + return $$.expandDuration(d.data.id); + }).attr("d", $$.svgArc), $$.svg.selectAll("" + _classes2.default.arc).style("opacity", "1"); + } + }, + expandDuration: function expandDuration(id) { + var $$ = this, + config = $$.config; + return $$.isDonutType(id) ? config.donut_expand_duration : $$.isGaugeType(id) ? config.gauge_expand_duration : $$.isPieType(id) ? config.pie_expand_duration : 50; + }, + shouldExpand: function shouldExpand(id) { + var $$ = this, + config = $$.config; + + + return $$.isDonutType(id) && config.donut_expand || $$.isGaugeType(id) && config.gauge_expand || $$.isPieType(id) && config.pie_expand; + }, + shouldShowArcLabel: function shouldShowArcLabel() { + var $$ = this, + config = $$.config, + shouldShow = !0; + + // when gauge, always true + return $$.hasType("donut") ? shouldShow = config.donut_label_show : $$.hasType("pie") && (shouldShow = config.pie_label_show), shouldShow; + }, + meetsArcLabelThreshold: function meetsArcLabelThreshold(ratio) { + var $$ = this, + config = $$.config, + threshold = $$.hasType("donut") ? config.donut_label_threshold : config.pie_label_threshold; + + + return ratio >= threshold; + }, + getArcLabelFormat: function getArcLabelFormat() { + var $$ = this, + config = $$.config, + format = config.pie_label_format; + + return $$.hasType("gauge") ? format = config.gauge_label_format : $$.hasType("donut") && (format = config.donut_label_format), format; + }, + getGaugeLabelExtents: function getGaugeLabelExtents() { + var config = this.config; + + return config.gauge_label_extents; + }, + getArcTitle: function getArcTitle() { + var $$ = this; + + return $$.hasType("donut") ? $$.config.donut_title : ""; + }, + updateTargetsForArc: function updateTargetsForArc(targets) { + var $$ = this, + main = $$.main, + classChartArc = $$.classChartArc.bind($$), + classArcs = $$.classArcs.bind($$), + classFocus = $$.classFocus.bind($$), + mainPieUpdate = main.select("." + _classes2.default.chartArcs).selectAll("." + _classes2.default.chartArc).data($$.pie(targets)).attr("class", function (d) { + return classChartArc(d) + classFocus(d.data); + }), + mainPieEnter = mainPieUpdate.enter().append("g").attr("class", classChartArc); + mainPieEnter.append("g").attr("class", classArcs).merge(mainPieUpdate), mainPieEnter.append("text").attr("dy", $$.hasType("gauge") ? "-.1em" : ".35em").style("opacity", "0").style("text-anchor", "middle").style("pointer-events", "none"); + }, + initArc: function initArc() { + var $$ = this; + + $$.arcs = $$.main.select("." + _classes2.default.chart).append("g").attr("class", _classes2.default.chartArcs).attr("transform", $$.getTranslate("arc")), $$.arcs.append("text").attr("class", _classes2.default.chartArcsTitle).style("text-anchor", "middle").text($$.getArcTitle()); + }, + redrawArc: function redrawArc(duration, durationForExit, withTransform) { + + function selectArc(_this, arcData, id) { + $$.expandArc(id), $$.api.focus(id), $$.toggleFocusLegend(id, !0), $$.showTooltip([arcData], _this); + } + + function unselectArc(arcData) { + var id = arcData && arcData.id || undefined; + + $$.unexpandArc(id), $$.api.revert(), $$.revertLegend(), $$.hideTooltip(); + } + + var $$ = this, + config = $$.config, + main = $$.main, + isTouch = $$.inputType === "touch", + isMouse = $$.inputType === "mouse", + mainArc = main.selectAll("." + _classes2.default.arcs).selectAll("." + _classes2.default.arc).data($$.arcData.bind($$)); + + + if (mainArc.exit().transition().duration(durationForExit).style("opacity", "0").remove(), mainArc = mainArc.enter().append("path").attr("class", $$.classArc.bind($$)).style("fill", function (d) { + return $$.color(d.data); + }).style("cursor", function (d) { + return config.interaction_enabled && (config.data_selection_isselectable(d) ? "pointer" : null); + }).style("opacity", "0").each(function (d) { + $$.isGaugeType(d.data) && (d.startAngle = config.gauge_startingAngle, d.endAngle = config.gauge_startingAngle), this._current = d; + }).merge(mainArc), mainArc.attr("transform", function (d) { + return !$$.isGaugeType(d.data) && withTransform ? "scale(0)" : ""; + }).style("opacity", function (d) { + return d === this._current ? "0" : "1"; + }).on(isMouse ? "mouseover" : undefined, config.interaction_enabled ? function (d) { + if (!$$.transiting) // skip while transiting + { + + var updated = $$.updateAngle(d), + arcData = updated ? $$.convertToArcData(updated) : null, + id = arcData && arcData.id || undefined; + selectArc(this, arcData, id), $$.config.data_onover(arcData, this); + } + } : null).on(isMouse ? "mouseout" : undefined, config.interaction_enabled ? function (d) { + if (!$$.transiting) // skip while transiting + { + var updated = $$.updateAngle(d), + arcData = updated ? $$.convertToArcData(updated) : null; + unselectArc(), $$.config.data_onout(arcData, this); + } + } : null).on(isMouse ? "mousemove" : undefined, config.interaction_enabled ? function (d) { + var updated = $$.updateAngle(d), + arcData = updated ? $$.convertToArcData(updated) : null; + $$.showTooltip([arcData], this); + } : null).on(isMouse ? "click" : undefined, config.interaction_enabled ? function (d, i) { + var updated = $$.updateAngle(d), + arcData = void 0; + updated && (arcData = $$.convertToArcData(updated), $$.toggleShape && $$.toggleShape(this, arcData, i), $$.config.data_onclick.call($$.api, arcData, this)); + } : null).each(function () { + $$.transiting = !0; + }).transition().duration(duration).attrTween("d", function (d) { + var updated = $$.updateAngle(d); + + if (!updated) return function () { + return "M 0 0"; + }; + + isNaN(this._current.startAngle) && (this._current.startAngle = 0), isNaN(this._current.endAngle) && (this._current.endAngle = this._current.startAngle); + + + var interpolate = (0, _d.interpolate)(this._current, updated); + + return this._current = interpolate(0), function (t) { + var interpolated = interpolate(t); + + // data.id will be updated by interporator + return interpolated.data = d.data, $$.getArc(interpolated, !0); + }; + }).attr("transform", withTransform ? "scale(1)" : "").style("fill", function (d) { + return $$.levelColor ? $$.levelColor(d.data.values[0].value) : $$.color(d.data.id); + } + // Where gauge reading color would receive customization. + ).style("opacity", "1").call($$.endall, function () { + $$.transiting = !1; + }), isTouch && config.interaction_enabled && $$.hasArcType()) { + var getEventArc = function () { + var touch = _d.event.changedTouches[0], + eventArc = (0, _d.select)(document.elementFromPoint(touch.clientX, touch.clientY)); + + + return eventArc; + }; + + $$.svg.on("touchstart", function () { + if (!$$.transiting) // skip while transiting + { + + var eventArc = getEventArc(), + datum = eventArc.datum(), + updated = datum && datum.data && datum.data.id ? $$.updateAngle(datum) : null, + arcData = updated ? $$.convertToArcData(updated) : null, + id = arcData && arcData.id || undefined; + id === undefined ? unselectArc() : selectArc(this, arcData, id), $$.config.data_onover(arcData, this); + } + }).on("touchend", function () { + if (!$$.transiting) // skip while transiting + { + var eventArc = getEventArc(), + datum = eventArc.datum(), + updated = datum && datum.data && datum.data.id ? $$.updateAngle(datum) : null, + arcData = updated ? $$.convertToArcData(updated) : null, + id = arcData && arcData.id || undefined; + id === undefined ? unselectArc() : selectArc(this, arcData, id), $$.config.data_onout(arcData, this); + } + }).on("touchmove", function () { + var eventArc = getEventArc(), + datum = eventArc.datum(), + updated = datum && datum.data && datum.data.id ? $$.updateAngle(datum) : null, + arcData = updated ? $$.convertToArcData(updated) : null, + id = arcData && arcData.id || undefined; + id === undefined ? unselectArc() : selectArc(this, arcData, id); + }); + } + + main.selectAll("." + _classes2.default.chartArc).select("text").style("opacity", "0").attr("class", function (d) { + return $$.isGaugeType(d.data) ? _classes2.default.gaugeValue : ""; + }).text($$.textForArcLabel.bind($$)).attr("transform", $$.transformForArcLabel.bind($$)).style("font-size", function (d) { + return $$.isGaugeType(d.data) ? Math.round($$.radius / 5) + "px" : ""; + }).transition().duration(duration).style("opacity", function (d) { + return $$.isTargetToShow(d.data.id) && $$.isArcType(d.data) ? "1" : "0"; + }), main.select("." + _classes2.default.chartArcsTitle).style("opacity", $$.hasType("donut") || $$.hasType("gauge") ? "1" : "0"), $$.hasType("gauge") && ($$.arcs.select("." + _classes2.default.chartArcsBackground).attr("d", function () { + var d = { + data: [{ value: config.gauge_max }], + startAngle: config.gauge_startingAngle, + endAngle: -1 * config.gauge_startingAngle + }; + + return $$.getArc(d, !0, !0); + }), $$.arcs.select("." + _classes2.default.chartArcsGaugeUnit).attr("dy", ".75em").text(config.gauge_label_show ? config.gauge_units : ""), $$.arcs.select("." + _classes2.default.chartArcsGaugeMin).attr("dx", -1 * ($$.innerRadius + ($$.radius - $$.innerRadius) / (config.gauge_fullCircle ? 1 : 2)) + "px").attr("dy", "1.2em").text(config.gauge_label_show ? $$.textForGaugeMinMax(config.gauge_min, !1) : ""), $$.arcs.select("." + _classes2.default.chartArcsGaugeMax).attr("dx", $$.innerRadius + ($$.radius - $$.innerRadius) / (config.gauge_fullCircle ? 1 : 2) + "px").attr("dy", "1.2em").text(config.gauge_label_show ? $$.textForGaugeMinMax(config.gauge_max, !0) : "")); + }, + initGauge: function initGauge() { + var arcs = this.arcs; + + this.hasType("gauge") && (arcs.append("path").attr("class", _classes2.default.chartArcsBackground), arcs.append("text").attr("class", _classes2.default.chartArcsGaugeUnit).style("text-anchor", "middle").style("pointer-events", "none"), arcs.append("text").attr("class", _classes2.default.chartArcsGaugeMin).style("text-anchor", "middle").style("pointer-events", "none"), arcs.append("text").attr("class", _classes2.default.chartArcsGaugeMax).style("text-anchor", "middle").style("pointer-events", "none")); + }, + getGaugeLabelHeight: function getGaugeLabelHeight() { + return this.config.gauge_label_show ? 20 : 0; + } +}); + +/***/ }), +/* 36 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +(0, _util.extend)(_ChartInternal2.default.prototype, { + hasCaches: function hasCaches(ids) { + for (var i = 0; i < ids.length; i++) if (!(ids[i] in this.cache)) return !1; + + return !0; + }, + addCache: function addCache(id, target) { + this.cache[id] = this.cloneTarget(target); + }, + getCaches: function getCaches(ids) { + var targets = []; + + for (var i = 0; i < ids.length; i++) ids[i] in this.cache && targets.push(this.cloneTarget(this.cache[ids[i]])); + return targets; + } +}); + +/***/ }), +/* 37 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +(0, _util.extend)(_ChartInternal2.default.prototype, { + /** + * Category Name + * @private + * @param {Number} index + * @returns {String} gategory Name + */ + categoryName: function categoryName(i) { + var config = this.config; + + return i < config.axis_x_categories.length ? config.axis_x_categories[i] : i; + } +}); + +/***/ }), +/* 38 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _classes = __webpack_require__(3), + _classes2 = _interopRequireDefault(_classes), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +(0, _util.extend)(_ChartInternal2.default.prototype, { + CLASS: _classes2.default, + + generateClass: function generateClass(prefix, targetId) { + return " " + prefix + " " + (prefix + this.getTargetSelectorSuffix(targetId)); + }, + classText: function classText(d) { + return this.generateClass(_classes2.default.text, d.index); + }, + classTexts: function classTexts(d) { + return this.generateClass(_classes2.default.texts, d.id); + }, + classShape: function classShape(d) { + return this.generateClass(_classes2.default.shape, d.index); + }, + classShapes: function classShapes(d) { + return this.generateClass(_classes2.default.shapes, d.id); + }, + classLine: function classLine(d) { + return this.classShape(d) + this.generateClass(_classes2.default.line, d.id); + }, + classLines: function classLines(d) { + return this.classShapes(d) + this.generateClass(_classes2.default.lines, d.id); + }, + classCircle: function classCircle(d) { + return this.classShape(d) + this.generateClass(_classes2.default.circle, d.index); + }, + classCircles: function classCircles(d) { + return this.classShapes(d) + this.generateClass(_classes2.default.circles, d.id); + }, + classBar: function classBar(d) { + return this.classShape(d) + this.generateClass(_classes2.default.bar, d.index); + }, + classBars: function classBars(d) { + return this.classShapes(d) + this.generateClass(_classes2.default.bars, d.id); + }, + classArc: function classArc(d) { + return this.classShape(d.data) + this.generateClass(_classes2.default.arc, d.data.id); + }, + classArcs: function classArcs(d) { + return this.classShapes(d.data) + this.generateClass(_classes2.default.arcs, d.data.id); + }, + classArea: function classArea(d) { + return this.classShape(d) + this.generateClass(_classes2.default.area, d.id); + }, + classAreas: function classAreas(d) { + return this.classShapes(d) + this.generateClass(_classes2.default.areas, d.id); + }, + classRegion: function classRegion(d, i) { + return this.generateClass(_classes2.default.region, i) + " " + ("class" in d ? d.class : ""); + }, + classEvent: function classEvent(d) { + return this.generateClass(_classes2.default.eventRect, d.index); + }, + classTarget: function classTarget(id) { + var additionalClassSuffix = this.config.data_classes[id], + additionalClass = ""; + + + return additionalClassSuffix && (additionalClass = " " + _classes2.default.target + "-" + additionalClassSuffix), this.generateClass(_classes2.default.target, id) + additionalClass; + }, + classFocus: function classFocus(d) { + return this.classFocused(d) + this.classDefocused(d); + }, + classFocused: function classFocused(d) { + return " " + (this.focusedTargetIds.indexOf(d.id) >= 0 ? _classes2.default.focused : ""); + }, + classDefocused: function classDefocused(d) { + return " " + (this.defocusedTargetIds.indexOf(d.id) >= 0 ? _classes2.default.defocused : ""); + }, + classChartText: function classChartText(d) { + return _classes2.default.chartText + this.classTarget(d.id); + }, + classChartLine: function classChartLine(d) { + return _classes2.default.chartLine + this.classTarget(d.id); + }, + classChartBar: function classChartBar(d) { + return _classes2.default.chartBar + this.classTarget(d.id); + }, + classChartArc: function classChartArc(d) { + return _classes2.default.chartArc + this.classTarget(d.data.id); + }, + getTargetSelectorSuffix: function getTargetSelectorSuffix(targetId) { + return targetId || targetId === 0 ? ("-" + targetId).replace(/[\s?!@#$%^&*()_=+,.<>'":;\[\]\/|~`{}\\]/g, "-") : ""; + }, + selectorTarget: function selectorTarget(id, prefix) { + return (prefix || "") + "." + (_classes2.default.target + this.getTargetSelectorSuffix(id)); + }, + selectorTargets: function selectorTargets(idsValue, prefix) { + var $$ = this, + ids = idsValue || []; + + + return ids.length ? ids.map(function (id) { + return $$.selectorTarget(id, prefix); + }) : null; + }, + selectorLegend: function selectorLegend(id) { + return "." + (_classes2.default.legendItem + this.getTargetSelectorSuffix(id)); + }, + selectorLegends: function selectorLegends(ids) { + var $$ = this; + + return ids && ids.length ? ids.map(function (id) { + return $$.selectorLegend(id); + }) : null; + } +}); /** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ + +/***/ }), +/* 39 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +(0, _util.extend)(_ChartInternal2.default.prototype, { + getClipPath: function getClipPath(id) { + var isIE9 = window.navigator.appVersion.toLowerCase().indexOf("msie 9.") >= 0; + + return "url(" + (isIE9 ? "" : document.URL.split("#")[0]) + "#" + id + ")"; + }, + appendClip: function appendClip(parent, id) { + return parent.append("clipPath").attr("id", id).append("rect"); + }, + getAxisClipX: function getAxisClipX(forHorizontal) { + // axis line width + padding for left + var left = Math.max(30, this.margin.left); + + return forHorizontal ? -(1 + left) : -(left - 1); + }, + getAxisClipY: function getAxisClipY(forHorizontal) { + return forHorizontal ? -20 : -this.margin.top; + }, + getXAxisClipX: function getXAxisClipX() { + var $$ = this; + + return $$.getAxisClipX(!$$.config.axis_rotated); + }, + getXAxisClipY: function getXAxisClipY() { + var $$ = this; + + return $$.getAxisClipY(!$$.config.axis_rotated); + }, + getYAxisClipX: function getYAxisClipX() { + var $$ = this; + + return $$.config.axis_y_inner ? -1 : $$.getAxisClipX($$.config.axis_rotated); + }, + getYAxisClipY: function getYAxisClipY() { + var $$ = this; + + return $$.getAxisClipY($$.config.axis_rotated); + }, + getAxisClipWidth: function getAxisClipWidth(forHorizontal) { + var $$ = this, + left = Math.max(30, $$.margin.left), + right = Math.max(30, $$.margin.right); + + + // width + axis line width + padding for left/right + return forHorizontal ? $$.width + 2 + left + right : $$.margin.left + 20; + }, + getAxisClipHeight: function getAxisClipHeight(forHorizontal) { + // less than 20 is not enough to show the axis label 'outer' without legend + return (forHorizontal ? this.margin.bottom : this.margin.top + this.height) + 20; + }, + getXAxisClipWidth: function getXAxisClipWidth() { + var $$ = this; + + return $$.getAxisClipWidth(!$$.config.axis_rotated); + }, + getXAxisClipHeight: function getXAxisClipHeight() { + var $$ = this; + + return $$.getAxisClipHeight(!$$.config.axis_rotated); + }, + getYAxisClipWidth: function getYAxisClipWidth() { + var $$ = this; + + return $$.getAxisClipWidth($$.config.axis_rotated) + ($$.config.axis_y_inner ? 20 : 0); + }, + getYAxisClipHeight: function getYAxisClipHeight() { + var $$ = this; + + return $$.getAxisClipHeight($$.config.axis_rotated); + } +}); + +/***/ }), +/* 40 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _d = __webpack_require__(2), + _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +(0, _util.extend)(_ChartInternal2.default.prototype, { + generateColor: function generateColor() { + var $$ = this, + config = $$.config, + colors = config.data_colors, + callback = config.data_color, + ids = [], + pattern = (0, _util.notEmpty)(config.color_pattern) ? config.color_pattern : (0, _d.scaleOrdinal)(_d.schemeCategory10).range(); + + + return function (d) { + var id = d.id || d.data && d.data.id || d, + color = void 0; + + // if callback function is provided + + + return colors[id] instanceof Function ? color = colors[id](d) : colors[id] ? color = colors[id] : (ids.indexOf(id) < 0 && ids.push(id), color = pattern[ids.indexOf(id) % pattern.length], colors[id] = color), callback instanceof Function ? callback(color, d) : color; + }; + }, + generateLevelColor: function generateLevelColor() { + var $$ = this, + config = $$.config, + colors = config.color_pattern, + threshold = config.color_threshold, + asValue = threshold.unit === "value", + max = threshold.max || 100, + values = threshold.values && threshold.values.length ? threshold.values : []; + + + return (0, _util.notEmpty)(threshold) ? function (value) { + var color = colors[colors.length - 1]; + + for (var v, i = 0; i < values.length; i++) if (v = asValue ? value : value * 100 / max, v < values[i]) { + color = colors[i]; + + break; + } + + return color; + } : null; + } +}); /** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ + +/***/ }), +/* 41 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _typeof2 = __webpack_require__(5), + _typeof3 = _interopRequireDefault(_typeof2), + _d = __webpack_require__(2), + _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +// selection +(0, _util.extend)(_ChartInternal2.default.prototype, { + getYDomainMin: function getYDomainMin(targets) { + var $$ = this, + config = $$.config, + ids = $$.mapToIds(targets), + ys = $$.getValuesAsIdKeyed(targets), + j = void 0, + k = void 0, + baseId = void 0, + idsInGroup = void 0, + id = void 0, + hasNegativeValue = void 0; + + + if (config.data_groups.length > 0) for (hasNegativeValue = $$.hasNegativeValueInTargets(targets), j = 0; j < config.data_groups.length; j++) if (idsInGroup = config.data_groups[j].filter(function (v) { + return ids.indexOf(v) >= 0; + }), idsInGroup.length !== 0) + + // Compute min + for (baseId = idsInGroup[0], hasNegativeValue && ys[baseId] && ys[baseId].forEach(function (v, i) { + ys[baseId][i] = v < 0 ? v : 0; + }), k = 1; k < idsInGroup.length; k++) (id = idsInGroup[k], !!ys[id]) && ys[id].forEach(function (v, i) { + $$.axis.getId(id) === $$.axis.getId(baseId) && ys[baseId] && !(hasNegativeValue && +v > 0) && (ys[baseId][i] += +v); + }); + return (0, _d.min)(Object.keys(ys).map(function (key) { + return (0, _d.min)(ys[key]); + })); + }, + getYDomainMax: function getYDomainMax(targets) { + var $$ = this, + config = $$.config, + ids = $$.mapToIds(targets), + ys = $$.getValuesAsIdKeyed(targets), + j = void 0, + k = void 0, + baseId = void 0, + idsInGroup = void 0, + id = void 0, + hasPositiveValue = void 0; + + + if (config.data_groups.length > 0) for (hasPositiveValue = $$.hasPositiveValueInTargets(targets), j = 0; j < config.data_groups.length; j++) if (idsInGroup = config.data_groups[j].filter(function (v) { + return ids.indexOf(v) >= 0; + }), idsInGroup.length !== 0) + // Compute max + for (baseId = idsInGroup[0], hasPositiveValue && ys[baseId] && ys[baseId].forEach(function (v, i) { + ys[baseId][i] = v > 0 ? v : 0; + }), k = 1; k < idsInGroup.length; k++) (id = idsInGroup[k], !!ys[id]) && ys[id].forEach(function (v, i) { + $$.axis.getId(id) === $$.axis.getId(baseId) && ys[baseId] && !(hasPositiveValue && +v < 0) && (ys[baseId][i] += +v); + }); + return (0, _d.max)(Object.keys(ys).map(function (key) { + return (0, _d.max)(ys[key]); + })); + }, + getYDomain: function getYDomain(targets, axisId, xDomain) { + var $$ = this, + config = $$.config, + targetsByAxisId = targets.filter(function (t) { + return $$.axis.getId(t.id) === axisId; + }), + yTargets = xDomain ? $$.filterByXDomain(targetsByAxisId, xDomain) : targetsByAxisId, + yMin = axisId === "y2" ? config.axis_y2_min : config.axis_y_min, + yMax = axisId === "y2" ? config.axis_y2_max : config.axis_y_max, + yDomainMin = $$.getYDomainMin(yTargets), + yDomainMax = $$.getYDomainMax(yTargets), + center = axisId === "y2" ? config.axis_y2_center : config.axis_y_center, + isZeroBased = $$.hasType("bar", yTargets) && config.bar_zerobased || $$.hasType("area", yTargets) && config.area_zerobased, + isInverted = axisId === "y2" ? config.axis_y2_inverted : config.axis_y_inverted, + showHorizontalDataLabel = $$.hasDataLabel() && config.axis_rotated, + showVerticalDataLabel = $$.hasDataLabel() && !config.axis_rotated, + lengths = void 0; + + // MEMO: avoid inverting domain unexpectedly + + + if (yDomainMin = (0, _util.isValue)(yMin) ? yMin : (0, _util.isValue)(yMax) ? yDomainMin < yMax ? yDomainMin : yMax - 10 : yDomainMin, yDomainMax = (0, _util.isValue)(yMax) ? yMax : (0, _util.isValue)(yMin) ? yMin < yDomainMax ? yDomainMax : yMin + 10 : yDomainMax, yTargets.length === 0) // use current domain if target of axisId is none + return axisId === "y2" ? $$.y2.domain() : $$.y.domain(); + + isNaN(yDomainMin) && (yDomainMin = 0), isNaN(yDomainMax) && (yDomainMax = yDomainMin), yDomainMin === yDomainMax && (yDomainMin < 0 ? yDomainMax = 0 : yDomainMin = 0); + + + var isAllPositive = yDomainMin >= 0 && yDomainMax >= 0, + isAllNegative = yDomainMin <= 0 && yDomainMax <= 0; + ((0, _util.isValue)(yMin) && isAllPositive || (0, _util.isValue)(yMax) && isAllNegative) && (isZeroBased = !1), isZeroBased && (isAllPositive && (yDomainMin = 0), isAllNegative && (yDomainMax = 0)); + + + var domainLength = Math.abs(yDomainMax - yDomainMin), + paddingTop = domainLength * 0.1, + paddingBottom = domainLength * 0.1; + + + if (typeof center !== "undefined") { + var yDomainAbs = Math.max(Math.abs(yDomainMin), Math.abs(yDomainMax)); + + yDomainMax = center + yDomainAbs, yDomainMin = center - yDomainAbs; + } + + // add padding for data label + if (showHorizontalDataLabel) { + lengths = $$.getDataLabelLength(yDomainMin, yDomainMax, "width"); + + var diff = (0, _util.diffDomain)($$.y.range()), + ratio = [lengths[0] / diff, lengths[1] / diff]; + paddingTop += domainLength * (ratio[1] / (1 - ratio[0] - ratio[1])), paddingBottom += domainLength * (ratio[0] / (1 - ratio[0] - ratio[1])); + } else showVerticalDataLabel && (lengths = $$.getDataLabelLength(yDomainMin, yDomainMax, "height"), paddingTop += $$.axis.convertPixelsToAxisPadding(lengths[1], domainLength), paddingBottom += $$.axis.convertPixelsToAxisPadding(lengths[0], domainLength)); + + axisId === "y" && (0, _util.notEmpty)(config.axis_y_padding) && (paddingTop = $$.axis.getPadding(config.axis_y_padding, "top", paddingTop, domainLength), paddingBottom = $$.axis.getPadding(config.axis_y_padding, "bottom", paddingBottom, domainLength)), axisId === "y2" && (0, _util.notEmpty)(config.axis_y2_padding) && (paddingTop = $$.axis.getPadding(config.axis_y2_padding, "top", paddingTop, domainLength), paddingBottom = $$.axis.getPadding(config.axis_y2_padding, "bottom", paddingBottom, domainLength)), isZeroBased && (isAllPositive && (paddingBottom = yDomainMin), isAllNegative && (paddingTop = -yDomainMax)); + + + var domain = [yDomainMin - paddingBottom, yDomainMax + paddingTop]; + + return isInverted ? domain.reverse() : domain; + }, + getXDomainMin: function getXDomainMin(targets) { + var $$ = this, + config = $$.config; + + + return (0, _util.isDefined)(config.axis_x_min) ? $$.isTimeSeries() ? this.parseDate(config.axis_x_min) : config.axis_x_min : (0, _d.min)(targets, function (t) { + return (0, _d.min)(t.values, function (v) { + return v.x; + }); + }); + }, + getXDomainMax: function getXDomainMax(targets) { + var $$ = this, + config = $$.config; + + + return (0, _util.isDefined)(config.axis_x_max) ? $$.isTimeSeries() ? this.parseDate(config.axis_x_max) : config.axis_x_max : (0, _d.max)(targets, function (t) { + return (0, _d.max)(t.values, function (v) { + return v.x; + }); + }); + }, + getXDomainPadding: function getXDomainPadding(domain) { + var $$ = this, + config = $$.config, + diff = domain[1] - domain[0], + maxDataCount = void 0, + padding = void 0, + paddingLeft = void 0, + paddingRight = void 0; + + return $$.isCategorized() ? padding = 0 : $$.hasType("bar") ? (maxDataCount = $$.getMaxDataCount(), padding = maxDataCount > 1 ? diff / (maxDataCount - 1) / 2 : 0.5) : padding = diff * 0.01, (0, _typeof3.default)(config.axis_x_padding) === "object" && (0, _util.notEmpty)(config.axis_x_padding) ? (paddingLeft = (0, _util.isValue)(config.axis_x_padding.left) ? config.axis_x_padding.left : padding, paddingRight = (0, _util.isValue)(config.axis_x_padding.right) ? config.axis_x_padding.right : padding) : typeof config.axis_x_padding === "number" ? (paddingLeft = config.axis_x_padding, paddingRight = config.axis_x_padding) : (paddingLeft = padding, paddingRight = padding), { left: paddingLeft, right: paddingRight }; + }, + getXDomain: function getXDomain(targets) { + var $$ = this, + xDomain = [$$.getXDomainMin(targets), $$.getXDomainMax(targets)], + firstX = xDomain[0], + lastX = xDomain[1], + padding = $$.getXDomainPadding(xDomain), + min = 0, + max = 0; + // show center of x domain if min and max are the same + + return firstX - lastX !== 0 || $$.isCategorized() || ($$.isTimeSeries() ? (firstX = new Date(firstX.getTime() * 0.5), lastX = new Date(lastX.getTime() * 1.5)) : (firstX = firstX === 0 ? 1 : firstX * 0.5, lastX = lastX === 0 ? -1 : lastX * 1.5)), (firstX || firstX === 0) && (min = $$.isTimeSeries() ? new Date(firstX.getTime() - padding.left) : firstX - padding.left), (lastX || lastX === 0) && (max = $$.isTimeSeries() ? new Date(lastX.getTime() + padding.right) : lastX + padding.right), [min, max]; + }, + updateXDomain: function updateXDomain(targets, withUpdateXDomain, withUpdateOrgXDomain, withTrim, domain) { + var $$ = this, + config = $$.config; + + + if (withUpdateOrgXDomain && ($$.x.domain(domain || (0, _d.extent)($$.getXDomain(targets))), $$.orgXDomain = $$.x.domain(), config.zoom_enabled && $$.zoom.updateScaleExtent(), $$.subX.domain($$.x.domain()), $$.brush && $$.brush.scale($$.subX)), withUpdateXDomain) { + var domainValue = domain || !$$.brush || $$.brushEmpty() ? $$.orgXDomain : $$.getBrushSelection().map(function (v) { + return $$.subX.invert(v); + }); + + $$.x.domain(domainValue), config.zoom_enabled && $$.zoom.updateScaleExtent(); + } + + // Trim domain when too big by zoom mousemove event + + + return withTrim && $$.x.domain($$.trimXDomain($$.x.orgDomain())), $$.x.domain(); + }, + trimXDomain: function trimXDomain(domain) { + var zoomDomain = this.getZoomDomain(), + min = zoomDomain[0], + max = zoomDomain[1]; + + + return domain[0] <= min && (domain[1] = +domain[1] + (min - domain[0]), domain[0] = min), max <= domain[1] && (domain[0] = +domain[0] - (domain[1] - max), domain[1] = max), domain; + } +}); /** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ + +/***/ }), +/* 42 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _typeof2 = __webpack_require__(5), + _typeof3 = _interopRequireDefault(_typeof2), + _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +var getFormat = function ($$, typeValue, v) { + var config = $$.config, + type = "axis_" + typeValue + "_tick_format", + format = config[type] ? config[type] : $$.defaultValueFormat; + + + return format(v); +}; + +(0, _util.extend)(_ChartInternal2.default.prototype, { + getYFormat: function getYFormat(forArc) { + var $$ = this, + formatForY = $$.yFormat, + formatForY2 = $$.y2Format; + + + return forArc && !$$.hasType("gauge") && (formatForY = $$.defaultArcValueFormat, formatForY2 = $$.defaultArcValueFormat), function (v, ratio, id) { + var format = $$.axis.getId(id) === "y2" ? formatForY2 : formatForY; + + return format.call($$, v, ratio); + }; + }, + yFormat: function yFormat(v) { + return getFormat(this, "y", v); + }, + y2Format: function y2Format(v) { + return getFormat(this, "y2", v); + }, + defaultValueFormat: function defaultValueFormat(v) { + return (0, _util.isValue)(v) ? +v : ""; + }, + defaultArcValueFormat: function defaultArcValueFormat(v, ratio) { + return (ratio * 100).toFixed(1) + "%"; + }, + dataLabelFormat: function dataLabelFormat(targetId) { + var $$ = this, + dataLabels = $$.config.data_labels, + defaultFormat = function (v) { + return (0, _util.isValue)(v) ? +v : ""; + }, + format = void 0; + + // find format according to axis id + + + return format = typeof dataLabels.format === "function" ? dataLabels.format : (0, _typeof3.default)(dataLabels.format) === "object" ? dataLabels.format[targetId] ? dataLabels.format[targetId] === !0 ? defaultFormat : dataLabels.format[targetId] : function () { + return ""; + } : defaultFormat, format; + } +}); + +/***/ }), +/* 43 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _d = __webpack_require__(2), + _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _classes = __webpack_require__(3), + _classes2 = _interopRequireDefault(_classes), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +(0, _util.extend)(_ChartInternal2.default.prototype, { + initGrid: function initGrid() { + var $$ = this, + config = $$.config; + $$.grid = $$.main.append("g").attr("clip-path", $$.clipPathForGrid).attr("class", _classes2.default.grid), config.grid_x_show && $$.grid.append("g").attr("class", _classes2.default.xgrids), config.grid_y_show && $$.grid.append("g").attr("class", _classes2.default.ygrids), config.grid_focus_show && $$.grid.append("g").attr("class", _classes2.default.xgridFocus).append("line").attr("class", _classes2.default.xgridFocus), $$.xgrid = (0, _d.selectAll)([]), config.grid_lines_front || $$.initGridLines(); + }, + initGridLines: function initGridLines() { + var $$ = this; + + $$.gridLines = $$.main.append("g").attr("clip-path", $$.clipPathForGrid).attr("class", _classes2.default.grid + " " + _classes2.default.gridLines), $$.gridLines.append("g").attr("class", _classes2.default.xgridLines), $$.gridLines.append("g").attr("class", _classes2.default.ygridLines), $$.xgridLines = (0, _d.selectAll)([]); + }, + updateXGrid: function updateXGrid(withoutUpdate) { + var $$ = this, + config = $$.config, + xgridData = $$.generateGridData(config.grid_x_type, $$.x), + tickOffset = $$.isCategorized() ? $$.xAxis.tickOffset() : 0; + $$.xgridAttr = config.axis_rotated ? { + "x1": 0, + "x2": $$.width, + "y1": function y1(d) { + return $$.x(d) - tickOffset; + }, + "y2": function y2(d) { + return $$.x(d) - tickOffset; + } + } : { + "x1": function x1(d) { + return $$.x(d) + tickOffset; + }, + "x2": function x2(d) { + return $$.x(d) + tickOffset; + }, + "y1": 0, + "y2": $$.height + }, $$.xgrid = $$.main.select("." + _classes2.default.xgrids).selectAll("." + _classes2.default.xgrid).data(xgridData), $$.xgrid.exit().remove(), $$.xgrid = $$.xgrid.enter().append("line").attr("class", _classes2.default.xgrid).merge($$.xgrid), withoutUpdate || $$.xgrid.each(function () { + var grid = (0, _d.select)(this); + + Object.keys($$.xgridAttr).forEach(function (id) { + grid.attr(id, $$.xgridAttr[id]).style("opacity", function () { + return grid.attr(config.axis_rotated ? "y1" : "x1") === (config.axis_rotated ? $$.height : 0) ? "0" : "1"; + }); + }); + }); + }, + updateYGrid: function updateYGrid() { + var $$ = this, + config = $$.config, + gridValues = $$.yAxis.tickValues() || $$.y.ticks(config.grid_y_ticks); + $$.ygrid = $$.main.select("." + _classes2.default.ygrids).selectAll("." + _classes2.default.ygrid).data(gridValues), $$.ygrid.exit().remove(), $$.ygrid = $$.ygrid.enter().append("line").attr("class", _classes2.default.ygrid).merge($$.ygrid), $$.ygrid.attr("x1", config.axis_rotated ? $$.y : 0).attr("x2", config.axis_rotated ? $$.y : $$.width).attr("y1", config.axis_rotated ? 0 : $$.y).attr("y2", config.axis_rotated ? $$.height : $$.y), $$.smoothLines($$.ygrid, "grid"); + }, + gridTextAnchor: function gridTextAnchor(d) { + return d.position ? d.position : "end"; + }, + gridTextDx: function gridTextDx(d) { + return d.position === "start" ? 4 : d.position === "middle" ? 0 : -4; + }, + xGridTextX: function xGridTextX(d) { + return d.position === "start" ? -this.height : d.position === "middle" ? -this.height / 2 : 0; + }, + yGridTextX: function yGridTextX(d) { + return d.position === "start" ? 0 : d.position === "middle" ? this.width / 2 : this.width; + }, + updateGrid: function updateGrid(duration) { + var $$ = this, + main = $$.main, + config = $$.config; + + + // hide if arc type + $$.grid.style("visibility", $$.hasArcType() ? "hidden" : "visible"), main.select("line." + _classes2.default.xgridFocus).style("visibility", "hidden"), config.grid_x_show && $$.updateXGrid(), $$.xgridLines = main.select("." + _classes2.default.xgridLines).selectAll("." + _classes2.default.xgridLine).data(config.grid_x_lines), $$.xgridLines.exit().transition().duration(duration).style("opacity", "0").remove(); + + + // enter + var xgridLine = $$.xgridLines.enter().append("g").attr("class", function (d) { + return _classes2.default.xgridLine + (d.class ? " " + d.class : ""); + }); + + xgridLine.append("line").style("opacity", "0"), xgridLine.append("text").attr("text-anchor", $$.gridTextAnchor).attr("transform", config.axis_rotated ? "" : "rotate(-90)").attr("dx", $$.gridTextDx).attr("dy", -5).style("opacity", "0"), $$.xgridLines = xgridLine.merge($$.xgridLines), config.grid_y_show && $$.updateYGrid(), $$.ygridLines = main.select("." + _classes2.default.ygridLines).selectAll("." + _classes2.default.ygridLine).data(config.grid_y_lines), $$.ygridLines.exit().transition().duration(duration).style("opacity", "0").remove(); + + + // enter + var ygridLine = $$.ygridLines.enter().append("g").attr("class", function (d) { + return _classes2.default.ygridLine + (d.class ? " " + d.class : ""); + }); + + ygridLine.append("line").style("opacity", "0"), ygridLine.append("text").attr("text-anchor", $$.gridTextAnchor).attr("transform", config.axis_rotated ? "rotate(-90)" : "").attr("dx", $$.gridTextDx).attr("dy", -5).style("opacity", "0"), $$.ygridLines = ygridLine.merge($$.ygridLines); + + + // update + var yv = $$.yv.bind($$); + + $$.ygridLines.select("line").transition().duration(duration).attr("x1", config.axis_rotated ? yv : 0).attr("x2", config.axis_rotated ? yv : $$.width).attr("y1", config.axis_rotated ? 0 : yv).attr("y2", config.axis_rotated ? $$.height : yv).transition().style("opacity", "1"), $$.ygridLines.select("text").transition().duration(duration).attr("x", config.axis_rotated ? $$.xGridTextX.bind($$) : $$.yGridTextX.bind($$)).attr("y", yv).text(function (d) { + return d.text; + }).transition().style("opacity", "1"); + }, + redrawGrid: function redrawGrid(withTransition) { + var $$ = this, + rotated = $$.config.axis_rotated, + xv = $$.xv.bind($$), + lines = $$.xgridLines.select("line"), + texts = $$.xgridLines.select("text"); + + + return lines = (withTransition ? lines.transition() : lines).attr("x1", rotated ? 0 : xv).attr("x2", rotated ? $$.width : xv).attr("y1", rotated ? xv : 0).attr("y2", rotated ? xv : $$.height), texts = (withTransition ? texts.transition() : texts).attr("x", rotated ? $$.yGridTextX.bind($$) : $$.xGridTextX.bind($$)).attr("y", xv).text(function (d) { + return d.text; + }), [(withTransition ? lines.transition() : lines).style("opacity", "1"), (withTransition ? texts.transition() : texts).style("opacity", "1")]; + }, + showXGridFocus: function showXGridFocus(selectedData) { + var $$ = this, + config = $$.config, + dataToShow = selectedData.filter(function (d) { + return d && (0, _util.isValue)(d.value); + }), + focusEl = $$.main.selectAll("line." + _classes2.default.xgridFocus), + xx = $$.xx.bind($$); + !config.tooltip_show || $$.hasType("scatter") || $$.hasArcType() || (focusEl.style("visibility", "visible").data([dataToShow[0]]).attr(config.axis_rotated ? "y1" : "x1", xx).attr(config.axis_rotated ? "y2" : "x2", xx), $$.smoothLines(focusEl, "grid")); + + // Hide when scatter plot exists + }, + hideXGridFocus: function hideXGridFocus() { + this.main.select("line." + _classes2.default.xgridFocus).style("visibility", "hidden"); + }, + updateXgridFocus: function updateXgridFocus() { + var $$ = this, + config = $$.config; + $$.main.select("line." + _classes2.default.xgridFocus).attr("x1", config.axis_rotated ? 0 : -10).attr("x2", config.axis_rotated ? $$.width : -10).attr("y1", config.axis_rotated ? -10 : 0).attr("y2", config.axis_rotated ? -10 : $$.height); + }, + generateGridData: function generateGridData(type, scale) { + var $$ = this, + tickNum = $$.main.select("." + _classes2.default.axisX).selectAll(".tick").size(), + gridData = []; + + + if (type === "year") { + var xDomain = $$.getXDomain(), + firstYear = xDomain[0].getFullYear(), + lastYear = xDomain[1].getFullYear(); + + + for (var i = firstYear; i <= lastYear; i++) gridData.push(new Date(i + "-01-01 00:00:00")); + } else gridData = scale.ticks(10), gridData.length > tickNum && (gridData = gridData.filter(function (d) { + return (d + "").indexOf(".") < 0; + })); + return gridData; + }, + getGridFilterToRemove: function getGridFilterToRemove(params) { + return params ? function (line) { + var found = !1; + + return [].concat(params).forEach(function (param) { + ("value" in param && line.value === param.value || "class" in param && line.class === param.class) && (found = !0); + }), found; + } : function () { + return !0; + }; + }, + removeGridLines: function removeGridLines(params, forX) { + var $$ = this, + config = $$.config, + toRemove = $$.getGridFilterToRemove(params), + toShow = function (line) { + return !toRemove(line); + }, + classLines = forX ? _classes2.default.xgridLines : _classes2.default.ygridLines, + classLine = forX ? _classes2.default.xgridLine : _classes2.default.ygridLine; + $$.main.select("." + classLines).selectAll("." + classLine).filter(toRemove).transition().duration(config.transition_duration).style("opacity", "0").remove(), forX ? config.grid_x_lines = config.grid_x_lines.filter(toShow) : config.grid_y_lines = config.grid_y_lines.filter(toShow); + } +}); + +/***/ }), +/* 44 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _d = __webpack_require__(2), + _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _classes = __webpack_require__(3), + _classes2 = _interopRequireDefault(_classes), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +(0, _util.extend)(_ChartInternal2.default.prototype, { + /** + * Initialize the legend. + * @private + */ + initLegend: function initLegend() { + var $$ = this; + + return $$.legendItemTextBox = {}, $$.legendHasRendered = !1, $$.legend = $$.svg.append("g").attr("transform", $$.getTranslate("legend")), $$.config.legend_show ? void $$.updateLegendWithDefaults() : ($$.legend.style("visibility", "hidden"), void ($$.hiddenLegendIds = $$.mapToIds($$.data.targets))); + // MEMO: call here to update legend box and tranlate for all + // MEMO: translate will be upated by this, so transform not needed in updateLegend() + }, + + + /** + * Update the legend to its default value. + * @private + */ + updateLegendWithDefaults: function updateLegendWithDefaults() { + var $$ = this; + + $$.updateLegend($$.mapToIds($$.data.targets), { + withTransform: !1, + withTransitionForTransform: !1, + withTransition: !1 + }); + }, + + + /** + * Update the size of the legend. + * @private + * @param {Number} height + * @param {Number} width + */ + updateSizeForLegend: function updateSizeForLegend(legendHeight, legendWidth) { + var $$ = this, + config = $$.config, + insetLegendPosition = { + top: $$.isLegendTop ? $$.getCurrentPaddingTop() + config.legend_inset_y + 5.5 : $$.currentHeight - legendHeight - $$.getCurrentPaddingBottom() - config.legend_inset_y, + left: $$.isLegendLeft ? $$.getCurrentPaddingLeft() + config.legend_inset_x + 0.5 : $$.currentWidth - legendWidth - $$.getCurrentPaddingRight() - config.legend_inset_x + 0.5 + }; + $$.margin3 = { + top: $$.isLegendRight ? 0 : $$.isLegendInset ? insetLegendPosition.top : $$.currentHeight - legendHeight, + right: NaN, + bottom: 0, + left: $$.isLegendRight ? $$.currentWidth - legendWidth : $$.isLegendInset ? insetLegendPosition.left : 0 + }; + }, + + /** + * Transform Legend + * @private + * @param {Boolean} whether or not to transition. + */ + transformLegend: function transformLegend(withTransition) { + var $$ = this; + + (withTransition ? $$.legend.transition() : $$.legend).attr("transform", $$.getTranslate("legend")); + }, + + + /** + * Update the legend step + * @private + * @param {Number} step + */ + updateLegendStep: function updateLegendStep(step) { + this.legendStep = step; + }, + + + /** + * Update legend item width + * @private + * @param {Number} width + */ + updateLegendItemWidth: function updateLegendItemWidth(w) { + this.legendItemWidth = w; + }, + + + /** + * Update legend item height + * @private + * @param {Number} height + */ + updateLegendItemHeight: function updateLegendItemHeight(h) { + this.legendItemHeight = h; + }, + + + /** + * Get the width of the legend + * @private + * @param {Number} width + */ + getLegendWidth: function getLegendWidth() { + var $$ = this; + + return $$.config.legend_show ? $$.isLegendRight || $$.isLegendInset ? $$.legendItemWidth * ($$.legendStep + 1) : $$.currentWidth : 0; + }, + + /** + * Get the height of the legend + * @private + * @param {Number} height + */ + getLegendHeight: function getLegendHeight() { + var $$ = this, + h = 0; + + return $$.config.legend_show && ($$.isLegendRight ? h = $$.currentHeight : h = Math.max(20, $$.legendItemHeight) * ($$.legendStep + 1)), h; + }, + + /** + * Get the opacity of the legend + * @private + * @param {Object} d3.Select + * @returns {Number} opacity + */ + opacityForLegend: function opacityForLegend(legendItem) { + return legendItem.classed(_classes2.default.legendItemHidden) ? null : "1"; + }, + + + /** + * Get the opacity of the legend that is unfocused + * @private + * @param {Object} legendItem, d3.Select + * @returns {Number} opacity + */ + opacityForUnfocusedLegend: function opacityForUnfocusedLegend(legendItem) { + return legendItem.classed(_classes2.default.legendItemHidden) ? null : "0.3"; + }, + + /** + * Toggles the focus of the legend + * @private + * @param {Array} ID's of target + * @param {Boolean} whether or not to focus. + */ + toggleFocusLegend: function toggleFocusLegend(targetIds, focus) { + var $$ = this, + targetIdz = $$.mapToTargetIds(targetIds); + $$.legend.selectAll("." + _classes2.default.legendItem).filter(function (id) { + return targetIdz.indexOf(id) >= 0; + }).classed(_classes2.default.legendItemFocused, focus).transition().duration(100).style("opacity", function () { + var opacity = focus ? $$.opacityForLegend : $$.opacityForUnfocusedLegend; + + return opacity.call($$, (0, _d.select)(this)); + }); + }, + + /** + * Revert the legend to its default state + * @private + */ + revertLegend: function revertLegend() { + var $$ = this; + + $$.legend.selectAll("." + _classes2.default.legendItem).classed(_classes2.default.legendItemFocused, !1).transition().duration(100).style("opacity", function () { + return $$.opacityForLegend((0, _d.select)(this)); + }); + }, + + /** + * Shows the legend + * @private + * @param {Array} ID's of target + */ + showLegend: function showLegend(targetIds) { + var $$ = this, + config = $$.config; + config.legend_show || (config.legend_show = !0, $$.legend.style("visibility", "visible"), !$$.legendHasRendered && $$.updateLegendWithDefaults()), $$.removeHiddenLegendIds(targetIds), $$.legend.selectAll($$.selectorLegends(targetIds)).style("visibility", "visible").transition().style("opacity", function () { + return $$.opacityForLegend((0, _d.select)(this)); + }); + }, + + /** + * Hide the legend + * @private + * @param {Array} ID's of target + */ + hideLegend: function hideLegend(targetIds) { + var $$ = this, + config = $$.config; + config.legend_show && (0, _util.isEmpty)(targetIds) && (config.legend_show = !1, $$.legend.style("visibility", "hidden")), $$.addHiddenLegendIds(targetIds), $$.legend.selectAll($$.selectorLegends(targetIds)).style("opacity", "0").style("visibility", "hidden"); + }, + + /** + * Clear the LegendItemTextBox cache. + * @private + */ + clearLegendItemTextBoxCache: function clearLegendItemTextBoxCache() { + this.legendItemTextBox = {}; + }, + + /** + * Update the legend + * @private + * @param {Array} ID's of target + * @param {Object} withTransform : Whether to use the transform property / withTransitionForTransform: Whether transition is used when using the transform property / withTransition : whether or not to transition. + * @param {Object} the return value of the generateTransitions + */ + updateLegend: function updateLegend(targetIds, options, transitions) { + var $$ = this, + config = $$.config, + posMin = 10, + tileWidth = config.legend_item_tile_width + 5, + isTouch = $$.inputType === "touch", + maxWidth = 0, + maxHeight = 0, + xForLegend = void 0, + yForLegend = void 0, + totalLength = 0, + offsets = {}, + widths = {}, + heights = {}, + margins = [0], + steps = {}, + step = 0, + background = void 0, + targetIdz = targetIds.filter(function (id) { + return !(0, _util.isDefined)(config.data_names[id]) || config.data_names[id] !== null; + }), + optionz = options || {}, + withTransition = (0, _util.getOption)(optionz, "withTransition", !0), + withTransitionForTransform = (0, _util.getOption)(optionz, "withTransitionForTransform", !0), + getTextBox = function (textElement, id) { + return $$.legendItemTextBox[id] || ($$.legendItemTextBox[id] = $$.getTextRect(textElement.textContent, _classes2.default.legendItem, textElement)), $$.legendItemTextBox[id]; + }, + updatePositions = function (textElement, id, index) { + var isLast = index === targetIdz.length - 1, + box = getTextBox(textElement, id), + itemWidth = box.width + tileWidth + (isLast && !($$.isLegendRight || $$.isLegendInset) ? 0 : 10) + config.legend_padding, + itemHeight = box.height + 4, + itemLength = $$.isLegendRight || $$.isLegendInset ? itemHeight : itemWidth, + areaLength = $$.isLegendRight || $$.isLegendInset ? $$.getLegendHeight() : $$.getLegendWidth(), + margin = void 0, + updateValues = function (id2, withoutStep) { + withoutStep || (margin = (areaLength - totalLength - itemLength) / 2, margin < posMin && (margin = (areaLength - itemLength) / 2, totalLength = 0, step++)), steps[id2] = step, margins[step] = $$.isLegendInset ? 10 : margin, offsets[id2] = totalLength, totalLength += itemLength; + }; + + // MEMO: care about condifion of step, totalLength + + + if (index === 0 && (totalLength = 0, step = 0, maxWidth = 0, maxHeight = 0), config.legend_show && !$$.isLegendToShow(id)) return widths[id] = 0, heights[id] = 0, steps[id] = 0, void (offsets[id] = 0); + + widths[id] = itemWidth, heights[id] = itemHeight, (!maxWidth || itemWidth >= maxWidth) && (maxWidth = itemWidth), (!maxHeight || itemHeight >= maxHeight) && (maxHeight = itemHeight); + + + var maxLength = $$.isLegendRight || $$.isLegendInset ? maxHeight : maxWidth; + + config.legend_equally ? (Object.keys(widths).forEach(function (id2) { + return widths[id2] = maxWidth; + }), Object.keys(heights).forEach(function (id2) { + return heights[id2] = maxHeight; + }), margin = (areaLength - maxLength * targetIdz.length) / 2, margin < posMin ? (totalLength = 0, step = 0, targetIdz.forEach(function (id2) { + return updateValues(id2); + })) : updateValues(id, !0)) : updateValues(id); + }; + // Skip elements when their name is set to null + $$.isLegendInset && (step = config.legend_inset_step ? config.legend_inset_step : targetIdz.length, $$.updateLegendStep(step)), $$.isLegendRight ? (xForLegend = function (id) { + return maxWidth * steps[id]; + }, yForLegend = function (id) { + return margins[steps[id]] + offsets[id]; + }) : $$.isLegendInset ? (xForLegend = function (id) { + return maxWidth * steps[id] + 10; + }, yForLegend = function (id) { + return margins[steps[id]] + offsets[id]; + }) : (xForLegend = function (id) { + return margins[steps[id]] + offsets[id]; + }, yForLegend = function (id) { + return maxHeight * steps[id]; + }); + + + var xForLegendText = function (id, i) { + return xForLegend(id, i) + 4 + config.legend_item_tile_width; + }, + yForLegendText = function (id, i) { + return yForLegend(id, i) + 9; + }, + xForLegendRect = function (id, i) { + return xForLegend(id, i); + }, + yForLegendRect = function (id, i) { + return yForLegend(id, i) - 5; + }, + x1ForLegendTile = function (id, i) { + return xForLegend(id, i) - 2; + }, + x2ForLegendTile = function (id, i) { + return xForLegend(id, i) - 2 + config.legend_item_tile_width; + }, + yForLegendTile = function (id, i) { + return yForLegend(id, i) + 4; + }, + l = $$.legend.selectAll("." + _classes2.default.legendItem).data(targetIdz).enter().append("g").attr("class", function (id) { + return $$.generateClass(_classes2.default.legendItem, id); + }).style("visibility", function (id) { + return $$.isLegendToShow(id) ? "visible" : "hidden"; + }).style("cursor", "pointer").on(isTouch ? "touchstart" : "click", function (id) { + config.legend_item_onclick ? config.legend_item_onclick.call($$, id) : _d.event.altKey ? ($$.api.hide(), $$.api.show(id)) : ($$.api.toggle(id), $$.isTargetToShow(id) ? $$.api.focus(id) : $$.api.revert()), isTouch && $$.hideTooltip(); + }).on(isTouch ? undefined : "mouseover", function (id) { + config.legend_item_onover ? config.legend_item_onover.call($$, id) : ((0, _d.select)(this).classed(_classes2.default.legendItemFocused, !0), !$$.transiting && $$.isTargetToShow(id) && $$.api.focus(id)); + }).on(isTouch ? "touchend" : "mouseout", function (id) { + config.legend_item_onout ? config.legend_item_onout.call($$, id) : ((0, _d.select)(this).classed(_classes2.default.legendItemFocused, !1), $$.api.revert()); + }); + + // Define g for legend area + l.append("text").text(function (id) { + return (0, _util.isDefined)(config.data_names[id]) ? config.data_names[id] : id; + }).each(function (id, i) { + updatePositions(this, id, i); + }).style("pointer-events", "none").attr("x", $$.isLegendRight || $$.isLegendInset ? xForLegendText : -200).attr("y", $$.isLegendRight || $$.isLegendInset ? -200 : yForLegendText), l.append("rect").attr("class", _classes2.default.legendItemEvent).style("fill-opacity", "0").attr("x", $$.isLegendRight || $$.isLegendInset ? xForLegendRect : -200).attr("y", $$.isLegendRight || $$.isLegendInset ? -200 : yForLegendRect), l.append("line").attr("class", _classes2.default.legendItemTile).style("stroke", $$.color).style("pointer-events", "none").attr("x1", $$.isLegendRight || $$.isLegendInset ? x1ForLegendTile : -200).attr("y1", $$.isLegendRight || $$.isLegendInset ? -200 : yForLegendTile).attr("x2", $$.isLegendRight || $$.isLegendInset ? x2ForLegendTile : -200).attr("y2", $$.isLegendRight || $$.isLegendInset ? -200 : yForLegendTile).attr("stroke-width", config.legend_item_tile_height), background = $$.legend.select("." + _classes2.default.legendBackground + " rect"), $$.isLegendInset && maxWidth > 0 && background.size() === 0 && (background = $$.legend.insert("g", "." + _classes2.default.legendItem).attr("class", _classes2.default.legendBackground).append("rect")); + + + var texts = $$.legend.selectAll("text").data(targetIdz).text(function (id) { + return (0, _util.isDefined)(config.data_names[id]) ? config.data_names[id] : id; + } // MEMO: needed for update + ).each(function (id, i) { + updatePositions(this, id, i); + }); + + (withTransition ? texts.transition() : texts).attr("x", xForLegendText).attr("y", yForLegendText); + + + var rects = $$.legend.selectAll("rect." + _classes2.default.legendItemEvent).data(targetIdz); + + (withTransition ? rects.transition() : rects).attr("width", function (id) { + return widths[id]; + }).attr("height", function (id) { + return heights[id]; + }).attr("x", xForLegendRect).attr("y", yForLegendRect); + + + var tiles = $$.legend.selectAll("line." + _classes2.default.legendItemTile).data(targetIdz); + + (withTransition ? tiles.transition() : tiles).style("stroke", $$.color).attr("x1", x1ForLegendTile).attr("y1", yForLegendTile).attr("x2", x2ForLegendTile).attr("y2", yForLegendTile), background && (withTransition ? background.transition() : background).attr("height", $$.getLegendHeight() - 12).attr("width", maxWidth * (step + 1) + 10), $$.legend.selectAll("." + _classes2.default.legendItem).classed(_classes2.default.legendItemHidden, function (id) { + return !$$.isTargetToShow(id); + }), $$.updateLegendItemWidth(maxWidth), $$.updateLegendItemHeight(maxHeight), $$.updateLegendStep(step), $$.updateSizes(), $$.updateScales(), $$.updateSvgSize(), $$.transformAll(withTransitionForTransform, transitions), $$.legendHasRendered = !0; + } +}); + +/***/ }), +/* 45 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _d = __webpack_require__(2), + _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _classes = __webpack_require__(3), + _classes2 = _interopRequireDefault(_classes), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +(0, _util.extend)(_ChartInternal2.default.prototype, { + initRegion: function initRegion() { + var $$ = this; + + $$.region = $$.main.append("g").attr("clip-path", $$.clipPath).attr("class", _classes2.default.regions); + }, + updateRegion: function updateRegion(duration) { + var $$ = this, + config = $$.config; + + + // hide if arc type + $$.region.style("visibility", $$.hasArcType() ? "hidden" : "visible"), $$.mainRegion = $$.main.select("." + _classes2.default.regions).selectAll("." + _classes2.default.region).data(config.regions), $$.mainRegion.exit().transition().duration(duration).style("opacity", "0").remove(), $$.mainRegion = $$.mainRegion.enter().append("g").merge($$.mainRegion).attr("class", $$.classRegion.bind($$)), $$.mainRegion.append("rect").style("fill-opacity", "0"); + }, + redrawRegion: function redrawRegion(withTransition) { + var $$ = this, + x = $$.regionX.bind($$), + y = $$.regionY.bind($$), + w = $$.regionWidth.bind($$), + h = $$.regionHeight.bind($$), + regions = $$.mainRegion.select("rect"); + + + return regions = (withTransition ? regions.transition() : regions).attr("x", x).attr("y", y).attr("width", w).attr("height", h), [(withTransition ? regions.transition() : regions).style("fill-opacity", function (d) { + return (0, _util.isValue)(d.opacity) ? d.opacity : "0.1"; + }).on("end", function () { + (0, _d.select)(this.parentNode).selectAll("rect:not([x])").remove(); + })]; + }, + regionX: function regionX(d) { + var $$ = this, + config = $$.config, + yScale = d.axis === "y" ? $$.y : $$.y2, + xPos = void 0; + + + return xPos = d.axis === "y" || d.axis === "y2" ? config.axis_rotated ? "start" in d ? yScale(d.start) : 0 : 0 : config.axis_rotated ? 0 : "start" in d ? $$.x($$.isTimeSeries() ? $$.parseDate(d.start) : d.start) : 0, xPos; + }, + regionY: function regionY(d) { + var $$ = this, + config = $$.config, + yScale = d.axis === "y" ? $$.y : $$.y2, + yPos = void 0; + + + return yPos = d.axis === "y" || d.axis === "y2" ? config.axis_rotated ? 0 : "end" in d ? yScale(d.end) : 0 : config.axis_rotated ? "start" in d ? $$.x($$.isTimeSeries() ? $$.parseDate(d.start) : d.start) : 0 : 0, yPos; + }, + regionWidth: function regionWidth(d) { + var $$ = this, + config = $$.config, + yScale = d.axis === "y" ? $$.y : $$.y2, + start = $$.regionX(d), + end = void 0; + + + return end = d.axis === "y" || d.axis === "y2" ? config.axis_rotated ? "end" in d ? yScale(d.end) : $$.width : $$.width : config.axis_rotated ? $$.width : "end" in d ? $$.x($$.isTimeSeries() ? $$.parseDate(d.end) : d.end) : $$.width, end < start ? 0 : end - start; + }, + regionHeight: function regionHeight(d) { + var $$ = this, + config = $$.config, + start = this.regionY(d), + end = void 0, + yScale = d.axis === "y" ? $$.y : $$.y2; + + + return end = d.axis === "y" || d.axis === "y2" ? config.axis_rotated ? $$.height : "start" in d ? yScale(d.start) : $$.height : config.axis_rotated ? "end" in d ? $$.x($$.isTimeSeries() ? $$.parseDate(d.end) : d.end) : $$.height : $$.height, end < start ? 0 : end - start; + }, + isRegionOnX: function isRegionOnX(d) { + return !d.axis || d.axis === "x"; + } +}); // selection + +/***/ }), +/* 46 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _d = __webpack_require__(2), + _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +(0, _util.extend)(_ChartInternal2.default.prototype, { + getScale: function getScale(min, max, forTimeseries) { + return (forTimeseries ? (0, _d.scaleTime)() : (0, _d.scaleLinear)()).range([min, max]); + }, + getX: function getX(min, max, domain, offsetValue) { + var $$ = this, + scale = $$.getScale(min, max, $$.isTimeSeries()), + _scale = domain ? scale.domain(domain) : scale, + key = void 0, + offset = void 0; + + // Define customized scale if categorized axis + + + // define functions + for (key in $$.isCategorized() ? (offset = offsetValue || function () { + return 0; + }, scale = function (d, raw) { + var v = _scale(d) + offset(d); + + return raw ? v : Math.ceil(v); + }) : scale = function (d, raw) { + var v = _scale(d); + + return raw ? v : Math.ceil(v); + }, _scale) scale[key] = _scale[key]; + + return scale.orgDomain = function () { + return _scale.domain(); + }, $$.isCategorized() && (scale.domain = function (domainValue) { + var domain = domainValue; + + return arguments.length ? (_scale.domain(domain), scale) : (domain = this.orgDomain(), [domain[0], domain[1] + 1]); + }), scale; + }, + getY: function getY(min, max, domain) { + var scale = this.getScale(min, max, this.isTimeSeriesY()); + + return domain && scale.domain(domain), scale; + }, + getYScale: function getYScale(id) { + return this.axis.getId(id) === "y2" ? this.y2 : this.y; + }, + getSubYScale: function getSubYScale(id) { + return this.axis.getId(id) === "y2" ? this.subY2 : this.subY; + }, + + + /** + * Update scale + * @private + * @param {Boolean} withoutTransitionAtInit - param is given at the init rendering + */ + updateScales: function updateScales(withoutTransitionAtInit) { + var $$ = this, + config = $$.config, + forInit = !$$.x; + + + // update edges + $$.xMin = config.axis_rotated ? 1 : 0, $$.xMax = config.axis_rotated ? $$.height : $$.width, $$.yMin = config.axis_rotated ? 0 : $$.height, $$.yMax = config.axis_rotated ? $$.width : 1, $$.subXMin = $$.xMin, $$.subXMax = $$.xMax, $$.subYMin = config.axis_rotated ? 0 : $$.height2, $$.subYMax = config.axis_rotated ? $$.width2 : 1, $$.x = $$.getX($$.xMin, $$.xMax, forInit ? undefined : $$.x.orgDomain(), function () { + return $$.xAxis.tickOffset(); + }), $$.y = $$.getY($$.yMin, $$.yMax, forInit ? config.axis_y_default : $$.y.domain()), $$.y2 = $$.getY($$.yMin, $$.yMax, forInit ? config.axis_y2_default : $$.y2.domain()), $$.subX = $$.getX($$.xMin, $$.xMax, $$.orgXDomain, function (d) { + return d % 1 ? 0 : $$.subXAxis.tickOffset(); + }), $$.subY = $$.getY($$.subYMin, $$.subYMax, forInit ? config.axis_y_default : $$.subY.domain()), $$.subY2 = $$.getY($$.subYMin, $$.subYMax, forInit ? config.axis_y2_default : $$.subY2.domain()), $$.xAxisTickFormat = $$.axis.getXAxisTickFormat(), $$.xAxisTickValues = $$.axis.getXAxisTickValues(), $$.yAxisTickValues = $$.axis.getYAxisTickValues(), $$.y2AxisTickValues = $$.axis.getY2AxisTickValues(), $$.xAxis = $$.axis.getXAxis($$.x, $$.xOrient, $$.xAxisTickFormat, $$.xAxisTickValues, config.axis_x_tick_outer, withoutTransitionAtInit), $$.subXAxis = $$.axis.getXAxis($$.subX, $$.subXOrient, $$.xAxisTickFormat, $$.xAxisTickValues, config.axis_x_tick_outer), $$.yAxis = $$.axis.getYAxis($$.y, $$.yOrient, config.axis_y_tick_format, $$.yAxisTickValues, config.axis_y_tick_outer), $$.y2Axis = $$.axis.getYAxis($$.y2, $$.y2Orient, config.axis_y2_tick_format, $$.y2AxisTickValues, config.axis_y2_tick_outer), $$.updateArc && $$.updateArc(); + } +}); /** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ + +/***/ }), +/* 47 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _d = __webpack_require__(2), + _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _classes = __webpack_require__(3), + _classes2 = _interopRequireDefault(_classes), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +(0, _util.extend)(_ChartInternal2.default.prototype, { + /** + * Select a point + * @private + * @param {Object} target point + * @param {Object} data + * @param {Number} index + */ + selectPoint: function selectPoint(target, d, i) { + var $$ = this, + config = $$.config, + cx = (config.axis_rotated ? $$.circleY : $$.circleX).bind($$), + cy = (config.axis_rotated ? $$.circleX : $$.circleY).bind($$), + r = $$.pointSelectR.bind($$); + config.data_onselected.call($$.api, d, target.node()), $$.main.select("." + _classes2.default.selectedCircles + $$.getTargetSelectorSuffix(d.id)).selectAll("." + _classes2.default.selectedCircle + "-" + i).data([d]).enter().append("circle").attr("class", function () { + return $$.generateClass(_classes2.default.selectedCircle, i); + }).attr("cx", cx).attr("cy", cy).attr("stroke", function () { + return $$.color(d); + }).attr("r", function (d2) { + return $$.pointSelectR(d2) * 1.4; + }).transition().duration(100).attr("r", r); + }, + + + /** + * Unelect a point + * @private + * @param {Object} target point + * @param {Object} data + * @param {Number} index + */ + unselectPoint: function unselectPoint(target, d, i) { + var $$ = this; + + $$.config.data_onunselected.call($$.api, d, target.node()), $$.main.select("." + _classes2.default.selectedCircles + $$.getTargetSelectorSuffix(d.id)).selectAll("." + _classes2.default.selectedCircle + "-" + i).transition().duration(100).attr("r", 0).remove(); + }, + + + /** + * Toggles the selection of points + * @private + * @param {Boolean} whether or not to select. + * @param {Object} target point + * @param {Object} data + * @param {Number} index + */ + togglePoint: function togglePoint(selected, target, d, i) { + selected ? this.selectPoint(target, d, i) : this.unselectPoint(target, d, i); + }, + + + /** + * Select a path + * @private + * @param {Object} target path + * @param {Object} data + */ + selectPath: function selectPath(target, d) { + var $$ = this; + + $$.config.data_onselected.call($$, d, target.node()), $$.config.interaction_brighten && target.transition().duration(100).style("fill", function () { + return (0, _d.rgb)($$.color(d)).brighter(0.75); + }); + }, + + + /** + * Unelect a path + * @private + * @param {Object} target path + * @param {Object} data + */ + unselectPath: function unselectPath(target, d) { + var $$ = this; + + $$.config.data_onunselected.call($$, d, target.node()), $$.config.interaction_brighten && target.transition().duration(100).style("fill", function () { + return $$.color(d); + }); + }, + + + /** + * Toggles the selection of lines + * @private + * @param {Boolean} whether or not to select. + * @param {Object} target shape + * @param {Object} data + * @param {Number} index + */ + togglePath: function togglePath(selected, target, d, i) { + selected ? this.selectPath(target, d, i) : this.unselectPath(target, d, i); + }, + + + /** + * Returns the toggle method of the target + * @private + * @param {Object} target shape + * @param {Object} data + * @returns {Function} toggle method + */ + getToggle: function getToggle(that, d) { + var $$ = this, + toggle = void 0; + + return that.nodeName === "circle" ? $$.isStepType(d) ? toggle = function () {} : toggle = $$.togglePoint : that.nodeName === "path" && (toggle = $$.togglePath), toggle; + }, + + + /** + * Toggles the selection of shapes + * @private + * @param {Object} target shape + * @param {Object} data + * @param {Number} index + */ + toggleShape: function toggleShape(that, d, i) { + var _this = this, + $$ = this, + config = $$.config, + shape = (0, _d.select)(that), + isSelected = shape.classed(_classes2.default.SELECTED), + toggle = $$.getToggle(that, d).bind($$); + + if (config.data_selection_enabled && config.data_selection_isselectable(d)) { + if (!config.data_selection_multiple) { + var selecter = "." + _classes2.default.shapes; + + config.data_selection_grouped && (selecter = "." + selecter + $$.getTargetSelectorSuffix(d.id)), $$.main.selectAll(selecter).selectAll("." + _classes2.default.shape).each(function (d, i) { + var shape = (0, _d.select)(_this); + + shape.classed(_classes2.default.SELECTED) && toggle(!1, shape.classed(_classes2.default.SELECTED, !1), d, i); + }); + } + shape.classed(_classes2.default.SELECTED, !isSelected), toggle(!isSelected, shape, d, i); + } + } +}); + +/***/ }), +/* 48 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _d = __webpack_require__(2), + _classes = __webpack_require__(3), + _classes2 = _interopRequireDefault(_classes), + _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +(0, _util.extend)(_ChartInternal2.default.prototype, { + initBar: function initBar() { + var $$ = this; + + $$.main.select("." + _classes2.default.chart).append("g").attr("class", _classes2.default.chartBars); + }, + updateTargetsForBar: function updateTargetsForBar(targets) { + var $$ = this, + config = $$.config, + classChartBar = $$.classChartBar.bind($$), + classBars = $$.classBars.bind($$), + classFocus = $$.classFocus.bind($$), + mainBarUpdate = $$.main.select("." + _classes2.default.chartBars).selectAll("." + _classes2.default.chartBar).data(targets).attr("class", function (d) { + return classChartBar(d) + classFocus(d); + }), + mainBarEnter = mainBarUpdate.enter().append("g").attr("class", classChartBar).style("opacity", "0").style("pointer-events", "none"); + + + // Bars for each data + mainBarEnter.append("g").attr("class", classBars).style("cursor", function (d) { + return config.data_selection_isselectable(d) ? "pointer" : null; + }); + }, + updateBar: function updateBar(durationForExit) { + var $$ = this, + barData = $$.barData.bind($$), + classBar = $$.classBar.bind($$), + initialOpacity = $$.initialOpacity.bind($$), + color = function (d) { + return $$.color(d.id); + }; + $$.mainBar = $$.main.selectAll("." + _classes2.default.bars).selectAll("." + _classes2.default.bar).data(barData), $$.mainBar.exit().transition().duration(durationForExit).style("opacity", "0").remove(), $$.mainBar = $$.mainBar.enter().append("path").attr("class", classBar).style("stroke", color).style("fill", color).merge($$.mainBar).style("opacity", initialOpacity); + }, + redrawBar: function redrawBar(drawBar, withTransition) { + return [(withTransition ? this.mainBar.transition(Math.random().toString()) : this.mainBar).attr("d", drawBar).style("fill", this.color).style("opacity", "1")]; + }, + getBarW: function getBarW(axis, barTargetsNum) { + var $$ = this, + config = $$.config, + w = typeof config.bar_width === "number" ? config.bar_width : barTargetsNum ? axis.tickInterval() * config.bar_width_ratio / barTargetsNum : 0; + + + return config.bar_width_max && w > config.bar_width_max ? config.bar_width_max : w; + }, + getBars: function getBars(i, id) { + var $$ = this, + suffix = (0, _util.isValue)(i) ? "-" + i : ""; + + + return (id ? $$.main.selectAll("." + _classes2.default.bars + $$.getTargetSelectorSuffix(id)) : $$.main).selectAll("." + _classes2.default.bar + suffix); + }, + expandBars: function expandBars(i, id, reset) { + var $$ = this; + + reset && $$.unexpandBars(), $$.getBars(i, id).classed(_classes2.default.EXPANDED, !0); + }, + unexpandBars: function unexpandBars(i) { + var $$ = this; + + $$.getBars(i).classed(_classes2.default.EXPANDED, !1); + }, + generateDrawBar: function generateDrawBar(barIndices, isSub) { + var $$ = this, + config = $$.config, + getPoints = $$.generateGetBarPoints(barIndices, isSub); + + + return function (d, i) { + // 4 points that make a bar + var points = getPoints(d, i), + indexX = config.axis_rotated ? 1 : 0, + indexY = config.axis_rotated ? 0 : 1, + path = "M " + points[0][indexX] + "," + points[0][indexY] + "\n\t\t\tL " + points[1][indexX] + "," + points[1][indexY] + "\n\t\t\tL " + points[2][indexX] + "," + points[2][indexY] + "\n\t\t\tL " + points[3][indexX] + "," + points[3][indexY] + " z"; + + // switch points if axis is rotated, not applicable for sub chart + + + return path; + }; + }, + generateGetBarPoints: function generateGetBarPoints(barIndices, isSub) { + var $$ = this, + axis = isSub ? $$.subXAxis : $$.xAxis, + barTargetsNum = barIndices.__max__ + 1, + barW = $$.getBarW(axis, barTargetsNum), + barX = $$.getShapeX(barW, barTargetsNum, barIndices, !!isSub), + barY = $$.getShapeY(!!isSub), + barOffset = $$.getShapeOffset($$.isBarType, barIndices, !!isSub), + yScale = isSub ? $$.getSubYScale : $$.getYScale; + + + return function (d, i) { + var y0 = yScale.call($$, d.id)(0), + offset = barOffset(d, i) || y0, + posX = barX(d), + posY = barY(d); // offset is for stacked bar chart + + + // fix posY not to overflow opposite quadrant + + // 4 points that make a bar + return $$.config.axis_rotated && (d.value > 0 && posY < y0 || d.value < 0 && y0 < posY) && (posY = y0), [[posX, offset], [posX, posY - (y0 - offset)], [posX + barW, posY - (y0 - offset)], [posX + barW, offset]]; + }; + }, + isWithinBar: function isWithinBar(that) { + var mouse = (0, _d.mouse)(that), + list = (0, _util.getRectSegList)(that), + box = that.getBBox(), + seg0 = list[0], + seg1 = list[1], + x = Math.min(seg0.x, seg1.x), + y = Math.min(seg0.y, seg1.y), + w = box.width, + h = box.height, + offset = 2, + isIn = x - offset < mouse[0] && mouse[0] < x + w + offset && y - offset < mouse[1] && mouse[1] < y + h + offset; + + + return isIn; + } +}); + +/***/ }), +/* 49 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _d = __webpack_require__(2), + _classes = __webpack_require__(3), + _classes2 = _interopRequireDefault(_classes), + _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +(0, _util.extend)(_ChartInternal2.default.prototype, { + getShapeIndices: function getShapeIndices(typeFilter) { + var $$ = this, + config = $$.config, + indices = {}, + i = 0, + j = void 0, + k = void 0; + + return $$.filterTargetsToShow($$.data.targets.filter(typeFilter, $$)).forEach(function (d) { + for (j = 0; j < config.data_groups.length; j++) if (!(config.data_groups[j].indexOf(d.id) < 0)) for (k = 0; k < config.data_groups[j].length; k++) if (config.data_groups[j][k] in indices) { + indices[d.id] = indices[config.data_groups[j][k]]; + + break; + } + (0, _util.isUndefined)(indices[d.id]) && (indices[d.id] = i++); + }), indices.__max__ = i - 1, indices; + }, + getShapeX: function getShapeX(offset, targetsNum, indices, isSub) { + var $$ = this, + scale = isSub ? $$.subX : $$.x; + + + return function (d) { + var index = d.id in indices ? indices[d.id] : 0; + + return d.x || d.x === 0 ? scale(d.x) - offset * (targetsNum / 2 - index) : 0; + }; + }, + getShapeY: function getShapeY(isSub) { + var $$ = this; + + return function (d) { + var scale = isSub ? $$.getSubYScale(d.id) : $$.getYScale(d.id); + + return scale(d.value); + }; + }, + getShapeOffset: function getShapeOffset(typeFilter, indices, isSub) { + var $$ = this, + targets = $$.orderTargets($$.filterTargetsToShow($$.data.targets.filter(typeFilter, $$))), + targetIds = targets.map(function (t) { + return t.id; + }); + + + return function (d, idx) { + var scale = isSub ? $$.getSubYScale(d.id) : $$.getYScale(d.id), + y0 = scale(0), + offset = y0, + i = idx; + + return targets.forEach(function (t) { + var values = $$.isStepType(d) ? $$.convertValuesToStep(t.values) : t.values; + + t.id === d.id || indices[t.id] !== indices[d.id] || targetIds.indexOf(t.id) < targetIds.indexOf(d.id) && ((typeof values[i] === "undefined" || +values[i].x !== +d.x) && (i = -1, values.forEach(function (v, j) { + v.x === d.x && (i = j); + })), i in values && values[i].value * d.value >= 0 && (offset += scale(values[i].value) - y0)); + }), offset; + }; + }, + isWithinShape: function isWithinShape(that, d) { + var $$ = this, + shape = (0, _d.select)(that), + isWithin = void 0; + + return $$.isTargetToShow(d.id) ? that.nodeName === "circle" ? isWithin = $$.isStepType(d) ? $$.isWithinStep(that, $$.getYScale(d.id)(d.value)) : $$.isWithinCircle(that, $$.pointSelectR(d) * 1.5) : that.nodeName === "path" && (isWithin = !shape.classed(_classes2.default.bar) || $$.isWithinBar(that)) : isWithin = !1, isWithin; + }, + getInterpolate: function getInterpolate(d) { + var $$ = this, + interpolation = $$.getInterpolateType(d); + + + return { + "basis": _d.curveBasis, + "basis-closed": _d.curveBasisClosed, + "basis-open": _d.curveBasisOpen, + "bundle": _d.curveBundle, + "cardinal": _d.curveCardinal, + "cardinal-closed": _d.curveCardinalClosed, + "cardinal-open": _d.curveCardinalOpen, + "catmull-rom": _d.curveCatmullRom, + "catmull-rom-closed": _d.curveCatmullRomClosed, + "catmull-rom-open": _d.curveCatmullRomOpen, + "monotone-x": _d.curveMonotoneX, + "monotone-y": _d.curveMonotoneY, + "natural": _d.curveNatural, + "linear-closed": _d.curveLinearClosed, + "linear": _d.curveLinear, + "step": _d.curveStep + }[interpolation]; + }, + getInterpolateType: function getInterpolateType(d) { + var $$ = this, + interpolation = $$.isInterpolationType($$.config.spline_interpolation_type) ? $$.config.spline_interpolation_type : "cardinal"; + + return interpolation = $$.isSplineType(d) ? interpolation : $$.isStepType(d) ? $$.config.line_step_type : "linear", interpolation; + } +}); + +/***/ }), +/* 50 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _d = __webpack_require__(2), + _classes = __webpack_require__(3), + _classes2 = _interopRequireDefault(_classes), + _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +(0, _util.extend)(_ChartInternal2.default.prototype, { + initLine: function initLine() { + var $$ = this; + + $$.main.select("." + _classes2.default.chart).append("g").attr("class", _classes2.default.chartLines); + }, + updateTargetsForLine: function updateTargetsForLine(targets) { + var $$ = this, + config = $$.config, + classChartLine = $$.classChartLine.bind($$), + classLines = $$.classLines.bind($$), + classAreas = $$.classAreas.bind($$), + classCircles = $$.classCircles.bind($$), + classFocus = $$.classFocus.bind($$), + mainLineUpdate = $$.main.select("." + _classes2.default.chartLines).selectAll("." + _classes2.default.chartLine).data(targets).attr("class", function (d) { + return classChartLine(d) + classFocus(d); + }), + mainLineEnter = mainLineUpdate.enter().append("g").attr("class", classChartLine).style("opacity", "0").style("pointer-events", "none"); + + + // Lines for each data + mainLineEnter.append("g").attr("class", classLines), mainLineEnter.append("g").attr("class", classAreas), mainLineEnter.append("g").attr("class", function (d) { + return $$.generateClass(_classes2.default.selectedCircles, d.id); + }), mainLineEnter.append("g").attr("class", classCircles).style("cursor", function (d) { + return config.data_selection_isselectable(d) ? "pointer" : null; + }), targets.forEach(function (t) { + $$.main.selectAll("." + _classes2.default.selectedCircles + $$.getTargetSelectorSuffix(t.id)).selectAll("" + _classes2.default.selectedCircle).each(function (d) { + d.value = t.values[d.index].value; + }); + }); + }, + updateLine: function updateLine(durationForExit) { + var $$ = this; + + $$.mainLine = $$.main.selectAll("." + _classes2.default.lines).selectAll("." + _classes2.default.line).data($$.lineData.bind($$)), $$.mainLine.exit().transition().duration(durationForExit).style("opacity", "0").remove(), $$.mainLine = $$.mainLine.enter().append("path").attr("class", $$.classLine.bind($$)).style("stroke", $$.color).merge($$.mainLine).style("opacity", $$.initialOpacity.bind($$)).style("shape-rendering", function (d) { + return $$.isStepType(d) ? "crispEdges" : ""; + }).attr("transform", null); + }, + redrawLine: function redrawLine(drawLine, withTransition) { + return [(withTransition ? this.mainLine.transition(Math.random().toString()) : this.mainLine).attr("d", drawLine).style("stroke", this.color).style("opacity", "1")]; + }, + generateDrawLine: function generateDrawLine(lineIndices, isSub) { + var $$ = this, + config = $$.config, + getPoints = $$.generateGetLinePoints(lineIndices, isSub), + yScaleGetter = isSub ? $$.getSubYScale : $$.getYScale, + xValue = function (d) { + return (isSub ? $$.subxx : $$.xx).call($$, d); + }, + yValue = function (d, i) { + return config.data_groups.length > 0 ? getPoints(d, i)[0][1] : yScaleGetter.call($$, d.id)(d.value); + }, + line = (0, _d.line)(); + + + return line = config.axis_rotated ? line.x(yValue).y(xValue) : line.x(xValue).y(yValue), config.line_connectNull || (line = line.defined(function (d) { + return d.value !== null; + })), function (d) { + var x = isSub ? $$.x : $$.subX, + y = yScaleGetter.call($$, d.id), + values = config.line_connectNull ? $$.filterRemoveNull(d.values) : d.values, + x0 = 0, + y0 = 0, + path = void 0; + + return $$.isLineType(d) ? config.data_regions[d.id] ? path = $$.lineWithRegions(values, x, y, config.data_regions[d.id]) : ($$.isStepType(d) && (values = $$.convertValuesToStep(values)), path = line.curve($$.getInterpolate(d))(values)) : (values[0] && (x0 = x(values[0].x), y0 = y(values[0].value)), path = config.axis_rotated ? "M " + y0 + " " + x0 : "M " + x0 + " " + y0), path || "M 0 0"; + }; + }, + generateGetLinePoints: function generateGetLinePoints(lineIndices, isSub) { + // partial duplication of generateGetBarPoints + var $$ = this, + config = $$.config, + lineTargetsNum = lineIndices.__max__ + 1, + x = $$.getShapeX(0, lineTargetsNum, lineIndices, !!isSub), + y = $$.getShapeY(!!isSub), + lineOffset = $$.getShapeOffset($$.isLineType, lineIndices, !!isSub), + yScale = isSub ? $$.getSubYScale : $$.getYScale; + + + return function (d, i) { + var y0 = yScale.call($$, d.id)(0), + offset = lineOffset(d, i) || y0, + posX = x(d), + posY = y(d); // offset is for stacked area chart + + + // fix posY not to overflow opposite quadrant + + // 1 point that marks the line position + return config.axis_rotated && (d.value > 0 && posY < y0 || d.value < 0 && y0 < posY) && (posY = y0), [[posX, posY - (y0 - offset)], [posX, posY - (y0 - offset)], // needed for compatibility + [posX, posY - (y0 - offset)], // needed for compatibility + [posX, posY - (y0 - offset)] // needed for compatibility + ]; + }; + }, + lineWithRegions: function lineWithRegions(d, x, y, _regions) { + + function isWithinRegions(withinX, withinRegions) { + var idx = void 0; + + for (idx = 0; idx < withinRegions.length; idx++) if (withinRegions[idx].start < withinX && withinX <= withinRegions[idx].end) return !0; + return !1; + } + + // Check start/end of regions + + + // Define svg generator function for region + function generateM(points) { + return "M" + points[0][0] + " " + points[0][1] + " " + points[1][0] + " " + points[1][1]; + } + + var $$ = this, + config = $$.config, + xOffset = $$.isCategorized() ? 0.5 : 0, + regions = [], + i = void 0, + j = void 0, + s = "M", + sWithRegion = void 0, + xp = void 0, + yp = void 0, + dx = void 0, + dy = void 0, + dd = void 0, + diff = void 0, + diffx2 = void 0; + if ((0, _util.isDefined)(_regions)) for (i = 0; i < _regions.length; i++) regions[i] = {}, regions[i].start = (0, _util.isUndefined)(_regions[i].start) ? d[0].x : $$.isTimeSeries() ? $$.parseDate(_regions[i].start) : _regions[i].start, regions[i].end = (0, _util.isUndefined)(_regions[i].end) ? d[d.length - 1].x : $$.isTimeSeries() ? $$.parseDate(_regions[i].end) : _regions[i].end; + + // Set scales + var xValue = config.axis_rotated ? function (dt) { + return y(dt.value); + } : function (dt) { + return x(dt.x); + }, + yValue = config.axis_rotated ? function (dt) { + return x(dt.x); + } : function (dt) { + return y(dt.value); + }; + + // Generate + for (sWithRegion = $$.isTimeSeries() ? function (d0, d1, k, timeseriesDiff) { + var x0 = d0.x.getTime(), + xDiff = d1.x - d0.x, + xv0 = new Date(x0 + xDiff * k), + xv1 = new Date(x0 + xDiff * (k + timeseriesDiff)), + points = void 0; + + return points = config.axis_rotated ? [[y(yp(k)), x(xv0)], [y(yp(k + diff)), x(xv1)]] : [[x(xv0), y(yp(k))], [x(xv1), y(yp(k + diff))]], generateM(points); + } : function (d0, d1, k, otherDiff) { + var points = void 0; + + return points = config.axis_rotated ? [[y(yp(k), !0), x(xp(k))], [y(yp(k + otherDiff), !0), x(xp(k + otherDiff))]] : [[x(xp(k), !0), y(yp(k))], [x(xp(k + otherDiff), !0), y(yp(k + otherDiff))]], generateM(points); + }, i = 0; i < d.length; i++) + // Draw as normal + if ((0, _util.isUndefined)(regions) || !isWithinRegions(d[i].x, regions)) s += " " + xValue(d[i]) + " " + yValue(d[i]);else for (xp = $$.getScale(d[i - 1].x + xOffset, d[i].x + xOffset, $$.isTimeSeries()), yp = $$.getScale(d[i - 1].value, d[i].value), dx = x(d[i].x) - x(d[i - 1].x), dy = y(d[i].value) - y(d[i - 1].value), dd = Math.sqrt(Math.pow(dx, 2) + Math.pow(dy, 2)), diff = 2 / dd, diffx2 = diff * 2, j = diff; j <= 1; j += diffx2) s += sWithRegion(d[i - 1], d[i], j, diff); + + return s; + }, + updateArea: function updateArea(durationForExit) { + var $$ = this; + + $$.mainArea = $$.main.selectAll("." + _classes2.default.areas).selectAll("." + _classes2.default.area).data($$.lineData.bind($$)), $$.mainArea.exit().transition().duration(durationForExit).style("opacity", "0").remove(), $$.mainArea = $$.mainArea.enter().append("path").attr("class", $$.classArea.bind($$)).style("fill", $$.color).style("opacity", function () { + return $$.orgAreaOpacity = (0, _d.select)(this).style("opacity"), "0"; + }).merge($$.mainArea), $$.mainArea.style("opacity", $$.orgAreaOpacity); + }, + redrawArea: function redrawArea(drawArea, withTransition) { + return [(withTransition ? this.mainArea.transition(Math.random().toString()) : this.mainArea).attr("d", drawArea).style("fill", this.color).style("opacity", this.orgAreaOpacity)]; + }, + generateDrawArea: function generateDrawArea(areaIndices, isSub) { + var $$ = this, + config = $$.config, + getPoints = $$.generateGetAreaPoints(areaIndices, isSub), + yScaleGetter = isSub ? $$.getSubYScale : $$.getYScale, + xValue = function (d) { + return (isSub ? $$.subxx : $$.xx).call($$, d); + }, + value0 = function (d, i) { + return config.data_groups.length > 0 ? getPoints(d, i)[0][1] : yScaleGetter.call($$, d.id)($$.getAreaBaseValue(d.id)); + }, + value1 = function (d, i) { + return config.data_groups.length > 0 ? getPoints(d, i)[1][1] : yScaleGetter.call($$, d.id)(d.value); + }, + area = (0, _d.area)(); + + + return area = config.axis_rotated ? area.x0(value0).x1(value1).y(xValue) : area.x(xValue).y0(config.area_above ? 0 : value0).y1(value1), config.line_connectNull || (area = area.defined(function (d) { + return d.value !== null; + })), function (d) { + var values = config.line_connectNull ? $$.filterRemoveNull(d.values) : d.values, + x0 = 0, + y0 = 0, + path = void 0; + + return $$.isAreaType(d) ? ($$.isStepType(d) && (values = $$.convertValuesToStep(values)), path = area.curve($$.getInterpolate(d))(values)) : (values[0] && (x0 = $$.x(values[0].x), y0 = $$.getYScale(d.id)(values[0].value)), path = config.axis_rotated ? "M " + y0 + " " + x0 : "M " + x0 + " " + y0), path || "M 0 0"; + }; + }, + getAreaBaseValue: function getAreaBaseValue() { + return 0; + }, + generateGetAreaPoints: function generateGetAreaPoints(areaIndices, isSub) { + // partial duplication of generateGetBarPoints + var $$ = this, + config = $$.config, + areaTargetsNum = areaIndices.__max__ + 1, + x = $$.getShapeX(0, areaTargetsNum, areaIndices, !!isSub), + y = $$.getShapeY(!!isSub), + areaOffset = $$.getShapeOffset($$.isAreaType, areaIndices, !!isSub), + yScale = isSub ? $$.getSubYScale : $$.getYScale; + + + return function (d, i) { + var y0 = yScale.call($$, d.id)(0), + offset = areaOffset(d, i) || y0, + posX = x(d), + posY = y(d); // offset is for stacked area chart + + + // fix posY not to overflow opposite quadrant + + + // 1 point that marks the area position + return config.axis_rotated && (d.value > 0 && posY < y0 || d.value < 0 && y0 < posY) && (posY = y0), [[posX, offset], [posX, posY - (y0 - offset)], [posX, posY - (y0 - offset)], // needed for compatibility + [posX, offset] // needed for compatibility + ]; + }; + }, + updateCircle: function updateCircle() { + var $$ = this; + + $$.mainCircle = $$.main.selectAll("." + _classes2.default.circles).selectAll("." + _classes2.default.circle).data($$.lineOrScatterData.bind($$)), $$.mainCircle.exit().remove(), $$.mainCircle = $$.mainCircle.enter().append("circle").attr("class", $$.classCircle.bind($$)).attr("r", $$.pointR.bind($$)).style("fill", $$.color).merge($$.mainCircle).style("opacity", $$.initialOpacityForCircle.bind($$)); + }, + redrawCircle: function redrawCircle(cx, cy, withTransition, flow) { + var selectedCircles = this.main.selectAll("." + _classes2.default.selectedCircle), + mainCircles = void 0; + + + if (withTransition) { + var transitionName = Math.random().toString(); + + mainCircles = flow ? this.mainCircle.attr("cx", cx).transition(transitionName).attr("cx", cx).attr("cy", cy).transition(transitionName).style("opacity", this.opacityForCircle.bind(this)).style("fill", this.color) : this.mainCircle.transition(transitionName).attr("cx", cx).attr("cy", cy).transition(transitionName).style("opacity", this.opacityForCircle.bind(this)).style("fill", this.color), selectedCircles = selectedCircles.transition(Math.random().toString()); + } else mainCircles = this.mainCircle.attr("cx", cx).attr("cy", cy).style("opacity", this.opacityForCircle.bind(this)).style("fill", this.color); + + return [mainCircles, selectedCircles.attr("cx", cx).attr("cy", cy)]; + }, + circleX: function circleX(d) { + return this.config.zoom_enabled && this.zoomScale ? d.x || d.x === 0 ? this.zoomScale(d.x) : null : d.x || d.x === 0 ? this.x(d.x) : null; + }, + updateCircleY: function updateCircleY() { + var $$ = this, + lineIndices = void 0, + getPoints = void 0; + $$.config.data_groups.length > 0 ? (lineIndices = $$.getShapeIndices($$.isLineType), getPoints = $$.generateGetLinePoints(lineIndices), $$.circleY = function (d, i) { + return getPoints(d, i)[0][1]; + }) : $$.circleY = function (d) { + return $$.getYScale(d.id)(d.value); + }; + }, + getCircles: function getCircles(i, id) { + var $$ = this, + suffix = (0, _util.isValue)(i) ? "-" + i : ""; + + + return (id ? $$.main.selectAll("." + _classes2.default.circles + $$.getTargetSelectorSuffix(id)) : $$.main).selectAll("." + _classes2.default.circle + suffix); + }, + expandCircles: function expandCircles(i, id, reset) { + var $$ = this, + r = $$.pointExpandedR.bind($$); + reset && $$.unexpandCircles(), $$.getCircles(i, id).classed(_classes2.default.EXPANDED, !0).attr("r", r); + }, + unexpandCircles: function unexpandCircles(i) { + var $$ = this, + r = $$.pointR.bind($$); + $$.getCircles(i).filter(function () { + return (0, _d.select)(this).classed(_classes2.default.EXPANDED); + }).classed(_classes2.default.EXPANDED, !1).attr("r", r); + }, + pointR: function pointR(d) { + var $$ = this, + config = $$.config; + + + return $$.isStepType(d) ? 0 : (0, _util.isFunction)(config.point_r) ? config.point_r(d) : config.point_r; + }, + pointExpandedR: function pointExpandedR(d) { + var $$ = this, + config = $$.config; + + + return config.point_focus_expand_enabled ? config.point_focus_expand_r ? config.point_focus_expand_r : $$.pointR(d) * 1.75 : $$.pointR(d); + }, + pointSelectR: function pointSelectR(d) { + var $$ = this, + config = $$.config; + + + return (0, _util.isFunction)(config.point_select_r) ? config.point_select_r(d) : config.point_select_r ? config.point_select_r : $$.pointR(d) * 4; + }, + isWithinCircle: function isWithinCircle(that, r) { + var mouse = (0, _d.mouse)(that), + d3This = (0, _d.select)(that), + cx = +d3This.attr("cx"), + cy = +d3This.attr("cy"); + + + return Math.sqrt(Math.pow(cx - mouse[0], 2) + Math.pow(cy - mouse[1], 2)) < r; + }, + isWithinStep: function isWithinStep(that, y) { + return Math.abs(y - (0, _d.mouse)(that)[1]) < 30; + } +}); + +/***/ }), +/* 51 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _classes = __webpack_require__(3), + _classes2 = _interopRequireDefault(_classes), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +(0, _util.extend)(_ChartInternal2.default.prototype, { + getCurrentWidth: function getCurrentWidth() { + var $$ = this, + config = $$.config; + + + return config.size_width ? config.size_width : $$.getParentWidth(); + }, + getCurrentHeight: function getCurrentHeight() { + var $$ = this, + config = $$.config, + h = config.size_height ? config.size_height : $$.getParentHeight(); + + + return h > 0 ? h : 320 / ($$.hasType("gauge") && !config.gauge_fullCircle ? 2 : 1); + }, + getCurrentPaddingTop: function getCurrentPaddingTop() { + var $$ = this, + config = $$.config, + padding = (0, _util.isValue)(config.padding_top) ? config.padding_top : 0; + + + return $$.title && $$.title.node() && (padding += $$.getTitlePadding()), padding; + }, + getCurrentPaddingBottom: function getCurrentPaddingBottom() { + var config = this.config; + + return (0, _util.isValue)(config.padding_bottom) ? config.padding_bottom : 0; + }, + getCurrentPaddingLeft: function getCurrentPaddingLeft(withoutRecompute) { + var $$ = this, + config = $$.config, + paddingLeft = void 0; + + + return paddingLeft = (0, _util.isValue)(config.padding_left) ? config.padding_left : config.axis_rotated ? config.axis_x_show ? Math.max((0, _util.ceil10)($$.getAxisWidthByAxisId("x", withoutRecompute)), 40) : 1 : !config.axis_y_show || config.axis_y_inner ? $$.axis.getYAxisLabelPosition().isOuter ? 30 : 1 : (0, _util.ceil10)($$.getAxisWidthByAxisId("y", withoutRecompute)), paddingLeft; + }, + getCurrentPaddingRight: function getCurrentPaddingRight() { + var $$ = this, + config = $$.config, + legendWidthOnRight = $$.isLegendRight ? $$.getLegendWidth() + 20 : 0, + paddingRight = void 0; + + + return paddingRight = (0, _util.isValue)(config.padding_right) ? config.padding_right + 1 : config.axis_rotated ? 10 + legendWidthOnRight : !config.axis_y2_show || config.axis_y2_inner ? 2 + legendWidthOnRight + ($$.axis.getY2AxisLabelPosition().isOuter ? 20 : 0) : (0, _util.ceil10)($$.getAxisWidthByAxisId("y2")) + legendWidthOnRight, paddingRight; + }, + getParentRectValue: function getParentRectValue(key) { + for (var parent = this.selectChart.node(), v = void 0; parent && parent.tagName !== "BODY";) { + try { + v = parent.getBoundingClientRect()[key]; + } catch (e) { + key === "width" && (v = parent.offsetWidth); + } + + if (v) break; + + parent = parent.parentNode; + } + + return v; + }, + getParentWidth: function getParentWidth() { + return this.getParentRectValue("width"); + }, + getParentHeight: function getParentHeight() { + var h = this.selectChart.style("height"); + + return h.indexOf("px") > 0 ? +h.replace("px", "") : 0; + }, + getSvgLeft: function getSvgLeft(withoutRecompute) { + var $$ = this, + config = $$.config, + hasLeftAxisRect = config.axis_rotated || !config.axis_rotated && !config.axis_y_inner, + leftAxisClass = config.axis_rotated ? _classes2.default.axisX : _classes2.default.axisY, + leftAxis = $$.main.select("." + leftAxisClass).node(), + svgRect = leftAxis && hasLeftAxisRect ? leftAxis.getBoundingClientRect() : { right: 0 }, + chartRect = $$.selectChart.node().getBoundingClientRect(), + hasArc = $$.hasArcType(), + svgLeft = svgRect.right - chartRect.left - (hasArc ? 0 : $$.getCurrentPaddingLeft(withoutRecompute)); + + + return svgLeft > 0 ? svgLeft : 0; + }, + getAxisWidthByAxisId: function getAxisWidthByAxisId(id, withoutRecompute) { + var $$ = this, + position = $$.axis.getLabelPositionById(id); + + + return $$.axis.getMaxTickWidth(id, withoutRecompute) + (position.isInner ? 20 : 40); + }, + getHorizontalAxisHeight: function getHorizontalAxisHeight(axisId) { + var $$ = this, + config = $$.config, + h = 30; + + + // Calculate x axis height when tick rotated + return axisId !== "x" || config.axis_x_show ? axisId === "x" && config.axis_x_height ? config.axis_x_height : axisId !== "y" || config.axis_y_show ? axisId !== "y2" || config.axis_y2_show ? (axisId === "x" && !config.axis_rotated && config.axis_x_tick_rotate && (h = 30 + $$.axis.getMaxTickWidth(axisId) * Math.cos(Math.PI * (90 - config.axis_x_tick_rotate) / 180)), axisId === "y" && config.axis_rotated && config.axis_y_tick_rotate && (h = 30 + $$.axis.getMaxTickWidth(axisId) * Math.cos(Math.PI * (90 - config.axis_y_tick_rotate) / 180)), h + ($$.axis.getLabelPositionById(axisId).isInner ? 0 : 10) + (axisId === "y2" ? -10 : 0)) : $$.rotated_padding_top : !config.legend_show || $$.isLegendRight || $$.isLegendInset ? 1 : 10 : 8; + }, + getEventRectWidth: function getEventRectWidth() { + return Math.max(0, this.xAxis.tickInterval()); + } +}); /** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ + +/***/ }), +/* 52 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _d = __webpack_require__(2), + _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _classes = __webpack_require__(3), + _classes2 = _interopRequireDefault(_classes), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +(0, _util.extend)(_ChartInternal2.default.prototype, { + /** + * Initializes the text + * @private + */ + initText: function initText() { + var $$ = this; + + $$.main.select("." + _classes2.default.chart).append("g").attr("class", _classes2.default.chartTexts), $$.mainText = (0, _d.selectAll)([]); + }, + + + /** + * Update chartText + * @private + * @param {Object} $$.data.targets + */ + updateTargetsForText: function updateTargetsForText(targets) { + var $$ = this, + classChartText = $$.classChartText.bind($$), + classTexts = $$.classTexts.bind($$), + classFocus = $$.classFocus.bind($$), + mainTextUpdate = $$.main.select("." + _classes2.default.chartTexts).selectAll("." + _classes2.default.chartText).data(targets).attr("class", function (d) { + return classChartText(d) + classFocus(d); + }), + mainTextEnter = mainTextUpdate.enter().append("g").attr("class", classChartText).style("opacity", "0").style("pointer-events", "none"); + mainTextEnter.append("g").attr("class", classTexts); + }, + + + /** + * Update text + * @private + * @param {Number} Fade-out transition duration + */ + updateText: function updateText(durationForExit) { + var $$ = this, + config = $$.config, + barOrLineData = $$.barOrLineData.bind($$), + classText = $$.classText.bind($$); + $$.mainText = $$.main.selectAll("." + _classes2.default.texts).selectAll("." + _classes2.default.text).data(barOrLineData), $$.mainText.exit().transition().duration(durationForExit).style("fill-opacity", "0").remove(), $$.mainText = $$.mainText.enter().append("text").attr("class", classText).attr("text-anchor", function (d) { + return config.axis_rotated ? d.value < 0 ? "end" : "start" : "middle"; + }).style("stroke", "none").style("fill", function (d) { + return $$.color(d); + }).style("fill-opacity", "0").merge($$.mainText).text(function (d, i, j) { + return $$.dataLabelFormat(d.id)(d.value, d.id, i, j); + }); + }, + + + /** + * Redraw chartText + * @private + * @param {Number} x Attribute + * @param {Number} y Attribute + * @param {Object} options.flow + * @param {Boolean} indicates transition is enabled + * @returns {Object} $$.mainText + */ + redrawText: function redrawText(xForText, yForText, forFlow, withTransition) { + return [(withTransition ? this.mainText.transition() : this.mainText).attr("x", xForText).attr("y", yForText).style("fill", this.color).style("fill-opacity", forFlow ? 0 : this.opacityForText.bind(this))]; + }, + + + /** + * Gets the getBoundingClientRect value of the element + * @private + * @param {String} text + * @param {String} class + * @param {HTMLElement} element + * @returns {Object} value of element.getBoundingClientRect() + */ + getTextRect: function getTextRect(text, cls, element) { + var dummy = (0, _d.select)("body").append("div").classed("bb", !0), + svg = dummy.append("svg").style("visibility", "hidden").style("position", "fixed").style("top", "0px").style("left", "0px"), + font = (0, _d.select)(element).style("font"), + rect = void 0; + + return svg.selectAll(".dummy").data([text]).enter().append("text").classed(cls ? cls : "", !0).style("font", font).text(text).each(function () { + rect = this.getBoundingClientRect(); + }), dummy.remove(), rect; + }, + + + /** + * Gets the x or y coordinate of the text + * @private + * @param {Object} area Indices + * @param {Object} bar Indices + * @param {Object} line Indices + * @param {Boolean} whether or not to x + * @returns {Number} coordinates + */ + generateXYForText: function generateXYForText(areaIndices, barIndices, lineIndices, forX) { + var $$ = this, + getAreaPoints = $$.generateGetAreaPoints(areaIndices, !1), + getBarPoints = $$.generateGetBarPoints(barIndices, !1), + getLinePoints = $$.generateGetLinePoints(lineIndices, !1), + getter = forX ? $$.getXForText : $$.getYForText; + + + return function (d, i) { + var getPoints = $$.isBarType(d) ? getBarPoints : getLinePoints; + + return getPoints = $$.isAreaType(d) ? getAreaPoints : getPoints, getter.call($$, getPoints(d, i), d, this); + }; + }, + + + /** + * Gets the x coordinate of the text + * @private + * @param {Object} points + * @param {Object} data + * @param {HTMLElement} element + * @returns {Number} x coordinate + */ + getXForText: function getXForText(points, d, textElement) { + var $$ = this, + box = textElement.getBoundingClientRect(), + xPos = void 0, + padding = void 0; + + return $$.config.axis_rotated ? (padding = $$.isBarType(d) ? 4 : 6, xPos = points[2][1] + padding * (d.value < 0 ? -1 : 1)) : xPos = $$.hasType("bar") ? (points[2][0] + points[0][0]) / 2 : points[0][0], d.value === null && (xPos > $$.width ? xPos = $$.width - box.width : xPos < 0 && (xPos = 4)), xPos; + }, + + + /** + * Gets the y coordinate of the text + * @private + * @param {Object} points + * @param {Object} data + * @param {HTMLElement} element + * @returns {Number} y coordinate + */ + getYForText: function getYForText(points, d, textElement) { + var $$ = this, + box = textElement.getBoundingClientRect(), + yPos = void 0; + + return $$.config.axis_rotated ? yPos = (points[0][0] + points[2][0] + box.height * 0.6) / 2 : (yPos = points[2][1], d.value < 0 || d.value === 0 && !$$.hasPositiveValue ? (yPos += box.height, $$.isBarType(d) && $$.isSafari() ? yPos -= 3 : !$$.isBarType(d) && $$.isChrome() && (yPos += 3)) : yPos += $$.isBarType(d) ? -3 : -6), d.value !== null || $$.config.axis_rotated || (yPos < box.height ? yPos = box.height : yPos > this.height && (yPos = this.height - 4)), yPos; + } +}); + +/***/ }), +/* 53 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +(0, _util.extend)(_ChartInternal2.default.prototype, { + /** + * Initializes the title + * @private + */ + initTitle: function initTitle() { + var $$ = this; + + $$.title = $$.svg.append("text").text($$.config.title_text).attr("class", $$.CLASS.title); + }, + + + /** + * Redraw title + * @private + */ + redrawTitle: function redrawTitle() { + var $$ = this; + + $$.title.attr("x", $$.xForTitle.bind($$)).attr("y", $$.yForTitle.bind($$)); + }, + + + /** + * Returns the x attribute value of the title + * @private + * @returns {Number} x attribute value + */ + xForTitle: function xForTitle() { + var $$ = this, + config = $$.config, + position = config.title_position || "left", + x = void 0; + + + return x = position.indexOf("right") >= 0 ? $$.currentWidth - $$.getTextRect($$.title.node().textContent, $$.CLASS.title, $$.title.node()).width - config.title_padding.right : position.indexOf("center") >= 0 ? ($$.currentWidth - $$.getTextRect($$.title.node().textContent, $$.CLASS.title, $$.title.node()).width) / 2 : config.title_padding.left, x; + }, + + + /** + * Returns the y attribute value of the title + * @private + * @returns {Number} y attribute value + */ + yForTitle: function yForTitle() { + var $$ = this; + + return $$.config.title_padding.top + $$.getTextRect($$.title.node().textContent, $$.CLASS.title, $$.title.node()).height; + }, + + + /** + * Get title padding + * @private + * @returns {Number} padding value + */ + getTitlePadding: function getTitlePadding() { + var $$ = this; + + return $$.yForTitle() + $$.config.title_padding.bottom; + } +}); + +/***/ }), +/* 54 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _d = __webpack_require__(2), + _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _classes = __webpack_require__(3), + _classes2 = _interopRequireDefault(_classes), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +(0, _util.extend)(_ChartInternal2.default.prototype, { + /** + * Initializes the tooltip + * @private + */ + initTooltip: function initTooltip() { + var $$ = this, + config = $$.config, + i = void 0; + + + // Show tooltip if needed + if ($$.tooltip = $$.selectChart.style("position", "relative").append("div").attr("class", _classes2.default.tooltipContainer).style("position", "absolute").style("pointer-events", "none").style("display", "none"), config.tooltip_init_show) { + if ($$.isTimeSeries() && (0, _util.isString)(config.tooltip_init_x)) { + + for (config.tooltip_init_x = $$.parseDate(config.tooltip_init_x), i = 0; i < $$.data.targets[0].values.length && $$.data.targets[0].values[i].x - config.tooltip_init_x !== 0; i++); + + config.tooltip_init_x = i; + } + + $$.tooltip.html(config.tooltip_contents.call($$, $$.data.targets.map(function (d) { + return $$.addName(d.values[config.tooltip_init_x]); + }), $$.axis.getXAxisTickFormat(), $$.getYFormat($$.hasArcType()), $$.color)), $$.tooltip.style("top", config.tooltip_init_position.top).style("left", config.tooltip_init_position.left).style("display", "block"); + } + }, + + /** + * Returns the tooltip content(HTML string) + * @private + * @param {Object} data + * @param {Function} default title format + * @param {Function} default format for each data value in the tooltip. + * @param {Object} $$.color(generateColor()) + * @returns {string} html + */ + getTooltipContent: function getTooltipContent(d, defaultTitleFormat, defaultValueFormat, color) { + var $$ = this, + config = $$.config, + titleFormat = config.tooltip_format_title || defaultTitleFormat, + nameFormat = config.tooltip_format_name || function (name) { + return name; + }, + valueFormat = config.tooltip_format_value || defaultValueFormat, + orderAsc = $$.isOrderAsc(), + text = void 0, + i = void 0, + title = void 0, + value = void 0, + name = void 0, + bgcolor = void 0; + + + if (config.data_groups.length === 0) d.sort(function (a, b) { + var v1 = a ? a.value : null, + v2 = b ? b.value : null; + + + return orderAsc ? v1 - v2 : v2 - v1; + });else { + var ids = $$.orderTargets($$.data.targets).map(function (i2) { + return i2.id; + }); + + d.sort(function (a, b) { + var v1 = a ? a.value : null, + v2 = b ? b.value : null; + + return v1 > 0 && v2 > 0 && (v1 = a ? ids.indexOf(a.id) : null, v2 = b ? ids.indexOf(b.id) : null), orderAsc ? v1 - v2 : v2 - v1; + }); + } + + for (i = 0; i < d.length; i++) if (d[i] && (d[i].value || d[i].value === 0) && (text || (title = (0, _util.sanitise)(titleFormat ? titleFormat(d[i].x) : d[i].x), text = title || title === 0 ? "" + title + "" : "", text = "" + text), value = (0, _util.sanitise)(valueFormat(d[i].value, d[i].ratio, d[i].id, d[i].index, d)), value !== undefined)) { + // Skip elements when their name is set to null + if (d[i].name === null) continue; + name = (0, _util.sanitise)(nameFormat(d[i].name, d[i].ratio, d[i].id, d[i].index)), bgcolor = $$.levelColor ? $$.levelColor(d[i].value) : color(d[i].id), text += "" + ("") + (""); + } + + return text + "
" + name + "" + value + "
"; + }, + + /** + * Returns the position of the tooltip + * @private + * @param {Object} data + * @param {String} width + * @param {String} hHeight + * @param {HTMLElement} element + * @returns {Object} top, left value + */ + tooltipPosition: function tooltipPosition(dataToShow, tWidth, tHeight, element) { + var $$ = this, + config = $$.config, + forArc = $$.hasArcType(), + isTouch = $$.inputType === "touch", + mouse = (0, _d.mouse)(element), + svgLeft = void 0, + tooltipLeft = void 0, + tooltipRight = void 0, + tooltipTop = void 0, + chartRight = void 0; + + // Determin tooltip position + + + return forArc ? (tooltipLeft = isTouch ? mouse[0] : ($$.width - ($$.isLegendRight ? $$.getLegendWidth() : 0)) / 2 + mouse[0], tooltipTop = isTouch ? mouse[1] + 20 : $$.height / 2 + mouse[1] + 20) : (svgLeft = $$.getSvgLeft(!0), config.axis_rotated ? (tooltipLeft = svgLeft + mouse[0] + 100, tooltipRight = tooltipLeft + tWidth, chartRight = $$.currentWidth - $$.getCurrentPaddingRight(), tooltipTop = $$.x(dataToShow[0].x) + 20) : (tooltipLeft = svgLeft + $$.getCurrentPaddingLeft(!0) + $$.x(dataToShow[0].x) + 20, tooltipRight = tooltipLeft + tWidth, chartRight = svgLeft + $$.currentWidth - $$.getCurrentPaddingRight(), tooltipTop = mouse[1] + 15), tooltipRight > chartRight && (tooltipLeft -= tooltipRight - chartRight + 20), tooltipTop + tHeight > $$.currentHeight && (tooltipTop -= tHeight + 30)), tooltipTop < 0 && (tooltipTop = 0), { + top: tooltipTop, + left: tooltipLeft + }; + }, + + /** + * Show the tooltip + * @private + * @param {Object} data + * @param {HTMLElement} element + */ + showTooltip: function showTooltip(selectedData, element) { + var $$ = this, + config = $$.config, + forArc = $$.hasArcType(), + dataToShow = selectedData.filter(function (d) { + return d && (0, _util.isValue)(d.value); + }), + positionFunction = config.tooltip_position || $$.tooltipPosition; + + + if (dataToShow.length !== 0 && config.tooltip_show) { + $$.tooltip.html(config.tooltip_contents.call($$, selectedData, $$.axis.getXAxisTickFormat(), $$.getYFormat(forArc), $$.color)).style("display", "block"); + + + // Get tooltip dimensions + var tWidth = $$.tooltip.property("offsetWidth"), + tHeight = $$.tooltip.property("offsetHeight"), + position = positionFunction.call(this, dataToShow, tWidth, tHeight, element); + $$.tooltip.style("top", position.top + "px").style("left", position.left + "px"); + } + + // Set tooltip + }, + + /** + * Hide the tooltip + * @private + */ + hideTooltip: function hideTooltip() { + this.tooltip.style("display", "none"); + } +}); + +/***/ }), +/* 55 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +(0, _util.extend)(_ChartInternal2.default.prototype, { + setTargetType: function setTargetType(targetIds, type) { + var $$ = this, + config = $$.config; + $$.mapToTargetIds(targetIds).forEach(function (id) { + $$.withoutFadeIn[id] = type === config.data_types[id], config.data_types[id] = type; + }), targetIds || (config.data_type = type); + }, + hasType: function hasType(type, targetsValue) { + var $$ = this, + types = $$.config.data_types, + targets = targetsValue || $$.data.targets, + has = !1; + + + return targets && targets.length ? targets.forEach(function (target) { + var t = types[target.id]; + + (t && t.indexOf(type) >= 0 || !t && type === "line") && (has = !0); + }) : Object.keys(types).length ? Object.keys(types).forEach(function (id) { + types[id] === type && (has = !0); + }) : has = $$.config.data_type === type, has; + }, + hasArcType: function hasArcType(targets) { + return this.hasType("pie", targets) || this.hasType("donut", targets) || this.hasType("gauge", targets); + }, + isLineType: function isLineType(d) { + var config = this.config, + id = (0, _util.isString)(d) ? d : d.id; + + + return !config.data_types[id] || ["line", "spline", "area", "area-spline", "step", "area-step"].indexOf(config.data_types[id]) >= 0; + }, + isStepType: function isStepType(d) { + var id = (0, _util.isString)(d) ? d : d.id; + + return ["step", "area-step"].indexOf(this.config.data_types[id]) >= 0; + }, + isSplineType: function isSplineType(d) { + var id = (0, _util.isString)(d) ? d : d.id; + + return ["spline", "area-spline"].indexOf(this.config.data_types[id]) >= 0; + }, + isAreaType: function isAreaType(d) { + var id = (0, _util.isString)(d) ? d : d.id; + + return ["area", "area-spline", "area-step"].indexOf(this.config.data_types[id]) >= 0; + }, + isBarType: function isBarType(d) { + var id = (0, _util.isString)(d) ? d : d.id; + + return this.config.data_types[id] === "bar"; + }, + isScatterType: function isScatterType(d) { + var id = (0, _util.isString)(d) ? d : d.id; + + return this.config.data_types[id] === "scatter"; + }, + isPieType: function isPieType(d) { + var id = (0, _util.isString)(d) ? d : d.id; + + return this.config.data_types[id] === "pie"; + }, + isGaugeType: function isGaugeType(d) { + var id = (0, _util.isString)(d) ? d : d.id; + + return this.config.data_types[id] === "gauge"; + }, + isDonutType: function isDonutType(d) { + var id = (0, _util.isString)(d) ? d : d.id; + + return this.config.data_types[id] === "donut"; + }, + isArcType: function isArcType(d) { + return this.isPieType(d) || this.isDonutType(d) || this.isGaugeType(d); + }, + lineData: function lineData(d) { + return this.isLineType(d) ? [d] : []; + }, + arcData: function arcData(d) { + return this.isArcType(d.data) ? [d] : []; + }, + barData: function barData(d) { + return this.isBarType(d) ? d.values : []; + }, + lineOrScatterData: function lineOrScatterData(d) { + return this.isLineType(d) || this.isScatterType(d) ? d.values : []; + }, + barOrLineData: function barOrLineData(d) { + return this.isBarType(d) || this.isLineType(d) ? d.values : []; + }, + + + // https://github.com/d3/d3-shape#curves + isInterpolationType: function isInterpolationType(type) { + return ["basis", "basis-closed", "basis-open", "bundle", "cardinal", "cardinal-closed", "cardinal-open", "catmull-rom", "catmull-rom-closed", "catmull-rom-open", "linear", "linear-closed", "monotone-x", "monotone-y", "natural"].indexOf(type) >= 0; + } +}); + +/***/ }), +/* 56 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _util = __webpack_require__(0); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +(0, _util.extend)(_ChartInternal2.default.prototype, { + isSafari: function isSafari() { + var ua = window.navigator.userAgent; + + return ua.indexOf("Safari") >= 0 && ua.indexOf("Chrome") < 0; + }, + isChrome: function isChrome() { + return window.navigator.userAgent.indexOf("Chrome") >= 0; + } +}); + +/***/ }), +/* 57 */ +/***/ (function(module, exports, __webpack_require__) { + +exports = module.exports = __webpack_require__(61)(undefined); +// imports + + +// module +exports.push([module.i, "/*-- Chart --*/\n.bb svg {\n font: 10px sans-serif;\n -webkit-tap-highlight-color: transparent; }\n\n.bb path, .bb line {\n fill: none;\n stroke: #000; }\n\n.bb text {\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none; }\n\n.bb-legend-item-tile,\n.bb-xgrid-focus,\n.bb-ygrid,\n.bb-event-rect,\n.bb-bars path {\n shape-rendering: crispEdges; }\n\n.bb-chart-arc path {\n stroke: #fff; }\n\n.bb-chart-arc text {\n fill: #fff;\n font-size: 13px; }\n\n/*-- Axis --*/\n/*-- Grid --*/\n.bb-grid line {\n stroke: #aaa; }\n\n.bb-grid text {\n fill: #aaa; }\n\n.bb-xgrid, .bb-ygrid {\n stroke-dasharray: 3 3; }\n\n/*-- Text on Chart --*/\n.bb-text.bb-empty {\n fill: #808080;\n font-size: 2em; }\n\n/*-- Line --*/\n.bb-line {\n stroke-width: 1px; }\n\n/*-- Point --*/\n.bb-circle._expanded_ {\n stroke-width: 1px;\n stroke: white; }\n\n.bb-selected-circle {\n fill: white;\n stroke-width: 2px; }\n\n/*-- Bar --*/\n.bb-bar {\n stroke-width: 0; }\n .bb-bar._expanded_ {\n fill-opacity: 0.75; }\n\n/*-- Focus --*/\n.bb-target.bb-focused {\n opacity: 1; }\n\n.bb-target.bb-focused path.bb-line, .bb-target.bb-focused path.bb-step {\n stroke-width: 2px; }\n\n.bb-target.bb-defocused {\n opacity: 0.3 !important; }\n\n/*-- Region --*/\n.bb-region {\n fill: steelblue;\n fill-opacity: .1; }\n\n/*-- Brush --*/\n.bb-brush .extent {\n fill-opacity: .1; }\n\n/*-- Select - Drag --*/\n/*-- Legend --*/\n.bb-legend-item {\n font-size: 12px; }\n\n.bb-legend-item-hidden {\n opacity: 0.15; }\n\n.bb-legend-background {\n opacity: 0.75;\n fill: white;\n stroke: lightgray;\n stroke-width: 1; }\n\n/*-- Title --*/\n.bb-title {\n font: 14px sans-serif; }\n\n/*-- Tooltip --*/\n.bb-tooltip-container {\n z-index: 10; }\n\n.bb-tooltip {\n border-collapse: collapse;\n border-spacing: 0;\n background-color: #fff;\n empty-cells: show;\n opacity: 0.9;\n -webkit-box-shadow: 7px 7px 12px -9px #777777;\n -moz-box-shadow: 7px 7px 12px -9px #777777;\n box-shadow: 7px 7px 12px -9px #777777; }\n .bb-tooltip tr {\n border: 1px solid #CCC; }\n .bb-tooltip th {\n background-color: #aaa;\n font-size: 14px;\n padding: 2px 5px;\n text-align: left;\n color: #FFF; }\n .bb-tooltip td {\n font-size: 13px;\n padding: 3px 6px;\n background-color: #fff;\n border-left: 1px dotted #999; }\n .bb-tooltip td > span {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin-right: 6px; }\n .bb-tooltip td.value {\n text-align: right; }\n\n/*-- Area --*/\n.bb-area {\n stroke-width: 0;\n opacity: 0.2; }\n\n/*-- Arc --*/\n.bb-chart-arcs-title {\n dominant-baseline: middle;\n font-size: 1.3em; }\n\n.bb-chart-arcs .bb-chart-arcs-background {\n fill: #e0e0e0;\n stroke: none; }\n\n.bb-chart-arcs .bb-chart-arcs-gauge-unit {\n fill: #000;\n font-size: 16px; }\n\n.bb-chart-arcs .bb-chart-arcs-gauge-max {\n fill: #777; }\n\n.bb-chart-arcs .bb-chart-arcs-gauge-min {\n fill: #777; }\n\n.bb-chart-arc .bb-gauge-value {\n fill: #000; }\n", ""]); + +// exports + + +/***/ }), +/* 58 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +exports.__esModule = !0; + +var _classCallCheck2 = __webpack_require__(6), + _classCallCheck3 = _interopRequireDefault(_classCallCheck2); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +/** + * Class to set options on generating chart. + * - It's instantiated internally, not exposed for public. + * @class Options + * @see {@link bb.generate} to use these options on generating the chart + */ +var Options = function Options() { + (0, _classCallCheck3.default)(this, Options), this.value = { + /** + * bindto The CSS selector or the element which the chart will be set to. D3 selection object can be specified. If other chart is set already, it will be replaced with the new one (only one chart can be set in one element).

+ * If this option is not specified, the chart will be generated but not be set. Instead, we can access the element by chart.element and set it by ourselves.
+ * > NOTE: When chart is not binded, bb starts observing if chart.element is binded by MutationObserver. In this case, polyfill is required in IE9 and IE10 becuase they do not support MutationObserver. On the other hand, if chart always will be binded, polyfill will not be required because MutationObserver will never be called. + * @name bindto + * @memberof Options + * @type {String} + * @default #chart + * @example + * bindto: "#myContainer" + * + * // or element + * bindto: document.getElementById("myContainer") + * + * // or D3 selection object + * bindto: d3.select("#myContainer") + */ + bindto: "#chart", + + /** + * Set svg element's class name + * @name svg + * @memberof Options + * @type {Object} + * @property {String} [svg.classname] class name for svg element + * @example + * svg: { + * classname: "test_class" + * } + */ + svg_classname: undefined, + + /** + * The desired size of the chart element. + * If value is not specified, the width of the chart will be calculated by the size of the parent element it's appended to. + * @name size + * @memberof Options + * @type {Object} + * @property {Number} [size.width] width of the chart element + * @property {Number} [size.height] height of the chart element + * @example + * size: { + * width: 640, + * height: 480 + * } + */ + size_width: undefined, + size_height: undefined, + + /** + * The padding of the chart element. + * @name padding + * @memberof Options + * @type {Object} + * @property {Number} [padding.top] padding on the top of chart + * @property {Number} [padding.right] padding on the right of chart + * @property {Number} [padding.bottom] padding on the bottom of chart + * @property {Number} [padding.left] padding on the left of chart + * @example + * padding: { + * top: 20, + * right: 20, + * bottom: 20, + * left: 20 + * } + */ + padding_left: undefined, + padding_right: undefined, + padding_top: undefined, + padding_bottom: undefined, + + /** + * Set chart resize options + * @name resize + * @memberof Options + * @type {Object} + * @property {Boolean} [resize.auto=true] Set chart resize automatically on viewport changes. + * @example + * resize: { + * auto: false + * } + */ + resize_auto: !0, + + /** + * Set zoom options + * @name zoom + * @memberof Options + * @type {Object} + * @property {Boolean} [zoom.enabled=false] Enable zooming. + * @property {Boolean} [zoom.rescale=false] Enable to rescale after zooming.
+ * If true set, y domain will be updated according to the zoomed region. + * @property {Array} [zoom.extent=[1, 10]] Change zoom extent. + * @property {Function} [zoom.onzoom=function(){}] Set callback that is called when the chart is zooming.
+ * Specified function receives the zoomed domain. + * @property {Function} [zoom.onzoomstart=function(){}] Set callback that is called when zooming starts.
+ * Specified function receives the zoom event. + * @property {Function} [zoom.onzoomend=function(){}] Set callback that is called when zooming ends.
+ * Specified function receives the zoomed domain. + * @example + * zoom: { + * enabled: true, + * rescale: true, + * extent: [1, 100] // enable more zooming + * onzoom: function(domain) { ... }, + * onzoomstart: function(event) { ... }, + * onzoomend: function(domain) { ... } + * } + */ + zoom_enabled: !1, + zoom_extent: undefined, + zoom_privileged: !1, + zoom_rescale: !1, + zoom_onzoom: function zoom_onzoom() {}, + zoom_onzoomstart: function zoom_onzoomstart() {}, + zoom_onzoomend: function zoom_onzoomend() {}, + zoom_x_min: undefined, + zoom_x_max: undefined, + + /** + * Interaction options + * @name interaction + * @memberof Options + * @type {Object} + * @property {Boolean} [interaction.enabled=true] Indicate if the chart should have interactions.
+ * If `false` is set, all of interactions (showing/hiding tooltip, selection, mouse events, etc) will be disabled. + * @property {Boolean} [interaction.brighten=true] + * @property {Boolean} [interaction.inputType.mouse=true] enable or disable mouse interaction + * @property {Boolean} [interaction.inputType.touch=true] enable or disable touch interaction + * @example + * interaction: { + * enabled: false, + * inputType: { + * mouse: true, + * touch: false + * } + * } + */ + interaction_brighten: !0, + interaction_enabled: !0, + interaction_inputType_mouse: !0, + interaction_inputType_touch: !0, + + /** + * Set a callback to execute when mouse/touch enters the chart. + * @name onover + * @memberof Options + * @type {Function} + * @default function(){} + * @example + * onover: function() { + * ... + * } + */ + onover: function onover() {}, + + /** + * Set a callback to execute when mouse/touch leaves the chart. + * @name onout + * @memberof Options + * @type {Function} + * @default function(){} + * @example + * onout: function() { + * ... + * } + */ + onout: function onout() {}, + + /** + * Set a callback to execute when user resizes the screen. + * @name onresize + * @memberof Options + * @type {Function} + * @default function(){} + * @example + * onresize: function() { + * ... + * } + */ + onresize: function onresize() {}, + + /** + * SSet a callback to execute when screen resize finished. + * @name onresized + * @memberof Options + * @type {Function} + * @default function(){} + * @example + * onresized: function() { + * ... + * } + */ + onresized: function onresized() {}, + + /** + * Set a callback to execute when the chart is initialized. + * @name oninit + * @memberof Options + * @type {Function} + * @default function(){} + * @example + * oninit: function() { + * ... + * } + */ + oninit: function oninit() {}, + + /** + * Set a callback which is executed when the chart is rendered. Basically, this callback will be called in each time when the chart is redrawed. + * @name onrendered + * @memberof Options + * @type {Function} + * @default function(){} + * @example + * onrendered: function() { + * ... + * } + */ + onrendered: function onrendered() {}, + + /** + * Set duration of transition (in milliseconds) for chart animation.

+ * NOTE:If `0 `or `null` set, transition will be skipped. So, this makes initial rendering faster especially in case you have a lot of data. + * @name transition + * @memberof Options + * @type {Object} + * @property {Number} [transition.duration=350] duration in milliseconds + * @example + * transition: { + * duration: 500 + * } + */ + transition_duration: 350, + + /** + * Specify the key of x values in the data.

+ * We can show the data with non-index x values by this option. This option is required when the type of x axis is timeseries. If this option is set on category axis, the values of the data on the key will be used for category names. + * @name data:x + * @memberof Options + * @type {String} + * @default undefined + * @example + * data: { + * x: "date" + * } + */ + data_x: undefined, + + /** + * Specify the keys of the x values for each data.

+ * This option can be used if we want to show the data that has different x values. + * @name data:xs + * @memberof Options + * @type {Object} + * @default {} + * @example + * data: { + * xs: { + * data1: "x1", + * data2: "x2" + * } + * } + */ + data_xs: {}, + + /** + * Set a format to parse string specifed as x. + * @name data:xFormat + * @memberof Options + * @type {String} + * @default %Y-%m-%d + * @example + * data: { + * xFormat: "%Y-%m-%d %H:%M:%S" + * } + * @see [D3's time specifier](https://npm.runkit.com/d3-time-format) + */ + data_xFormat: "%Y-%m-%d", + + /** + * Set localtime format to parse x axis. + * @name data:xLocaltime + * @memberof Options + * @type {Boolean} + * @default true + * @example + * data: { + * xLocaltime: false + * } + */ + data_xLocaltime: !0, + + /** + * Sort on x axis. + * @name data:xSort + * @memberof Options + * @type {Boolean} + * @default true + * @example + * data: { + * xSort: false + * } + */ + data_xSort: !0, + data_idConverter: function data_idConverter(id) { + return id; + }, + + /** + * Set custom data name. + * @name data:names + * @memberof Options + * @type {Object} + * @default {} + * @example + * data: { + * names: { + * data1: "Data Name 1", + * data2: "Data Name 2" + * } + * } + */ + data_names: {}, + + /** + * Set custom data class.

+ * If this option is specified, the element g for the data has an additional class that has the prefix 'bb-target-' (eg. bb-target-additional-data1-class). + * @name data:classes + * @memberof Options + * @type {Object} + * @default {} + * @example + * data: { + * classes: { + * data1: "additional-data1-class", + * data2: "additional-data2-class" + * } + * } + */ + data_classes: {}, + + /** + * Set groups for the data for stacking. + * @name data:groups + * @memberof Options + * @type {Array} + * @default [] + * @example + * data: { + * groups: [ + * ["data1", "data2"], + * ["data3"] + * ] + * } + */ + data_groups: [], + + /** + * Set y axis the data related to. y and y2 can be used. + * @name data:axes + * @memberof Options + * @type {Object} + * @default {} + * @example + * data: { + * axes: { + * data1: "y", + * data2: "y2" + * } + * } + */ + data_axes: {}, + + /** + * Set chart type at once.

+ * If this option is specified, the type will be applied to every data. This setting can be overwritten by data.types.

+ * Available Values: + * - line + * - spline + * - step + * - area + * - area-spline + * - area-step + * - bar + * - scatter + * - pie + * - donut + * - gauge + * @name data:type + * @memberof Options + * @type {String} + * @default line + * @example + * data: { + * type: "bar" + * } + */ + data_type: undefined, + + /** + * Set chart type for each data.
+ * This setting overwrites data.type setting. + * @name data:types + * @memberof Options + * @type {Object} + * @default {} + * @example + * data: { + * types: { + * data1: "bar", + * data2: "spline" + * } + * } + */ + data_types: {}, + + /** + * Show labels on each data points. + * @name data:labels + * @memberof Options + * @type {Boolean} + * @default false + * @example + * data: { + * labels: true + * } + */ + /** + * Set formatter function for data labels.
+ * The formatter function receives 4 arguments such as v, id, i, j and it must return a string that will be shown as the label. The arguments are:
+ * - `v` is the value of the data point where the label is shown. + * - `id` is the id of the data where the label is shown. + * - `i` is the index of the data point where the label is shown. + * - `j` is the sub index of the data point where the label is shown.

+ * Formatter function can be defined for each data by specifying as an object and D3 formatter function can be set (ex. d3.format('$')) + * @name data:labels:format + * @memberof Options + * @type {Object} + * @default {} + * @example + * data: { + * labels: { + * format: function(v, id, i, j) { ... } + * // it's possible to set for each data + * //format: { + * // data1: function(v, id, i, j) { ... }, + * // ... + * //} + * } + * } + */ + data_labels: {}, + + /** + * This option changes the order of stacking the data and pieces of pie/donut. If `null` specified, it will be the order the data loaded. If function specified, it will be used to sort the data and it will recieve the data as argument.

+ * Available Values: + * - desc + * - asc + * - function(data1, data2) { ... } + * - null + * @name data:order + * @memberof Options + * @type {String|Function} + * @default desc + * @example + * data: { + * lorder: "asc" + * } + */ + data_order: "desc", + + /** + * Define regions for each data.

+ * The values must be an array for each data and it should include an object that has start, end, style. If start is not set, the start will be the first data point. If end is not set, the end will be the last data point.
+ * Currently this option supports only line chart and dashed style. If this option specified, the line will be dashed only in the regions. + * @name data:regions + * @memberof Options + * @type {Object} + * @default {} + * @example + * data: { + * regions: { + * data1: [{ + * "start": 1, + * "end": 2, + * "style": "dashed" + * }, { + * "start":3 + * }], + * ... + * } + * } + */ + data_regions: {}, + + /** + * Set color converter function.

+ * This option should a function and the specified function receives color (e.g. '#ff0000') and d that has data parameters like id, value, index, etc. And it must return a string that represents color (e.g. '#00ff00'). + * @name data:color + * @memberof Options + * @type {Function} + * @default undefined + * @example + * data: { + * color: function(color, d) { ... } + * } + */ + data_color: undefined, + + /** + * Set color for each data. + * @name data:colors + * @memberof Options + * @type {Object} + * @default {} + * @example + * data: { + * colors: { + * data1: "#ff0000", + * ... + * } + * } + */ + data_colors: {}, + + /** + * Hide each data when the chart appears.

+ * If true specified, all of data will be hidden. If multiple ids specified as an array, those will be hidden. + * @name data:hide + * @memberof Options + * @type {Boolean|Array} + * @default false + * @example + * data: { + * // all of data will be hidden + * hide: true + * // specified data will be hidden + * hide: ["data1", ...] + * } + */ + data_hide: !1, + data_filter: undefined, + + /** + * Set data selection enabled.

+ * If this option is set true, we can select the data points and get/set its state of selection by API (e.g. select, unselect, selected). + * @name data:selection:enabled + * @memberof Options + * @type {Boolean} + * @default false + * @example + * data: { + * selection: { + * enabled: true + * } + * } + */ + data_selection_enabled: !1, + + /** + * Set grouped selection enabled.

+ * If this option set true, multiple data points that have same x value will be selected by one selection. + * @name data:selection:grouped + * @memberof Options + * @type {Boolean} + * @default false + * @example + * data: { + * selection: { + * grouped: true + * } + * } + */ + data_selection_grouped: !1, + + /** + * Set a callback for each data point to determine if it's selectable or not.

+ * The callback will receive d as an argument and it has some parameters like id, value, index. This callback should return boolean. + * @name data:selection:isselectable + * @memberof Options + * @type {Function} + * @default function() { return true; } + * @example + * data: { + * selection: { + * isselectable: function(d) { ... } + * } + * } + */ + data_selection_isselectable: function data_selection_isselectable() { + return !0; + }, + + /** + * Set multiple data points selection enabled.

+ * If this option set true, multile data points can have the selected state at the same time. If false set, only one data point can have the selected state and the others will be unselected when the new data point is selected. + * @name data:selection:multiple + * @memberof Options + * @type {Boolean} + * @default true + * @example + * data: { + * selection: { + * multiple: false + * } + * } + */ + data_selection_multiple: !0, + + /** + * Enable to select data points by dragging.

+ * If this option set true, data points can be selected by dragging. + * Note: If this option set true, scrolling on the chart will be disabled because dragging event will handle the event. + * @name data:selection:draggable + * @memberof Options + * @type {Boolean} + * @default false + * @example + * data: { + * selection: { + * draggable: true + * } + * } + */ + data_selection_draggable: !1, + + /** + * Set a callback for click event on each data point.

+ * This callback will be called when each data point clicked and will receive d and element as the arguments. d is the data clicked and element is the element clicked. In this callback, this will be the Chart object. + * @name data:onclick + * @memberof Options + * @type {Function} + * @default function() {} + * @example + * data: { + * onclick: function(d, element) { ... } + * } + */ + data_onclick: function data_onclick() {}, + + /** + * Set a callback for mouse/touch over event on each data point.

+ * This callback will be called when mouse cursor or via touch moves onto each data point and will receive d as the argument. d is the data where mouse cursor moves onto. In this callback, this will be the Chart object. + * @name data:onover + * @memberof Options + * @type {Function} + * @default function() {} + * @example + * data: { + * onover: function(d) { ... } + * } + */ + data_onover: function data_onover() {}, + + /** + * Set a callback for mouse/touch out event on each data point.

+ * This callback will be called when mouse cursor or via touch moves out each data point and will receive d as the argument. d is the data where mouse cursor moves out. In this callback, this will be the Chart object. + * @name data:onout + * @memberof Options + * @type {Function} + * @default function() {} + * @example + * data: { + * onout: function(d) { ... } + * } + */ + data_onout: function data_onout() {}, + + /** + * Set a callback for on data selection. + * @name data:onselected + * @memberof Options + * @type {Function} + * @default function() {} + * @example + * data: { + * onselected: function(d) { ... } + * } + */ + data_onselected: function data_onselected() {}, + + /** + * Set a callback for on data un-selection. + * @name data:onunselected + * @memberof Options + * @type {Function} + * @default function() {} + * @example + * data: { + * onunselected: function(d) { ... } + * } + */ + data_onunselected: function data_onunselected() {}, + data_url: undefined, + data_headers: undefined, + data_json: undefined, + data_rows: undefined, + data_columns: undefined, + data_mimeType: undefined, + data_keys: undefined, + + /** + * Set text displayed when empty data. + * @name data:empty:label:text + * @memberof Options + * @type {String} + * @default "" + * @example + * data: { + * empty: { + * label: { + * text: "No Data" + * } + * } + * } + */ + data_empty_label_text: "", + + /** + * Set subchart options + * @name subchart + * @memberof Options + * @type {Object} + * @property {Boolean} [subchart.show=false] Show sub chart on the bottom of the chart. + * @property {Boolean} [subchart.size.height] Change the height of the subchart. + * @property {Boolean} [subchart.onbrush] Set callback for brush event.
+ * Specified function receives the current zoomed x domain. + * @example + * subchart: { + * show: true, + * size: { + * height: 20 + * }, + * onbrush: function(domain) { ... } + * } + */ + subchart_show: !1, + subchart_size_height: 60, + subchart_axis_x_show: !0, + subchart_onbrush: function subchart_onbrush() {}, + + /** + * Set color of the data values + * @name color + * @memberof Options + * @type {Object} + * @property {Array} [color.pattern] custom color pattern + * @property {Object} [color.threshold] color threshold + * @property {String} [color.threshold.unit] unit + * @property {Array} [color.threshold.value] value + * @property {Array} [color.threshold.max=100] max value + * @example + * color: { + * pattern: ["#1f77b4", "#aec7e8", ...] + * } + */ + color_pattern: [], + color_threshold: {}, + + /** + * Legend options + * @name legend + * @memberof Options + * @type {Object} + * @property {Boolean} [legend.show=true] Show or hide legend. + * @property {Boolean} [legend.hide=false] Hide legend + * If true given, all legend will be hidden. If string or array given, only the legend that has the id will be hidden. + * @property {String} [legend.position=bottom] Change the position of legend.
+ * Available values are: `bottom`, `right` and `inset` are supported. + * @property {Object} [legend.inset={anchor: 'top-left',x: 10,y: 0,step: undefined}] Change inset legend attributes.
+ * This option accepts object that has the keys anchor, x, y and step. + * anchor decides the position of the legend. These anchors are available: + * - top-left + * - top-right + * - bottom-left + * - bottom-right + * x and y set the position of the legend based on the anchor.
+ * step defines the max step the lagend has (e.g. If 2 set and legend has 3 legend item, the legend 2 columns). + * @property {Function} [legend.item.onclick=undefined] Set click event handler to the legend item. + * @property {Function} [legend.item.onover=undefined] Set mouse/touch over event handler to the legend item. + * @property {Function} [legend.item.onout=undefined] Set mouse/touch out event handler to the legend item. + * @example + * legend: { + * show: true, + * hide: true, + * //or hide: "data1" + * //or hide: ["data1", "data2"] + * position: "bottom", // bottom, right, inset + * inset: { + * anchor: "top-right" // top-left, top-right, bottom-left, bottom-right + * x: 20, + * y: 10, + * step: 2 + * }, + * onclick: function(id) { ... }, + * onover: function(id) { ... }, + * onout: function(id) { ... } + * } + */ + legend_show: !0, + legend_hide: !1, + legend_position: "bottom", + legend_inset_anchor: "top-left", + legend_inset_x: 10, + legend_inset_y: 0, + legend_inset_step: undefined, + legend_item_onclick: undefined, + legend_item_onover: undefined, + legend_item_onout: undefined, + legend_equally: !1, + legend_padding: 0, + legend_item_tile_width: 10, + legend_item_tile_height: 10, + + /** + * Switch x and y axis position. + * @name axis:rotated + * @memberof Options + * @type {Boolean} + * @default false + * @example + * axis: { + * rotated: true + * } + */ + axis_rotated: !1, + + /** + * Show or hide x axis. + * @name axis:x:show + * @memberof Options + * @type {Boolean} + * @default true + * @example + * axis: { + * x: { + * show: false + * } + * } + */ + axis_x_show: !0, + + /** + * Set type of x axis.

+ * Available Values: + * -timeseries + * -category + * -indexed + * @name axis:x:type + * @memberof Options + * @type {String} + * @default indexed + * @example + * axis: { + * x: { + * type: "timeseries" + * } + * } + */ + axis_x_type: "indexed", + + /** + * Set how to treat the timezone of x values.
+ * If true, treat x value as localtime. If false, convert to UTC internally. + * @name axis:x:localtime + * @memberof Options + * @type {Boolean} + * @default true + * @example + * axis: { + * x: { + * localtime: false + * } + * } + */ + axis_x_localtime: !0, + + /** + * Set category names on category axis. + * This must be an array that includes category names in string. If category names are included in the date by data.x option, this is not required. + * @name axis:x:categories + * @memberof Options + * @type {Array} + * @default [] + * @example + * axis: { + * x: { + * categories: ["Category 1", "Category 2", ...] + * } + * } + */ + axis_x_categories: [], + + /** + * Centerise ticks on category axis. + * @name axis:x:tick:centered + * @memberof Options + * @type {Array} + * @default false + * @example + * axis: { + * x: { + * tick: { + * centered: true + * } + * } + * } + */ + axis_x_tick_centered: !1, + + /** + * A function to format tick value. Format string is also available for timeseries data. + * @name axis:x:tick:format + * @memberof Options + * @type {Function} + * @default undefined + * @example + * axis: { + * x: { + * tick: { + * format: function(x) { + * return x.getFullYear(); + * } + * } + * } + * } + */ + axis_x_tick_format: undefined, + + /** + * Setting for culling ticks.

+ * If true is set, the ticks will be culled, then only limitted tick text will be shown. This option does not hide the tick lines. If false is set, all of ticks will be shown.

+ * We can change the number of ticks to be shown by axis.x.tick.culling.max. + * @name axis:x:tick:culling + * @memberof Options + * @type {Function} + * @default + * - true for indexed axis and timeseries axis + * - false for category axis + * @example + * axis: { + * x: { + * tick: { + * culling: false + * } + * } + * } + */ + axis_x_tick_culling: {}, + + /** + * The number of tick texts will be adjusted to less than this value. + * @name axis:x:tick:culling:max + * @memberof Options + * @type {Number} + * @default 10 + * @example + * axis: { + * x: { + * tick: { + * culling: { + * max: 5 + * } + * } + * } + * } + */ + axis_x_tick_culling_max: 10, + + /** + * The number of x axis ticks to show.

+ * This option hides tick lines together with tick text. If this option is used on timeseries axis, the ticks position will be determined precisely and not nicely positioned (e.g. it will have rough second value). + * @name axis:x:tick:count + * @memberof Options + * @type {Number} + * @default undefined + * @example + * axis: { + * x: { + * tick: { + * count: 5 + * } + * } + * } + */ + axis_x_tick_count: undefined, + + /** + * Fit x axis ticks.

+ * If true set, the ticks will be positioned nicely. If false set, the ticks will be positioned according to x value of the data points. + * @name axis:x:tick:fit + * @memberof Options + * @type {Boolean} + * @default true + * @example + * axis: { + * x: { + * tick: { + * fit: false + * } + * } + * } + */ + axis_x_tick_fit: !0, + + /** + * Set the x values of ticks manually.

+ * If this option is provided, the position of the ticks will be determined based on those values. This option works with timeseries data and the x values will be parsed accoding to the type of the value and data.xFormat option. + * @name axis:x:tick:values + * @memberof Options + * @type {Array} + * @default null + * @example + * axis: { + * x: { + * tick: { + * values: [1, 2, 4, 8, 16, 32, ...] + * } + * } + * } + */ + axis_x_tick_values: null, + + /** + * Rotate x axis tick text.
+ * If you set negative value, it will rotate to opposite direction. + * @name axis:x:tick:rotate + * @memberof Options + * @type {Number} + * @default 0 + * @example + * axis: { + * x: { + * tick: { + * rotate: 60 + * } + * } + * } + */ + axis_x_tick_rotate: 0, + + /** + * Show x axis outer tick. + * @name axis:x:tick:outer + * @memberof Options + * @type {Boolean} + * @default true + * @example + * axis: { + * x: { + * tick: { + * outer: false + * } + * } + * } + */ + axis_x_tick_outer: !0, + + /** + * Set tick text to be multiline + * @name axis:x:tick:multiline + * @memberof Options + * @type {Boolean} + * @default true + * @example + * axis: { + * x: { + * tick: { + * multiline: false + * } + * } + * } + */ + axis_x_tick_multiline: !0, + + /** + * Set tick width + * @name axis:x:tick:width + * @memberof Options + * @type {Number} + * @default null + * @example + * axis: { + * x: { + * tick: { + * width: 50 + * } + * } + * } + */ + axis_x_tick_width: null, + + /** + * Set max value of x axis range. + * @name axis:x:max + * @memberof Options + * @type {Number} + * @default undefined + * @example + * axis: { + * x: { + * max: 100 + * } + * } + */ + axis_x_max: undefined, + + /** + * Set min value of x axis range. + * @name axis:x:min + * @memberof Options + * @type {Number} + * @default undefined + * @example + * axis: { + * x: { + * min: -100 + * } + * } + */ + axis_x_min: undefined, + + /** + * Set padding for x axis.

+ * If this option is set, the range of x axis will increase/decrease according to the values. If no padding is needed in the ragen of x axis, 0 should be set. On category axis, this option will be ignored. + * @name axis:x:padding + * @memberof Options + * @type {Object} + * @default {} + * @example + * axis: { + * x: { + * padding: { + * left: 0, + * right: 0 + * } + * } + * } + */ + axis_x_padding: {}, + + /** + * Set height of x axis.

+ * The height of x axis can be set manually by this option. If you need more space for x axis, please use this option for that. The unit is pixel. + * @name axis:x:height + * @memberof Options + * @type {Number} + * @default undefined + * @example + * axis: { + * x: { + * height: 20 + * } + * } + */ + axis_x_height: undefined, + + /** + * Set default extent for subchart and zoom. This can be an array or function that returns an array. + * @name axis:x:extent + * @memberof Options + * @type {Array} + * @default undefined + * @example + * axis: { + * x: { + * // [[x0, y0], [x1, y1]], where [x0, y0] is the top-left corner and [x1, y1] is the bottom-right corner + * // https://github.com/d3/d3-brush/blob/master/src/brush.js#L521 + * extent: [[0, 0], [200, 60]] + * } + * } + */ + axis_x_extent: undefined, + + /** + * Set label on x axis.

+ * You can set x axis label and change its position by this option. string and object can be passed and we can change the poisiton by passing object that has position key. Available position differs according to the axis direction (vertical or horizontal). If string set, the position will be the default. + * - If it's horizontal axis: + * - inner-right [default] + * - inner-center + * - inner-left + * - outer-right + * - outer-center + * - outer-left + * - If it's vertical axis: + * - inner-top [default] + * - inner-middle + * - inner-bottom + * - outer-top + * - outer-middle + * - outer-bottom + * @name axis:x:label + * @memberof Options + * @type {String|Object} + * @default undefined + * @example + * axis: { + * x: { + * label: "Your X Axis" + * } + * } + * + * axis: { + * x: { + * label: { + * text: "Your X Axis", + * position: "outer-center" + * } + * } + * } + */ + axis_x_label: {}, + + /** + * Show or hide y axis. + * @name axis:y:show + * @memberof Options + * @type {Boolean} + * @default true + * @example + * axis: { + * y: { + * show: false + * } + * } + */ + axis_y_show: !0, + + /** + * Set type of y axis. + * Available Values: + * -timeseries + * -category + * -indexed + * @name axis:y:type + * @memberof Options + * @type {String} + * @default undefined + * @example + * axis: { + * y: { + * type: "timeseries" + * } + * } + */ + axis_y_type: undefined, + + /** + * Set max value of y axis. + * Note: Padding will be added based on this value, so if you don't need the padding, please set axis.y.padding to disable it (e.g. axis.y.padding = 0). + * @name axis:y:max + * @memberof Options + * @type {Number} + * @default undefined + * @example + * axis: { + * y: { + * max: 1000 + * } + * } + */ + axis_y_max: undefined, + + /** + * Set min value of y axis. + * Note: Padding will be added based on this value, so if you don't need the padding, please set axis.y.padding to disable it (e.g. axis.y.padding = 0). + * @name axis:y:min + * @memberof Options + * @type {Number} + * @default undefined + * @example + * axis: { + * y: { + * min: 1000 + * } + * } + */ + axis_y_min: undefined, + + /** + * Change the direction of y axis.

+ * If true set, the direction will be from the top to the bottom. + * @name axis:y:inverted + * @memberof Options + * @type {Boolean} + * @default false + * @example + * axis: { + * y: { + * inverted: true + * } + * } + */ + axis_y_inverted: !1, + + /** + * Set center value of y axis. + * @name axis:y:center + * @memberof Options + * @type {Number} + * @default undefined + * @example + * axis: { + * y: { + * center: 0 + * } + * } + */ + axis_y_center: undefined, + + /** + * Show y axis inside of the chart. + * @name axis:y:inner + * @memberof Options + * @type {Boolean} + * @default false + * @example + * axis: { + * y: { + * inner: true + * } + * } + */ + axis_y_inner: !1, + + /** + * Set label on y axis.

+ * You can set y axis label and change its position by this option. This option works in the same way as axis.x.label. + * @name axis:y:label + * @memberof Options + * @type {String|Object} + * @default {} + * @example + * axis: { + * y: { + * label: "Your Y Axis" + * } + * } + * + * axis: { + * y: { + * label: { + * text: "Your Y Axis", + * position: "outer-middle" + * } + * } + * } + */ + axis_y_label: {}, + + /** + * Set formatter for y axis tick text.

+ * This option accepts d3.format object as well as a function you define. + * @name axis:y:format + * @memberof Options + * @type {Function} + * @default undefined + * @example + * axis: { + * x: { + * tick: { + * format: function(x) { + * return x.getFullYear(); + * } + * } + * } + * } + */ + axis_y_tick_format: undefined, + + /** + * Show y axis outer tick. + * @name axis:y:tick:outer + * @memberof Options + * @type {Boolean} + * @default true + * @example + * axis: { + * y: { + * tick: { + * outer: false + * } + * } + * } + */ + axis_y_tick_outer: !0, + + /** + * Set y axis tick values manually. + * @name axis:y:tick:values + * @memberof Options + * @type {Array} + * @default null + * @example + * axis: { + * y: { + * tick: { + * values: [100, 1000, 10000] + * } + * } + * } + */ + axis_y_tick_values: null, + axis_y_tick_rotate: 0, + + /** + * Set the number of y axis ticks.

+ * Note: The position of the ticks will be calculated precisely, so the values on the ticks will not be rounded nicely. In the case, axis.y.tick.format or axis.y.tick.values will be helpful. + * @name axis:y:tick:count + * @memberof Options + * @type {Number} + * @default undefined + * @example + * axis: { + * y: { + * tick: { + * count: 5 + * } + * } + * } + */ + axis_y_tick_count: undefined, + + /** + * Set the number of y axis ticks.

+ * Note: The position of the ticks will be calculated precisely, so the values on the ticks will not be rounded nicely. In the case, axis.y.tick.format or axis.y.tick.values will be helpful. + * @name axis:y:tick:time + * @memberof Options + * @private + * @type {Object} + * @property {Function} [time.value] D3's time interval function (https://github.com/d3/d3-time#intervals) + * @example + * axis: { + * y: { + * tick: { + * time: { + * // ticks at 15-minute intervals + * // https://github.com/d3/d3-scale/blob/master/README.md#time_ticks + * value: d3.timeMinute.every(15) + * } + * } + * } + * } + */ + // @TODO: not fully implemented yet + axis_y_tick_time_value: undefined, + + /** + * Set padding for y axis.

+ * You can set padding for y axis to create more space on the edge of the axis. This option accepts object and it can include top and bottom. top, bottom will be treated as pixels. + * @name axis:y:padding + * @memberof Options + * @type {Object} + * @default {} + * @example + * axis: { + * y: { + * padding: { + * top: 0, + * bottom: 0 + * } + * } + * } + */ + axis_y_padding: {}, + + /** + * Set default range of y axis.

+ * This option set the default value for y axis when there is no data on init. + * @name axis:y:default + * @memberof Options + * @type {Array} + * @default undefined + * @example + * axis: { + * y: { + * default: [0, 1000] + * } + * } + */ + axis_y_default: undefined, + + /** + * Show or hide y2 axis. + * @name axis:y2:show + * @memberof Options + * @type {Array} + * @default false + * @example + * axis: { + * y2: { + * show: true + * } + * } + */ + axis_y2_show: !1, + + /** + * Set max value of y2 axis. + * @name axis:y2:max + * @memberof Options + * @type {Number} + * @default undefined + * @example + * axis: { + * y2: { + * max: 1000 + * } + * } + */ + axis_y2_max: undefined, + + /** + * Set min value of y2 axis. + * @name axis:y2:min + * @memberof Options + * @type {Number} + * @default undefined + * @example + * axis: { + * y2: { + * min: -1000 + * } + * } + */ + axis_y2_min: undefined, + + /** + * Change the direction of y2 axis.

+ * If true set, the direction will be from the top to the bottom. + * @name axis:y2:inverted + * @memberof Options + * @type {Boolean} + * @default false + * @example + * axis: { + * y2: { + * inverted: true + * } + * } + */ + axis_y2_inverted: !1, + + /** + * Set center value of y2 axis. + * @name axis:y2:center + * @memberof Options + * @type {Number} + * @default undefined + * @example + * axis: { + * y2: { + * center: 0 + * } + * } + */ + axis_y2_center: undefined, + + /** + * Show y2 axis inside of the chart. + * @name axis:y2:inner + * @memberof Options + * @type {Boolean} + * @default false + * @example + * axis: { + * y2: { + * inner: true + * } + * } + */ + axis_y2_inner: !1, + + /** + * Set label on y2 axis.

+ * You can set y2 axis label and change its position by this option. This option works in the same way as axis.x.label. + * @name axis:y2:label + * @memberof Options + * @type {String|Object} + * @default {} + * @example + * axis: { + * y2: { + * label: "Your Y2 Axis" + * } + * } + * + * axis: { + * y2: { + * label: { + * text: "Your Y2 Axis", + * position: "outer-middle" + * } + * } + * } + */ + axis_y2_label: {}, + + /** + * Set formatter for y2 axis tick text.

+ * This option works in the same way as axis.y.format. + * @name axis:y2:tick:format + * @memberof Options + * @type {Function} + * @default undefined + * @example + * axis: { + * y2: { + * tick: { + * format: d3.format("$,") + * //or format: function(d) { return "$" + d; } + * } + * } + * } + */ + axis_y2_tick_format: undefined, + + /** + * Show or hide y2 axis outer tick. + * @name axis:y2:tick:outer + * @memberof Options + * @type {Boolean} + * @default true + * @example + * axis: { + * y2: { + * tick: { + * outer: false + * } + * } + * } + */ + axis_y2_tick_outer: !0, + + /** + * Set y2 axis tick values manually. + * @name axis:y2:tick:values + * @memberof Options + * @type {Array} + * @default null + * @example + * axis: { + * y2: { + * tick: { + * values: [100, 1000, 10000] + * } + * } + * } + */ + axis_y2_tick_values: null, + + /** + * Set the number of y2 axis ticks. + * Note: This works in the same way as axis.y.tick.count. + * @name axis:y2:tick:count + * @memberof Options + * @type {Number} + * @default undefined + * @example + * axis: { + * y2: { + * tick: { + * count: 5 + * } + * } + * } + */ + axis_y2_tick_count: undefined, + + /** + * Set the number of y2 axis ticks. + * Note: This works in the same way as axis.y.tick.count. + * @name axis:y2:padding + * @memberof Options + * @type {Number} + * @default {} + * @example + * axis: { + * y2: { + * padding: { + * top: 100, + * bottom: 100 + * } + * } + * } + */ + axis_y2_padding: {}, + + /** + * Set default range of y2 axis.

+ * This option set the default value for y2 axis when there is no data on init. + * @name axis:y2:default + * @memberof Options + * @type {Array} + * @default undefined + * @example + * axis: { + * y2: { + * default: [0, 1000] + * } + * } + */ + axis_y2_default: undefined, + + /** + * Set related options + * @name grid + * @memberof Options + * @type {Object} + * @property {Boolean} [x.show=false] Show grids along x axis. + * @property {Boolean} [x.lines=[]] Show additional grid lines along x axis.
+ * This option accepts array including object that has value, text, position and class. text, position and class are optional. For position, start, middle and end (default) are available. + * If x axis is category axis, value can be category name. If x axis is timeseries axis, value can be date string, Date object and unixtime integer. + * @property {Boolean} [y.show=false] Show grids along x axis. + * @property {Boolean} [y.lines=[]] Show additional grid lines along y axis.
+ * This option accepts array including object that has value, text, position and class. + * @property {Boolean} [y.ticks=10] + * @property {Boolean} [focus.show=true] Show grids when focus. + * @property {Boolean} [lines.front=true] + * @default undefined + * @example + * grid: { + * x: { + * show: true, + * lines: [ + * {value: 2, text: "Label on 2"}, + * {value: 5, text: "Label on 5", class: "label-5"} + * {value: 6, text: "Label on 6", position: "start"} + * ] + * }, + * y: { + * show: true, + * lines: [ + * {value: 100, text: "Label on 100"}, + * {value: 200, text: "Label on 200", class: "label-200"} + * {value: 300, text: "Label on 300", position: 'middle'} + * ], + * ticks: 5 + * }, + * focus: { + * show: false + * }, + * lines: { + * front: false + * } + * } + */ + grid_x_show: !1, + grid_x_type: "tick", + grid_x_lines: [], + grid_y_show: !1, + grid_y_lines: [], + grid_y_ticks: 10, + grid_focus_show: !0, + grid_lines_front: !0, + + /** + * Set point options + * @name point + * @memberof Options + * @type {Object} + * @property {Boolean} [point.show=true] Whether to show each point in line. + * @property {Number} [point.r=2.5] The radius size of each point. + * @property {Boolean} [point.focus.expand.enabled=true] Whether to expand each point on focus. + * @property {Boolean} [point.focus.expand.r=point.r*1.75] The radius size of each point on focus. + * @property {Number} [point.select.r=point.r*4] The radius size of each point on selected. + * @example + * point: { + * show: false, + * r: 5, + * focus: { + * expand: { + * enabled: true, + * r: 1 + * } + * }, + * select: { + * r: 3 + * } + * } + */ + point_show: !0, + point_r: 2.5, + point_sensitivity: 10, + point_focus_expand_enabled: !0, + point_focus_expand_r: undefined, + point_select_r: undefined, + + /** + * Set line options + * @name line + * @memberof Options + * @type {Object} + * @property {Boolean} [line.connectNull=false] Set if null data point will be connected or not.
+ * If true set, the region of null data will be connected without any data point. If false set, the region of null data will not be connected and get empty. + * @property {Boolean} [line.step_type=step] Change step type for step chart.
+ * Available values: + * - step + * - step-before + * - step-after + * @example + * line: { + * connectNull: true, + * step: { + * type: "step-after" + * } + * } + */ + line_connectNull: !1, + line_step_type: "step", + + /** + * Set bar options + * @name bar + * @memberof Options + * @type {Object} + * @property {Number} [bar.width] Change the width of bar chart. + * @property {Number} [bar.width.ratio=0.6] Change the width of bar chart by ratio. + * @property {Number} [bar.width.max] + * @property {Boolean} [bar.zerobased=true] Set if min or max value will be 0 on bar chart. + * @example + * bar: { + * width: 10, + * // or + * width: { + * ratio: 0.2, + * max: 200 + * }, + * zerobased: false + * } + */ + bar_width: undefined, + bar_width_ratio: 0.6, + bar_width_max: undefined, + bar_zerobased: !0, + + /** + * Set area options + * @name area + * @memberof Options + * @type {Object} + * @property {Boolean} [area.zerobased=true] Set if min or max value will be 0 on area chart. + * @property {Boolean} [area.above=false] + * @example + * area: { + * zerobased: false, + * above: true + * } + */ + area_zerobased: !0, + area_above: !1, + + /** + * Set pie options + * @name pie + * @memberof Options + * @type {Object} + * @property {Boolean} [pie.label.show=true] Show or hide label on each pie piece. + * @property {Function} [pie.label.format] Set formatter for the label on each pie piece. + * @property {Number} [pie.label.threshold=0.05] Set threshold to show/hide labels. + * @property {Boolean} [pie.expand=true] Enable or disable expanding pie pieces. + * @property {Number} [pie.padAngle=0] Set padding between data. + * @example + * pie: { + * label: { + * show: false, + * format: function(value, ratio, id) { + * return d3.format("$")(value); + * }, + * threshold: 0.1 + * }, + * expand: false, + * padAngle: 0.1 + * } + */ + pie_label_show: !0, + pie_label_format: undefined, + pie_label_threshold: 0.05, + pie_label_ratio: undefined, + pie_expand: {}, + pie_expand_duration: 50, + pie_padAngle: 0, + + /** + * Set gauge options + * @name gauge + * @memberof Options + * @type {Object} + * @property {Boolean} [gauge.fullCircle=false] + * @property {Boolean} [gauge.label.show=true] Show or hide label on gauge. + * @property {Function} [gauge.label.format] Set formatter for the label on gauge. + * @property {Boolean} [gauge.expand=true] Enable or disable expanding gauge. + * @property {Number} [gauge.expand.duration=50] + * @property {Number} [gauge.min=0] Set min value of the gauge. + * @property {Number} [gauge.max=100] Set max value of the gauge. + * @property {Number} [gauge.startingAngle=-1 * Math.PI / 2] + * @property {String} [gauge.units] Set units of the gauge. + * @property {Number} [gauge.width] Set width of gauge chart. + * @example + * gauge: { + * label: { + * show: false, + * format: function(value, ratio) { + * return value; + * } + * }, + * expand: false, + * min: -100, + * max: 200, + * units: "%", + * width: 10 + * } + */ + gauge_fullCircle: !1, + gauge_label_show: !0, + gauge_label_format: undefined, + gauge_min: 0, + gauge_max: 100, + gauge_startingAngle: -1 * Math.PI / 2, + gauge_label_extents: undefined, + gauge_units: undefined, + gauge_width: undefined, + gauge_expand: {}, + gauge_expand_duration: 50, + + /** + * Set donut options + * @name donut + * @memberof Options + * @type {Object} + * @property {Boolean} [donut.label.show=true] Show or hide label on each donut piece. + * @property {Function} [donut.label.format] Set formatter for the label on each donut piece. + * @property {Number} [donut.label.threshold=0.05] Set threshold to show/hide labels. + * @property {Boolean} [donut.expand=true] Enable or disable expanding donut pieces. + * @property {Number} [donut.width] Set width of donut chart. + * @property {String} [donut.title=""] Set title of donut chart. + * @property {Number} [donut.padAngle=0] Set padding between data. + * @example + * donut: { + * label: { + * show: false, + * format: function(value, ratio, id) { + * return d3.format("$")(value); + * }, + * threshold: 0.1 + * }, + * expand: false, + * width: 10, + * title: "Donut Title", + * padAngle: 0.2 + * } + */ + donut_label_show: !0, + donut_label_format: undefined, + donut_label_threshold: 0.05, + donut_label_ratio: undefined, + donut_width: undefined, + donut_title: "", + donut_expand: {}, + donut_expand_duration: 50, + donut_padAngle: 0, + + /** + * Set spline options + * @name spline + * @memberof Options + * @type {Object} + * @property {String} [spline.interpolation.type=cardinal] + * @example + * spline: { + * interpolation: { + * type: "cardinal" + * } + * } + */ + spline_interpolation_type: "cardinal", + + /** + * Show rectangles inside the chart.

+ * This option accepts array including object that has axis, start, end and class. The keys start, end and class are optional. + * axis must be x, y or y2. start and end should be the value where regions start and end. If not specified, the edge values will be used. If timeseries x axis, date string, Date object and unixtime integer can be used. If class is set, the region element will have it as class. + * @name regions + * @memberof Options + * @type {Array} + * @default [] + * @example + * regions: [ + * { + * axis: "x", + * start: 1, + * end: 4, + * class: "region-1-4" + * } + * ] + */ + regions: [], + + /** + * Tooltip options + * @name tooltip + * @memberof Options + * @type {Object} + * @property {Boolean} [tooltip.show=true] Show or hide tooltip.
+ * @property {Boolean} [tooltip.grouped=true] Set if tooltip is grouped or not for the data points. + * @property {Function} [tooltip.format.title] Set format for the title of tooltip.
+ * Specified function receives x of the data point to show. + * @property {Function} [tooltip.format.name] Set format for the name of each data in tooltip.
+ * Specified function receives name, ratio, id and index of the data point to show. ratio will be undefined if the chart is not donut/pie/gauge. + * @property {Function} [tooltip.format.value] Set format for the value of each data in tooltip.
+ * Specified function receives name, ratio, id and index of the data point to show. ratio will be undefined if the chart is not donut/pie/gauge. + * If undefined returned, the row of that value will be skipped. + * @property {function} [tooltip.position] Set custom position for the tooltip.
+ * This option can be used to modify the tooltip position by returning object that has top and left. + * @property {function} [tooltip.contents] Set custom HTML for the tooltip.
+ * Specified function receives data, defaultTitleFormat, defaultValueFormat and color of the data point to show. If tooltip.grouped is true, data includes multiple data points. + * @example + * tooltip: { + * show: true, + * grouped: false, + * format: { + * title: function(x) { return "Data " + x; }, + * name: function(name, ratio, id, index) { return name; }, + * value: function(value, ratio, id, index) { return ratio; } + * }, + * position: function(data, width, height, element) { + * return {top: 0, left: 0} + * }, + * contents: function(d, defaultTitleFormat, defaultValueFormat, color) { + * return ... // formatted html as you want + * } + * } + */ + tooltip_show: !0, + tooltip_grouped: !0, + tooltip_format_title: undefined, + tooltip_format_name: undefined, + tooltip_format_value: undefined, + tooltip_position: undefined, + tooltip_contents: function tooltip_contents(d, defaultTitleFormat, defaultValueFormat, color) { + return this.getTooltipContent ? this.getTooltipContent(d, defaultTitleFormat, defaultValueFormat, color) : ""; + }, + tooltip_init_show: !1, + tooltip_init_x: 0, + tooltip_init_position: { + top: "0px", + left: "50px" + }, + tooltip_onshow: function tooltip_onshow() {}, + tooltip_onhide: function tooltip_onhide() {}, + + /** + * Set title options + * @name title + * @memberof Options + * @type {Object} + * @property {String} [title.text] + * @property {Number} [title.padding.top=0] + * @property {Number} [title.padding.right=0] + * @property {Number} [title.padding.bottom=0] + * @property {Number} [title.padding.left=0] + * @property {String} [title.position=top-center] + * @example + * title: { + * text: "Title Text", + * padding: { + * top: 10, + * right: 10, + * bottom: 10, + * left: 10 + * }, + * position: "top-center" + * } + */ + title_text: undefined, + title_padding: { + top: 0, + right: 0, + bottom: 0, + left: 0 + }, + title_position: "top-center" + }; +}; + +exports.default = Options; +module.exports = exports["default"]; + +/***/ }), +/* 59 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +exports.__esModule = !0; +exports.d3 = exports.bb = undefined; + +var _d = __webpack_require__(2), + d3 = _interopRequireWildcard(_d), + _Chart = __webpack_require__(4), + _Chart2 = _interopRequireDefault(_Chart), + _ChartInternal = __webpack_require__(1), + _ChartInternal2 = _interopRequireDefault(_ChartInternal), + _Axis = __webpack_require__(7), + _Axis2 = _interopRequireDefault(_Axis), + _util = __webpack_require__(0), + util = _interopRequireWildcard(_util); + +__webpack_require__(57); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) return obj; var newObj = {}; if (obj != null) for (var key in obj) Object.prototype.hasOwnProperty.call(obj, key) && (newObj[key] = obj[key]); return newObj.default = obj, newObj; } + +/** + * @namespace bb + * @version 1.0.0 + */ +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +var bb = { + /** + * Version information + * @property {String} version version + * @example + * bb.version; // "1.0.0" + * @memberof bb + */ + version: "1.0.0", + /** + * generate charts + * @param {Options} options chart options + * @memberof bb + * @return {Chart} + * @see {@link Options} for different generation options + * @see {@link Chart} for different methods API + * @example + * + *
+ * @example + * // generate chart with options + * var chart = bb.generate({ + * "bindto": "#LineChart" + * "data": { + * "columns": [ + * ["data1", 30, 200, 100, 400, 150, 250], + * ["data2", 50, 20, 10, 40, 15, 25] + * ] + * } + * }); + * + * // call some API + * // ex) get the data of 'data1' + * chart.data("data1"); + */ + generate: function generate(config) { + return new _Chart2.default(config); + }, + + chart: { + fn: _Chart2.default.prototype, + internal: { + fn: _ChartInternal2.default.prototype, + axis: { + fn: _Axis2.default.prototype + } + } + } +}; + +for (var p in util) /^__/.test(p) || (_ChartInternal2.default.prototype[p] = util[p]); + +__webpack_require__(27), __webpack_require__(46), __webpack_require__(41), __webpack_require__(29), __webpack_require__(28), __webpack_require__(30), __webpack_require__(37), __webpack_require__(32), __webpack_require__(51), __webpack_require__(49), __webpack_require__(50), __webpack_require__(48), __webpack_require__(52), __webpack_require__(55), __webpack_require__(43), __webpack_require__(54), __webpack_require__(44), __webpack_require__(53), __webpack_require__(39), __webpack_require__(35), __webpack_require__(45), __webpack_require__(31), __webpack_require__(47), __webpack_require__(33), __webpack_require__(34), __webpack_require__(40), __webpack_require__(42), __webpack_require__(36), __webpack_require__(38), __webpack_require__(15), __webpack_require__(22), __webpack_require__(26), __webpack_require__(19), __webpack_require__(14), __webpack_require__(21), __webpack_require__(24), __webpack_require__(17), __webpack_require__(16), __webpack_require__(20), __webpack_require__(13), __webpack_require__(10), __webpack_require__(12), __webpack_require__(25), __webpack_require__(9), __webpack_require__(18), __webpack_require__(11), __webpack_require__(23), __webpack_require__(8), __webpack_require__(56); +exports.bb = bb; +exports.d3 = d3; + +/***/ }), +/* 60 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +exports.__esModule = !0; +/** + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + */ +/* eslint-disable no-new-func, no-nested-ternary */ +var win = typeof window !== "undefined" && window.Math === Math ? window : typeof self !== "undefined" && self.Math === Math ? self : Function("return this")(); +/* eslint-enable no-new-func, no-nested-ternary */ + +exports.window = win; +var document = exports.document = win.document; + +/***/ }), +/* 61 */ +/***/ (function(module, exports) { + +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ +// css base code, injected by the css-loader +module.exports = function(useSourceMap) { + var list = []; + + // return the list of modules as css string + list.toString = function toString() { + return this.map(function (item) { + var content = cssWithMappingToString(item, useSourceMap); + if(item[2]) { + return "@media " + item[2] + "{" + content + "}"; + } else { + return content; + } + }).join(""); + }; + + // import a list of modules into the list + list.i = function(modules, mediaQuery) { + if(typeof modules === "string") + modules = [[null, modules, ""]]; + var alreadyImportedModules = {}; + for(var i = 0; i < this.length; i++) { + var id = this[i][0]; + if(typeof id === "number") + alreadyImportedModules[id] = true; + } + for(i = 0; i < modules.length; i++) { + var item = modules[i]; + // skip already imported module + // this implementation is not 100% perfect for weird media query combinations + // when a module is imported multiple times with different media queries. + // I hope this will never occur (Hey this way we have smaller bundles) + if(typeof item[0] !== "number" || !alreadyImportedModules[item[0]]) { + if(mediaQuery && !item[2]) { + item[2] = mediaQuery; + } else if(mediaQuery) { + item[2] = "(" + item[2] + ") and (" + mediaQuery + ")"; + } + list.push(item); + } + } + }; + return list; +}; + +function cssWithMappingToString(item, useSourceMap) { + var content = item[1] || ''; + var cssMapping = item[3]; + if (!cssMapping) { + return content; + } + + if (useSourceMap && typeof btoa === 'function') { + var sourceMapping = toComment(cssMapping); + var sourceURLs = cssMapping.sources.map(function (source) { + return '/*# sourceURL=' + cssMapping.sourceRoot + source + ' */' + }); + + return [content].concat(sourceURLs).concat([sourceMapping]).join('\n'); + } + + return [content].join('\n'); +} + +// Adapted from convert-source-map (MIT) +function toComment(sourceMap) { + // eslint-disable-next-line no-undef + var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))); + var data = 'sourceMappingURL=data:application/json;charset=utf-8;base64,' + base64; + + return '/*# ' + data + ' */'; +} + + +/***/ }) +/******/ ]); +}); \ No newline at end of file diff --git a/dist/billboard.pkgd.min.js b/dist/billboard.pkgd.min.js new file mode 100644 index 000000000..6f68be8aa --- /dev/null +++ b/dist/billboard.pkgd.min.js @@ -0,0 +1,13 @@ +/*! + * Copyright (c) 2017 NAVER Corp. + * billboard.js project is licensed under the MIT license + * + * billboard.js, JavaScript chart library + * http://naver.github.io/billboard.js/ + * + * @version 1.0.0 + * + * All-in-one packaged file for ease use of 'billboard.js' with below dependency. + * - d3 + */ +!function(t,e){if("object"==typeof exports&&"object"==typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var n=e();for(var i in n)("object"==typeof exports?exports:t)[i]=n[i]}}(this,function(){return function(t){function __webpack_require__(n){if(e[n])return e[n].exports;var i=e[n]={i:n,l:!1,exports:{}};return t[n].call(i.exports,i,i.exports,__webpack_require__),i.l=!0,i.exports}var e={};return __webpack_require__.m=t,__webpack_require__.c=e,__webpack_require__.i=function(t){return t},__webpack_require__.d=function(t,e,n){__webpack_require__.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:n})},__webpack_require__.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return __webpack_require__.d(e,"a",e),e},__webpack_require__.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},__webpack_require__.p="",__webpack_require__(__webpack_require__.s=59)}([function(t,e,n){"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}function extend(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=arguments[1],n=void 0;for(n in e)t[n]=e[n];return t}function addEvent(t,e,n,i){if(M){var a=i||!1;"object"===(void 0===i?"undefined":(0,r.default)(i))&&(a=!!S&&i),t.addEventListener(e,n,a)}else t.attachEvent?t.attachEvent("on"+e,n):t["on"+e]=n}function removeEvent(t,e,n){t.removeEventListener?t.removeEventListener(e,n,!1):t.detachEvent?t.detachEvent("on"+e,n):t["on"+e]=null}e.__esModule=!0,e.isObject=e.isArray=e.merge=e.getRectSegList=e.removeEvent=e.addEvent=e.extend=e.brushEmpty=e.getBrushSelection=e.isEmpty=e.diffDomain=e.getPathBox=e.sanitise=e.hasValue=e.isString=e.getOption=e.asHalfPixel=e.isFunction=e.ceil10=e.notEmpty=e.isUndefined=e.isDefined=e.isValue=void 0;var i=n(5),r=_interopRequireDefault(i),a=n(2),o=n(3),s=_interopRequireDefault(o),u=function(t){return t||0===t},c=function(t){return"function"==typeof t},l=function(t){return"string"==typeof t},f=function(t){return void 0===t},d=function(t){return void 0!==t},h=function(t){return 10*Math.ceil(t/10)},p=function(t){return Math.ceil(t)+.5},g=function(t){return t[1]-t[0]},v=function(t){return void 0===t||null===t||l(t)&&0===t.length||"object"===(void 0===t?"undefined":(0,r.default)(t))&&0===Object.keys(t).length},x=function(t){return!v(t)},_=function(t,e,n){return d(t[e])?t[e]:n},m=function(t,e){var n=!1;return Object.keys(t).forEach(function(i){return t[i]===e&&(n=!0)}),n},y=function(t){return"string"==typeof t?t.replace(//g,">"):t},b=function(t){var e=t.getBBox(),n=[];return n.push({x:e.x,y:e.y+e.height}),n.push({x:e.x,y:e.y}),n.push({x:e.x+e.width,y:e.y}),n.push({x:e.x+e.width,y:e.y+e.height}),n},w=function(t){var e=t.getBoundingClientRect(),n=b(t);return{x:n[0].x,y:Math.min(n[0].y,n[1].y),width:e.width,height:e.height}},T=function(){var t=null,e=a.event;return e&&"BrushEvent"===e.constructor.name?t=e.selection:this.context&&(t=this.context.select("."+s.default.brush).node())&&(t=(0,a.brushSelection)(t)),t},A=function(){var t=this.getBrushSelection();return!t||t[0]===t[1]},M=!!("addEventListener"in document),S=function(){var t=!1;try{M&&Object.defineProperty&&document.addEventListener("test",null,Object.defineProperty({},"passive",{get:function(){t=!0}}))}catch(t){}return t}(),C=function(t){return t&&t.constructor===Array},k=function(t){return t&&!t.nodeType&&"object"===(void 0===t?"undefined":(0,r.default)(t))&&!C(t)},R=function(t){for(var e=arguments.length,n=Array(e>1?e-1:0),i=1;i0&&void 0!==arguments[0]?arguments[0]:{},e=arguments[1],n=this,i=n.main,r=n.config,o=n.getShapeIndices(n.isAreaType),s=n.getShapeIndices(n.isBarType),u=n.getShapeIndices(n.isLineType),f=void 0,d=void 0,h=n.hasArcType(),p=n.filterTargetsToShow(n.data.targets),g=n.xv.bind(n),v=void 0,x=void 0,_=void 0,m=(0,l.getOption)(t,"withY",!0),y=(0,l.getOption)(t,"withSubchart",!0),b=(0,l.getOption)(t,"withTransition",!0),w=(0,l.getOption)(t,"withTransform",!1),T=(0,l.getOption)(t,"withUpdateXDomain",!1),A=(0,l.getOption)(t,"withUpdateOrgXDomain",!1),M=(0,l.getOption)(t,"withTrimXDomain",!0),S=(0,l.getOption)(t,"withUpdateXAxis",T),C=(0,l.getOption)(t,"withLegend",!1),k=(0,l.getOption)(t,"withEventRect",!0),R=(0,l.getOption)(t,"withDimension",!0),L=(0,l.getOption)(t,"withTransitionForExit",b),E=(0,l.getOption)(t,"withTransitionForAxis",b),D=b?r.transition_duration:0,I=L?D:0,F=E?D:0,N=e||n.axis.generateTransitions(F);if("touch"===n.inputType&&n.hideTooltip(),C&&r.legend_show?n.updateLegend(n.mapToIds(n.data.targets),t,N):R&&n.updateDimension(!0),n.isCategorized()&&0===p.length&&n.x.domain([0,n.axes.x.selectAll(".tick").size()]),p.length?(n.updateXDomain(p,T,A,M),!r.axis_x_tick_values&&(v=n.axis.updateXAxisTickValues(p))):(n.xAxis.tickValues([]),n.subXAxis.tickValues([])),r.zoom_rescale&&!t.flow&&(_=n.x.orgDomain()),n.y.domain(n.getYDomain(p,"y",_)),n.y2.domain(n.getYDomain(p,"y2",_)),!r.axis_y_tick_values&&r.axis_y_tick_count&&n.yAxis.tickValues(n.axis.generateTickValues(n.y.domain(),r.axis_y_tick_count,n.isTimeSeriesY())),!r.axis_y2_tick_values&&r.axis_y2_tick_count&&n.y2Axis.tickValues(n.axis.generateTickValues(n.y2.domain(),r.axis_y2_tick_count)),n.axis.redraw(N,h),n.axis.updateLabels(b),(T||S)&&p.length)if(r.axis_x_tick_culling&&v){for(var P=1;P=0&&(0,a.select)(this).style("display",e%x?"none":"block")})}else n.svg.selectAll("."+c.default.axisX+" .tick text").style("display","block");var z=n.generateDrawArea?n.generateDrawArea(o,!1):void 0,O=n.generateDrawBar?n.generateDrawBar(s):void 0,X=n.generateDrawLine?n.generateDrawLine(u,!1):void 0,$=n.generateXYForText(o,s,u,!0),Y=n.generateXYForText(o,s,u,!1);m&&(n.subY.domain(n.getYDomain(p,"y")),n.subY2.domain(n.getYDomain(p,"y2"))),n.updateXgridFocus(),i.select("text."+c.default.text+"."+c.default.empty).attr("x",n.width/2).attr("y",n.height/2).text(r.data_empty_label_text).transition().style("opacity",p.length?0:1),n.updateGrid(D),n.updateRegion(D),n.updateBar(I),n.updateLine(I),n.updateArea(I),n.updateCircle(),n.hasDataLabel()&&n.updateText(I),n.redrawTitle&&n.redrawTitle(),n.redrawArc&&n.redrawArc(D,I,w),r.subchart_show&&n.redrawSubchart&&n.redrawSubchart(y,N,D,I,o,s,u),i.selectAll("."+c.default.selectedCircles).filter(n.isBarType.bind(n)).selectAll("circle").remove(),r.interaction_enabled&&!t.flow&&k&&(n.redrawEventRect(),n.updateZoom&&n.updateZoom()),n.updateCircleY();var B=(n.config.axis_rotated?n.circleY:n.circleX).bind(n),q=(n.config.axis_rotated?n.circleX:n.circleY).bind(n);t.flow&&(d=n.generateFlow({targets:p,flow:t.flow,duration:t.flow.duration,drawBar:O,drawLine:X,drawArea:z,cx:B,cy:q,xv:g,xForText:$,yForText:Y})),(D||d)&&n.isTabVisible()?(0,a.transition)().duration(D).each(function(){f=n.generateWait(),[n.redrawBar(O,!0),n.redrawLine(X,!0),n.redrawArea(z,!0),n.redrawCircle(B,q,!0,d),n.redrawText($,Y,t.flow,!0),n.redrawRegion(!0),n.redrawGrid(!0)].reduce(function(t,e){return e.forEach(function(e){t.push(e)}),t},[]).forEach(function(t){f.add(t)})}).call(f,function(){d&&d(),r.onrendered&&r.onrendered.call(n)}):(n.redrawBar(O),n.redrawLine(X),n.redrawArea(z),n.redrawCircle(B,q),n.redrawText($,Y,t.flow),n.redrawRegion(),n.redrawGrid(),r.onrendered&&r.onrendered.call(n)),n.mapToIds(n.data.targets).forEach(function(t){n.withoutFadeIn[t]=!0})},ChartInternal.prototype.updateAndRedraw=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=this,n=e.config,i=void 0;t.withTransition=(0,l.getOption)(t,"withTransition",!0),t.withTransform=(0,l.getOption)(t,"withTransform",!1),t.withLegend=(0,l.getOption)(t,"withLegend",!1),t.withUpdateXDomain=!0,t.withUpdateOrgXDomain=!0,t.withTransitionForExit=!1,t.withTransitionForTransform=(0,l.getOption)(t,"withTransitionForTransform",t.withTransition),e.updateSizes(),t.withLegend&&n.legend_show||(i=e.axis.generateTransitions(t.withTransitionForAxis?n.transition_duration:0),e.updateScales(),e.updateSvgSize(),e.transformAll(t.withTransitionForTransform,i)),e.redraw(t,i)},ChartInternal.prototype.redrawWithoutRescale=function(){this.redraw({withY:!1,withSubchart:!1,withEventRect:!1,withTransitionForAxis:!1})},ChartInternal.prototype.isTimeSeries=function(){return"timeseries"===this.config.axis_x_type},ChartInternal.prototype.isCategorized=function(){return this.config.axis_x_type.indexOf("categor")>=0},ChartInternal.prototype.isCustomX=function(){var t=this,e=t.config;return!t.isTimeSeries()&&(e.data_x||(0,l.notEmpty)(e.data_xs))},ChartInternal.prototype.isTimeSeriesY=function(){return"timeseries"===this.config.axis_y_type},ChartInternal.prototype.getTranslate=function(t){var e=this,n=e.config,i=void 0,r=void 0;return"main"===t?(i=(0,l.asHalfPixel)(e.margin.left),r=(0,l.asHalfPixel)(e.margin.top)):"context"===t?(i=(0,l.asHalfPixel)(e.margin2.left),r=(0,l.asHalfPixel)(e.margin2.top)):"legend"===t?(i=e.margin3.left,r=e.margin3.top):"x"===t?(i=0,r=n.axis_rotated?0:e.height):"y"===t?(i=0,r=n.axis_rotated?e.height:0):"y2"===t?(i=n.axis_rotated?0:e.width,r=n.axis_rotated?1:0):"subx"===t?(i=0,r=n.axis_rotated?0:e.height2):"arc"===t&&(i=e.arcWidth/2,r=e.arcHeight/2),"translate("+i+", "+r+")"},ChartInternal.prototype.initialOpacity=function(t){return null!==t.value&&this.withoutFadeIn[t.id]?"1":"0"},ChartInternal.prototype.initialOpacityForCircle=function(t){return null!==t.value&&this.withoutFadeIn[t.id]?this.opacityForCircle(t):"0"},ChartInternal.prototype.opacityForCircle=function(t){var e=this.config.point_show?"1":"0";return(0,l.isValue)(t.value)?this.isScatterType(t)?"0.5":e:"0"},ChartInternal.prototype.opacityForText=function(){return this.hasDataLabel()?"1":"0"},ChartInternal.prototype.xx=function(t){return this.config.zoom_enabled&&this.zoomScale?t?this.zoomScale(t.x):null:t?this.x(t.x):null},ChartInternal.prototype.xv=function(t){var e=this,n=t.value;return e.isTimeSeries()?n=e.parseDate(t.value):e.isCategorized()&&"string"==typeof t.value&&(n=e.config.axis_x_categories.indexOf(t.value)),Math.ceil(e.x(n))},ChartInternal.prototype.yv=function(t){var e=this,n=t.axis&&"y2"===t.axis?e.y2:e.y;return Math.ceil(n(t.value))},ChartInternal.prototype.subxx=function(t){return t?this.subX(t.x):null},ChartInternal.prototype.transformMain=function(t,e){var n=this,i=void 0,r=void 0,a=void 0;e&&e.axisX?i=e.axisX:(i=n.main.select("."+c.default.axisX),t&&(i=i.transition())),e&&e.axisY?r=e.axisY:(r=n.main.select("."+c.default.axisY),t&&(r=r.transition())),e&&e.axisY2?a=e.axisY2:(a=n.main.select("."+c.default.axisY2),t&&(a=a.transition())),(t?n.main.transition():n.main).attr("transform",n.getTranslate("main")),i.attr("transform",n.getTranslate("x")),r.attr("transform",n.getTranslate("y")),a.attr("transform",n.getTranslate("y2")),n.main.select("."+c.default.chartArcs).attr("transform",n.getTranslate("arc"))},ChartInternal.prototype.transformAll=function(t,e){var n=this;n.transformMain(t,e),n.config.subchart_show&&n.transformContext(t,e),n.legend&&n.transformLegend(t)},ChartInternal.prototype.updateSvgSize=function(){var t=this,e=t.svg.select("."+c.default.brush+" .overlay"),n=e.size()?e.attr("height"):0;t.svg.attr("width",t.currentWidth).attr("height",t.currentHeight),t.svg.selectAll(["#"+t.clipId,"#"+t.clipIdForGrid]).select("rect").attr("width",t.width).attr("height",t.height),t.svg.select("#"+t.clipIdForXAxis).select("rect").attr("x",t.getXAxisClipX.bind(t)).attr("y",t.getXAxisClipY.bind(t)).attr("width",t.getXAxisClipWidth.bind(t)).attr("height",t.getXAxisClipHeight.bind(t)),t.svg.select("#"+t.clipIdForYAxis).select("rect").attr("x",t.getYAxisClipX.bind(t)).attr("y",t.getYAxisClipY.bind(t)).attr("width",t.getYAxisClipWidth.bind(t)).attr("height",t.getYAxisClipHeight.bind(t)),t.svg.select("#"+t.clipIdForSubchart).select("rect").attr("width",t.width).attr("height",n),t.svg.select("."+c.default.zoomRect).attr("width",t.width).attr("height",t.height),t.selectChart.style("max-height",t.currentHeight+"px"),t.brush&&t.brush.scale(t.subX,n)},ChartInternal.prototype.updateDimension=function(t){var e=this;t||(e.config.axis_rotated?(e.axes.x.call(e.xAxis),e.axes.subx.call(e.subXAxis)):(e.axes.y.call(e.yAxis),e.axes.y2.call(e.y2Axis))),e.updateSizes(),e.updateScales(t),e.updateSvgSize(),e.transformAll(!1)},ChartInternal.prototype.observeInserted=function(t){var e=this;if("undefined"==typeof MutationObserver)return void(console&&console.error&&console.error("MutationObserver not defined."));var n=new MutationObserver(function(i){i.forEach(function(i){"childList"===i.type&&i.previousSibling&&(n.disconnect(),e.intervalForObserveInserted=window.setInterval(function(){t.node().parentNode&&(window.clearInterval(e.intervalForObserveInserted),e.updateDimension(),e.brush&&e.brush.update(),e.config.oninit.call(e),e.redraw({withTransform:!0,withUpdateXDomain:!0,withUpdateOrgXDomain:!0,withTransition:!1,withTransitionForTransform:!1,withLegend:!0}),t.transition().style("opacity","1"))},10))})});n.observe(t.node(),{attributes:!0,childList:!0,characterData:!0})},ChartInternal.prototype.bindResize=function(){var t=this,e=t.config;t.resizeFunction=t.generateResize(),t.resizeFunction.add(function(){e.onresize.call(t)}),e.resize_auto&&t.resizeFunction.add(function(){void 0!==t.resizeTimeout&&window.clearTimeout(t.resizeTimeout),t.resizeTimeout=window.setTimeout(function(){delete t.resizeTimeout,t.api.flush()},100)}),t.resizeFunction.add(function(){e.onresized.call(t)}),(0,l.addEvent)(window,"resize",t.resizeFunction)},ChartInternal.prototype.generateResize=function(){function callResizeFunctions(){t.forEach(function(t){return t()})}var t=[];return callResizeFunctions.add=function(e){t.push(e)},callResizeFunctions.remove=function(e){for(var n=0;n=0?(a>=b?10:a>=w?5:a>=T?2:1)*Math.pow(10,r):-Math.pow(10,-r)/(a>=b?10:a>=w?5:a>=T?2:1)}function tickStep(t,e,n){var i=Math.abs(e-t)/Math.max(0,n),r=Math.pow(10,Math.floor(Math.log(i)/Math.LN10)),a=i/r;return a>=b?r*=10:a>=w?r*=5:a>=T&&(r*=2),e=0&&(n=t.slice(i+1),t=t.slice(0,i)),t&&!e.hasOwnProperty(t))throw new Error("unknown type: "+t);return{type:t,name:n}})}function get(t,e){for(var n,i=0,r=t.length;i=0&&(e=t.slice(n+1),t=t.slice(0,n)),{type:t,name:e}})}function onRemove(t){return function(){var e=this.__on;if(e){for(var n,i=0,r=-1,a=e.length;ie?1:t>=e?0:NaN}function attrRemove(t){return function(){this.removeAttribute(t)}}function attrRemoveNS(t){return function(){this.removeAttributeNS(t.space,t.local)}}function attrConstant(t,e){return function(){this.setAttribute(t,e)}}function attrConstantNS(t,e){return function(){this.setAttributeNS(t.space,t.local,e)}}function attrFunction(t,e){return function(){var n=e.apply(this,arguments);null==n?this.removeAttribute(t):this.setAttribute(t,n)}}function attrFunctionNS(t,e){return function(){var n=e.apply(this,arguments);null==n?this.removeAttributeNS(t.space,t.local):this.setAttributeNS(t.space,t.local,n)}}function styleRemove(t){return function(){this.style.removeProperty(t)}}function styleConstant(t,e,n){return function(){this.style.setProperty(t,e,n)}}function styleFunction(t,e,n){return function(){var i=e.apply(this,arguments);null==i?this.style.removeProperty(t):this.style.setProperty(t,i,n)}}function styleValue(t,e){return t.style.getPropertyValue(e)||Lt(t).getComputedStyle(t,null).getPropertyValue(e)}function propertyRemove(t){return function(){delete this[t]}}function propertyConstant(t,e){return function(){this[t]=e}}function propertyFunction(t,e){return function(){var n=e.apply(this,arguments);null==n?delete this[t]:this[t]=n}}function classArray(t){return t.trim().split(/^|\s+/)}function classList(t){return t.classList||new ClassList(t)}function ClassList(t){this._node=t,this._names=classArray(t.getAttribute("class")||"")}function classedAdd(t,e){for(var n=classList(t),i=-1,r=e.length;++i>8&15|e>>4&240,e>>4&15|240&e,(15&e)<<4|15&e,1)):(e=ie.exec(t))?rgbn(parseInt(e[1],16)):(e=re.exec(t))?new Rgb(e[1],e[2],e[3],1):(e=ae.exec(t))?new Rgb(255*e[1]/100,255*e[2]/100,255*e[3]/100,1):(e=oe.exec(t))?rgba(e[1],e[2],e[3],e[4]):(e=se.exec(t))?rgba(255*e[1]/100,255*e[2]/100,255*e[3]/100,e[4]):(e=ue.exec(t))?hsla(e[1],e[2]/100,e[3]/100,1):(e=ce.exec(t))?hsla(e[1],e[2]/100,e[3]/100,e[4]):le.hasOwnProperty(t)?rgbn(le[t]):"transparent"===t?new Rgb(NaN,NaN,NaN,0):null}function rgbn(t){return new Rgb(t>>16&255,t>>8&255,255&t,1)}function rgba(t,e,n,i){return i<=0&&(t=e=n=NaN),new Rgb(t,e,n,i)}function rgbConvert(t){return t instanceof Color||(t=color(t)),t?(t=t.rgb(),new Rgb(t.r,t.g,t.b,t.opacity)):new Rgb}function rgb(t,e,n,i){return 1===arguments.length?rgbConvert(t):new Rgb(t,e,n,null==i?1:i)}function Rgb(t,e,n,i){this.r=+t,this.g=+e,this.b=+n,this.opacity=+i}function hsla(t,e,n,i){return i<=0?t=e=n=NaN:n<=0||n>=1?t=e=NaN:e<=0&&(t=NaN),new Hsl(t,e,n,i)}function hslConvert(t){if(t instanceof Hsl)return new Hsl(t.h,t.s,t.l,t.opacity);if(t instanceof Color||(t=color(t)),!t)return new Hsl;if(t instanceof Hsl)return t;t=t.rgb();var e=t.r/255,n=t.g/255,i=t.b/255,r=Math.min(e,n,i),a=Math.max(e,n,i),o=NaN,s=a-r,u=(a+r)/2;return s?(o=e===a?(n-i)/s+6*(n0&&u<1?0:o,new Hsl(o,s,u,t.opacity)}function hsl(t,e,n,i){return 1===arguments.length?hslConvert(t):new Hsl(t,e,n,null==i?1:i)}function Hsl(t,e,n,i){this.h=+t,this.s=+e,this.l=+n,this.opacity=+i}function hsl2rgb(t,e,n){return 255*(t<60?e+(n-e)*t/60:t<180?n:t<240?e+(n-e)*(240-t)/60:e)}function labConvert(t){if(t instanceof Lab)return new Lab(t.l,t.a,t.b,t.opacity);if(t instanceof Hcl){var e=t.h*fe;return new Lab(t.l,Math.cos(e)*t.c,Math.sin(e)*t.c,t.opacity)}t instanceof Rgb||(t=rgbConvert(t));var n=rgb2xyz(t.r),i=rgb2xyz(t.g),r=rgb2xyz(t.b),a=xyz2lab((.4124564*n+.3575761*i+.1804375*r)/he),o=xyz2lab((.2126729*n+.7151522*i+.072175*r)/pe);return new Lab(116*o-16,500*(a-o),200*(o-xyz2lab((.0193339*n+.119192*i+.9503041*r)/ge)),t.opacity)}function lab(t,e,n,i){return 1===arguments.length?labConvert(t):new Lab(t,e,n,null==i?1:i)}function Lab(t,e,n,i){this.l=+t,this.a=+e,this.b=+n,this.opacity=+i}function xyz2lab(t){return t>me?Math.pow(t,1/3):t/_e+ve}function lab2xyz(t){return t>xe?t*t*t:_e*(t-ve)}function xyz2rgb(t){return 255*(t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055)}function rgb2xyz(t){return(t/=255)<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)}function hclConvert(t){if(t instanceof Hcl)return new Hcl(t.h,t.c,t.l,t.opacity);t instanceof Lab||(t=labConvert(t));var e=Math.atan2(t.b,t.a)*de;return new Hcl(e<0?e+360:e,Math.sqrt(t.a*t.a+t.b*t.b),t.l,t.opacity)}function hcl(t,e,n,i){return 1===arguments.length?hclConvert(t):new Hcl(t,e,n,null==i?1:i)}function Hcl(t,e,n,i){this.h=+t,this.c=+e,this.l=+n,this.opacity=+i}function cubehelixConvert(t){if(t instanceof Cubehelix)return new Cubehelix(t.h,t.s,t.l,t.opacity);t instanceof Rgb||(t=rgbConvert(t));var e=t.r/255,n=t.g/255,i=t.b/255,r=(Ce*i+Me*e-Se*n)/(Ce+Me-Se),a=i-r,o=(Ae*(n-r)-we*a)/Te,s=Math.sqrt(o*o+a*a)/(Ae*r*(1-r)),u=s?Math.atan2(o,a)*de-120:NaN;return new Cubehelix(u<0?u+360:u,s,r,t.opacity)}function cubehelix(t,e,n,i){return 1===arguments.length?cubehelixConvert(t):new Cubehelix(t,e,n,null==i?1:i)}function Cubehelix(t,e,n,i){this.h=+t,this.s=+e,this.l=+n,this.opacity=+i}function basis(t,e,n,i,r){var a=t*t,o=a*t;return((1-3*t+3*a-o)*e+(4-6*a+3*o)*n+(1+3*t+3*a-3*o)*i+o*r)/6}function linear(t,e){return function(n){return t+n*e}}function exponential(t,e,n){return t=Math.pow(t,n),e=Math.pow(e,n)-t,n=1/n,function(i){return Math.pow(t+i*e,n)}}function hue(t,e){var n=e-t;return n?linear(t,n>180||n<-180?n-360*Math.round(n/360):n):Pe(isNaN(t)?e:t)}function gamma(t){return 1==(t=+t)?nogamma:function(e,n){return n-e?exponential(e,n,t):Pe(isNaN(e)?n:e)}}function nogamma(t,e){var n=e-t;return n?linear(t,n):Pe(isNaN(t)?e:t)}function rgbSpline(t){return function(e){var n,i,r=e.length,a=new Array(r),o=new Array(r),s=new Array(r);for(n=0;n180?e+=360:e-t>180&&(t+=360),r.push({i:n.push(pop(n)+"rotate(",null,i)-2,x:Be(t,e)})):e&&n.push(pop(n)+"rotate("+e+i)}function skewX(t,e,n,r){t!==e?r.push({i:n.push(pop(n)+"skewX(",null,i)-2,x:Be(t,e)}):e&&n.push(pop(n)+"skewX("+e+i)}function scale(t,e,n,i,r,a){if(t!==n||e!==i){var o=r.push(pop(r)+"scale(",null,",",null,")");a.push({i:o-4,x:Be(t,n)},{i:o-2,x:Be(e,i)})}else 1===n&&1===i||r.push(pop(r)+"scale("+n+","+i+")")}return function(e,n){var i=[],r=[];return e=t(e),n=t(n),translate(e.translateX,e.translateY,n.translateX,n.translateY,i,r),rotate(e.rotate,n.rotate,i,r),skewX(e.skewX,n.skewX,i,r),scale(e.scaleX,e.scaleY,n.scaleX,n.scaleY,i,r),e=n=null,function(t){for(var e,n=-1,a=r.length;++n=0&&e._call.call(null,t),e=e._next;--ln}function wake(){gn=(pn=xn.now())+vn,ln=fn=0;try{timerFlush()}finally{ln=0,nap(),gn=0}}function poke(){var t=xn.now(),e=t-pn;e>hn&&(vn-=e,pn=t)}function nap(){for(var t,e,n=De,i=1/0;n;)n._call?(i>n._time&&(i=n._time),t=n,n=n._next):(e=n._next,n._next=null,n=t?t._next=e:De=e);Ie=t,sleep(i)}function sleep(t){if(!ln){fn&&(fn=clearTimeout(fn));var e=t-gn;e>24?(t<1/0&&(fn=setTimeout(wake,e)),dn&&(dn=clearInterval(dn))):(dn||(pn=gn,dn=setInterval(poke,hn)),ln=1,_n(wake))}}function init(t,e){var n=t.__transition;if(!n||!(n=n[e])||n.state>Tn)throw new Error("too late");return n}function set$1(t,e){var n=t.__transition;if(!n||!(n=n[e])||n.state>Mn)throw new Error("too late");return n}function get$1(t,e){var n=t.__transition;if(!n||!(n=n[e]))throw new Error("too late");return n}function create(t,e,n){function schedule(t){n.state=An,n.timer.restart(start,n.delay,n.time),n.delay<=t&&start(t-n.delay)}function start(a){var o,s,u,c;if(n.state!==An)return stop();for(o in r)if(c=r[o],c.name===n.name){if(c.state===Sn)return mn(start);c.state===Cn?(c.state=Rn,c.timer.stop(),c.on.call("interrupt",t,t.__data__,c.index,c.group),delete r[o]):+o=0&&(t=t.slice(0,e)),!t||"start"===t})}function onFunction(t,e,n){var i,r,a=start(e)?init:set$1;return function(){var o=a(this,t),s=o.on;s!==i&&(r=(i=s).copy()).on(e,n),o.on=r}}function removeFunction(t){return function(){var e=this.parentNode;for(var n in this.__transition)if(+n!==t)return;e&&e.removeChild(this)}}function styleRemove$1(t,e){var n,i,r;return function(){var a=styleValue(this,t),o=(this.style.removeProperty(t),styleValue(this,t));return a===o?null:a===n&&o===i?r:r=e(n=a,i=o)}}function styleRemoveEnd(t){return function(){this.style.removeProperty(t)}}function styleConstant$1(t,e,n){var i,r;return function(){var a=styleValue(this,t);return a===n?null:a===i?r:r=e(i=a,n)}}function styleFunction$1(t,e,n){var i,r,a;return function(){var o=styleValue(this,t),s=n(this);return null==s&&(this.style.removeProperty(t),s=styleValue(this,t)),o===s?null:o===i&&s===r?a:a=e(i=o,r=s)}}function styleTween(t,e,n){function tween(){var i=this,r=e.apply(i,arguments);return r&&function(e){i.style.setProperty(t,r(e),n)}}return tween._value=e,tween}function textConstant$1(t){return function(){this.textContent=t}}function textFunction$1(t){return function(){var e=t(this);this.textContent=null==e?"":e}}function Transition(t,e,n,i){this._groups=t,this._parents=e,this._name=n,this._id=i}function transition(t){return selection().transition(t)}function newId(){return++Jn}function linear$1(t){return+t}function quadIn(t){return t*t}function quadOut(t){return t*(2-t)}function quadInOut(t){return((t*=2)<=1?t*t:--t*(2-t)+1)/2}function cubicIn(t){return t*t*t}function cubicOut(t){return--t*t*t+1}function cubicInOut(t){return((t*=2)<=1?t*t*t:(t-=2)*t*t+2)/2}function sinIn(t){return 1-Math.cos(t*ri)}function sinOut(t){return Math.sin(t*ri)}function sinInOut(t){return(1-Math.cos(ii*t))/2}function expIn(t){return Math.pow(2,10*t-10)}function expOut(t){return 1-Math.pow(2,-10*t)}function expInOut(t){return((t*=2)<=1?Math.pow(2,10*t-10):2-Math.pow(2,10-10*t))/2}function circleIn(t){return 1-Math.sqrt(1-t*t)}function circleOut(t){return Math.sqrt(1- --t*t)}function circleInOut(t){return((t*=2)<=1?1-Math.sqrt(1-t*t):Math.sqrt(1-(t-=2)*t)+1)/2}function bounceIn(t){return 1-bounceOut(1-t)}function bounceOut(t){return(t=+t)Math.abs(t[1]-E[1])?v=!0:g=!0),E=t,p=!0,ki(),move()}function move(){var t;switch(d=E[0]-L[0],h=E[1]-L[1],m){case Li:case Ri:y&&(d=Math.max(M-i,Math.min(C-u,d)),a=i+d,c=u+d),b&&(h=Math.max(S-o,Math.min(k-l,h)),s=o+h,f=l+h);break;case Ei:y<0?(d=Math.max(M-i,Math.min(C-i,d)),a=i+d,c=u):y>0&&(d=Math.max(M-u,Math.min(C-u,d)),a=i,c=u+d),b<0?(h=Math.max(S-o,Math.min(k-o,h)),s=o+h,f=l):b>0&&(h=Math.max(S-l,Math.min(k-l,h)),s=o,f=l+h);break;case Di:y&&(a=Math.max(M,Math.min(C,i-d*y)),c=Math.max(M,Math.min(C,u+d*y))),b&&(s=Math.max(S,Math.min(k,o-h*b)),f=Math.max(S,Math.min(k,l+h*b)))}c0&&(i=a-d),b<0?l=f-h:b>0&&(o=s-h),m=Li,F.attr("cursor",Pi.selection),move());break;default:return}ki()}function keyupped(){switch(t.event.keyCode){case 16:R&&(g=v=R=!1,move());break;case 18:m===Di&&(y<0?u=c:y>0&&(i=a),b<0?l=f:b>0&&(o=s),m=Ei,move());break;case 32:m===Li&&(t.event.altKey?(y&&(u=c-d*y,i=a+d*y),b&&(l=f-h*b,o=s+h*b),m=Di):(y<0?u=c:y>0&&(i=a),b<0?l=f:b>0&&(o=s),m=Ei),F.attr("cursor",Pi[_]),move());break;default:return}ki()}if(t.event.touches){if(t.event.changedTouches.length=(a=(g+x)/2))?g=a:x=a,(l=n>=(o=(v+_)/2))?v=o:_=o,r=h,!(h=h[f=l<<1|c]))return r[f]=p,t;if(s=+t._x.call(null,h.data),u=+t._y.call(null,h.data),e===s&&n===u)return p.next=h,r?r[f]=p:t._root=p,t;do{r=r?r[f]=new Array(4):t._root=new Array(4),(c=e>=(a=(g+x)/2))?g=a:x=a,(l=n>=(o=(v+_)/2))?v=o:_=o}while((f=l<<1|c)==(d=(u>=o)<<1|s>=a));return r[d]=h,r[f]=p,t}function addAll(t){var e,n,i,r,a=t.length,o=new Array(a),s=new Array(a),u=1/0,c=1/0,l=-1/0,f=-1/0;for(n=0;nl&&(l=i),rf&&(f=r));for(l",r=e[3]||"-",a=e[4]||"",o=!!e[5],s=e[6]&&+e[6],u=!!e[7],c=e[8]&&+e[8].slice(1),l=e[9]||"";"n"===l?(u=!0,l="g"):Zr[l]||(l=""),(o||"0"===n&&"="===i)&&(o=!0,n="0",i="="),this.fill=n,this.align=i,this.sign=r,this.symbol=a,this.zero=o,this.width=s,this.comma=u,this.precision=c,this.type=l}function defaultLocale(e){return Jr=ea(e),t.format=Jr.format,t.formatPrefix=Jr.formatPrefix,Jr}function Adder(){this.reset()}function add$1(t,e,n){var i=t.s=e+n,r=i-e,a=i-r;t.t=e-a+(n-r)}function acos(t){return t>1?0:t<-1?Xa:Math.acos(t)}function asin(t){return t>1?$a:t<-1?-$a:Math.asin(t)}function haversin(t){return(t=Qa(t/2))*t}function noop$1(){}function streamGeometry(t,e){t&&ro.hasOwnProperty(t.type)&&ro[t.type](t,e)}function streamLine(t,e,n){var i,r=-1,a=t.length-n;for(e.lineStart();++r=0?1:-1,r=i*n,a=Wa(e),o=Qa(e),s=la*o,u=ca*a+s*Wa(r),c=s*i*Qa(r);oo.add(ja(c,u)),ua=t,ca=a,la=o}function spherical(t){return[ja(t[1],t[0]),asin(t[2])]}function cartesian(t){var e=t[0],n=t[1],i=Wa(n);return[i*Wa(e),i*Qa(e),Qa(n)]}function cartesianDot(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]}function cartesianCross(t,e){return[t[1]*e[2]-t[2]*e[1],t[2]*e[0]-t[0]*e[2],t[0]*e[1]-t[1]*e[0]]}function cartesianAddInPlace(t,e){t[0]+=e[0],t[1]+=e[1],t[2]+=e[2]}function cartesianScale(t,e){return[t[0]*e,t[1]*e,t[2]*e]}function cartesianNormalizeInPlace(t){var e=eo(t[0]*t[0]+t[1]*t[1]+t[2]*t[2]);t[0]/=e,t[1]/=e,t[2]/=e}function boundsPoint(t,e){ma.push(ya=[fa=t,ha=t]),epa&&(pa=e)}function linePoint(t,e){var n=cartesian([t*Ua,e*Ua]);if(_a){var i=cartesianCross(_a,n),r=[i[1],-i[0],0],a=cartesianCross(r,i);cartesianNormalizeInPlace(a),a=spherical(a);var o,s=t-ga,u=s>0?1:-1,c=a[0]*qa*u,l=Ha(s)>180;l^(u*gapa&&(pa=o):(c=(c+360)%360-180,l^(u*gapa&&(pa=e))),l?tangle(fa,ha)&&(ha=t):angle(t,ha)>angle(fa,ha)&&(fa=t):ha>=fa?(tha&&(ha=t)):t>ga?angle(fa,t)>angle(fa,ha)&&(ha=t):angle(t,ha)>angle(fa,ha)&&(fa=t)}else ma.push(ya=[fa=t,ha=t]);epa&&(pa=e),_a=n,ga=t}function boundsLineStart(){fo.point=linePoint}function boundsLineEnd(){ya[0]=fa,ya[1]=ha,fo.point=boundsPoint,_a=null}function boundsRingPoint(t,e){if(_a){var n=t-ga;lo.add(Ha(n)>180?n+(n>0?360:-360):n)}else va=t,xa=e;uo.point(t,e),linePoint(t,e)}function boundsRingStart(){uo.lineStart()}function boundsRingEnd(){boundsRingPoint(va,xa),uo.lineEnd(),Ha(lo)>Oa&&(fa=-(ha=180)),ya[0]=fa,ya[1]=ha,_a=null}function angle(t,e){return(e-=t)<0?e+360:e}function rangeCompare(t,e){return t[0]-e[0]}function rangeContains(t,e){return t[0]<=t[1]?t[0]<=e&&e<=t[1]:eXa?t-Ba:t<-Xa?t+Ba:t,e]}function rotateRadians(t,e,n){return(t%=Ba)?e||n?xo(rotationLambda(t),rotationPhiGamma(e,n)):rotationLambda(t):e||n?rotationPhiGamma(e,n):rotationIdentity}function forwardRotationLambda(t){return function(e,n){return e+=t,[e>Xa?e-Ba:e<-Xa?e+Ba:e,n]}}function rotationLambda(t){var e=forwardRotationLambda(t);return e.invert=forwardRotationLambda(-t),e}function rotationPhiGamma(t,e){function rotation(t,e){var o=Wa(e),s=Wa(t)*o,u=Qa(t)*o,c=Qa(e),l=c*n+s*i;return[ja(u*r-l*a,s*n-c*i),asin(l*r+u*a)]}var n=Wa(t),i=Qa(t),r=Wa(e),a=Qa(e);return rotation.invert=function(t,e){var o=Wa(e),s=Wa(t)*o,u=Qa(t)*o,c=Qa(e),l=c*r-u*a;return[ja(u*r+c*a,s*n+l*i),asin(l*n-s*i)]},rotation}function circleStream(t,e,n,i,r,a){if(n){var o=Wa(e),s=Qa(e),u=i*n;null==r?(r=e+i*Ba,a=e-u/2):(r=circleRadius(o,r),a=circleRadius(o,a),(i>0?ra)&&(r+=i*Ba));for(var c,l=r;i>0?l>a:l0){do{s.point(0===u||3===u?t:n,u>1?i:e)}while((u=(u+o+4)%4)!==c)}else s.point(a[0],a[1])}function corner(i,r){return Ha(i[0]-t)0?0:3:Ha(i[0]-n)0?2:1:Ha(i[1]-e)0?1:0:r>0?3:2}function compareIntersection(t,e){return comparePoint(t.x,e.x)}function comparePoint(t,e){var n=corner(t,1),i=corner(e,1);return n!==i?n-i:0===n?e[1]-t[1]:1===n?t[0]-e[0]:2===n?t[1]-e[1]:e[0]-t[0]}return function(r){function point(t,e){visible(t,e)&&v.point(t,e)}function polygonInside(){for(var e=0,n=0,r=o.length;ni&&(d-a)*(i-s)>(h-s)*(t-a)&&++e:h<=i&&(d-a)*(i-s)<(h-s)*(t-a)&&--e;return e}function polygonStart(){v=x,a=[],o=[],g=!0}function polygonEnd(){var t=polygonInside(),e=g&&t,n=(a=I(a)).length;(e||n)&&(r.polygonStart(),e&&(r.lineStart(),interpolate(null,null,1,r),r.lineEnd()),n&&Fo(a,compareIntersection,t,interpolate,r),r.polygonEnd()),v=r,a=o=s=null}function lineStart(){_.point=linePoint,o&&o.push(s=[]),p=!0,h=!1,f=d=NaN}function lineEnd(){a&&(linePoint(u,c),l&&h&&x.rejoin(),a.push(x.result())),_.point=point,h&&v.lineEnd()}function linePoint(r,a){var x=visible(r,a);if(o&&s.push([r,a]),p)u=r,c=a,l=x,p=!1,x&&(v.lineStart(),v.point(r,a));else if(x&&h)v.point(r,a);else{var _=[f=Math.max(Po,Math.min(No,f)),d=Math.max(Po,Math.min(No,d))],m=[r=Math.max(Po,Math.min(No,r)),a=Math.max(Po,Math.min(No,a))];Do(_,m,t,e,n,i)?(h||(v.lineStart(),v.point(_[0],_[1])),v.point(m[0],m[1]),x||v.lineEnd(),g=!1):x&&(v.lineStart(),v.point(r,a),g=!1)}f=r,d=a,h=x}var a,o,s,u,c,l,f,d,h,p,g,v=r,x=Eo(),_={point:point,lineStart:lineStart,lineEnd:lineEnd,polygonStart:polygonStart,polygonEnd:polygonEnd};return _}}function lengthLineStart(){Yo.point=lengthPointFirst,Yo.lineEnd=lengthLineEnd}function lengthLineEnd(){Yo.point=Yo.lineEnd=noop$1}function lengthPointFirst(t,e){t*=Ua,e*=Ua,_o=t,mo=Qa(e),yo=Wa(e),Yo.point=lengthPoint}function lengthPoint(t,e){t*=Ua,e*=Ua;var n=Qa(e),i=Wa(e),r=Ha(t-_o),a=Wa(r),o=Qa(r),s=i*o,u=yo*n-mo*i*a,c=mo*n+yo*i*a;$o.add(ja(eo(s*s+u*u),c)),_o=t,mo=n,yo=i}function containsGeometry(t,e){return!(!t||!jo.hasOwnProperty(t.type))&&jo[t.type](t,e)}function containsPoint(t,e){return 0===Ho(t,e)}function containsLine(t,e){var n=Ho(t[0],t[1]);return Ho(t[0],e)+Ho(e,t[1])<=n+Oa}function containsPolygon(t,e){return!!Xo(t.map(ringRadians),pointRadians(e))}function ringRadians(t){return t=t.map(pointRadians),t.pop(),t}function pointRadians(t){return[t[0]*Ua,t[1]*Ua]}function graticuleX(t,e,n){var i=m(t,e-Oa,n).concat(e);return function(t){return i.map(function(e){return[t,e]})}}function graticuleY(t,e,n){var i=m(t,e-Oa,n).concat(e);return function(t){return i.map(function(e){return[e,t]})}}function graticule(){function graticule(){return{type:"MultiLineString",coordinates:lines()}}function lines(){return m(Ga(i/p)*p,n,p).map(l).concat(m(Ga(s/g)*g,o,g).map(f)).concat(m(Ga(e/d)*d,t,d).filter(function(t){return Ha(t%p)>Oa}).map(u)).concat(m(Ga(a/h)*h,r,h).filter(function(t){return Ha(t%g)>Oa}).map(c))}var t,e,n,i,r,a,o,s,u,c,l,f,d=10,h=d,p=90,g=360,v=2.5;return graticule.lines=function(){return lines().map(function(t){return{type:"LineString",coordinates:t}})},graticule.outline=function(){return{type:"Polygon",coordinates:[l(i).concat(f(o).slice(1),l(n).reverse().slice(1),f(s).reverse().slice(1))]}},graticule.extent=function(t){return arguments.length?graticule.extentMajor(t).extentMinor(t):graticule.extentMinor()},graticule.extentMajor=function(t){return arguments.length?(i=+t[0][0],n=+t[1][0],s=+t[0][1],o=+t[1][1],i>n&&(t=i,i=n,n=t),s>o&&(t=s,s=o,o=t),graticule.precision(v)):[[i,s],[n,o]]},graticule.extentMinor=function(n){return arguments.length?(e=+n[0][0],t=+n[1][0],a=+n[0][1],r=+n[1][1],e>t&&(n=e,e=t,t=n),a>r&&(n=a,a=r,r=n),graticule.precision(v)):[[e,a],[t,r]]},graticule.step=function(t){return arguments.length?graticule.stepMajor(t).stepMinor(t):graticule.stepMinor()},graticule.stepMajor=function(t){return arguments.length?(p=+t[0],g=+t[1],graticule):[p,g]},graticule.stepMinor=function(t){return arguments.length?(d=+t[0],h=+t[1],graticule):[d,h]},graticule.precision=function(d){return arguments.length?(v=+d,u=graticuleX(a,r,90),c=graticuleY(e,t,v),l=graticuleX(s,o,90),f=graticuleY(i,n,v),graticule):v},graticule.extentMajor([[-180,-90+Oa],[180,90-Oa]]).extentMinor([[-180,-80-Oa],[180,80+Oa]])}function graticule10(){return graticule()()}function areaRingStart$1(){Qo.point=areaPointFirst$1}function areaPointFirst$1(t,e){Qo.point=areaPoint$1,bo=To=t,wo=Ao=e}function areaPoint$1(t,e){Jo.add(Ao*t-To*e),To=t,Ao=e}function areaRingEnd$1(){areaPoint$1(bo,wo)}function boundsPoint$1(t,e){tns&&(ns=t),eis&&(is=e)}function centroidPoint$1(t,e){as+=t,os+=e,++ss}function centroidLineStart$1(){ps.point=centroidPointFirstLine}function centroidPointFirstLine(t,e){ps.point=centroidPointLine,centroidPoint$1(Co=t,ko=e)}function centroidPointLine(t,e){var n=t-Co,i=e-ko,r=eo(n*n+i*i);us+=r*(Co+t)/2,cs+=r*(ko+e)/2,ls+=r,centroidPoint$1(Co=t,ko=e)}function centroidLineEnd$1(){ps.point=centroidPoint$1}function centroidRingStart$1(){ps.point=centroidPointFirstRing}function centroidRingEnd$1(){centroidPointRing(Mo,So)}function centroidPointFirstRing(t,e){ps.point=centroidPointRing,centroidPoint$1(Mo=Co=t,So=ko=e)}function centroidPointRing(t,e){var n=t-Co,i=e-ko,r=eo(n*n+i*i);us+=r*(Co+t)/2,cs+=r*(ko+e)/2,ls+=r,r=ko*t-Co*e,fs+=r*(Co+t),ds+=r*(ko+e),hs+=3*r,centroidPoint$1(Co=t,ko=e)}function PathContext(t){this._context=t}function lengthPointFirst$1(t,e){bs.point=lengthPoint$1,vs=_s=t,xs=ms=e}function lengthPoint$1(t,e){_s-=t,ms-=e,ys.add(eo(_s*_s+ms*ms)),_s=t,ms=e}function PathString(){this._string=[]}function circle$1(t){return"m0,"+t+"a"+t+","+t+" 0 1,1 0,"+-2*t+"a"+t+","+t+" 0 1,1 0,"+2*t+"z"}function validSegment(t){return t.length>1}function compareIntersection(t,e){return((t=t.x)[0]<0?t[1]-$a-Oa:$a-t[1])-((e=e.x)[0]<0?e[1]-$a-Oa:$a-e[1])}function clipAntimeridianLine(t){var e,n=NaN,i=NaN,r=NaN;return{lineStart:function(){t.lineStart(),e=1},point:function(a,o){var s=a>0?Xa:-Xa,u=Ha(a-n);Ha(u-Xa)0?$a:-$a),t.point(r,i),t.lineEnd(),t.lineStart(),t.point(s,i),t.point(a,i),e=0):r!==s&&u>=Xa&&(Ha(n-r)Oa?Va((Qa(e)*(a=Wa(i))*Qa(n)-Qa(i)*(r=Wa(e))*Qa(t))/(r*a*o)):(e+i)/2}function clipAntimeridianInterpolate(t,e,n,i){var r;if(null==t)r=n*$a,i.point(-Xa,r),i.point(0,r),i.point(Xa,r),i.point(Xa,0),i.point(Xa,-r),i.point(0,-r),i.point(-Xa,-r),i.point(-Xa,0),i.point(-Xa,r);else if(Ha(t[0]-e[0])>Oa){var a=t[0]4*e&&p--){var m=a+f,y=o+d,b=s+h,w=eo(m*m+y*y+b*b),T=asin(b/=w),A=Ha(Ha(b)-1)e||Ha((v*k+x*R)/_-.5)>.3||a*f+o*d+s*h2?t[2]%360*Ua:0,recenter()):[v*qa,x*qa,_*qa]},projection.precision=function(t){return arguments.length?(A=Rs(projectTransform,T=t*t),reset()):eo(T)},projection.fitExtent=function(t,e){return fitExtent(projection,t,e)},projection.fitSize=function(t,e){return fitSize(projection,t,e)},function(){return e=t.apply(this,arguments),projection.invert=e.invert&&invert,recenter()}}function conicProjection(t){var e=0,n=Xa/3,i=projectionMutator(t),r=i(e,n);return r.parallels=function(t){return arguments.length?i(e=t[0]*Ua,n=t[1]*Ua):[e*qa,n*qa]},r}function cylindricalEqualAreaRaw(t){function forward(t,n){return[t*e,Qa(n)/e]}var e=Wa(t);return forward.invert=function(t,n){return[t/e,asin(n*e)]},forward}function conicEqualAreaRaw(t,e){function project(t,e){var n=eo(r-2*i*Qa(e))/i;return[n*Qa(t*=i),a-n*Wa(t)]}var n=Qa(t),i=(n+Qa(e))/2;if(Ha(i)0?e<-$a+Oa&&(e=-$a+Oa):e>$a-Oa&&(e=$a-Oa);var n=r/Ja(tany(e),i);return[n*Qa(i*t),r-n*Wa(i*t)]}var n=Wa(t),i=t===e?Qa(t):Ka(n/Wa(e))/Ka(tany(e)/tany(t)),r=n*Ja(tany(t),i)/i;return i?(project.invert=function(t,e){var n=r-e,a=to(i)*eo(t*t+n*n);return[ja(t,Ha(n))/i*to(n),2*Va(Ja(r/a,1/i))-$a]},project):mercatorRaw}function equirectangularRaw(t,e){return[t,e]}function conicEquidistantRaw(t,e){function project(t,e){var n=r-e,a=i*t;return[n*Qa(a),r-n*Wa(a)]}var n=Wa(t),i=t===e?Qa(t):(n-Wa(e))/(e-t),r=n/i+t;return Ha(i)=0;)e+=n[i].value;else e=1;t.value=e}function leastCommonAncestor(t,e){if(t===e)return t;var n=t.ancestors(),i=e.ancestors(),r=null;for(t=n.pop(),e=i.pop();t===e;)r=t,t=n.pop(),e=i.pop();return r}function hierarchy(t,e){var n,i,r,a,o,s=new Node(t),u=+t.value&&(s.value=t.value),c=[s];for(null==e&&(e=defaultChildren);n=c.pop();)if(u&&(n.value=+n.data.value),(r=e(n.data))&&(o=r.length))for(n.children=new Array(o),a=o-1;a>=0;--a)c.push(i=n.children[a]=new Node(r[a])),i.parent=n,i.depth=n.depth+1;return s.eachBefore(computeHeight)}function node_copy(){return hierarchy(this).eachBefore(copyData)}function defaultChildren(t){return t.children}function copyData(t){t.data=t.data.data}function computeHeight(t){var e=0;do{t.height=e}while((t=t.parent)&&t.height<++e)}function Node(t){this.data=t,this.depth=this.height=0,this.parent=null}function Node$2(t){this._=t,this.next=null}function encloses(t,e){var n=e.x-t.x,i=e.y-t.y,r=t.r-e.r;return r*r+1e-6>n*n+i*i}function encloseN(t,e){var n,i,r,a=null,o=t.head;switch(e.length){case 1:n=enclose1(e[0]);break;case 2:n=enclose2(e[0],e[1]);break;case 3:n=enclose3(e[0],e[1],e[2])}for(;o;)r=o._,i=o.next,n&&encloses(n,r)?a=o:(a?(t.tail=a,a.next=null):t.head=t.tail=null,e.push(r),n=encloseN(t,e),e.pop(),t.head?(o.next=t.head,t.head=o):(o.next=null,t.head=t.tail=o),a=t.tail,a.next=i),o=i;return t.tail=a,n}function enclose1(t){return{x:t.x,y:t.y,r:t.r}}function enclose2(t,e){var n=t.x,i=t.y,r=t.r,a=e.x,o=e.y,s=e.r,u=a-n,c=o-i,l=s-r,f=Math.sqrt(u*u+c*c);return{x:(n+a+u/f*l)/2,y:(i+o+c/f*l)/2,r:(f+r+s)/2}}function enclose3(t,e,n){var i=t.x,r=t.y,a=t.r,o=e.x,s=e.y,u=e.r,c=n.x,l=n.y,f=n.r,d=2*(i-o),h=2*(r-s),p=2*(u-a),g=i*i+r*r-a*a-o*o-s*s+u*u,v=2*(i-c),x=2*(r-l),_=2*(f-a),m=i*i+r*r-a*a-c*c-l*l+f*f,y=v*h-d*x,b=(h*m-x*g)/y-i,w=(x*p-h*_)/y,T=(v*g-d*m)/y-r,A=(d*_-v*p)/y,M=w*w+A*A-1,S=2*(b*w+T*A+a),C=b*b+T*T-a*a,k=(-S-Math.sqrt(S*S-4*M*C))/(2*M);return{x:b+w*k+i,y:T+A*k+r,r:k}}function place(t,e,n){var i=t.x,r=t.y,a=e.r+n.r,o=t.r+n.r,s=e.x-i,u=e.y-r,c=s*s+u*u;if(c){var l=.5+((o*=o)-(a*=a))/(2*c),f=Math.sqrt(Math.max(0,2*a*(o+c)-(o-=c)*o-a*a))/(2*c);n.x=i+l*s+f*u,n.y=r+l*u-f*s}else n.x=i+o,n.y=r}function intersects(t,e){var n=e.x-t.x,i=e.y-t.y,r=t.r+e.r;return r*r-1e-6>n*n+i*i}function distance2(t,e,n){var i=t._,r=t.next._,a=i.r+r.r,o=(i.x*r.r+r.x*i.r)/a-e,s=(i.y*r.r+r.y*i.r)/a-n;return o*o+s*s}function Node$1(t){this._=t,this.next=null,this.previous=null}function packEnclose(t){if(!(r=t.length))return 0;var e,n,i,r;if(e=t[0],e.x=0,e.y=0,!(r>1))return e.r;if(n=t[1],e.x=-n.r,n.x=e.r,n.y=0,!(r>2))return e.r+n.r;place(n,e,i=t[2]);var a,o,s,u,c,l,f,d=e.r*e.r,h=n.r*n.r,p=i.r*i.r,g=d+h+p,v=d*e.x+h*n.x+p*i.x,x=d*e.y+h*n.y+p*i.y;e=new Node$1(e),n=new Node$1(n),i=new Node$1(i),e.next=i.previous=n,n.next=e.previous=i,i.next=n.previous=e;t:for(s=3;s=0;)e=r[a],e.z+=n,e.m+=n,n+=e.s+(i+=e.c)}function nextAncestor(t,e,n){return t.a.parent===e.parent?t.a:n}function TreeNode(t,e){this._=t,this.parent=null,this.children=null,this.A=null,this.a=this,this.z=0,this.m=0,this.c=0,this.s=0,this.t=null,this.i=e}function treeRoot(t){for(var e,n,i,r,a,o=new TreeNode(t,0),s=[o];e=s.pop();)if(i=e._.children)for(e.children=new Array(a=i.length),r=a-1;r>=0;--r)s.push(n=e.children[r]=new TreeNode(i[r],r)),n.parent=e;return(o.parent=new TreeNode(null,0)).children=[o],o}function squarifyRatio(t,e,n,i,r,a){for(var o,s,u,c,l,f,d,h,p,g,v,x=[],_=e.children,m=0,y=0,b=_.length,w=e.value;md&&(d=s),v=l*l*g,(h=Math.max(d/v,v/f))>p){l-=s;break}p=h}x.push(o={value:l,dice:u1&&Cu(t[n[i-2]],t[n[i-1]],t[r])<=0;)--i;n[i++]=r}return n.slice(0,i)}function Queue(t){this._size=t,this._call=this._error=null,this._tasks=[],this._data=[],this._waiting=this._active=this._ended=this._start=0}function poke$1(t){if(!t._start)try{start$1(t)}catch(e){if(t._tasks[t._ended+t._active-1])abort(t,e);else if(!t._data)throw e}}function start$1(t){for(;t._start=t._waiting&&t._active=0;)if((n=t._tasks[i])&&(t._tasks[i]=null,n.abort))try{n.abort()}catch(e){}t._active=NaN,maybeNotify(t)}function maybeNotify(t){if(!t._active&&t._call){var e=t._data;t._data=void 0,t._call(t._error,e)}}function queue(t){if(null==t)t=1/0;else if(!((t=+t)>=1))throw new Error("invalid concurrency");return new Queue(t)}function fixCallback(t){return function(e,n){t(null==e?n:null)}}function hasResponse(t){var e=t.responseType;return e&&"text"!==e?t.response:t.responseText}function responseOf(t,e){return function(n){return t(n.responseText,e)}}function ordinal(t){function scale(r){var a=r+"",o=e.get(a);if(!o){if(i!==Ju)return i;e.set(a,o=n.push(r))}return t[(o-1)%t.length]}var e=map$1(),n=[],i=Ju;return t=null==t?[]:Ku.call(t),scale.domain=function(t){if(!arguments.length)return n.slice();n=[],e=map$1();for(var i,r,a=-1,o=t.length;++a=n?1:i(t)}}}function reinterpolateClamp(t){return function(e,n){var i=t(e=+e,n=+n);return function(t){return t<=0?e:t>=1?n:i(t)}}}function bimap(t,e,n,i){var r=t[0],a=t[1],o=e[0],s=e[1];return a2?polymap:bimap,i=r=null,scale}function scale(e){return(i||(i=n(a,o,u?deinterpolateClamp(t):t,s)))(+e)}var n,i,r,a=ec,o=ec,s=je,u=!1;return scale.invert=function(t){return(r||(r=n(o,a,deinterpolateLinear,u?reinterpolateClamp(e):e)))(+t)},scale.domain=function(t){return arguments.length?(a=Zu.call(t,tc),rescale()):a.slice()},scale.range=function(t){return arguments.length?(o=Ku.call(t),rescale()):o.slice()},scale.rangeRound=function(t){return o=Ku.call(t),s=We,rescale()},scale.clamp=function(t){return arguments.length?(u=!!t,rescale()):u},scale.interpolate=function(t){return arguments.length?(s=t,rescale()):s},rescale()}function linearish(t){var e=t.domain;return t.ticks=function(t){var n=e();return A(n[0],n[n.length-1],null==t?10:t)},t.tickFormat=function(t,n){return nc(e(),t,n)},t.nice=function(n){null==n&&(n=10);var i,r=e(),a=0,o=r.length-1,s=r[a],u=r[o];return u0?(s=Math.floor(s/i)*i,u=Math.ceil(u/i)*i,i=tickIncrement(s,u,n)):i<0&&(s=Math.ceil(s*i)/i,u=Math.floor(u*i)/i,i=tickIncrement(s,u,n)),i>0?(r[a]=Math.floor(s/i)*i,r[o]=Math.ceil(u/i)*i,e(r)):i<0&&(r[a]=Math.ceil(s*i)/i,r[o]=Math.floor(u*i)/i,e(r)),t},t}function linear$2(){var t=continuous(deinterpolateLinear,Be);return t.copy=function(){return copy(t,linear$2())},linearish(t)}function identity$6(){function scale(t){return+t}var t=[0,1];return scale.invert=scale,scale.domain=scale.range=function(e){return arguments.length?(t=Zu.call(e,tc),scale):t.slice()},scale.copy=function(){return identity$6().domain(t)},linearish(scale)}function deinterpolate(t,e){return(e=Math.log(e/t))?function(n){return Math.log(n/t)/e}:Qu(e)}function reinterpolate$1(t,e){return t<0?function(n){return-Math.pow(-e,n)*Math.pow(-t,1-n)}:function(n){return Math.pow(e,n)*Math.pow(t,1-n)}}function pow10(t){return isFinite(t)?+("1e"+t):t<0?0:t}function powp(t){return 10===t?pow10:t===Math.E?Math.exp:function(e){return Math.pow(t,e)}}function logp(t){return t===Math.E?Math.log:10===t&&Math.log10||2===t&&Math.log2||(t=Math.log(t),function(e){return Math.log(e)/t})}function reflect(t){return function(e){return-t(-e)}}function log$1(){function rescale(){return r=logp(i),a=powp(i),n()[0]<0&&(r=reflect(r),a=reflect(a)),e}var e=continuous(deinterpolate,reinterpolate$1).domain([1,10]),n=e.domain,i=10,r=logp(10),a=powp(10);return e.base=function(t){return arguments.length?(i=+t,rescale()):i},e.domain=function(t){return arguments.length?(n(t),rescale()):n()},e.ticks=function(t){var e,o=n(),s=o[0],u=o[o.length-1];(e=u0){for(;du)break;g.push(f)}}else for(;d=1;--l)if(!((f=c*l)u)break;g.push(f)}}else g=A(d,h,Math.min(h-d,p)).map(a);return e?g.reverse():g},e.tickFormat=function(n,o){if(null==o&&(o=10===i?".0e":","),"function"!=typeof o&&(o=t.format(o)),n===1/0)return o;null==n&&(n=10);var s=Math.max(1,i*n/e.ticks().length);return function(t){var e=t/a(Math.round(r(t)));return e*i0?i[r-1]:t[0],r=n?[i[n-1],e]:[i[o-1],i[o]]},scale.copy=function(){return quantize$1().domain([t,e]).range(a)},linearish(scale)}function threshold$1(){function scale(i){if(i<=i)return e[r(t,i,0,n)]}var t=[.5],e=[0,1],n=1;return scale.domain=function(i){return arguments.length?(t=Ku.call(i),n=Math.min(t.length,e.length-1),scale):t.slice()},scale.range=function(i){return arguments.length?(e=Ku.call(i),n=Math.min(t.length,e.length-1),scale):e.slice()},scale.invertExtent=function(n){var i=e.indexOf(n);return[t[i-1],t[i]]},scale.copy=function(){return threshold$1().domain(t).range(e)},scale}function newInterval(t,e,n,i){function interval(e){return t(e=new Date(+e)),e}return interval.floor=interval,interval.ceil=function(n){return t(n=new Date(n-1)),e(n,1),t(n),n},interval.round=function(t){var e=interval(t),n=interval.ceil(t);return t-e0))return a;do{a.push(new Date(+n))}while(e(n,r),t(n),n=e)for(;t(e),!n(e);)e.setTime(e-1)},function(t,i){if(t>=t)for(;--i>=0;)for(;e(t,1),!n(t););})},n&&(interval.count=function(e,i){return rc.setTime(+e),ac.setTime(+i),t(rc),t(ac),Math.floor(n(rc,ac))},interval.every=function(t){return t=Math.floor(t),isFinite(t)&&t>0?t>1?interval.filter(i?function(e){return i(e)%t==0}:function(e){return interval.count(0,e)%t==0}):interval:null}),interval}function weekday(t){return newInterval(function(e){e.setDate(e.getDate()-(e.getDay()+7-t)%7),e.setHours(0,0,0,0)},function(t,e){t.setDate(t.getDate()+7*e)},function(t,e){return(e-t-(e.getTimezoneOffset()-t.getTimezoneOffset())*uc)/cc})}function utcWeekday(t){return newInterval(function(e){e.setUTCDate(e.getUTCDate()-(e.getUTCDay()+7-t)%7),e.setUTCHours(0,0,0,0)},function(t,e){t.setUTCDate(t.getUTCDate()+7*e)},function(t,e){return(e-t)/cc})}function localDate(t){if(0<=t.y&&t.y<100){var e=new Date(-1,t.m,t.d,t.H,t.M,t.S,t.L);return e.setFullYear(t.y),e}return new Date(t.y,t.m,t.d,t.H,t.M,t.S,t.L)}function utcDate(t){if(0<=t.y&&t.y<100){var e=new Date(Date.UTC(-1,t.m,t.d,t.H,t.M,t.S,t.L));return e.setUTCFullYear(t.y),e}return new Date(Date.UTC(t.y,t.m,t.d,t.H,t.M,t.S,t.L))}function newYear(t){return{y:t,m:0,d:1,H:0,M:0,S:0,L:0}}function formatLocale$1(t){function newFormat(t,e){return function(n){var i,r,a,o=[],s=-1,u=0,c=t.length;for(n instanceof Date||(n=new Date(+n));++s=u)return-1;if(37===(r=e.charCodeAt(o++))){if(r=e.charAt(o++),!(a=b[r in sl?e.charAt(o++):r])||(i=a(t,n,i))<0)return-1}else if(r!=n.charCodeAt(i++))return-1}return i}function parsePeriod(t,e,n){var i=c.exec(e.slice(n));return i?(t.p=l[i[0].toLowerCase()],n+i[0].length):-1}function parseShortWeekday(t,e,n){var i=h.exec(e.slice(n));return i?(t.w=p[i[0].toLowerCase()],n+i[0].length):-1}function parseWeekday(t,e,n){var i=f.exec(e.slice(n));return i?(t.w=d[i[0].toLowerCase()],n+i[0].length):-1}function parseShortMonth(t,e,n){var i=x.exec(e.slice(n));return i?(t.m=_[i[0].toLowerCase()],n+i[0].length):-1}function parseMonth(t,e,n){var i=g.exec(e.slice(n));return i?(t.m=v[i[0].toLowerCase()],n+i[0].length):-1}function parseLocaleDateTime(t,n,i){return parseSpecifier(t,e,n,i)}function parseLocaleDate(t,e,i){return parseSpecifier(t,n,e,i)}function parseLocaleTime(t,e,n){return parseSpecifier(t,i,e,n)}function formatShortWeekday(t){return o[t.getDay()]}function formatWeekday(t){return a[t.getDay()]}function formatShortMonth(t){return u[t.getMonth()]}function formatMonth(t){return s[t.getMonth()]}function formatPeriod(t){return r[+(t.getHours()>=12)]}function formatUTCShortWeekday(t){return o[t.getUTCDay()]}function formatUTCWeekday(t){return a[t.getUTCDay()]}function formatUTCShortMonth(t){return u[t.getUTCMonth()]}function formatUTCMonth(t){return s[t.getUTCMonth()]}function formatUTCPeriod(t){return r[+(t.getUTCHours()>=12)]}var e=t.dateTime,n=t.date,i=t.time,r=t.periods,a=t.days,o=t.shortDays,s=t.months,u=t.shortMonths,c=formatRe(r),l=formatLookup(r),f=formatRe(a),d=formatLookup(a),h=formatRe(o),p=formatLookup(o),g=formatRe(s),v=formatLookup(s),x=formatRe(u),_=formatLookup(u),m={a:formatShortWeekday,A:formatWeekday,b:formatShortMonth,B:formatMonth,c:null,d:formatDayOfMonth,e:formatDayOfMonth,H:formatHour24,I:formatHour12,j:formatDayOfYear,L:formatMilliseconds,m:formatMonthNumber,M:formatMinutes,p:formatPeriod,S:formatSeconds,U:formatWeekNumberSunday,w:formatWeekdayNumber,W:formatWeekNumberMonday,x:null,X:null,y:formatYear,Y:formatFullYear,Z:formatZone,"%":formatLiteralPercent},y={a:formatUTCShortWeekday,A:formatUTCWeekday,b:formatUTCShortMonth,B:formatUTCMonth,c:null,d:formatUTCDayOfMonth,e:formatUTCDayOfMonth,H:formatUTCHour24,I:formatUTCHour12,j:formatUTCDayOfYear,L:formatUTCMilliseconds,m:formatUTCMonthNumber,M:formatUTCMinutes,p:formatUTCPeriod,S:formatUTCSeconds,U:formatUTCWeekNumberSunday,w:formatUTCWeekdayNumber,W:formatUTCWeekNumberMonday,x:null,X:null,y:formatUTCYear,Y:formatUTCFullYear,Z:formatUTCZone,"%":formatLiteralPercent},b={a:parseShortWeekday,A:parseWeekday,b:parseShortMonth,B:parseMonth,c:parseLocaleDateTime,d:parseDayOfMonth,e:parseDayOfMonth,H:parseHour24,I:parseHour24,j:parseDayOfYear,L:parseMilliseconds,m:parseMonthNumber,M:parseMinutes,p:parsePeriod,S:parseSeconds,U:parseWeekNumberSunday,w:parseWeekdayNumber,W:parseWeekNumberMonday,x:parseLocaleDate,X:parseLocaleTime,y:parseYear,Y:parseFullYear,Z:parseZone,"%":parseLiteralPercent};return m.x=newFormat(n,m),m.X=newFormat(i,m),m.c=newFormat(e,m),y.x=newFormat(n,y),y.X=newFormat(i,y),y.c=newFormat(e,y),{format:function(t){var e=newFormat(t+="",m);return e.toString=function(){return t},e},parse:function(t){var e=newParse(t+="",localDate);return e.toString=function(){return t},e},utcFormat:function(t){var e=newFormat(t+="",y);return e.toString=function(){return t},e},utcParse:function(t){var e=newParse(t,utcDate);return e.toString=function(){return t},e}}}function pad(t,e,n){var i=t<0?"-":"",r=(i?-t:t)+"",a=r.length;return i+(a68?1900:2e3),n+i[0].length):-1}function parseZone(t,e,n){var i=/^(Z)|([+-]\d\d)(?:\:?(\d\d))?/.exec(e.slice(n,n+6));return i?(t.Z=i[1]?0:-(i[2]+(i[3]||"00")),n+i[0].length):-1}function parseMonthNumber(t,e,n){var i=ul.exec(e.slice(n,n+2));return i?(t.m=i[0]-1,n+i[0].length):-1}function parseDayOfMonth(t,e,n){var i=ul.exec(e.slice(n,n+2));return i?(t.d=+i[0],n+i[0].length):-1}function parseDayOfYear(t,e,n){var i=ul.exec(e.slice(n,n+3));return i?(t.m=0,t.d=+i[0],n+i[0].length):-1}function parseHour24(t,e,n){var i=ul.exec(e.slice(n,n+2));return i?(t.H=+i[0],n+i[0].length):-1}function parseMinutes(t,e,n){var i=ul.exec(e.slice(n,n+2));return i?(t.M=+i[0],n+i[0].length):-1}function parseSeconds(t,e,n){var i=ul.exec(e.slice(n,n+2));return i?(t.S=+i[0],n+i[0].length):-1}function parseMilliseconds(t,e,n){var i=ul.exec(e.slice(n,n+3));return i?(t.L=+i[0],n+i[0].length):-1}function parseLiteralPercent(t,e,n){var i=cl.exec(e.slice(n,n+1));return i?n+i[0].length:-1}function formatDayOfMonth(t,e){return pad(t.getDate(),e,2)}function formatHour24(t,e){return pad(t.getHours(),e,2)}function formatHour12(t,e){return pad(t.getHours()%12||12,e,2)}function formatDayOfYear(t,e){return pad(1+vc.count(Fc(t),t),e,3)}function formatMilliseconds(t,e){return pad(t.getMilliseconds(),e,3)}function formatMonthNumber(t,e){return pad(t.getMonth()+1,e,2)}function formatMinutes(t,e){return pad(t.getMinutes(),e,2)}function formatSeconds(t,e){return pad(t.getSeconds(),e,2)}function formatWeekNumberSunday(t,e){return pad(_c.count(Fc(t),t),e,2)}function formatWeekdayNumber(t){return t.getDay()}function formatWeekNumberMonday(t,e){return pad(mc.count(Fc(t),t),e,2)}function formatYear(t,e){return pad(t.getFullYear()%100,e,2)}function formatFullYear(t,e){return pad(t.getFullYear()%1e4,e,4)}function formatZone(t){var e=t.getTimezoneOffset();return(e>0?"-":(e*=-1,"+"))+pad(e/60|0,"0",2)+pad(e%60,"0",2)}function formatUTCDayOfMonth(t,e){return pad(t.getUTCDate(),e,2)}function formatUTCHour24(t,e){return pad(t.getUTCHours(),e,2)}function formatUTCHour12(t,e){return pad(t.getUTCHours()%12||12,e,2)}function formatUTCDayOfYear(t,e){return pad(1+$c.count(rl(t),t),e,3)}function formatUTCMilliseconds(t,e){return pad(t.getUTCMilliseconds(),e,3)}function formatUTCMonthNumber(t,e){return pad(t.getUTCMonth()+1,e,2)}function formatUTCMinutes(t,e){return pad(t.getUTCMinutes(),e,2)}function formatUTCSeconds(t,e){return pad(t.getUTCSeconds(),e,2)}function formatUTCWeekNumberSunday(t,e){return pad(Bc.count(rl(t),t),e,2)}function formatUTCWeekdayNumber(t){return t.getUTCDay()}function formatUTCWeekNumberMonday(t,e){return pad(qc.count(rl(t),t),e,2)}function formatUTCYear(t,e){return pad(t.getUTCFullYear()%100,e,2)}function formatUTCFullYear(t,e){return pad(t.getUTCFullYear()%1e4,e,4)}function formatUTCZone(){return"+0000"}function formatLiteralPercent(){return"%"}function defaultLocale$1(e){return al=formatLocale$1(e),t.timeFormat=al.format,t.timeParse=al.parse,t.utcFormat=al.utcFormat,t.utcParse=al.utcParse,al}function formatIsoNative(t){return t.toISOString()}function parseIsoNative(t){var e=new Date(t);return isNaN(e)?null:e}function date$1(t){return new Date(t)}function number$2(t){return t instanceof Date?+t:+new Date(+t)}function calendar(t,e,i,r,a,o,s,u,c){function tickFormat(n){return(s(n)1?0:t<-1?Hl:Math.acos(t)}function asin$1(t){return t>=1?Vl:t<=-1?-Vl:Math.asin(t)}function arcInnerRadius(t){return t.innerRadius}function arcOuterRadius(t){return t.outerRadius}function arcStartAngle(t){return t.startAngle}function arcEndAngle(t){return t.endAngle}function arcPadAngle(t){return t&&t.padAngle}function intersect(t,e,n,i,r,a,o,s){var u=n-t,c=i-e,l=o-r,f=s-a,d=(l*(e-a)-f*(t-r))/(f*u-l*c);return[t+d*u,e+d*c]}function cornerTangents(t,e,n,i,r,a,o){var s=t-n,u=e-i,c=(o?a:-a)/ql(s*s+u*u),l=c*u,f=-c*s,d=t+l,h=e+f,p=n+l,g=i+f,v=(d+p)/2,x=(h+g)/2,_=p-d,m=g-h,y=_*_+m*m,b=r-a,w=d*g-p*h,T=(m<0?-1:1)*ql($l(0,b*b*y-w*w)),A=(w*m-_*T)/y,M=(-w*_-m*T)/y,S=(w*m+_*T)/y,C=(-w*_+m*T)/y,k=A-v,R=M-x,L=S-v,E=C-x;return k*k+R*R>L*L+E*E&&(A=S,M=C),{cx:A,cy:M,x01:-l,y01:-f,x11:A*(r/b-1),y11:M*(r/b-1)}}function Linear(t){this._context=t}function x$3(t){return t[0]}function y$3(t){return t[1]}function Radial(t){this._curve=t}function curveRadial(t){function radial(e){return new Radial(t(e))}return radial._curve=t,radial}function radialLine(t){var e=t.curve;return t.angle=t.x,delete t.x,t.radius=t.y,delete t.y,t.curve=function(t){return arguments.length?e(curveRadial(t)):e()._curve},t}function linkSource(t){return t.source}function linkTarget(t){return t.target}function link$2(t){function link(){var o,s=af.call(arguments),u=e.apply(this,s),c=n.apply(this,s);if(a||(a=o=path()),t(a,+i.apply(this,(s[0]=u,s)),+r.apply(this,s),+i.apply(this,(s[0]=c,s)),+r.apply(this,s)),o)return a=null,o+""||null}var e=linkSource,n=linkTarget,i=x$3,r=y$3,a=null;return link.source=function(t){return arguments.length?(e=t,link):e},link.target=function(t){return arguments.length?(n=t,link):n},link.x=function(t){return arguments.length?(i="function"==typeof t?t:Pl(+t),link):i},link.y=function(t){return arguments.length?(r="function"==typeof t?t:Pl(+t),link):r},link.context=function(t){return arguments.length?(a=null==t?null:t,link):a},link}function curveHorizontal(t,e,n,i,r){t.moveTo(e,n),t.bezierCurveTo(e=(e+i)/2,n,e,r,i,r)}function curveVertical(t,e,n,i,r){t.moveTo(e,n),t.bezierCurveTo(e,n=(n+r)/2,i,n,i,r)}function curveRadial$1(t,e,n,i,r){var a=of(e,n),o=of(e,n=(n+r)/2),s=of(i,n),u=of(i,r);t.moveTo(a[0],a[1]),t.bezierCurveTo(o[0],o[1],s[0],s[1],u[0],u[1])}function linkHorizontal(){return link$2(curveHorizontal)}function linkVertical(){return link$2(curveVertical)}function linkRadial(){var t=link$2(curveRadial$1);return t.angle=t.x,delete t.x,t.radius=t.y,delete t.y,t}function point$2(t,e,n){t._context.bezierCurveTo((2*t._x0+t._x1)/3,(2*t._y0+t._y1)/3,(t._x0+2*t._x1)/3,(t._y0+2*t._y1)/3,(t._x0+4*t._x1+e)/6,(t._y0+4*t._y1+n)/6)}function Basis(t){this._context=t}function BasisClosed(t){this._context=t}function BasisOpen(t){this._context=t}function Bundle(t,e){this._basis=new Basis(t),this._beta=e}function point$3(t,e,n){t._context.bezierCurveTo(t._x1+t._k*(t._x2-t._x0),t._y1+t._k*(t._y2-t._y0),t._x2+t._k*(t._x1-e),t._y2+t._k*(t._y1-n),t._x2,t._y2)}function Cardinal(t,e){this._context=t,this._k=(1-e)/6}function CardinalClosed(t,e){this._context=t,this._k=(1-e)/6}function CardinalOpen(t,e){this._context=t,this._k=(1-e)/6}function point$4(t,e,n){var i=t._x1,r=t._y1,a=t._x2,o=t._y2;if(t._l01_a>Ul){var s=2*t._l01_2a+3*t._l01_a*t._l12_a+t._l12_2a,u=3*t._l01_a*(t._l01_a+t._l12_a);i=(i*s-t._x0*t._l12_2a+t._x2*t._l01_2a)/u,r=(r*s-t._y0*t._l12_2a+t._y2*t._l01_2a)/u}if(t._l23_a>Ul){var c=2*t._l23_2a+3*t._l23_a*t._l12_a+t._l12_2a,l=3*t._l23_a*(t._l23_a+t._l12_a);a=(a*c+t._x1*t._l23_2a-e*t._l12_2a)/l,o=(o*c+t._y1*t._l23_2a-n*t._l12_2a)/l}t._context.bezierCurveTo(i,r,a,o,t._x2,t._y2)}function CatmullRom(t,e){this._context=t,this._alpha=e}function CatmullRomClosed(t,e){this._context=t,this._alpha=e}function CatmullRomOpen(t,e){this._context=t,this._alpha=e}function LinearClosed(t){this._context=t}function sign$1(t){return t<0?-1:1}function slope3(t,e,n){var i=t._x1-t._x0,r=e-t._x1,a=(t._y1-t._y0)/(i||r<0&&-0),o=(n-t._y1)/(r||i<0&&-0),s=(a*r+o*i)/(i+r);return(sign$1(a)+sign$1(o))*Math.min(Math.abs(a),Math.abs(o),.5*Math.abs(s))||0}function slope2(t,e){var n=t._x1-t._x0;return n?(3*(t._y1-t._y0)/n-e)/2:e}function point$5(t,e,n){var i=t._x0,r=t._y0,a=t._x1,o=t._y1,s=(a-i)/3;t._context.bezierCurveTo(i+s,r+s*e,a-s,o-s*n,a,o)}function MonotoneX(t){this._context=t}function MonotoneY(t){this._context=new ReflectContext(t)}function ReflectContext(t){this._context=t}function monotoneX(t){return new MonotoneX(t)}function monotoneY(t){return new MonotoneY(t)}function Natural(t){this._context=t}function controlPoints(t){var e,n,i=t.length-1,r=new Array(i),a=new Array(i),o=new Array(i);for(r[0]=0,a[0]=2,o[0]=t[0]+2*t[1],e=1;e=0;--e)r[e]=(o[e]-r[e+1])/a[e];for(a[i-1]=(t[i]+r[i-1])/2,e=0;e0)){if(a/=p,p<0){if(a0){if(a>h)return;a>d&&(d=a)}if(a=i-u,p||!(a<0)){if(a/=p,p<0){if(a>h)return;a>d&&(d=a)}else if(p>0){if(a0)){if(a/=g,g<0){if(a0){if(a>h)return;a>d&&(d=a)}if(a=r-c,g||!(a<0)){if(a/=g,g<0){if(a>h)return;a>d&&(d=a)}else if(g>0){if(a0||h<1)||(d>0&&(t[0]=[u+d*p,c+d*g]),h<1&&(t[1]=[u+h*p,c+h*g]),!0)}}}}}function connectEdge(t,e,n,i,r){var a=t[1];if(a)return!0;var o,s,u=t[0],c=t.left,l=t.right,f=c[0],d=c[1],h=l[0],p=l[1],g=(f+h)/2,v=(d+p)/2;if(p===d){if(g=i)return;if(f>h){if(u){if(u[1]>=r)return}else u=[g,n];a=[g,r]}else{if(u){if(u[1]1)if(f>h){if(u){if(u[1]>=r)return}else u=[(n-s)/o,n];a=[(r-s)/o,r]}else{if(u){if(u[1]=i)return}else u=[e,o*e+s];a=[i,o*i+s]}else{if(u){if(u[0]ad||Math.abs(r[0][1]-r[1][1])>ad)||delete nd[a]}function createCell(t){return td[t.index]={site:t,halfedges:[]}}function cellHalfedgeAngle(t,e){var n=t.site,i=e.left,r=e.right;return n===r&&(r=i,i=n),r?Math.atan2(r[1]-i[1],r[0]-i[0]):(n===i?(i=e[1],r=e[0]):(i=e[0],r=e[1]),Math.atan2(i[0]-r[0],r[1]-i[1]))}function cellHalfedgeStart(t,e){return e[+(e.left!==t.site)]}function cellHalfedgeEnd(t,e){return e[+(e.left===t.site)]}function sortCellHalfedges(){for(var t,e,n,i,r=0,a=td.length;rad||Math.abs(g-d)>ad)&&(u.splice(s,0,nd.push(createBorderEdge(o,h,Math.abs(p-t)ad?[t,Math.abs(f-t)ad?[Math.abs(d-i)ad?[n,Math.abs(f-n)ad?[Math.abs(d-e)=-od)){var h=u*u+c*c,p=l*l+f*f,g=(f*h-c*p)/d,v=(u*p-l*h)/d,x=id.pop()||new Circle;x.arc=t,x.site=r,x.x=g+o,x.y=(x.cy=v+s)+Math.sqrt(g*g+v*v),t.circle=x;for(var _=null,m=ed._;m;)if(x.yad)s=s.L;else{if(!((r=a-rightBreakPoint(s,o))>ad)){i>-ad?(e=s.P,n=s):r>-ad?(e=s,n=s.N):e=n=s;break}if(!s.R){e=s;break}s=s.R}createCell(t);var u=createBeach(t);if(Qf.insert(e,u),e||n){if(e===n)return detachCircle(e),n=createBeach(e.site),Qf.insert(u,n),u.edge=n.edge=createEdge(e.site,u.site),attachCircle(e),void attachCircle(n);if(!n)return void(u.edge=createEdge(e.site,u.site));detachCircle(e),detachCircle(n);var c=e.site,l=c[0],f=c[1],d=t[0]-l,h=t[1]-f,p=n.site,g=p[0]-l,v=p[1]-f,x=2*(d*v-h*g),_=d*d+h*h,m=g*g+v*v,y=[(v*_-h*m)/x+l,(d*m-g*_)/x+f];setEdgeEnd(n.edge,c,p,y),u.edge=createEdge(c,t,null,y),n.edge=createEdge(t,p,null,y),attachCircle(e),attachCircle(n)}}function leftBreakPoint(t,e){var n=t.site,i=n[0],r=n[1],a=r-e;if(!a)return i;var o=t.P;if(!o)return-1/0;n=o.site;var s=n[0],u=n[1],c=u-e;if(!c)return s;var l=s-i,f=1/a-1/c,d=l/c;return f?(-d+Math.sqrt(d*d-2*f*(l*l/(-2*c)-u+c/2+r-a/2)))/f+i:(i+s)/2}function rightBreakPoint(t,e){var n=t.N;if(n)return leftBreakPoint(n,e);var i=t.site;return i[1]===e?i[0]:1/0}function triangleArea(t,e,n){return(t[0]-n[0])*(e[1]-t[1])-(t[0]-e[0])*(n[1]-t[1])}function lexicographic(t,e){return e[1]-t[1]||e[0]-t[0]}function Diagram(t,e){var n,i,r,a=t.sort(lexicographic).pop();for(nd=[],td=new Array(t.length),Qf=new RedBlackTree,ed=new RedBlackTree;;)if(r=Jf,a&&(!r||a[1]e?1:t>=e?0:NaN},n=function(t){return 1===t.length&&(t=ascendingComparator(t)),{left:function(e,n,i,r){for(null==i&&(i=0),null==r&&(r=e.length);i>>1;t(e[a],n)<0?i=a+1:r=a}return i},right:function(e,n,i,r){for(null==i&&(i=0),null==r&&(r=e.length);i>>1;t(e[a],n)>0?r=a:i=a+1}return i}}},i=n(e),r=i.right,a=i.left,o=function(t,e){null==e&&(e=pair);for(var n=0,i=t.length-1,r=t[0],a=new Array(i<0?0:i);nt?1:e>=t?0:NaN},c=function(t){return null===t?NaN:+t},l=function(t,e){var n,i,r=t.length,a=0,o=-1,s=0,u=0;if(null==e)for(;++o1)return u/(a-1)},f=function(t,e){var n=l(t,e);return n?Math.sqrt(n):n},d=function(t,e){var n,i,r,a=t.length,o=-1;if(null==e){for(;++o=n)for(i=r=n;++on&&(i=n),r=n)for(i=r=n;++on&&(i=n),r0)for(t=Math.ceil(t/a),e=Math.floor(e/a),r=new Array(i=Math.ceil(e-t+1));++sf;)d.pop(),--h;var p,g=new Array(h+1);for(a=0;a<=h;++a)p=g[a]=[],p.x0=a>0?d[a-1]:l,p.x1=a=1)return+n(t[i-1],i-1,t);var i,r=(i-1)*e,a=Math.floor(r),o=+n(t[a],a,t);return o+(+n(t[a+1],a+1,t)-o)*(r-a)}},k=function(t,n,i){return t=g.call(t,c).sort(e),Math.ceil((i-n)/(2*(C(t,.75)-C(t,.25))*Math.pow(t.length,-1/3)))},R=function(t,e,n){return Math.ceil((n-e)/(3.5*f(t)*Math.pow(t.length,-1/3)))},L=function(t,e){var n,i,r=t.length,a=-1;if(null==e){for(;++a=n)for(i=n;++ai&&(i=n)}else for(;++a=n)for(i=n;++ai&&(i=n);return i},E=function(t,e){var n,i=t.length,r=i,a=-1,o=0;if(null==e)for(;++a=0;)for(i=t[r],e=i.length;--e>=0;)n[--o]=i[e];return n},F=function(t,e){var n,i,r=t.length,a=-1;if(null==e){for(;++a=n)for(i=n;++an&&(i=n)}else for(;++a=n)for(i=n;++an&&(i=n);return i},N=function(t,e){for(var n=e.length,i=new Array(n);n--;)i[n]=t[e[n]];return i},P=function(t,n){if(i=t.length){var i,r,a=0,o=0,s=t[o];for(null==n&&(n=e);++a0)for(var n,i,r=new Array(n),a=0;a=0&&"xmlns"!==(e=t.slice(0,n))&&(t=t.slice(n+1)),Z.hasOwnProperty(e)?{space:Z[e],local:t}:t},J=function(t){var e=K(t);return(e.local?creatorFixed:creatorInherit)(e)},Q=0;Local.prototype=local$1.prototype={constructor:Local,get:function(t){for(var e=this._;!(e in t);)if(!(t=t.parentNode))return;return t[e]},set:function(t,e){return t[this._]=e},remove:function(t){return this._ in t&&delete t[this._]},toString:function(){return this._}};var tt=function(t){return function(){return this.matches(t)}};if("undefined"!=typeof document){var et=document.documentElement;if(!et.matches){var nt=et.webkitMatchesSelector||et.msMatchesSelector||et.mozMatchesSelector||et.oMatchesSelector;tt=function(t){return function(){return nt.call(this,t)}}}}var it=tt,rt={};if(t.event=null,"undefined"!=typeof document){"onmouseenter"in document.documentElement||(rt={mouseenter:"mouseover",mouseleave:"mouseout"})}var at=function(t,e,n){var i,r,a=parseTypenames$1(t+""),o=a.length;{if(!(arguments.length<2)){for(s=e?onAdd:onRemove,null==n&&(n=!1),i=0;i=y&&(y=m+1);!(_=v[y])&&++y=0;)(i=r[a])&&(o&&o!==i.nextSibling&&o.parentNode.insertBefore(i,o),o=i);return this},wt=function(t){function compareNode(e,n){return e&&n?t(e.__data__,n.__data__):!e-!n}t||(t=ascending$1);for(var e=this._groups,n=e.length,i=new Array(n),r=0;r1?this.each((null==e?styleRemove:"function"==typeof e?styleFunction:styleConstant)(t,e,null==n?"":n)):styleValue(this.node(),t)},Dt=function(t,e){return arguments.length>1?this.each((null==e?propertyRemove:"function"==typeof e?propertyFunction:propertyConstant)(t,e)):this.node()[t]};ClassList.prototype={add:function(t){this._names.indexOf(t)<0&&(this._names.push(t),this._node.setAttribute("class",this._names.join(" ")))},remove:function(t){var e=this._names.indexOf(t);e>=0&&(this._names.splice(e,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(t){return this._names.indexOf(t)>=0}};var It=function(t,e){var n=classArray(t+"");if(arguments.length<2){for(var i=classList(this.node()),r=-1,a=n.length;++rf}u.mouse("drag")}function mouseupped(){Ut(t.event.view).on("mousemove.drag mouseup.drag",null),yesdrag(t.event.view,i),Wt(),u.mouse("end")}function touchstarted(){if(a.apply(this,arguments)){var e,n,i=t.event.changedTouches,r=o.apply(this,arguments),s=i.length;for(e=0;e=240?t-240:t+120,r,i),hsl2rgb(t,r,i),hsl2rgb(t<120?t+240:t-120,r,i),this.opacity)},displayable:function(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1}}));var fe=Math.PI/180,de=180/Math.PI,he=.95047,pe=1,ge=1.08883,ve=4/29,xe=6/29,_e=3*xe*xe,me=xe*xe*xe;Jt(Lab,lab,extend(Color,{brighter:function(t){return new Lab(this.l+18*(null==t?1:t),this.a,this.b,this.opacity)},darker:function(t){return new Lab(this.l-18*(null==t?1:t),this.a,this.b,this.opacity)},rgb:function(){var t=(this.l+16)/116,e=isNaN(this.a)?t:t+this.a/500,n=isNaN(this.b)?t:t-this.b/200;return t=pe*lab2xyz(t),e=he*lab2xyz(e),n=ge*lab2xyz(n),new Rgb(xyz2rgb(3.2404542*e-1.5371385*t-.4985314*n),xyz2rgb(-.969266*e+1.8760108*t+.041556*n),xyz2rgb(.0556434*e-.2040259*t+1.0572252*n),this.opacity)}})),Jt(Hcl,hcl,extend(Color,{brighter:function(t){return new Hcl(this.h,this.c,this.l+18*(null==t?1:t),this.opacity)},darker:function(t){return new Hcl(this.h,this.c,this.l-18*(null==t?1:t),this.opacity)},rgb:function(){return labConvert(this).rgb()}}));var ye=-.14861,be=1.78277,we=-.29227,Te=-.90649,Ae=1.97294,Me=Ae*Te,Se=Ae*be,Ce=be*we-Te*ye;Jt(Cubehelix,cubehelix,extend(Color,{brighter:function(t){return t=null==t?1/.7:Math.pow(1/.7,t),new Cubehelix(this.h,this.s,this.l*t,this.opacity)},darker:function(t){return t=null==t?.7:Math.pow(.7,t),new Cubehelix(this.h,this.s,this.l*t,this.opacity)},rgb:function(){var t=isNaN(this.h)?0:(this.h+120)*fe,e=+this.l,n=isNaN(this.s)?0:this.s*e*(1-e),i=Math.cos(t),r=Math.sin(t);return new Rgb(255*(e+n*(ye*i+be*r)),255*(e+n*(we*i+Te*r)),255*(e+n*(Ae*i)),this.opacity)}}));var ke,Re,Le,Ee,De,Ie,Fe=function(t){var e=t.length-1;return function(n){var i=n<=0?n=0:n>=1?(n=1,e-1):Math.floor(n*e),r=t[i],a=t[i+1],o=i>0?t[i-1]:2*r-a,s=ia&&(r=e.slice(a,r),s[o]?s[o]+=r:s[++o]=r),(n=n[0])===(i=i[0])?s[o]?s[o]+=i:s[++o]=i:(s[++o]=null,u.push({i:o,x:Be(n,i)})),a=He.lastIndex;return aMn&&n.stateAn&&n.name===e)return new Transition([[t]],Ai,e,+i)}return null},Si=function(t){return function(){return t}},Ci=function(t,e,n){this.target=t,this.type=e,this.selection=n},ki=function(){t.event.preventDefault(),t.event.stopImmediatePropagation()},Ri={name:"drag"},Li={name:"space"},Ei={name:"handle"},Di={name:"center"},Ii={name:"x",handles:["e","w"].map(type),input:function(t,e){return t&&[[t[0],e[0][1]],[t[1],e[1][1]]]},output:function(t){return t&&[t[0][0],t[1][0]]}},Fi={name:"y",handles:["n","s"].map(type),input:function(t,e){return t&&[[e[0][0],t[0]],[e[1][0],t[1]]]},output:function(t){return t&&[t[0][1],t[1][1]]}},Ni={name:"xy",handles:["n","e","s","w","nw","ne","se","sw"].map(type),input:function(t){return t},output:function(t){return t}},Pi={overlay:"crosshair",selection:"move",n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},zi={e:"w",w:"e",nw:"ne",ne:"nw",se:"sw",sw:"se"},Oi={n:"s",s:"n",nw:"sw",ne:"se",se:"ne",sw:"nw"},Xi={overlay:1,selection:1,n:null,e:1,s:null,w:-1,nw:-1,ne:1,se:1,sw:-1},$i={overlay:1,selection:1,n:-1,e:null,s:1,w:null,nw:-1,ne:-1,se:1,sw:1},Yi=function(){return brush$1(Ni)},Bi=Math.cos,qi=Math.sin,Ui=Math.PI,Hi=Ui/2,Vi=2*Ui,ji=Math.max,Wi=function(){function chord(r){var a,o,s,u,c,l,f=r.length,d=[],h=m(f),p=[],g=[],v=g.groups=new Array(f),x=new Array(f*f);for(a=0,c=-1;++c1e-6)if(Math.abs(l*s-u*c)>1e-6&&r){var d=n-a,h=i-o,p=s*s+u*u,g=d*d+h*h,v=Math.sqrt(p),x=Math.sqrt(f),_=r*Math.tan((Ki-Math.acos((p+f-g)/(2*v*x)))/2),m=_/x,y=_/v;Math.abs(m-1)>1e-6&&(this._+="L"+(t+m*c)+","+(e+m*l)),this._+="A"+r+","+r+",0,0,"+ +(l*d>c*h)+","+(this._x1=t+y*s)+","+(this._y1=e+y*u)}else this._+="L"+(this._x1=t)+","+(this._y1=e);else;},arc:function(t,e,n,i,r,a){t=+t,e=+e,n=+n;var o=n*Math.cos(i),s=n*Math.sin(i),u=t+o,c=e+s,l=1^a,f=a?i-r:r-i;if(n<0)throw new Error("negative radius: "+n);null===this._x1?this._+="M"+u+","+c:(Math.abs(this._x1-u)>1e-6||Math.abs(this._y1-c)>1e-6)&&(this._+="L"+u+","+c),n&&(f<0&&(f=f%Ji+Ji),f>Qi?this._+="A"+n+","+n+",0,1,"+l+","+(t-o)+","+(e-s)+"A"+n+","+n+",0,1,"+l+","+(this._x1=u)+","+(this._y1=c):f>1e-6&&(this._+="A"+n+","+n+",0,"+ +(f>=Ki)+","+l+","+(this._x1=t+n*Math.cos(r))+","+(this._y1=e+n*Math.sin(r))))},rect:function(t,e,n,i){this._+="M"+(this._x0=this._x1=+t)+","+(this._y0=this._y1=+e)+"h"+ +n+"v"+ +i+"h"+-n+"Z"},toString:function(){return this._}};var tr=function(){function ribbon(){var o,s=Gi.call(arguments),u=t.apply(this,s),c=e.apply(this,s),l=+n.apply(this,(s[0]=u,s)),f=i.apply(this,s)-Hi,d=r.apply(this,s)-Hi,h=l*Bi(f),p=l*qi(f),g=+n.apply(this,(s[0]=c,s)),v=i.apply(this,s)-Hi,x=r.apply(this,s)-Hi;if(a||(a=o=path()),a.moveTo(h,p),a.arc(0,0,l,f,d),f===v&&d===x||(a.quadraticCurveTo(0,0,g*Bi(v),g*qi(v)),a.arc(0,0,g,v,x)),a.quadraticCurveTo(0,0,h,p),a.closePath(),o)return a=null,o+""||null}var t=defaultSource,e=defaultTarget,n=defaultRadius,i=defaultStartAngle,r=defaultEndAngle,a=null;return ribbon.radius=function(t){return arguments.length?(n="function"==typeof t?t:Zi(+t),ribbon):n},ribbon.startAngle=function(t){return arguments.length?(i="function"==typeof t?t:Zi(+t),ribbon):i},ribbon.endAngle=function(t){return arguments.length?(r="function"==typeof t?t:Zi(+t),ribbon):r},ribbon.source=function(e){return arguments.length?(t=e,ribbon):t},ribbon.target=function(t){return arguments.length?(e=t,ribbon):e},ribbon.context=function(t){return arguments.length?(a=null==t?null:t,ribbon):a},ribbon};Map.prototype=map$1.prototype={constructor:Map,has:function(t){return"$"+t in this},get:function(t){return this["$"+t]},set:function(t,e){return this["$"+t]=e,this},remove:function(t){var e="$"+t;return e in this&&delete this[e]},clear:function(){for(var t in this)"$"===t[0]&&delete this[t]},keys:function(){var t=[];for(var e in this)"$"===e[0]&&t.push(e.slice(1));return t},values:function(){var t=[];for(var e in this)"$"===e[0]&&t.push(this[e]);return t},entries:function(){var t=[];for(var e in this)"$"===e[0]&&t.push({key:e.slice(1),value:this[e]});return t},size:function(){var t=0;for(var e in this)"$"===e[0]&&++t;return t},empty:function(){for(var t in this)if("$"===t[0])return!1;return!0},each:function(t){for(var e in this)"$"===e[0]&&t(this[e],e.slice(1),this)}};var er=function(){function apply(n,r,a,o){if(r>=i.length)return null!=e?e(n):null!=t?n.sort(t):n;for(var s,u,c,l=-1,f=n.length,d=i[r++],h=map$1(),p=a();++li.length)return t;var a,o=r[n-1];return null!=e&&n>=i.length?a=t.entries():(a=[],t.each(function(t,e){a.push({key:e,values:entries(t,n)})})),null!=o?a.sort(function(t,e){return o(t.key,e.key)}):a}var t,e,n,i=[],r=[];return n={object:function(t){return apply(t,0,createObject,setObject)},map:function(t){return apply(t,0,createMap,setMap)},entries:function(t){return entries(apply(t,0,createMap,setMap),0)},key:function(t){return i.push(t),n},sortKeys:function(t){return r[i.length-1]=t,n},sortValues:function(e){return t=e,n},rollup:function(t){return e=t,n}}},nr=map$1.prototype;Set.prototype=set$2.prototype={constructor:Set,has:nr.has,add:function(t){return t+="",this["$"+t]=t,this},remove:nr.remove,clear:nr.clear,values:nr.keys,size:nr.size,empty:nr.empty,each:nr.each};var ir=function(t){var e=[];for(var n in t)e.push(n);return e},rr=function(t){var e=[];for(var n in t)e.push(t[n]);return e},ar=function(t){var e=[];for(var n in t)e.push({key:n,value:t[n]});return e},or=function(t){function parse(t,e){var n,i,r=parseRows(t,function(t,r){if(n)return n(t,r-1);i=t,n=e?customConverter(t,e):objectConverter(t)});return r.columns=i,r}function parseRows(t,e){function token(){if(c>=u)return o;if(r)return r=!1,a;var e,i=c;if(34===t.charCodeAt(i)){for(var s=i;s++t||t>r||i>e||e>a))return this;var o,s,u=r-n,c=this._root;switch(s=(e<(i+a)/2)<<1|t<(n+r)/2){case 0:do{o=new Array(4),o[s]=c,c=o}while(u*=2,r=n+u,a=i+u,t>r||e>a);break;case 1:do{o=new Array(4),o[s]=c,c=o}while(u*=2,n=r-u,a=i+u,n>t||e>a);break;case 2:do{o=new Array(4),o[s]=c,c=o}while(u*=2,r=n+u,i=a-u,t>r||i>e);break;case 3:do{o=new Array(4),o[s]=c,c=o}while(u*=2,n=r-u,i=a-u,n>t||i>e)}this._root&&this._root.length&&(this._root=c)}return this._x0=n,this._y0=i,this._x1=r,this._y1=a,this},wr=function(){var t=[];return this.visit(function(e){if(!e.length)do{t.push(e.data)}while(e=e.next)}),t},Tr=function(t){return arguments.length?this.cover(+t[0][0],+t[0][1]).cover(+t[1][0],+t[1][1]):isNaN(this._x0)?void 0:[[this._x0,this._y0],[this._x1,this._y1]]},Ar=function(t,e,n,i,r){this.node=t,this.x0=e,this.y0=n,this.x1=i,this.y1=r},Mr=function(t,e,n){var i,r,a,o,s,u,c,l=this._x0,f=this._y0,d=this._x1,h=this._y1,p=[],g=this._root;for(g&&p.push(new Ar(g,l,f,d,h)),null==n?n=1/0:(l=t-n,f=e-n,d=t+n,h=e+n,n*=n);u=p.pop();)if(!(!(g=u.node)||(r=u.x0)>d||(a=u.y0)>h||(o=u.x1)=x)<<1|t>=v)&&(u=p[p.length-1],p[p.length-1]=p[p.length-1-c],p[p.length-1-c]=u)}else{var _=t-+this._x.call(null,g.data),m=e-+this._y.call(null,g.data),y=_*_+m*m;if(y=(s=(p+v)/2))?p=s:v=s,(l=o>=(u=(g+x)/2))?g=u:x=u,e=h,!(h=h[f=l<<1|c]))return this;if(!h.length)break;(e[f+1&3]||e[f+2&3]||e[f+3&3])&&(n=e,d=f)}for(;h.data!==t;)if(i=h,!(h=h.next))return this;return(r=h.next)&&delete h.next,i?(r?i.next=r:delete i.next,this):e?(r?e[f]=r:delete e[f],(h=e[0]||e[1]||e[2]||e[3])&&h===(e[3]||e[2]||e[1]||e[0])&&!h.length&&(n?n[d]=h:this._root=h),this):(this._root=r,this)},Cr=function(){return this._root},kr=function(){var t=0;return this.visit(function(e){if(!e.length)do{++t}while(e=e.next)}),t},Rr=function(t){var e,n,i,r,a,o,s=[],u=this._root;for(u&&s.push(new Ar(u,this._x0,this._y0,this._x1,this._y1));e=s.pop();)if(!t(u=e.node,i=e.x0,r=e.y0,a=e.x1,o=e.y1)&&u.length){var c=(i+a)/2,l=(r+o)/2;(n=u[3])&&s.push(new Ar(n,c,l,a,o)),(n=u[2])&&s.push(new Ar(n,i,l,c,o)),(n=u[1])&&s.push(new Ar(n,c,r,a,l)),(n=u[0])&&s.push(new Ar(n,i,r,c,l))}return this},Lr=function(t){var e,n=[],i=[];for(this._root&&n.push(new Ar(this._root,this._x0,this._y0,this._x1,this._y1));e=n.pop();){var r=e.node;if(r.length){var a,o=e.x0,s=e.y0,u=e.x1,c=e.y1,l=(o+u)/2,f=(s+c)/2;(a=r[0])&&n.push(new Ar(a,o,s,l,f)),(a=r[1])&&n.push(new Ar(a,l,s,u,f)),(a=r[2])&&n.push(new Ar(a,o,f,l,c)),(a=r[3])&&n.push(new Ar(a,l,f,u,c))}i.push(e)}for(;e=i.pop();)t(e.node,e.x0,e.y0,e.x1,e.y1);return this},Er=function(t){return arguments.length?(this._x=t,this):this._x},Dr=function(t){return arguments.length?(this._y=t,this):this._y},Ir=quadtree.prototype=Quadtree.prototype;Ir.copy=function(){var t,e,n=new Quadtree(this._x,this._y,this._x0,this._y0,this._x1,this._y1),i=this._root;if(!i)return n;if(!i.length)return n._root=leaf_copy(i),n;for(t=[{source:i,target:n._root=new Array(4)}];i=t.pop();)for(var r=0;r<4;++r)(e=i.source[r])&&(e.length?t.push({source:e,target:i.target[r]=new Array(4)}):i.target[r]=leaf_copy(e));return n},Ir.add=yr,Ir.addAll=addAll,Ir.cover=br,Ir.data=wr,Ir.extent=Tr,Ir.find=Mr,Ir.remove=Sr,Ir.removeAll=removeAll,Ir.root=Cr,Ir.size=kr,Ir.visit=Rr,Ir.visitAfter=Lr,Ir.x=Er,Ir.y=Dr;var Fr,Nr=function(t){function force(){function apply(t,e,n,r,a){var f=t.data,d=t.r,h=c+d;{if(!f)return e>s+h||ru+h||ao.index){var p=s-f.x-f.vx,g=u-f.y-f.vy,v=p*p+g*g;vt.r&&(t.r=t[e].r)}function initialize(){if(e){var i,r,a=e.length;for(n=new Array(a),i=0;i1?(null==n?s.remove(t):s.set(t,initializeForce(n)),e):s.get(t)},find:function(e,n,i){var r,a,o,s,u,c=0,l=t.length;for(null==i?i=1/0:i*=i,c=0;c1?(c.on(t,n),e):c.on(t)}}},$r=function(){function force(i){var r,a=t.length,o=quadtree(t,x$1,y$1).visitAfter(accumulate);for(n=i,r=0;r=o)){(t.data!==e||t.next)&&(0===l&&(l=mr(),h+=l*l),0===f&&(f=mr(),h+=f*f),h1?i[0]+i.slice(2):i,+t.slice(n+1)]},Ur=function(t){return t=qr(Math.abs(t)),t?t[1]:NaN},Hr=function(t,e){return function(n,i){for(var r=n.length,a=[],o=0,s=t[0],u=0;r>0&&s>0&&(u+s+1>i&&(s=Math.max(1,i-u)),a.push(n.substring(r-=s,r+s)),!((u+=s+1)>i));)s=t[o=(o+1)%t.length];return a.reverse().join(e)}},Vr=function(t){return function(e){return e.replace(/[0-9]/g,function(e){return t[+e]})}},jr=function(t,e){t=t.toPrecision(e);t:for(var n,i=t.length,r=1,a=-1;r0&&(a=0)}return a>0?t.slice(0,a)+t.slice(n+1):t},Wr=function(t,e){var n=qr(t,e);if(!n)return t+"";var i=n[0],r=n[1],a=r-(Fr=3*Math.max(-8,Math.min(8,Math.floor(r/3))))+1,o=i.length;return a===o?i:a>o?i+new Array(a-o+1).join("0"):a>0?i.slice(0,a)+"."+i.slice(a):"0."+new Array(1-a).join("0")+qr(t,Math.max(0,e+a-1))[0]},Gr=function(t,e){var n=qr(t,e);if(!n)return t+"";var i=n[0],r=n[1];return r<0?"0."+new Array(-r).join("0")+i:i.length>r+1?i.slice(0,r+1)+"."+i.slice(r+1):i+new Array(r-i.length+2).join("0")},Zr={"":jr,"%":function(t,e){return(100*t).toFixed(e)},b:function(t){return Math.round(t).toString(2)},c:function(t){return t+""},d:function(t){return Math.round(t).toString(10)},e:function(t,e){return t.toExponential(e)},f:function(t,e){return t.toFixed(e)},g:function(t,e){return t.toPrecision(e)},o:function(t){return Math.round(t).toString(8)},p:function(t,e){return Gr(100*t,e)},r:Gr,s:Wr,X:function(t){return Math.round(t).toString(16).toUpperCase()},x:function(t){return Math.round(t).toString(16)}},Kr=/^(?:(.)?([<>=^]))?([+\-\( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?([a-z%])?$/i;formatSpecifier.prototype=FormatSpecifier.prototype,FormatSpecifier.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(null==this.width?"":Math.max(1,0|this.width))+(this.comma?",":"")+(null==this.precision?"":"."+Math.max(0,0|this.precision))+this.type};var Jr,Qr=function(t){return t},ta=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"],ea=function(t){function newFormat(t){function format(t){var n,a,c,m=g,y=v;if("c"===p)y=x(t)+y,t="";else{t=+t;var b=t<0;if(t=x(Math.abs(t),h),b&&0==+t&&(b=!1),m=(b?"("===u?u:"-":"-"===u||"("===u?"":u)+m,y=y+("s"===p?ta[8+Fr/3]:"")+(b&&"("===u?")":""),_)for(n=-1,a=t.length;++n(c=t.charCodeAt(n))||c>57){y=(46===c?i+t.slice(n+1):t.slice(n))+y,t=t.slice(0,n);break}}d&&!l&&(t=e(t,1/0));var w=m.length+t.length+y.length,T=w>1)+m+t+y+T.slice(w);break;default:t=T+m+t+y}return r(t)}t=formatSpecifier(t);var o=t.fill,s=t.align,u=t.sign,c=t.symbol,l=t.zero,f=t.width,d=t.comma,h=t.precision,p=t.type,g="$"===c?n[0]:"#"===c&&/[boxX]/.test(p)?"0"+p.toLowerCase():"",v="$"===c?n[1]:/[%p]/.test(p)?a:"",x=Zr[p],_=!p||/[defgprs%]/.test(p);return h=null==h?p?6:12:/[gprs]/.test(p)?Math.max(1,Math.min(21,h)):Math.max(0,Math.min(20,h)),format.toString=function(){return t+""},format}function formatPrefix(t,e){var n=newFormat((t=formatSpecifier(t),t.type="f",t)),i=3*Math.max(-8,Math.min(8,Math.floor(Ur(e)/3))),r=Math.pow(10,-i),a=ta[8+i/3];return function(t){return n(r*t)+a}}var e=t.grouping&&t.thousands?Hr(t.grouping,t.thousands):Qr,n=t.currency,i=t.decimal,r=t.numerals?Vr(t.numerals):Qr,a=t.percent||"%";return{format:newFormat,formatPrefix:formatPrefix}};defaultLocale({decimal:".",thousands:",",grouping:[3],currency:["$",""]});var na=function(t){return Math.max(0,-Ur(Math.abs(t)))},ia=function(t,e){return Math.max(0,3*Math.max(-8,Math.min(8,Math.floor(Ur(e)/3)))-Ur(Math.abs(t)))},ra=function(t,e){return t=Math.abs(t),e=Math.abs(e)-t,Math.max(0,Ur(e)-Ur(t))+1},aa=function(){return new Adder};Adder.prototype={constructor:Adder,reset:function(){this.s=this.t=0},add:function(t){add$1(za,t,this.t),add$1(this,za.s,this.s),this.s?this.t+=za.t:this.s=za.t},valueOf:function(){return this.s}};var oa,sa,ua,ca,la,fa,da,ha,pa,ga,va,xa,_a,ma,ya,ba,wa,Ta,Aa,Ma,Sa,Ca,ka,Ra,La,Ea,Da,Ia,Fa,Na,Pa,za=new Adder,Oa=1e-6,Xa=Math.PI,$a=Xa/2,Ya=Xa/4,Ba=2*Xa,qa=180/Xa,Ua=Xa/180,Ha=Math.abs,Va=Math.atan,ja=Math.atan2,Wa=Math.cos,Ga=Math.ceil,Za=Math.exp,Ka=Math.log,Ja=Math.pow,Qa=Math.sin,to=Math.sign||function(t){return t>0?1:t<0?-1:0},eo=Math.sqrt,no=Math.tan,io={Feature:function(t,e){streamGeometry(t.geometry,e)},FeatureCollection:function(t,e){for(var n=t.features,i=-1,r=n.length;++iOa?pa=90:lo<-Oa&&(da=-90),ya[0]=fa,ya[1]=ha}},ho=function(t){var e,n,i,r,a,o,s;if(pa=ha=-(fa=da=1/0),ma=[],ao(t,fo),n=ma.length){for(ma.sort(rangeCompare),e=1,i=ma[0],a=[i];eangle(i[0],i[1])&&(i[1]=r[1]),angle(r[0],i[1])>angle(i[0],i[1])&&(i[0]=r[0])):a.push(i=r);for(o=-1/0,n=a.length-1,e=0,i=a[n];e<=n;i=r,++e)r=a[e],(s=angle(i[1],r[0]))>o&&(o=s,fa=r[0],ha=i[1])}return ma=ya=null,fa===1/0||da===1/0?[[NaN,NaN],[NaN,NaN]]:[[fa,da],[ha,pa]]},po={sphere:noop$1,point:centroidPoint,lineStart:centroidLineStart,lineEnd:centroidLineEnd,polygonStart:function(){po.lineStart=centroidRingStart,po.lineEnd=centroidRingEnd},polygonEnd:function(){po.lineStart=centroidLineStart,po.lineEnd=centroidLineEnd}},go=function(t){ba=wa=Ta=Aa=Ma=Sa=Ca=ka=Ra=La=Ea=0,ao(t,po);var e=Ra,n=La,i=Ea,r=e*e+n*n+i*i;return r<1e-12&&(e=Sa,n=Ca,i=ka,wa2?t[2]*Ua:0),forward.invert=function(e){return e=t.invert(e[0]*Ua,e[1]*Ua),e[0]*=qa,e[1]*=qa,e},forward},Lo=function(){function point(n,i){t.push(n=e(n,i)),n[0]*=qa,n[1]*=qa}function circle(){var o=n.apply(this,arguments),s=i.apply(this,arguments)*Ua,u=r.apply(this,arguments)*Ua;return t=[],e=rotateRadians(-o[0]*Ua,-o[1]*Ua,0).invert,circleStream(a,s,u,1),o={type:"Polygon",coordinates:[t]},t=e=null,o}var t,e,n=vo([0,0]),i=vo(90),r=vo(6),a={point:point};return circle.center=function(t){return arguments.length?(n="function"==typeof t?t:vo([+t[0],+t[1]]),circle):n},circle.radius=function(t){return arguments.length?(i="function"==typeof t?t:vo(+t),circle):i},circle.precision=function(t){return arguments.length?(r="function"==typeof t?t:vo(+t),circle):r},circle},Eo=function(){var t,e=[];return{point:function(e,n){t.push([e,n])},lineStart:function(){e.push(t=[])},lineEnd:noop$1,rejoin:function(){e.length>1&&e.push(e.pop().concat(e.shift()))},result:function(){var n=e;return e=[],t=null,n}}},Do=function(t,e,n,i,r,a){var o,s=t[0],u=t[1],c=e[0],l=e[1],f=0,d=1,h=c-s,p=l-u;if(o=n-s,h||!(o>0)){if(o/=h,h<0){if(o0){if(o>d)return;o>f&&(f=o)}if(o=r-s,h||!(o<0)){if(o/=h,h<0){if(o>d)return;o>f&&(f=o)}else if(h>0){if(o0)){if(o/=p,p<0){if(o0){if(o>d)return;o>f&&(f=o)}if(o=a-u,p||!(o<0)){if(o/=p,p<0){if(o>d)return;o>f&&(f=o)}else if(p>0){if(o0&&(t[0]=s+f*h,t[1]=u+f*p),d<1&&(e[0]=s+d*h,e[1]=u+d*p),!0}}}}},Io=function(t,e){return Ha(t[0]-e[0])=0;--a)r.point((l=c[a])[0],l[1]);else i(d.x,d.p.x,-1,r);d=d.p}d=d.o,c=d.z,h=!h}while(!d.v);r.lineEnd()}}},No=1e9,Po=-No,zo=function(){var t,e,n,i=0,r=0,a=960,o=500;return n={stream:function(n){return t&&e===n?t:t=clipExtent(i,r,a,o)(e=n)},extent:function(s){return arguments.length?(i=+s[0][0],r=+s[0][1],a=+s[1][0],o=+s[1][1],t=e=null,n):[[i,r],[a,o]]}}},Oo=aa(),Xo=function(t,e){var n=e[0],i=e[1],r=[Qa(n),-Wa(n),0],a=0,o=0;Oo.reset();for(var s=0,u=t.length;s=0?1:-1,A=T*w,M=A>Xa,S=p*y;if(Oo.add(ja(S*T*Qa(A),g*b+S*Wa(A))),a+=M?w+T*Ba:w,M^d>=n^_>=n){var C=cartesianCross(cartesian(f),cartesian(x));cartesianNormalizeInPlace(C);var k=cartesianCross(r,C);cartesianNormalizeInPlace(k);var R=(M^w>=0?-1:1)*asin(k[2]);(i>R||i===R&&(C[0]||C[1]))&&(o+=M^w>=0?1:-1)}}return(a<-Oa||a0){for(h||(a.polygonStart(),h=!0),a.lineStart(),t=0;t1&&2&r&&c.push(c.pop().concat(c.shift())),s.push(c.filter(validSegment))}var o,s,u,c=e(a),l=r.invert(i[0],i[1]),f=Eo(),d=e(f),h=!1,p={point:point,lineStart:lineStart,lineEnd:lineEnd,polygonStart:function(){p.point=pointRing,p.lineStart=ringStart,p.lineEnd=ringEnd,s=[],o=[]},polygonEnd:function(){p.point=point,p.lineStart=lineStart,p.lineEnd=lineEnd,s=I(s);var t=Xo(o,l);s.length?(h||(a.polygonStart(),h=!0),Fo(s,compareIntersection,t,n,a)):t&&(h||(a.polygonStart(),h=!0),a.lineStart(),n(null,null,1,a),a.lineEnd()),h&&(a.polygonEnd(),h=!1),s=o=null},sphere:function(){a.polygonStart(),a.lineStart(),n(null,null,1,a),a.lineEnd(),a.polygonEnd()}};return p}},As=Ts(function(){return!0},clipAntimeridianLine,clipAntimeridianInterpolate,[-Xa,-$a]),Ms=function(t,e){function interpolate(n,i,r,a){circleStream(a,t,e,r,n,i)}function visible(t,e){return Wa(t)*Wa(e)>n}function clipLine(t){var e,n,a,o,s;return{lineStart:function(){o=a=!1,s=1},point:function(u,c){var l,f=[u,c],d=visible(u,c),h=i?d?0:code(u,c):d?code(u+(u<0?Xa:-Xa),c):0;if(!e&&(o=a=d)&&t.lineStart(),d!==a&&(!(l=intersect(e,f))||Io(e,l)||Io(f,l))&&(f[0]+=Oa,f[1]+=Oa,d=visible(f[0],f[1])),d!==a)s=0,d?(t.lineStart(),l=intersect(f,e),t.point(l[0],l[1])):(l=intersect(e,f),t.point(l[0],l[1]),t.lineEnd()),e=l;else if(r&&e&&i^d){var p;h&n||!(p=intersect(f,e,!0))||(s=0,i?(t.lineStart(),t.point(p[0][0],p[0][1]),t.point(p[1][0],p[1][1]),t.lineEnd()):(t.point(p[1][0],p[1][1]),t.lineEnd(),t.lineStart(),t.point(p[0][0],p[0][1])))}!d||e&&Io(e,f)||t.point(f[0],f[1]),e=f,a=d,n=h},lineEnd:function(){a&&t.lineEnd(),e=null},clean:function(){return s|(o&&a)<<1}}}function intersect(t,e,i){var r=cartesian(t),a=cartesian(e),o=[1,0,0],s=cartesianCross(r,a),u=cartesianDot(s,s),c=s[0],l=u-c*c;if(!l)return!i&&t;var f=n*u/l,d=-n*c/l,h=cartesianCross(o,s),p=cartesianScale(o,f);cartesianAddInPlace(p,cartesianScale(s,d));var g=h,v=cartesianDot(p,g),x=cartesianDot(g,g),_=v*v-x*(cartesianDot(p,p)-1);if(!(_<0)){var m=eo(_),y=cartesianScale(g,(-v-m)/x);if(cartesianAddInPlace(y,p),y=spherical(y),!i)return y;var b,w=t[0],T=e[0],A=t[1],M=e[1];T0^y[1]<(Ha(y[0]-w)Xa^(w<=y[0]&&y[0]<=T)){var R=cartesianScale(g,(-v+m)/x);return cartesianAddInPlace(R,p),[y,spherical(R)]}}}function code(e,n){var r=i?t:Xa-t,a=0;return e<-r?a|=1:e>r&&(a|=2),n<-r?a|=4:n>r&&(a|=8),a}var n=Wa(t),i=n>0,r=Ha(n)>Oa;return Ts(visible,clipLine,interpolate,i?[0,-t]:[-Xa,t-Xa])},Ss=function(t){return{stream:transformer(t)}};TransformStream.prototype={constructor:TransformStream,point:function(t,e){this.stream.point(t,e)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}};var Cs=16,ks=Wa(30*Ua),Rs=function(t,e){return+e?resample$1(t,e):resampleNone(t)},Ls=transformer({point:function(t,e){this.stream.point(t*Ua,e*Ua)}}),Es=function(){return conicProjection(conicEqualAreaRaw).scale(155.424).center([0,33.6442])},Ds=function(){return Es().parallels([29.5,45.5]).scale(1070).translate([480,250]).rotate([96,0]).center([-.6,38.7])},Is=function(){function albersUsa(t){var e=t[0],o=t[1];return a=null,n.point(e,o),a||(i.point(e,o),a)||(r.point(e,o),a)}function reset(){return t=e=null,albersUsa}var t,e,n,i,r,a,o=Ds(),s=Es().rotate([154,0]).center([-2,58.5]).parallels([55,65]),u=Es().rotate([157,0]).center([-3,19.9]).parallels([8,18]),c={point:function(t,e){a=[t,e]}};return albersUsa.invert=function(t){var e=o.scale(),n=o.translate(),i=(t[0]-n[0])/e,r=(t[1]-n[1])/e;return(r>=.12&&r<.234&&i>=-.425&&i<-.214?s:r>=.166&&r<.234&&i>=-.214&&i<-.115?u:o).invert(t)},albersUsa.stream=function(n){return t&&e===n?t:t=multiplex([o.stream(e=n),s.stream(n),u.stream(n)])},albersUsa.precision=function(t){return arguments.length?(o.precision(t),s.precision(t),u.precision(t),reset()):o.precision()},albersUsa.scale=function(t){return arguments.length?(o.scale(t),s.scale(.35*t),u.scale(t),albersUsa.translate(o.translate())):o.scale()},albersUsa.translate=function(t){if(!arguments.length)return o.translate();var e=o.scale(),a=+t[0],l=+t[1];return n=o.translate(t).clipExtent([[a-.455*e,l-.238*e],[a+.455*e,l+.238*e]]).stream(c),i=s.translate([a-.307*e,l+.201*e]).clipExtent([[a-.425*e+Oa,l+.12*e+Oa],[a-.214*e-Oa,l+.234*e-Oa]]).stream(c),r=u.translate([a-.205*e,l+.212*e]).clipExtent([[a-.214*e+Oa,l+.166*e+Oa],[a-.115*e-Oa,l+.234*e-Oa]]).stream(c),reset()},albersUsa.fitExtent=function(t,e){return fitExtent(albersUsa,t,e)},albersUsa.fitSize=function(t,e){return fitSize(albersUsa,t,e)},albersUsa.scale(1070)},Fs=azimuthalRaw(function(t){return eo(2/(1+t))});Fs.invert=azimuthalInvert(function(t){return 2*asin(t/2)});var Ns=function(){return projection(Fs).scale(124.75).clipAngle(179.999)},Ps=azimuthalRaw(function(t){return(t=acos(t))&&t/Qa(t)});Ps.invert=azimuthalInvert(function(t){return t});var zs=function(){return projection(Ps).scale(79.4188).clipAngle(179.999)};mercatorRaw.invert=function(t,e){return[t,2*Va(Za(e))-$a]};var Os=function(){return mercatorProjection(mercatorRaw).scale(961/Ba)},Xs=function(){return conicProjection(conicConformalRaw).scale(109.5).parallels([30,30])};equirectangularRaw.invert=equirectangularRaw;var $s=function(){return projection(equirectangularRaw).scale(152.63)},Ys=function(){return conicProjection(conicEquidistantRaw).scale(131.154).center([0,13.9389])};gnomonicRaw.invert=azimuthalInvert(Va);var Bs=function(){return projection(gnomonicRaw).scale(144.049).clipAngle(60)},qs=function(){function reset(){return i=r=null,a}var t,e,n,i,r,a,o=1,s=0,u=0,c=1,l=1,f=Zo,d=null,h=Zo;return a={stream:function(t){return i&&r===t?i:i=f(h(r=t))},clipExtent:function(i){return arguments.length?(h=null==i?(d=t=e=n=null,Zo):clipExtent(d=+i[0][0],t=+i[0][1],e=+i[1][0],n=+i[1][1]),reset()):null==d?null:[[d,t],[e,n]]},scale:function(t){return arguments.length?(f=scaleTranslate((o=+t)*c,o*l,s,u),reset()):o},translate:function(t){return arguments.length?(f=scaleTranslate(o*c,o*l,s=+t[0],u=+t[1]),reset()):[s,u]},reflectX:function(t){return arguments.length?(f=scaleTranslate(o*(c=t?-1:1),o*l,s,u),reset()):c<0},reflectY:function(t){return arguments.length?(f=scaleTranslate(o*c,o*(l=t?-1:1),s,u),reset()):l<0},fitExtent:function(t,e){return fitExtent(a,t,e)},fitSize:function(t,e){return fitSize(a,t,e)}}};orthographicRaw.invert=azimuthalInvert(asin);var Us=function(){return projection(orthographicRaw).scale(249.5).clipAngle(90+Oa)};stereographicRaw.invert=azimuthalInvert(function(t){return 2*Va(t)});var Hs=function(){return projection(stereographicRaw).scale(250).clipAngle(142)};transverseMercatorRaw.invert=function(t,e){return[-e,2*Va(Za(t))-$a]};var Vs=function(){var t=mercatorProjection(transverseMercatorRaw),e=t.center,n=t.rotate;return t.center=function(t){return arguments.length?e([-t[1],t[0]]):(t=e(),[t[1],-t[0]])},t.rotate=function(t){return arguments.length?n([t[0],t[1],t.length>2?t[2]+90:90]):(t=n(),[t[0],t[1],t[2]-90])},n([0,0,90]).scale(159.155)},js=function(){function cluster(r){var a,o=0;r.eachAfter(function(e){var n=e.children;n?(e.x=meanX(n),e.y=maxY(n)):(e.x=a?o+=t(e,a):0,e.y=0,a=e)});var s=leafLeft(r),u=leafRight(r),c=s.x-t(s,u)/2,l=u.x+t(u,s)/2;return r.eachAfter(i?function(t){t.x=(t.x-r.x)*e,t.y=(r.y-t.y)*n}:function(t){t.x=(t.x-c)/(l-c)*e,t.y=(1-(r.y?t.y/r.y:1))*n})}var t=defaultSeparation,e=1,n=1,i=!1;return cluster.separation=function(e){return arguments.length?(t=e,cluster):t},cluster.size=function(t){return arguments.length?(i=!1,e=+t[0],n=+t[1],cluster):i?null:[e,n]},cluster.nodeSize=function(t){return arguments.length?(i=!0,e=+t[0],n=+t[1],cluster):i?[e,n]:null},cluster},Ws=function(){return this.eachAfter(count)},Gs=function(t){var e,n,i,r,a=this,o=[a];do{for(e=o.reverse(),o=[];a=e.pop();)if(t(a),n=a.children)for(i=0,r=n.length;i=0;--n)r.push(e[n]);return this},Ks=function(t){for(var e,n,i,r=this,a=[r],o=[];r=a.pop();)if(o.push(r),e=r.children)for(n=0,i=e.length;n=0;)n+=i[r].value;e.value=n})},Qs=function(t){return this.eachBefore(function(e){e.children&&e.children.sort(t)})},tu=function(t){for(var e=this,n=leastCommonAncestor(e,t),i=[e];e!==n;)e=e.parent,i.push(e);for(var r=i.length;t!==n;)i.splice(r,0,t),t=t.parent;return i},eu=function(){for(var t=this,e=[t];t=t.parent;)e.push(t);return e},nu=function(){var t=[];return this.each(function(e){t.push(e)}),t},iu=function(){var t=[];return this.eachBefore(function(e){e.children||t.push(e)}),t},ru=function(){var t=this,e=[];return t.each(function(n){n!==t&&e.push({source:n.parent,target:n})}),e};Node.prototype=hierarchy.prototype={constructor:Node,count:Ws,each:Gs,eachAfter:Ks,eachBefore:Zs,sum:Js,sort:Qs,path:tu,ancestors:eu,descendants:nu,leaves:iu,links:ru,copy:node_copy};var au=function(t){for(var e=(t=t.slice()).length,n=null,i=n;e;){var r=new Node$2(t[e-1]);i=i?i.next=r:n=r,t[void 0]=t[--e]}return{head:n,tail:i}},ou=function(t){return encloseN(au(t),[])},su=function(t){return packEnclose(t),t},uu=function(t){return function(){return t}},cu=function(){function pack(r){return r.x=e/2,r.y=n/2,t?r.eachBefore(radiusLeaf(t)).eachAfter(packChildren(i,.5)).eachBefore(translateChild(1)):r.eachBefore(radiusLeaf(defaultRadius$1)).eachAfter(packChildren(constantZero,1)).eachAfter(packChildren(i,r.r/Math.min(e,n))).eachBefore(translateChild(Math.min(e,n)/(2*r.r))),r}var t=null,e=1,n=1,i=constantZero;return pack.radius=function(e){return arguments.length?(t=optional(e),pack):t},pack.size=function(t){return arguments.length?(e=+t[0],n=+t[1],pack):[e,n]},pack.padding=function(t){return arguments.length?(i="function"==typeof t?t:uu(+t),pack):i},pack},lu=function(t){t.x0=Math.round(t.x0),t.y0=Math.round(t.y0),t.x1=Math.round(t.x1),t.y1=Math.round(t.y1)},fu=function(t,e,n,i,r){for(var a,o=t.children,s=-1,u=o.length,c=t.value&&(i-e)/t.value;++s0)throw new Error("cycle");return a}var t=defaultId,e=defaultParentId;return stratify.id=function(e){return arguments.length?(t=required(e),stratify):t},stratify.parentId=function(t){return arguments.length?(e=required(t),stratify):e},stratify};TreeNode.prototype=Object.create(Node.prototype);var xu=function(){function tree(r){var a=treeRoot(r);if(a.eachAfter(firstWalk),a.parent.m=-a.z,a.eachBefore(secondWalk),i)r.eachBefore(sizeNode);else{var o=r,s=r,u=r;r.eachBefore(function(t){t.xs.x&&(s=t),t.depth>u.depth&&(u=t)});var c=o===s?1:t(o,s)/2,l=c-o.x,f=e/(s.x+c+l),d=n/(u.depth||1);r.eachBefore(function(t){t.x=(t.x+l)*f,t.y=t.depth*d})}return r}function firstWalk(e){var n=e.children,i=e.parent.children,r=e.i?i[e.i-1]:null;if(n){executeShifts(e);var a=(n[0].z+n[n.length-1].z)/2;r?(e.z=r.z+t(e._,r._),e.m=e.z-a):e.z=a}else r&&(e.z=r.z+t(e._,r._));e.parent.A=apportion(e,r,e.parent.A||i[0])}function secondWalk(t){t._.x=t.z+t.parent.m,t.m+=t.parent.m}function apportion(e,n,i){if(n){for(var r,a=e,o=e,s=n,u=a.parent.children[0],c=a.m,l=o.m,f=s.m,d=u.m;s=nextRight(s),a=nextLeft(a),s&&a;)u=nextLeft(u),o=nextRight(o),o.a=e,r=s.z+f-a.z-c+t(s._,a._),r>0&&(moveSubtree(nextAncestor(s,e,i),e,r),c+=r,l+=r),f+=s.m,c+=a.m,d+=u.m,l+=o.m;s&&!nextRight(o)&&(o.t=s,o.m+=f-l),a&&!nextLeft(u)&&(u.t=a,u.m+=c-d,i=e)}return i}function sizeNode(t){t.x*=e,t.y=t.depth*n}var t=defaultSeparation$1,e=1,n=1,i=null;return tree.separation=function(e){return arguments.length?(t=e,tree):t},tree.size=function(t){return arguments.length?(i=!1,e=+t[0],n=+t[1],tree):i?null:[e,n]},tree.nodeSize=function(t){return arguments.length?(i=!0,e=+t[0],n=+t[1],tree):i?[e,n]:null},tree},_u=function(t,e,n,i,r){for(var a,o=t.children,s=-1,u=o.length,c=t.value&&(r-n)/t.value;++s1?t:1)},squarify}(mu),bu=function(){function treemap(t){return t.x0=t.y0=0,t.x1=n,t.y1=i,t.eachBefore(positionNode),r=[0],e&&t.eachBefore(lu),t}function positionNode(e){var n=r[e.depth],i=e.x0+n,l=e.y0+n,f=e.x1-n,d=e.y1-n;f=e-1){var u=s[t];return u.x0=i,u.y0=r,u.x1=a,u.y1=o,void 0}for(var l=c[t],f=n/2+l,d=t+1,h=e-1;d>>1;c[p]o-r){var x=(i*v+a*g)/n;partition(t,d,g,i,r,x,o),partition(d,e,v,x,r,a,o)}else{var _=(r*v+o*g)/n;partition(t,d,g,i,r,a,_),partition(d,e,v,i,_,a,o)}}var a,o,s=t.children,u=s.length,c=new Array(u+1);for(c[0]=o=a=0;a1?t:1)},resquarify}(mu),Mu=function(t){for(var e,n=-1,i=t.length,r=t[i-1],a=0;++n=0;--e)c.push(t[i[a[e]][2]]);for(e=+s;es!=c>s&&o<(u-n)*(s-i)/(c-i)+n&&(l=!l),u=n,c=i;return l},Lu=function(t){for(var e,n,i=-1,r=t.length,a=t[r-1],o=a[0],s=a[1],u=0;++i1);return e+n*a*Math.sqrt(-2*Math.log(r)/r)}}return randomNormal.source=sourceRandomNormal,randomNormal}(Iu),Pu=function sourceRandomLogNormal(t){function randomLogNormal(){var e=Nu.source(t).apply(this,arguments);return function(){return Math.exp(e())}}return randomLogNormal.source=sourceRandomLogNormal,randomLogNormal}(Iu),zu=function sourceRandomIrwinHall(t){function randomIrwinHall(e){return function(){for(var n=0,i=0;i=200&&i<300||304===i){if(r)try{e=r.call(n,u)}catch(t){return void o.call("error",n,t)}else e=u;o.call("load",n,e)}else o.call("error",n,t)}var n,i,r,a,o=dispatch("beforesend","progress","load","error"),s=map$1(),u=new XMLHttpRequest,c=null,l=null,f=0;if("undefined"==typeof XDomainRequest||"withCredentials"in u||!/^(http(s)?:)?\/\//.test(t)||(u=new XDomainRequest),"onload"in u?u.onload=u.onerror=u.ontimeout=respond:u.onreadystatechange=function(t){u.readyState>3&&respond(t)},u.onprogress=function(t){o.call("progress",n,t)},n={header:function(t,e){return t=(t+"").toLowerCase(),arguments.length<2?s.get(t):(null==e?s.remove(t):s.set(t,e+""),n)},mimeType:function(t){return arguments.length?(i=null==t?null:t+"",n):i},responseType:function(t){return arguments.length?(a=t,n):a},timeout:function(t){return arguments.length?(f=+t,n):f},user:function(t){return arguments.length<1?c:(c=null==t?null:t+"",n)},password:function(t){return arguments.length<1?l:(l=null==t?null:t+"",n)},response:function(t){return r=t,n},get:function(t,e){return n.send("GET",t,e)},post:function(t,e){return n.send("POST",t,e)},send:function(e,r,d){return u.open(e,t,!0,c,l),null==i||s.has("accept")||s.set("accept",i+",*/*"),u.setRequestHeader&&s.each(function(t,e){u.setRequestHeader(e,t)}),null!=i&&u.overrideMimeType&&u.overrideMimeType(i),null!=a&&(u.responseType=a),f>0&&(u.timeout=f),null==d&&"function"==typeof r&&(d=r,r=null),null!=d&&1===d.length&&(d=fixCallback(d)),null!=d&&n.on("error",d).on("load",function(t){d(null,t)}),o.call("beforesend",n,u),u.send(null==r?null:r),n},abort:function(){return u.abort(),n},on:function(){var t=o.on.apply(o,arguments);return t===o?n:t}},null!=e){if("function"!=typeof e)throw new Error("invalid callback: "+e);return n.get(e)}return n},Yu=function(t,e){return function(n,i){var r=$u(n).mimeType(t).response(e);if(null!=i){if("function"!=typeof i)throw new Error("invalid callback: "+i);return r.get(i)}return r}},Bu=Yu("text/html",function(t){return document.createRange().createContextualFragment(t.responseText)}),qu=Yu("application/json",function(t){return JSON.parse(t.responseText)}),Uu=Yu("text/plain",function(t){return t.responseText}),Hu=Yu("application/xml",function(t){var e=t.responseXML;if(!e)throw new Error("parse error");return e}),Vu=function(t,e){return function(n,i,r){arguments.length<3&&(r=i,i=null);var a=$u(n).mimeType(t);return a.row=function(t){return arguments.length?a.response(responseOf(e,i=t)):i},a.row(i),r?a.get(r):a}},ju=Vu("text/csv",ur),Wu=Vu("text/tab-separated-values",hr),Gu=Array.prototype,Zu=Gu.map,Ku=Gu.slice,Ju={name:"implicit"},Qu=function(t){return function(){return t}},tc=function(t){return+t},ec=[0,1],nc=function(e,n,i){var r,a=e[0],o=e[e.length-1],s=tickStep(a,o,null==n?10:n);switch(i=formatSpecifier(null==i?",f":i),i.type){case"s":var u=Math.max(Math.abs(a),Math.abs(o));return null!=i.precision||isNaN(r=ia(s,u))||(i.precision=r),t.formatPrefix(i,u);case"":case"e":case"g":case"p":case"r":null!=i.precision||isNaN(r=ra(s,Math.max(Math.abs(a),Math.abs(o))))||(i.precision=r-("e"===i.type));break;case"f":case"%":null!=i.precision||isNaN(r=na(s))||(i.precision=r-2*("%"===i.type))}return t.format(i)},ic=function(t,e){t=t.slice();var n,i=0,r=t.length-1,a=t[i],o=t[r];return o0?t>1?newInterval(function(e){e.setTime(Math.floor(e/t)*t)},function(e,n){e.setTime(+e+n*t)},function(e,n){return(n-e)/t}):oc:null};var sc=oc.range,uc=6e4,cc=6048e5,lc=newInterval(function(t){t.setTime(1e3*Math.floor(t/1e3))},function(t,e){t.setTime(+t+1e3*e)},function(t,e){return(e-t)/1e3},function(t){return t.getUTCSeconds()}),fc=lc.range,dc=newInterval(function(t){t.setTime(Math.floor(t/uc)*uc)},function(t,e){t.setTime(+t+e*uc)},function(t,e){return(e-t)/uc},function(t){return t.getMinutes()}),hc=dc.range,pc=newInterval(function(t){var e=t.getTimezoneOffset()*uc%36e5;e<0&&(e+=36e5),t.setTime(36e5*Math.floor((+t-e)/36e5)+e)},function(t,e){t.setTime(+t+36e5*e)},function(t,e){return(e-t)/36e5},function(t){return t.getHours()}),gc=pc.range,vc=newInterval(function(t){t.setHours(0,0,0,0)},function(t,e){t.setDate(t.getDate()+e)},function(t,e){return(e-t-(e.getTimezoneOffset()-t.getTimezoneOffset())*uc)/864e5},function(t){return t.getDate()-1}),xc=vc.range,_c=weekday(0),mc=weekday(1),yc=weekday(2),bc=weekday(3),wc=weekday(4),Tc=weekday(5),Ac=weekday(6),Mc=_c.range,Sc=mc.range,Cc=yc.range,kc=bc.range,Rc=wc.range,Lc=Tc.range,Ec=Ac.range,Dc=newInterval(function(t){t.setDate(1),t.setHours(0,0,0,0)},function(t,e){t.setMonth(t.getMonth()+e)},function(t,e){return e.getMonth()-t.getMonth()+12*(e.getFullYear()-t.getFullYear())},function(t){return t.getMonth()}),Ic=Dc.range,Fc=newInterval(function(t){t.setMonth(0,1),t.setHours(0,0,0,0)},function(t,e){t.setFullYear(t.getFullYear()+e)},function(t,e){return e.getFullYear()-t.getFullYear()},function(t){return t.getFullYear()});Fc.every=function(t){return isFinite(t=Math.floor(t))&&t>0?newInterval(function(e){e.setFullYear(Math.floor(e.getFullYear()/t)*t),e.setMonth(0,1),e.setHours(0,0,0,0)},function(e,n){e.setFullYear(e.getFullYear()+n*t)}):null};var Nc=Fc.range,Pc=newInterval(function(t){t.setUTCSeconds(0,0)},function(t,e){t.setTime(+t+e*uc)},function(t,e){return(e-t)/uc},function(t){return t.getUTCMinutes()}),zc=Pc.range,Oc=newInterval(function(t){t.setUTCMinutes(0,0,0)},function(t,e){t.setTime(+t+36e5*e)},function(t,e){return(e-t)/36e5},function(t){return t.getUTCHours()}),Xc=Oc.range,$c=newInterval(function(t){t.setUTCHours(0,0,0,0)},function(t,e){t.setUTCDate(t.getUTCDate()+e)},function(t,e){return(e-t)/864e5},function(t){return t.getUTCDate()-1}),Yc=$c.range,Bc=utcWeekday(0),qc=utcWeekday(1),Uc=utcWeekday(2),Hc=utcWeekday(3),Vc=utcWeekday(4),jc=utcWeekday(5),Wc=utcWeekday(6),Gc=Bc.range,Zc=qc.range,Kc=Uc.range,Jc=Hc.range,Qc=Vc.range,tl=jc.range,el=Wc.range,nl=newInterval(function(t){t.setUTCDate(1),t.setUTCHours(0,0,0,0)},function(t,e){t.setUTCMonth(t.getUTCMonth()+e)},function(t,e){return e.getUTCMonth()-t.getUTCMonth()+12*(e.getUTCFullYear()-t.getUTCFullYear())},function(t){return t.getUTCMonth()}),il=nl.range,rl=newInterval(function(t){t.setUTCMonth(0,1),t.setUTCHours(0,0,0,0)},function(t,e){t.setUTCFullYear(t.getUTCFullYear()+e)},function(t,e){return e.getUTCFullYear()-t.getUTCFullYear()},function(t){return t.getUTCFullYear()});rl.every=function(t){return isFinite(t=Math.floor(t))&&t>0?newInterval(function(e){e.setUTCFullYear(Math.floor(e.getUTCFullYear()/t)*t),e.setUTCMonth(0,1),e.setUTCHours(0,0,0,0)},function(e,n){e.setUTCFullYear(e.getUTCFullYear()+n*t)}):null};var al,ol=rl.range,sl={"-":"",_:" ",0:"0"},ul=/^\s*\d+/,cl=/^%/,ll=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g;defaultLocale$1({dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});var fl=Date.prototype.toISOString?formatIsoNative:t.utcFormat("%Y-%m-%dT%H:%M:%S.%LZ"),dl=+new Date("2000-01-01T00:00:00.000Z")?parseIsoNative:t.utcParse("%Y-%m-%dT%H:%M:%S.%LZ"),hl=1e3,pl=60*hl,gl=60*pl,vl=24*gl,xl=7*vl,_l=30*vl,ml=365*vl,yl=function(){return calendar(Fc,Dc,_c,vc,pc,dc,lc,oc,t.timeFormat).domain([new Date(2e3,0,1),new Date(2e3,0,2)])},bl=function(){return calendar(rl,nl,Bc,$c,Oc,Pc,lc,oc,t.utcFormat).domain([Date.UTC(2e3,0,1),Date.UTC(2e3,0,2)])},wl=function(t){return t.match(/.{6}/g).map(function(t){return"#"+t})},Tl=wl("1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf"),Al=wl("393b795254a36b6ecf9c9ede6379398ca252b5cf6bcedb9c8c6d31bd9e39e7ba52e7cb94843c39ad494ad6616be7969c7b4173a55194ce6dbdde9ed6"),Ml=wl("3182bd6baed69ecae1c6dbefe6550dfd8d3cfdae6bfdd0a231a35474c476a1d99bc7e9c0756bb19e9ac8bcbddcdadaeb636363969696bdbdbdd9d9d9"),Sl=wl("1f77b4aec7e8ff7f0effbb782ca02c98df8ad62728ff98969467bdc5b0d58c564bc49c94e377c2f7b6d27f7f7fc7c7c7bcbd22dbdb8d17becf9edae5"),Cl=un(cubehelix(300,.5,0),cubehelix(-240,.5,1)),kl=un(cubehelix(-100,.75,.35),cubehelix(80,1.5,.8)),Rl=un(cubehelix(260,.75,.35),cubehelix(80,1.5,.8)),Ll=cubehelix(),El=function(t){(t<0||t>1)&&(t-=Math.floor(t));var e=Math.abs(t-.5);return Ll.h=360*t-100,Ll.s=1.5-1.5*e,Ll.l=.8-.9*e,Ll+""},Dl=ramp(wl("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725")),Il=ramp(wl("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf")),Fl=ramp(wl("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4")),Nl=ramp(wl("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921")),Pl=function(t){return function(){return t}},zl=Math.abs,Ol=Math.atan2,Xl=Math.cos,$l=Math.max,Yl=Math.min,Bl=Math.sin,ql=Math.sqrt,Ul=1e-12,Hl=Math.PI,Vl=Hl/2,jl=2*Hl,Wl=function(){function arc(){var u,c,l=+t.apply(this,arguments),f=+e.apply(this,arguments),d=r.apply(this,arguments)-Vl,h=a.apply(this,arguments)-Vl,p=zl(h-d),g=h>d;if(s||(s=u=path()),fUl)if(p>jl-Ul)s.moveTo(f*Xl(d),f*Bl(d)),s.arc(0,0,f,d,h,!g),l>Ul&&(s.moveTo(l*Xl(h),l*Bl(h)),s.arc(0,0,l,h,d,g));else{var v,x,_=d,m=h,y=d,b=h,w=p,T=p,A=o.apply(this,arguments)/2,M=A>Ul&&(i?+i.apply(this,arguments):ql(l*l+f*f)),S=Yl(zl(f-l)/2,+n.apply(this,arguments)),C=S,k=S;if(M>Ul){var R=asin$1(M/l*Bl(A)),L=asin$1(M/f*Bl(A));(w-=2*R)>Ul?(R*=g?1:-1,y+=R,b-=R):(w=0,y=b=(d+h)/2),(T-=2*L)>Ul?(L*=g?1:-1,_+=L,m-=L):(T=0,_=m=(d+h)/2)}var E=f*Xl(_),D=f*Bl(_),I=l*Xl(b),F=l*Bl(b);if(S>Ul){var N=f*Xl(m),P=f*Bl(m),z=l*Xl(y),O=l*Bl(y);if(pUl?intersect(E,D,z,O,N,P,I,F):[I,F],$=E-X[0],Y=D-X[1],B=N-X[0],q=P-X[1],U=1/Bl(acos$1(($*B+Y*q)/(ql($*$+Y*Y)*ql(B*B+q*q)))/2),H=ql(X[0]*X[0]+X[1]*X[1]);C=Yl(S,(l-H)/(U-1)),k=Yl(S,(f-H)/(U+1))}}T>Ul?k>Ul?(v=cornerTangents(z,O,E,D,f,k,g),x=cornerTangents(N,P,I,F,f,k,g),s.moveTo(v.cx+v.x01,v.cy+v.y01),kUl&&w>Ul?C>Ul?(v=cornerTangents(I,F,N,P,l,-C,g),x=cornerTangents(E,D,z,O,l,-C,g),s.lineTo(v.cx+v.x01,v.cy+v.y01),C=l;--f)s.point(v[f],x[f]);s.lineEnd(),s.areaEnd()}g&&(v[c]=+t(d,c,u),x[c]=+n(d,c,u),s.point(e?+e(d,c,u):v[c],i?+i(d,c,u):x[c]))}if(h)return s=null,h+""||null}function arealine(){return Zl().defined(r).curve(o).context(a)}var t=x$3,e=null,n=Pl(0),i=y$3,r=Pl(!0),a=null,o=Gl,s=null;return area.x=function(n){return arguments.length?(t="function"==typeof n?n:Pl(+n),e=null,area):t},area.x0=function(e){return arguments.length?(t="function"==typeof e?e:Pl(+e),area):t},area.x1=function(t){return arguments.length?(e=null==t?null:"function"==typeof t?t:Pl(+t),area):e},area.y=function(t){return arguments.length?(n="function"==typeof t?t:Pl(+t),i=null,area):n},area.y0=function(t){return arguments.length?(n="function"==typeof t?t:Pl(+t),area):n},area.y1=function(t){return arguments.length?(i=null==t?null:"function"==typeof t?t:Pl(+t),area):i},area.lineX0=area.lineY0=function(){return arealine().x(t).y(n)},area.lineY1=function(){return arealine().x(t).y(i)},area.lineX1=function(){return arealine().x(e).y(n)},area.defined=function(t){return arguments.length?(r="function"==typeof t?t:Pl(!!t),area):r},area.curve=function(t){return arguments.length?(o=t,null!=a&&(s=o(a)),area):o},area.context=function(t){return arguments.length?(null==t?a=s=null:s=o(a=t),area):a},area},Jl=function(t,e){return et?1:e>=t?0:NaN},Ql=function(t){return t},tf=function(){function pie(o){var s,u,c,l,f,d=o.length,h=0,p=new Array(d),g=new Array(d),v=+i.apply(this,arguments),x=Math.min(jl,Math.max(-jl,r.apply(this,arguments)-v)),_=Math.min(Math.abs(x)/d,a.apply(this,arguments)),m=_*(x<0?-1:1);for(s=0;s0&&(h+=f);for(null!=e?p.sort(function(t,n){return e(g[t],g[n])}):null!=n&&p.sort(function(t,e){return n(o[t],o[e])}),s=0,c=h?(x-d*m)/h:0;s0?f*c:0)+m,g[u]={data:o[u],index:s,value:f,startAngle:v,endAngle:l,padAngle:_};return g}var t=Ql,e=Jl,n=null,i=Pl(0),r=Pl(jl),a=Pl(0);return pie.value=function(e){return arguments.length?(t="function"==typeof e?e:Pl(+e),pie):t},pie.sortValues=function(t){return arguments.length?(e=t,n=null,pie):e},pie.sort=function(t){return arguments.length?(n=t,e=null,pie):n},pie.startAngle=function(t){return arguments.length?(i="function"==typeof t?t:Pl(+t),pie):i},pie.endAngle=function(t){return arguments.length?(r="function"==typeof t?t:Pl(+t),pie):r},pie.padAngle=function(t){return arguments.length?(a="function"==typeof t?t:Pl(+t),pie):a},pie},ef=curveRadial(Gl);Radial.prototype={areaStart:function(){this._curve.areaStart()},areaEnd:function(){this._curve.areaEnd()},lineStart:function(){this._curve.lineStart()},lineEnd:function(){this._curve.lineEnd()},point:function(t,e){this._curve.point(e*Math.sin(t),e*-Math.cos(t))}};var nf=function(){return radialLine(Zl().curve(ef))},rf=function(){var t=Kl().curve(ef),e=t.curve,n=t.lineX0,i=t.lineX1,r=t.lineY0,a=t.lineY1;return t.angle=t.x,delete t.x,t.startAngle=t.x0,delete t.x0,t.endAngle=t.x1,delete t.x1,t.radius=t.y,delete t.y,t.innerRadius=t.y0,delete t.y0,t.outerRadius=t.y1,delete t.y1,t.lineStartAngle=function(){return radialLine(n())},delete t.lineX0,t.lineEndAngle=function(){return radialLine(i())},delete t.lineX1,t.lineInnerRadius=function(){return radialLine(r())},delete t.lineY0,t.lineOuterRadius=function(){return radialLine(a())},delete t.lineY1,t.curve=function(t){return arguments.length?e(curveRadial(t)):e()._curve},t},af=Array.prototype.slice,of=function(t,e){return[(e=+e)*Math.cos(t-=Math.PI/2),e*Math.sin(t)]},sf={draw:function(t,e){var n=Math.sqrt(e/Hl);t.moveTo(n,0),t.arc(0,0,n,0,jl)}},uf={draw:function(t,e){var n=Math.sqrt(e/5)/2;t.moveTo(-3*n,-n),t.lineTo(-n,-n),t.lineTo(-n,-3*n),t.lineTo(n,-3*n),t.lineTo(n,-n),t.lineTo(3*n,-n),t.lineTo(3*n,n),t.lineTo(n,n),t.lineTo(n,3*n),t.lineTo(-n,3*n),t.lineTo(-n,n),t.lineTo(-3*n,n),t.closePath()}},cf=Math.sqrt(1/3),lf=2*cf,ff={draw:function(t,e){var n=Math.sqrt(e/lf),i=n*cf;t.moveTo(0,-n),t.lineTo(i,0),t.lineTo(0,n),t.lineTo(-i,0),t.closePath()}},df=Math.sin(Hl/10)/Math.sin(7*Hl/10),hf=Math.sin(jl/10)*df,pf=-Math.cos(jl/10)*df,gf={draw:function(t,e){var n=Math.sqrt(.8908130915292852*e),i=hf*n,r=pf*n;t.moveTo(0,-n),t.lineTo(i,r);for(var a=1;a<5;++a){var o=jl*a/5,s=Math.cos(o),u=Math.sin(o);t.lineTo(u*n,-s*n),t.lineTo(s*i-u*r,u*i+s*r)}t.closePath()}},vf={draw:function(t,e){var n=Math.sqrt(e),i=-n/2;t.rect(i,i,n,n)}},xf=Math.sqrt(3),_f={draw:function(t,e){var n=-Math.sqrt(e/(3*xf));t.moveTo(0,2*n),t.lineTo(-xf*n,-n),t.lineTo(xf*n,-n),t.closePath()}},mf=-.5,yf=Math.sqrt(3)/2,bf=1/Math.sqrt(12),wf=3*(bf/2+1),Tf={draw:function(t,e){var n=Math.sqrt(e/wf),i=n/2,r=n*bf,a=i,o=n*bf+n,s=-a,u=o;t.moveTo(i,r),t.lineTo(a,o),t.lineTo(s,u),t.lineTo(mf*i-yf*r,yf*i+mf*r),t.lineTo(mf*a-yf*o,yf*a+mf*o),t.lineTo(mf*s-yf*u,yf*s+mf*u),t.lineTo(mf*i+yf*r,mf*r-yf*i),t.lineTo(mf*a+yf*o,mf*o-yf*a),t.lineTo(mf*s+yf*u,mf*u-yf*s),t.closePath()}},Af=[sf,uf,ff,vf,gf,_f,Tf],Mf=function(){function symbol(){var i;if(n||(n=i=path()),t.apply(this,arguments).draw(n,+e.apply(this,arguments)),i)return n=null,i+""||null}var t=Pl(sf),e=Pl(64),n=null;return symbol.type=function(e){return arguments.length?(t="function"==typeof e?e:Pl(e),symbol):t},symbol.size=function(t){return arguments.length?(e="function"==typeof t?t:Pl(+t),symbol):e},symbol.context=function(t){return arguments.length?(n=null==t?null:t,symbol):n},symbol},Sf=function(){};Basis.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){switch(this._point){case 3:point$2(this,this._x1,this._y1);case 2:this._context.lineTo(this._x1,this._y1)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3,this._context.lineTo((5*this._x0+this._x1)/6,(5*this._y0+this._y1)/6);default:point$2(this,t,e)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e}};var Cf=function(t){return new Basis(t)};BasisClosed.prototype={areaStart:Sf,areaEnd:Sf,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._y0=this._y1=this._y2=this._y3=this._y4=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x2,this._y2),this._context.closePath();break;case 2:this._context.moveTo((this._x2+2*this._x3)/3,(this._y2+2*this._y3)/3),this._context.lineTo((this._x3+2*this._x2)/3,(this._y3+2*this._y2)/3),this._context.closePath();break;case 3:this.point(this._x2,this._y2),this.point(this._x3,this._y3),this.point(this._x4,this._y4)}},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._x2=t,this._y2=e;break;case 1:this._point=2,this._x3=t,this._y3=e;break;case 2:this._point=3,this._x4=t,this._y4=e,this._context.moveTo((this._x0+4*this._x1+t)/6,(this._y0+4*this._y1+e)/6);break;default:point$2(this,t,e)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e}};var kf=function(t){return new BasisClosed(t)};BasisOpen.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;var n=(this._x0+4*this._x1+t)/6,i=(this._y0+4*this._y1+e)/6;this._line?this._context.lineTo(n,i):this._context.moveTo(n,i);break;case 3:this._point=4;default:point$2(this,t,e)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e}};var Rf=function(t){return new BasisOpen(t)};Bundle.prototype={lineStart:function(){this._x=[],this._y=[],this._basis.lineStart()},lineEnd:function(){var t=this._x,e=this._y,n=t.length-1;if(n>0)for(var i,r=t[0],a=e[0],o=t[n]-r,s=e[n]-a,u=-1;++u<=n;)i=u/n,this._basis.point(this._beta*t[u]+(1-this._beta)*(r+i*o),this._beta*e[u]+(1-this._beta)*(a+i*s));this._x=this._y=null,this._basis.lineEnd()},point:function(t,e){this._x.push(+t),this._y.push(+e)}};var Lf=function custom(t){function bundle(e){return 1===t?new Basis(e):new Bundle(e,t)}return bundle.beta=function(t){return custom(+t)},bundle}(.85);Cardinal.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:point$3(this,this._x1,this._y1)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2,this._x1=t,this._y1=e;break;case 2:this._point=3;default:point$3(this,t,e)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};var Ef=function custom(t){function cardinal(e){return new Cardinal(e,t)}return cardinal.tension=function(t){return custom(+t)},cardinal}(0);CardinalClosed.prototype={areaStart:Sf,areaEnd:Sf,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x3,this._y3),this._context.closePath();break;case 2:this._context.lineTo(this._x3,this._y3),this._context.closePath();break;case 3:this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5)}},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._x3=t,this._y3=e;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=e);break;case 2:this._point=3,this._x5=t,this._y5=e;break;default:point$3(this,t,e)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};var Df=function custom(t){function cardinal(e){return new CardinalClosed(e,t)}return cardinal.tension=function(t){return custom(+t)},cardinal}(0);CardinalOpen.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:point$3(this,t,e)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};var If=function custom(t){function cardinal(e){return new CardinalOpen(e,t)}return cardinal.tension=function(t){return custom(+t)},cardinal}(0);CatmullRom.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:this.point(this._x2,this._y2)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){if(t=+t,e=+e,this._point){var n=this._x2-t,i=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(n*n+i*i,this._alpha))}switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3;default:point$4(this,t,e)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};var Ff=function custom(t){function catmullRom(e){return t?new CatmullRom(e,t):new Cardinal(e,0)}return catmullRom.alpha=function(t){return custom(+t)},catmullRom}(.5);CatmullRomClosed.prototype={areaStart:Sf,areaEnd:Sf,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x3,this._y3),this._context.closePath();break;case 2:this._context.lineTo(this._x3,this._y3),this._context.closePath();break;case 3:this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5)}},point:function(t,e){if(t=+t,e=+e,this._point){var n=this._x2-t,i=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(n*n+i*i,this._alpha))}switch(this._point){case 0:this._point=1,this._x3=t,this._y3=e;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=e);break;case 2:this._point=3,this._x5=t,this._y5=e;break;default:point$4(this,t,e)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};var Nf=function custom(t){function catmullRom(e){return t?new CatmullRomClosed(e,t):new CardinalClosed(e,0)}return catmullRom.alpha=function(t){return custom(+t)},catmullRom}(.5);CatmullRomOpen.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){if(t=+t,e=+e,this._point){var n=this._x2-t,i=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(n*n+i*i,this._alpha))}switch(this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:point$4(this,t,e)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};var Pf=function custom(t){function catmullRom(e){return t?new CatmullRomOpen(e,t):new CardinalOpen(e,0)}return catmullRom.alpha=function(t){return custom(+t)},catmullRom}(.5);LinearClosed.prototype={areaStart:Sf,areaEnd:Sf,lineStart:function(){this._point=0},lineEnd:function(){this._point&&this._context.closePath()},point:function(t,e){t=+t,e=+e,this._point?this._context.lineTo(t,e):(this._point=1,this._context.moveTo(t,e))}};var zf=function(t){return new LinearClosed(t)};MonotoneX.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=this._t0=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x1,this._y1);break;case 3:point$5(this,this._t0,slope2(this,this._t0))}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){var n=NaN;if(t=+t,e=+e,t!==this._x1||e!==this._y1){switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3,point$5(this,slope2(this,n=slope3(this,t,e)),n);break;default:point$5(this,this._t0,n=slope3(this,t,e))}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e,this._t0=n}}},(MonotoneY.prototype=Object.create(MonotoneX.prototype)).point=function(t,e){MonotoneX.prototype.point.call(this,e,t)},ReflectContext.prototype={moveTo:function(t,e){this._context.moveTo(e,t)},closePath:function(){this._context.closePath()},lineTo:function(t,e){this._context.lineTo(e,t)},bezierCurveTo:function(t,e,n,i,r,a){this._context.bezierCurveTo(e,t,i,n,a,r)}},Natural.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x=[],this._y=[]},lineEnd:function(){var t=this._x,e=this._y,n=t.length;if(n)if(this._line?this._context.lineTo(t[0],e[0]):this._context.moveTo(t[0],e[0]),2===n)this._context.lineTo(t[1],e[1]);else for(var i=controlPoints(t),r=controlPoints(e),a=0,o=1;o=0&&(this._t=1-this._t,this._line=1-this._line)},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;default:if(this._t<=0)this._context.lineTo(this._x,e),this._context.lineTo(t,e);else{var n=this._x*(1-this._t)+t*this._t;this._context.lineTo(n,this._y),this._context.lineTo(n,e)}}this._x=t,this._y=e}};var Xf=function(t){return new Step(t,.5)},$f=function(t,e){if((r=t.length)>1)for(var n,i,r,a=1,o=t[e[0]],s=o.length;a=0;)n[e]=e;return n},Bf=function(){function stack(r){var a,o,s=t.apply(this,arguments),u=r.length,c=s.length,l=new Array(c);for(a=0;a0){for(var n,i,r,a=0,o=t[0].length;a1)for(var n,i,r,a,o,s,u=0,c=t[e[0]].length;u=0?(i[0]=a,i[1]=a+=r):r<0?(i[1]=o,i[0]=o+=r):i[0]=a},Hf=function(t,e){if((n=t.length)>0){for(var n,i=0,r=t[e[0]],a=r.length;i0&&(i=(n=t[e[0]]).length)>0){for(var n,i,r,a=0,o=1;o=s)return null;var u=t-r.site[0],c=e-r.site[1],l=u*u+c*c;do{r=a.cells[i=o],o=null,r.halfedges.forEach(function(n){var i=a.edges[n],s=i.left;if(s!==r.site&&s||(s=i.right)){var u=t-s[0],c=e-s[1],f=u*u+c*c;fn?(n+i)/2:Math.min(0,n)||Math.max(0,i),a>r?(r+a)/2:Math.min(0,r)||Math.max(0,a))}function centroid(t){return[(+t[0][0]+ +t[1][0])/2,(+t[0][1]+ +t[1][1])/2]}function schedule(t,e,n){t.on("start.zoom",function(){gesture(this,arguments).start()}).on("interrupt.zoom end.zoom",function(){gesture(this,arguments).end()}).tween("zoom",function(){var t=this,i=arguments,a=gesture(t,i),o=r.apply(t,i),s=n||centroid(o),u=Math.max(o[1][0]-o[0][0],o[1][1]-o[0][1]),c=t.__zoom,l="function"==typeof e?e.apply(t,i):e,f=d(c.invert(s).concat(u/c.k),l.invert(s).concat(u/l.k));return function(t){if(1===t)t=l;else{var e=f(t),n=u/e[2];t=new Transform(n,s[0]-e[0]*n,s[1]-e[1]*n)}a.zoom(null,t)}})}function gesture(t,e){for(var n,i=0,r=h.length;ix}e.zoom("mouse",constrain(translate(e.that.__zoom,e.mouse[0]=ut(e.that),e.mouse[1]),e.extent))}function mouseupped(){r.on("mousemove.zoom mouseup.zoom",null),yesdrag(t.event.view,e.moved),ld(),e.end()}if(!n&&i.apply(this,arguments)){var e=gesture(this,arguments),r=Ut(t.event.view).on("mousemove.zoom",mousemoved,!0).on("mouseup.zoom",mouseupped,!0),a=ut(this),o=t.event.clientX,s=t.event.clientY;Gt(t.event.view),nopropagation$2(),e.mouse=[a,this.__zoom.invert(a)],En(this),e.start()}}function dblclicked(){if(i.apply(this,arguments)){var e=this.__zoom,n=ut(this),a=e.invert(n),o=e.k*(t.event.shiftKey?.5:2),s=constrain(translate(scale(e,o),n,a),r.apply(this,arguments));ld(),f>0?Ut(this).transition().duration(f).call(schedule,s,n):Ut(this).call(zoom.transform,s)}}function touchstarted(){if(i.apply(this,arguments)){var n,r,a,o,s=gesture(this,arguments),u=t.event.changedTouches,c=u.length;for(nopropagation$2(),r=0;r2){for(o=f-2,r=t[0],a=t[t.length-1],s=(a-r)/(o+1),i=[r],c=0;c0&&e[0]>0&&e.unshift(e[0]-(e[1]-e[0])),e}function copyScale(){var n=e.copy();if(t.isCategory||!n.domain().length){var i=e.domain();n.domain([i[0],i[1]-1])}return n}function textFormatted(t){var e=l?l(t):t;return void 0===e?"":e}function getSizeFor1Char(t){if(o)return o;var e={h:11.5,w:5.5};return t.select("text").text(textFormatted).each(function(t){var n=this.getBoundingClientRect(),i=textFormatted(t),r=n.height,a=i?n.width/i.length:void 0;r&&a&&(e.h=r,e.w=a)}).text(""),o=e,e}function transitionise(e){return t.withoutTransition?e:e.transition(g)}function axis(r){r.each(function(){function splitTickText(e,n){function split(t,e){o=void 0;for(var n=1;n0?1:-1):E}(F)).style("text-anchor",function(t){return t?t>0?"start":"end":"middle"}(F)).attr("transform",function(t){return t?"rotate("+t+")":""}(F)),k.attr("x",0).attr("dy",tspanDy).attr("dx",function(t){return t?8*Math.sin(Math.PI*(t/180)):0}(F)),T.attr("d","M"+b[0]+","+s+"V0H"+b[1]+"V"+s)):"top"===n?(_=axisX,A.attr("y2",-i),S.attr("y",-E),M.attr("x2",0).attr("y2",-i),C.attr("x",0).attr("y",-E),I.style("text-anchor","middle"),k.attr("x",0).attr("dy","0em"),T.attr("d","M"+b[0]+","+-s+"V0H"+b[1]+"V"+-s)):"left"===n?(_=axisY,A.attr("x2",-i),S.attr("x",-E),M.attr("x2",-i).attr("y1",y).attr("y2",y),C.attr("x",-E).attr("y",d),I.style("text-anchor","end"),k.attr("x",-E).attr("dy",tspanDy),T.attr("d","M"+-s+","+b[0]+"H0V"+b[1]+"H"+-s)):"right"===n&&(_=axisY,A.attr("x2",i),S.attr("x",E),M.attr("x2",i).attr("y2",0),C.attr("x",E).attr("y",0),I.style("text-anchor","start"),k.attr("x",E).attr("dy",tspanDy),T.attr("d","M"+s+","+b[0]+"H0V"+b[1]+"H"+s)),l.bandwidth){var N=l,P=N.bandwidth()/2;o=function(t){return N(t)+P},l=o}else o.bandwidth?o=l:v.call(_,l);g.call(_,o),x.call(_,l)})}var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=(0,a.scaleLinear)(),n="bottom",i=6,s=t.withOuterTick?6:0,u=3,c=null,l=void 0,f=void 0,d=0,h=!0,p=void 0,g=void 0;return axis.scale=function(t){return arguments.length?(e=t,axis):e},axis.orient=function(t){return arguments.length?(n=t in{top:1,right:1,bottom:1,left:1}?t+"":"bottom",axis):n},axis.tickFormat=function(t){return arguments.length?(l=t,axis):l},axis.tickCentered=function(t){return arguments.length?(p=t,axis):p},axis.tickOffset=function(){return d},axis.tickInterval=function(){var e=void 0;if(t.isCategory)e=2*d;else{e=(axis.g.select("path.domain").node().getTotalLength()-2*s)/axis.g.selectAll("line").size()}return e===1/0?0:e},axis.ticks=function(){for(var t=arguments.length,e=Array(t),n=0;n1&&(i.axis_x_categories[t]=e,n.redraw()),i.axis_x_categories[t]},categories:function(t){var e=this.internal,n=e.config;return arguments.length?(n.axis_x_categories=t,e.redraw(),n.axis_x_categories):n.axis_x_categories}})},function(t,e,n){"use strict";var i=n(4),r=function(t){return t&&t.__esModule?t:{"default":t}}(i),a=n(60),o=n(0);(0,o.extend)(r.default.prototype,{resize:function(t){var e=this.internal.config;e.size_width=t?t.width:null,e.size_height=t?t.height:null,this.flush()},flush:function(){this.internal.updateAndRedraw({withLegend:!0,withTransition:!1,withTransitionForTransform:!1})},destroy:function(){var t=this.internal;return a.window.clearInterval(t.intervalForObserveInserted),void 0!==t.resizeTimeout&&a.window.clearTimeout(t.resizeTimeout),(0,o.removeEvent)(a.window,"resize",t.resizeFunction),t.selectChart.classed("bb",!1).html(""),Object.keys(t).forEach(function(e){t[e]=null}),null}})},function(t,e,n){"use strict";var i=n(4),r=function(t){return t&&t.__esModule?t:{"default":t}}(i);(0,n(0).extend)(r.default.prototype,{color:function(t){return this.internal.color(t)}})},function(t,e,n){"use strict";var i=n(4),r=function(t){return t&&t.__esModule?t:{"default":t}}(i),a=n(0),o=function(t){var e=this.internal.data.targets;return void 0===t?e:e.filter(function(e){return[].concat(t).indexOf(e.id)>=0})};o.shown=function(t){return this.internal.filterTargetsToShow(this.data(t))},o.values=function(t){var e=null;if(t){var n=this.data(t);n&&n[0]&&(e=n[0].values.map(function(t){return t.value}))}return e},o.names=function(t){return this.internal.clearLegendItemTextBoxCache(),this.internal.updateDataAttributes("names",t)},o.colors=function(t){return this.internal.updateDataAttributes("colors",t)},o.axes=function(t){return this.internal.updateDataAttributes("axes",t)},(0,a.extend)(r.default.prototype,{data:o})},function(t,e,n){"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}var i=n(2),r=n(4),a=_interopRequireDefault(r),o=n(1),s=_interopRequireDefault(o),u=n(0),c=n(3),l=_interopRequireDefault(c);(0,u.extend)(a.default.prototype,{flow:function(t){var e=this.internal,n=[],i=e.getMaxDataCount(),r=void 0,a=void 0,o=0,s=0,c=void 0,l=void 0;if(t.json)r=e.convertJsonToData(t.json,t.keys);else if(t.rows)r=e.convertRowsToData(t.rows);else{if(!t.columns)return;r=e.convertColumnsToData(t.columns)}var f=e.convertDataToTargets(r,!0);e.data.targets.forEach(function(t){var i=!1,r=void 0,a=void 0;for(r=0;r1?d.values[d.values.length-1].x-h.x:h.x-e.getXDomain(e.data.targets)[0]:1,a=[h.x-c,h.x],e.updateXDomain(null,!0,!0,!1,a)),e.updateTargets(e.data.targets),e.redraw({flow:{index:h.index,length:o,duration:(0,u.isValue)(t.duration)?t.duration:e.config.transition_duration,done:t.done,orgDataCount:i},withLegend:!0,withTransition:i>1,withTrimXDomain:!1,withUpdateXAxis:!0})}}),(0,u.extend)(s.default.prototype,{generateFlow:function(t){var e=this,n=e.config;return function(){var r=t.targets,a=t.flow,o=t.drawBar,s=t.drawLine,c=t.drawArea,f=t.cx,d=t.cy,h=t.xv,p=t.xForText,g=t.yForText,v=t.duration,x=void 0,_=1,m=a.index,y=a.length,b=e.getValueOnIndex(e.data.targets[0].values,m),w=e.getValueOnIndex(e.data.targets[0].values,m+y),T=e.x.domain(),A=a.duration||v,M=a.done||function(){},S=e.generateWait(),C=e.xgrid||(0,i.selectAll)([]),k=e.xgridLines||(0,i.selectAll)([]),R=e.mainRegion||(0,i.selectAll)([]),L=e.mainText||(0,i.selectAll)([]),E=e.mainBar||(0,i.selectAll)([]),D=e.mainLine||(0,i.selectAll)([]),I=e.mainArea||(0,i.selectAll)([]),F=e.mainCircle||(0,i.selectAll)([]);e.flowing=!0,e.data.targets.forEach(function(t){t.values.splice(0,y)});var N=e.updateXDomain(r,!0,!0);e.updateXGrid&&e.updateXGrid(!0),a.orgDataCount?x=1===a.orgDataCount||(b&&b.x)===(w&&w.x)?e.x(T[0])-e.x(N[0]):e.isTimeSeries()?e.x(T[0])-e.x(N[0]):e.x(b.x)-e.x(w.x):1===e.data.targets[0].values.length?e.isTimeSeries()?(b=e.getValueOnIndex(e.data.targets[0].values,0),w=e.getValueOnIndex(e.data.targets[0].values,e.data.targets[0].values.length-1),x=e.x(b.x)-e.x(w.x)):x=(0,u.diffDomain)(N)/2:x=e.x(T[0])-e.x(N[0]),_=(0,u.diffDomain)(T)/(0,u.diffDomain)(N);var P="translate("+x+",0) scale("+_+",1)";e.hideXGridFocus();var z=(0,i.transition)().ease(i.easeLinear).duration(A);S.add([e.axes.x.transition(z).call(e.xAxis.setTransition(z)),E.transition(z).attr("transform",P),D.transition(z).attr("transform",P),I.transition(z).attr("transform",P),F.transition(z).attr("transform",P),L.transition(z).attr("transform",P),R.filter(e.isRegionOnX).transition(z).attr("transform",P),C.transition(z).attr("transform",P),k.transition(z).attr("transform",P)]),z.call(S,function(){var t=void 0,i=[],r=[],a=[];if(y){for(t=0;t=0&&(e=!0)}),!e)}),n.regions},(0,s.extend)(r.default.prototype,{regions:u})},function(t,e,n){"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}var i=n(2),r=n(4),a=_interopRequireDefault(r),o=n(0),s=n(3),u=_interopRequireDefault(s);(0,o.extend)(a.default.prototype,{selected:function(t){var e=this.internal,n=[];return e.main.selectAll("."+(u.default.shapes+e.getTargetSelectorSuffix(t))).selectAll("."+u.default.shape).filter(function(){return(0,i.select)(this).classed(u.default.SELECTED)}).each(function(t){return n.push(t)}),n},select:function(t,e,n){var r=this.internal,a=r.config;a.data_selection_enabled&&r.main.selectAll("."+u.default.shapes).selectAll("."+u.default.shape).each(function(s,c){var l=(0,i.select)(this),f=s.data?s.data.id:s.id,d=r.getToggle(this,s).bind(r),h=a.data_selection_grouped||!t||t.indexOf(f)>=0,p=!e||e.indexOf(c)>=0,g=l.classed(u.default.SELECTED);l.classed(u.default.line)||l.classed(u.default.area)||(h&&p?a.data_selection_isselectable(s)&&!g&&d(!0,l.classed(u.default.SELECTED,!0),s,c):(0,o.isDefined)(n)&&n&&g&&d(!1,l.classed(u.default.SELECTED,!1),s,c))})},unselect:function(t,e){var n=this.internal,r=n.config;r.data_selection_enabled&&n.main.selectAll("."+u.default.shapes).selectAll("."+u.default.shape).each(function(a,o){var s=(0,i.select)(this),c=a.data?a.data.id:a.id,l=n.getToggle(this,a).bind(n),f=r.data_selection_grouped||!t||t.indexOf(c)>=0,d=!e||e.indexOf(o)>=0,h=s.classed(u.default.SELECTED);s.classed(u.default.line)||s.classed(u.default.area)||f&&d&&r.data_selection_isselectable(a)&&h&&l(!1,s.classed(u.default.SELECTED,!1),a,o)})}})},function(t,e,n){"use strict";var i=n(4),r=function(t){return t&&t.__esModule?t:{"default":t}}(i);(0,n(0).extend)(r.default.prototype,{show:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=this.internal,i=n.mapToTargetIds(t);n.removeHiddenTargetIds(i);var r=n.svg.selectAll(n.selectorTargets(i));r.transition().style("opacity","1","important").call(n.endall,function(){r.style("opacity",null).style("opacity","1")}),e.withLegend&&n.showLegend(i),n.redraw({withUpdateOrgXDomain:!0,withUpdateXDomain:!0,withLegend:!0})},hide:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=this.internal,i=n.mapToTargetIds(t);n.addHiddenTargetIds(i);var r=n.svg.selectAll(n.selectorTargets(i));r.transition().style("opacity","0","important").call(n.endall,function(){r.style("opacity",null).style("opacity","0")}),e.withLegend&&n.hideLegend(i),n.redraw({withUpdateOrgXDomain:!0,withUpdateXDomain:!0,withLegend:!0})},toggle:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=this,i=this.internal;i.mapToTargetIds(t).forEach(function(t){i.isTargetToShow(t)?n.hide(t,e):n.show(t,e)})}})},function(t,e,n){"use strict";var i=n(4),r=function(t){return t&&t.__esModule?t:{"default":t}}(i),a=n(0),o=function(){};o.show=function(t){var e=this.internal,n=void 0,i=void 0;t.mouse&&(i=t.mouse),t.data?e.isMultipleX()?(i=[e.x(t.data.x),e.getYScale(t.data.id)(t.data.value)],n=null):n=(0,a.isValue)(t.data.index)?t.data.index:e.getIndexByX(t.data.x):void 0===t.x?void 0!==t.index&&(n=t.index):n=e.getIndexByX(t.x),e.dispatchEvent("mouseover",n,i),e.dispatchEvent("mousemove",n,i),e.config.tooltip_onshow.call(e,t.data)},o.hide=function(){this.internal.dispatchEvent("mouseout",0),this.internal.config.tooltip_onhide.call(this)},(0,a.extend)(r.default.prototype,{tooltip:o})},function(t,e,n){"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}var i=n(4),r=_interopRequireDefault(i),a=n(1),o=_interopRequireDefault(a),s=n(0);(0,s.extend)(r.default.prototype,{transform:function(t,e){var n=this.internal,i=["pie","donut"].indexOf(t)>=0?{withTransform:!0}:null;n.transformTo(e,t,i)}}),(0,s.extend)(o.default.prototype,{transformTo:function(t,e,n){var i=this,r=!i.hasArcType(),a=n||{withTransitionForAxis:r};a.withTransitionForTransform=!1,i.transiting=!1,i.setTargetType(t,e),i.updateTargets(i.data.targets),i.updateAndRedraw(a)}})},function(t,e,n){"use strict";var i=n(4),r=function(t){return t&&t.__esModule?t:{"default":t}}(i);(0,n(0).extend)(r.default.prototype,{x:function(t){var e=this.internal;return arguments.length&&(e.updateTargetX(e.data.targets,t),e.redraw({withUpdateOrgXDomain:!0,withUpdateXDomain:!0})),e.data.xs},xs:function(t){var e=this.internal;return arguments.length&&(e.updateTargetXs(e.data.targets,t),e.redraw({withUpdateOrgXDomain:!0,withUpdateXDomain:!0})),e.data.xs}})},function(t,e,n){"use strict";var i=n(2),r=n(4),a=function(t){return t&&t.__esModule?t:{"default":t}}(r),o=n(0),s=function(t){var e=this.internal,n=t,r=void 0;if(n){if(e.isTimeSeries()&&(n=n.map(function(t){return e.parseDate(t)})),e.config.subchart_show){var a=e.zoomScale||e.x;e.brush.getSelection().call(e.brush.move,[a(n[0]),a(n[1])]),r=n}else{var o=e.x.orgDomain(),s=(o[1]-o[0])/(n[1]-n[0]),u=e.isTimeSeries()?0-s*e.x(n[0].getTime()):n[0]-s*e.x(n[0]);e.zoom.updateTransformScale(i.zoomIdentity.translate(u,0).scale(s)),r=e.zoomScale.domain()}e.redraw({withTransition:!0,withY:e.config.zoom_rescale}),e.config.zoom_onzoom.call(this,e.x.orgDomain())}else r=(e.zoomScale||e.x).domain();return r};s.enable=function(t){var e=this.internal;e.config.zoom_enabled=t,e.updateAndRedraw()},s.max=function(t){var e=this.internal,n=e.config;if(0!==t&&!t)return n.zoom_x_max;n.zoom_x_max=(0,i.max)([e.orgXDomain[1],t])},s.min=function(t){var e=this.internal,n=e.config;if(0!==t&&!t)return n.zoom_x_min;n.zoom_x_min=(0,i.min)([e.orgXDomain[0],t])},s.range=function(t){if(!arguments.length)return{max:this.domain.max(),min:this.domain.min()};(0,o.isDefined)(t.max)&&this.domain.max(t.max),(0,o.isDefined)(t.min)&&this.domain.min(t.min)},(0,o.extend)(a.default.prototype,{zoom:s,unzoom:function(){var t=this.internal;t.config.subchart_show?t.brush.getSelection().call(t.brush.move,null):t.zoom.updateTransformScale(i.zoomIdentity),t.redraw({withTransition:!0,withY:t.config.zoom_rescale})}})},function(t,e,n){"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}var i=n(5),r=_interopRequireDefault(i),a=n(58),o=_interopRequireDefault(a),s=n(1),u=_interopRequireDefault(s),c=n(0);(0,c.extend)(u.default.prototype,{getOptions:function(){var t=new o.default;return(0,c.merge)(t.value,this.additionalConfig)},additionalConfig:{},loadConfig:function(t){function find(){var t=i.shift();return t&&n&&"object"===(void 0===n?"undefined":(0,r.default)(n))&&t in n?(n=n[t],find()):t?void 0:n}var e=this.config,n=void 0,i=void 0,a=void 0;Object.keys(e).forEach(function(r){n=t,i=r.split("_"),a=find(),(0,c.isDefined)(a)&&(e[r]=a)})}})},function(t,e,n){"use strict";var i=n(2),r=n(1),a=function(t){return t&&t.__esModule?t:{"default":t}}(r),o=n(0);(0,o.extend)(a.default.prototype,{convertUrlToData:function(t){var e=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"csv",r=arguments[2],a=arguments[3],o=arguments[4],s=n,u=(0,i.request)(t);if(r)for(var c=Object.keys(r),l=Array.isArray(c),f=0,c=l?c:c[Symbol.iterator]();;){var d;if(l){if(f>=c.length)break;d=c[f++]}else{if(f=c.next(),f.done)break;d=f.value}var h=d;u.header(h,r[h])}u.get(function(t,n){var i=void 0;if(!n)throw new Error(t.responseURL+" "+t.status+" ("+t.statusText+")");var r=n.response||n.responseText;i="json"===s?e.convertJsonToData(JSON.parse(r),a):"tsv"===s?e.convertTsvToData(r):e.convertCsvToData(r),o.call(e,i)})},convertCsvToData:function(t){var e=(0,i.csvParseRows)(t),n=void 0;return 1===e.length?(n=[{}],e[0].forEach(function(t){n[0][t]=null})):n=(0,i.csvParse)(t),n},convertTsvToData:function(t){var e=(0,i.tsvParseRows)(t),n=void 0;return 1===e.length?(n=[{}],e[0].forEach(function(t){n[0][t]=null})):n=(0,i.tsvParse)(t),n},convertJsonToData:function(t,e){var n=this,i=[],r=void 0,a=void 0;return e?(e.x?(r=e.value.concat(e.x),this.config.data_x=e.x):r=e.value,i.push(r),t.forEach(function(t){for(var e=[],a=void 0,s=r,u=Array.isArray(s),c=0,s=u?s:s[Symbol.iterator]();;){var l;if(u){if(c>=s.length)break;l=s[c++]}else{if(c=s.next(),c.done)break;l=c.value}var f=l;a=n.findValueInJson(t,f),(0,o.isUndefined)(a)&&(a=null),e.push(a)}i.push(e)}),a=this.convertRowsToData(i)):(Object.keys(t).forEach(function(e){return i.push([e].concat(t[e]))}),a=this.convertColumnsToData(i)),a},findValueInJson:function(t,e){for(var n=e.replace(/\[(\w+)\]/g,".$1"),i=n.replace(/^\./,"").split("."),r=t,a=i,o=Array.isArray(a),s=0,a=o?a:a[Symbol.iterator]();;){var u;if(o){if(s>=a.length)break;u=a[s++]}else{if(s=a.next(),s.done)break;u=s.value}var c=u;if(!(c in r)){r=void 0;break}r=r[c]}return r},convertRowsToData:function(t){var e=t[0],n=[],i={},r=void 0,a=void 0;for(r=1;r=0?n.data.xs[i]=(e&&r.data.xs[i]?r.data.xs[i]:[]).concat(t.map(function(t){return t[s]}).filter(o.isValue).map(function(t,e){return r.generateTargetX(t,i,e)})):a.data_x?n.data.xs[i]=n.getOtherTargetXs():(0,o.notEmpty)(a.data_xs)&&(r.data.xs[i]=r.getXValuesOfXKey(s,r.data.targets)):r.data.xs[i]=t.map(function(t,e){return e})}),s.forEach(function(t){if(!r.data.xs[t])throw new Error('x is not defined for id = "'+t+'".')});var c=s.map(function(e,n){var i=a.data_idConverter(e);return{id:i,id_org:e,values:t.map(function(t,s){var u=r.getXKey(e),c=t[u],l=null===t[e]||isNaN(t[e])?null:+t[e],f=void 0;return r.isCustomX()&&r.isCategorized()&&0===n&&!(0,o.isUndefined)(c)?(0===n&&0===s&&(a.axis_x_categories=[]),-1===(f=a.axis_x_categories.indexOf(c))&&(f=a.axis_x_categories.length,a.axis_x_categories.push(c))):f=r.generateTargetX(c,e,s),((0,o.isUndefined)(t[e])||r.data.xs[e].length<=s)&&(f=void 0),{x:f,value:l,id:i}}).filter(function(t){return(0,o.isDefined)(t.x)})}});return c.forEach(function(t){var e=void 0;a.data_xSort&&(t.values=t.values.sort(function(t,e){return(t.x||0===t.x?t.x:1/0)-(e.x||0===e.x?e.x:1/0)})),e=0,t.values.forEach(function(t){t.index=e++}),r.data.xs[t.id].sort(function(t,e){return t-e})}),r.hasNegativeValue=r.hasNegativeValueInTargets(c),r.hasPositiveValue=r.hasPositiveValueInTargets(c),a.data_type&&r.setTargetType(r.mapToIds(c).filter(function(t){return!(t in a.data_types)}),a.data_type),c.forEach(function(t){r.addCache(t.id_org,t)}),c}})},function(t,e,n){"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}var i=n(5),r=_interopRequireDefault(i),a=n(2),o=n(3),s=_interopRequireDefault(o),u=n(1),c=_interopRequireDefault(u),l=n(0);(0,l.extend)(c.default.prototype,{isX:function(t){var e=this,n=e.config,i=n.data_x&&t===n.data_x,r=(0,l.notEmpty)(n.data_xs)&&(0,l.hasValue)(n.data_xs,t);return i||r},isNotX:function(t){return!this.isX(t)},getXKey:function(t){var e=this,n=e.config;return n.data_x?n.data_x:(0,l.notEmpty)(n.data_xs)?n.data_xs[t]:null},getXValuesOfXKey:function(t,e){var n=this,i=e&&(0,l.notEmpty)(e)?n.mapToIds(e):[],r=void 0;return i.forEach(function(e){n.getXKey(e)===t&&(r=n.data.xs[e])}),r},getIndexByX:function(t){var e=this,n=e.filterByX(e.data.targets,t);return n.length?n[0].index:null},getXValue:function(t,e){var n=this;return t in n.data.xs&&n.data.xs[t]&&(0,l.isValue)(n.data.xs[t][e])?n.data.xs[t][e]:e},getOtherTargetXs:function(){var t=this,e=Object.keys(t.data.xs);return e.length?t.data.xs[e[0]]:null},getOtherTargetX:function(t){var e=this.getOtherTargetXs();return e&&t1},isMultipleX:function(){return(0,l.notEmpty)(this.config.data_xs)||!this.config.data_xSort||this.hasType("scatter")},addName:function(t){var e=this,n=void 0;return t&&(n=e.config.data_names[t.id],t.name=void 0===n?t.id:n),t},getValueOnIndex:function(t,e){var n=t.filter(function(t){return t.index===e});return n.length?n[0]:null},updateTargetX:function(t,e){var n=this;t.forEach(function(t){t.values.forEach(function(i,r){i.x=n.generateTargetX(e[r],t.id,r)}),n.data.xs[t.id]=e})},updateTargetXs:function(t,e){var n=this;t.forEach(function(t){e[t.id]&&n.updateTargetX([t],e[t.id])})},generateTargetX:function(t,e,n){var i=this;return i.isTimeSeries()?t?i.parseDate(t):i.parseDate(i.getXValue(e,n)):i.isCustomX()&&!i.isCategorized()?(0,l.isValue)(t)?+t:i.getXValue(e,n):n},cloneTarget:function(t){return{id:t.id,id_org:t.id_org,values:t.values.map(function(t){return{x:t.x,value:t.value,id:t.id}})}},updateXs:function(){var t=this;t.data.targets.length&&(t.xs=[],t.data.targets[0].values.forEach(function(e){t.xs[e.index]=e.x}))},getPrevX:function(t){var e=this.xs[t-1];return void 0===e?null:e},getNextX:function(t){var e=this.xs[t+1];return void 0===e?null:e},getMaxDataCount:function(){var t=this;return(0,a.max)(t.data.targets,function(t){return t.values.length})},getMaxDataCountTarget:function(t){var e=t.length,n=0,i=void 0;return e>1?t.forEach(function(t){t.values.length>n&&(i=t,n=t.values.length)}):i=e?t[0]:null,i},getEdgeX:function(t){return t.length?[(0,a.min)(t,function(t){return t.values[0].x}),(0,a.max)(t,function(t){return t.values[t.values.length-1].x})]:[0,0]},mapToIds:function(t){return t.map(function(t){return t.id})},mapToTargetIds:function(t){var e=this;return t?[].concat(t):e.mapToIds(e.data.targets)},hasTarget:function(t,e){var n=this.mapToIds(t),i=void 0;for(i=0;ie?1:t>=e?0:NaN})},addHiddenTargetIds:function(t){this.hiddenTargetIds=this.hiddenTargetIds.concat(t)},removeHiddenTargetIds:function(t){this.hiddenTargetIds=this.hiddenTargetIds.filter(function(e){return t.indexOf(e)<0})},addHiddenLegendIds:function(t){this.hiddenLegendIds=this.hiddenLegendIds.concat(t)},removeHiddenLegendIds:function(t){this.hiddenLegendIds=this.hiddenLegendIds.filter(function(e){return t.indexOf(e)<0})},getValuesAsIdKeyed:function(t){var e={};return t.forEach(function(t){e[t.id]=[],t.values.forEach(function(n){e[t.id].push(n.value)})}),e},checkValueInTargets:function(t,e){var n=Object.keys(t),i=void 0,r=void 0,a=void 0;for(i=0;i0})},isOrderDesc:function(){var t=this.config;return"string"==typeof t.data_order&&"desc"===t.data_order.toLowerCase()},isOrderAsc:function(){var t=this.config;return"string"==typeof t.data_order&&"asc"===t.data_order.toLowerCase()},orderTargets:function(t){var e=this,n=e.config,i=e.isOrderAsc(),r=e.isOrderDesc();return i||r?t.sort(function(t,e){var n=function(t,e){return t+Math.abs(e.value)},r=t.values.reduce(n,0),a=e.values.reduce(n,0);return i?a-r:r-a}):(0,l.isFunction)(n.data_order)&&t.sort(n.data_order),t},filterByX:function(t,e){return(0,a.merge)(t.map(function(t){return t.values})).filter(function(t){return t.x-e==0})},filterRemoveNull:function(t){return t.filter(function(t){return(0,l.isValue)(t.value)})},filterByXDomain:function(t,e){return t.map(function(t){return{id:t.id,id_org:t.id_org,values:t.values.filter(function(t){return e[0]<=t.x&&t.x<=e[1]})}})},hasDataLabel:function(){var t=this.config;return!("boolean"!=typeof t.data_labels||!t.data_labels)||"object"===(0,r.default)(t.data_labels)&&(0,l.notEmpty)(t.data_labels)},getDataLabelLength:function(t,e,n){var i=this,r=[0,0];return i.selectChart.select("svg").selectAll(".dummy").data([t,e]).enter().append("text").text(function(t){return i.dataLabelFormat(t.id)(t)}).each(function(t,e){r[e]=1.3*this.getBoundingClientRect()[n]}).remove(),r},isNoneArc:function(t){return this.hasTarget(this.data.targets,t.id)},isArc:function(t){return"data"in t&&this.hasTarget(this.data.targets,t.data.id)},findSameXOfValues:function(t,e){var n=t[e].x,i=[],r=void 0;for(r=e-1;r>=0&&n===t[r].x;r--)i.push(t[r]);for(r=e;r0;n--)e[n]=e[n-1];return e[0]={x:e[0].x-1,value:e[0].value,id:e[0].id},e[t.length+1]={x:e[t.length].x+1,value:e[t.length].value,id:e[t.length].id},e},updateDataAttributes:function(t,e){var n=this,i=n.config,r=i["data_"+t];return void 0===e?r:(Object.keys(e).forEach(function(t){r[t]=e[t]}),n.redraw({withLegend:!0}),r)}})},function(t,e,n){"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}var i=n(3),r=_interopRequireDefault(i),a=n(1),o=_interopRequireDefault(a);(0,n(0).extend)(o.default.prototype,{load:function(t,e){var n=this,i=t;i&&(e.filter&&(i=i.filter(e.filter)),(e.type||e.types)&&i.forEach(function(t){var i=e.types&&e.types[t.id]?e.types[t.id]:e.type;n.setTargetType(t.id,i)}),n.data.targets.forEach(function(t){for(var e=0;e.375?1.175-36/e.radius:.8)*e.radius/s:0),l="translate("+a*c+","+o*c+")"),l},getArcRatio:function(t){var e=this,n=e.config,i=Math.PI*(e.hasType("gauge")&&!n.gauge_fullCircle?1:2);return t?(t.endAngle-t.startAngle)/i:null},convertToArcData:function(t){return this.addName({id:t.data.id,value:t.value,ratio:this.getArcRatio(t),index:t.index})},textForArcLabel:function(t){var e=this;if(!e.shouldShowArcLabel())return"";var n=e.updateAngle(t),i=n?n.value:null,r=e.getArcRatio(n),a=t.data.id;if(!e.hasType("gauge")&&!e.meetsArcLabelThreshold(r))return"";var o=e.getArcLabelFormat();return o?o(i,r,a):e.defaultArcValueFormat(i,r)},textForGaugeMinMax:function(t,e){var n=this.getGaugeLabelExtents();return n?n(t,e):t},expandArc:function(t){var e=this,n=void 0;if(e.transiting)return void(n=window.setInterval(function(){e.transiting||(window.clearInterval(n),e.legend.selectAll(".bb-legend-item-focused").size()>0&&e.expandArc(t))},10));var r=e.mapToTargetIds(t);e.svg.selectAll(e.selectorTargets(r,"."+s.default.chartArc)).each(function(t){e.shouldExpand(t.data.id)&&(0,i.select)(this).selectAll("path").transition().duration(e.expandDuration(t.data.id)).attr("d",e.svgArcExpanded).transition().duration(2*e.expandDuration(t.data.id)).attr("d",e.svgArcExpandedSub).each(function(t){e.isDonutType(t.data)})})},unexpandArc:function(t){var e=this;if(!e.transiting){var n=e.mapToTargetIds(t);e.svg.selectAll(e.selectorTargets(n,"."+s.default.chartArc)).selectAll("path").transition().duration(function(t){return e.expandDuration(t.data.id)}).attr("d",e.svgArc),e.svg.selectAll(""+s.default.arc).style("opacity","1")}},expandDuration:function(t){var e=this,n=e.config;return e.isDonutType(t)?n.donut_expand_duration:e.isGaugeType(t)?n.gauge_expand_duration:e.isPieType(t)?n.pie_expand_duration:50},shouldExpand:function(t){var e=this,n=e.config;return e.isDonutType(t)&&n.donut_expand||e.isGaugeType(t)&&n.gauge_expand||e.isPieType(t)&&n.pie_expand},shouldShowArcLabel:function(){var t=this,e=t.config,n=!0;return t.hasType("donut")?n=e.donut_label_show:t.hasType("pie")&&(n=e.pie_label_show),n},meetsArcLabelThreshold:function(t){var e=this,n=e.config;return t>=(e.hasType("donut")?n.donut_label_threshold:n.pie_label_threshold)},getArcLabelFormat:function(){var t=this,e=t.config,n=e.pie_label_format;return t.hasType("gauge")?n=e.gauge_label_format:t.hasType("donut")&&(n=e.donut_label_format),n},getGaugeLabelExtents:function(){return this.config.gauge_label_extents},getArcTitle:function(){var t=this;return t.hasType("donut")?t.config.donut_title:""},updateTargetsForArc:function(t){var e=this,n=e.main,i=e.classChartArc.bind(e),r=e.classArcs.bind(e),a=e.classFocus.bind(e),o=n.select("."+s.default.chartArcs).selectAll("."+s.default.chartArc).data(e.pie(t)).attr("class",function(t){return i(t)+a(t.data)}),u=o.enter().append("g").attr("class",i);u.append("g").attr("class",r).merge(o),u.append("text").attr("dy",e.hasType("gauge")?"-.1em":".35em").style("opacity","0").style("text-anchor","middle").style("pointer-events","none")},initArc:function(){var t=this;t.arcs=t.main.select("."+s.default.chart).append("g").attr("class",s.default.chartArcs).attr("transform",t.getTranslate("arc")),t.arcs.append("text").attr("class",s.default.chartArcsTitle).style("text-anchor","middle").text(t.getArcTitle())},redrawArc:function(t,e,n){function selectArc(t,e,n){r.expandArc(n),r.api.focus(n),r.toggleFocusLegend(n,!0),r.showTooltip([e],t)}function unselectArc(t){var e=t&&t.id||void 0;r.unexpandArc(e),r.api.revert(),r.revertLegend(),r.hideTooltip()}var r=this,a=r.config,o=r.main,u="touch"===r.inputType,c="mouse"===r.inputType,l=o.selectAll("."+s.default.arcs).selectAll("."+s.default.arc).data(r.arcData.bind(r));if(l.exit().transition().duration(e).style("opacity","0").remove(),l=l.enter().append("path").attr("class",r.classArc.bind(r)).style("fill",function(t){return r.color(t.data)}).style("cursor",function(t){return a.interaction_enabled&&(a.data_selection_isselectable(t)?"pointer":null)}).style("opacity","0").each(function(t){r.isGaugeType(t.data)&&(t.startAngle=a.gauge_startingAngle,t.endAngle=a.gauge_startingAngle),this._current=t}).merge(l),l.attr("transform",function(t){return!r.isGaugeType(t.data)&&n?"scale(0)":""}).style("opacity",function(t){return t===this._current?"0":"1"}).on(c?"mouseover":void 0,a.interaction_enabled?function(t){if(!r.transiting){var e=r.updateAngle(t),n=e?r.convertToArcData(e):null;selectArc(this,n,n&&n.id||void 0),r.config.data_onover(n,this)}}:null).on(c?"mouseout":void 0,a.interaction_enabled?function(t){if(!r.transiting){var e=r.updateAngle(t),n=e?r.convertToArcData(e):null;unselectArc(),r.config.data_onout(n,this)}}:null).on(c?"mousemove":void 0,a.interaction_enabled?function(t){var e=r.updateAngle(t),n=e?r.convertToArcData(e):null;r.showTooltip([n],this)}:null).on(c?"click":void 0,a.interaction_enabled?function(t,e){var n=r.updateAngle(t),i=void 0;n&&(i=r.convertToArcData(n),r.toggleShape&&r.toggleShape(this,i,e),r.config.data_onclick.call(r.api,i,this))}:null).each(function(){r.transiting=!0}).transition().duration(t).attrTween("d",function(t){var e=r.updateAngle(t);if(!e)return function(){return"M 0 0"};isNaN(this._current.startAngle)&&(this._current.startAngle=0),isNaN(this._current.endAngle)&&(this._current.endAngle=this._current.startAngle);var n=(0,i.interpolate)(this._current,e);return this._current=n(0),function(e){var i=n(e);return i.data=t.data,r.getArc(i,!0)}}).attr("transform",n?"scale(1)":"").style("fill",function(t){return r.levelColor?r.levelColor(t.data.values[0].value):r.color(t.data.id)}).style("opacity","1").call(r.endall,function(){r.transiting=!1}),u&&a.interaction_enabled&&r.hasArcType()){var f=function(){var t=i.event.changedTouches[0];return(0,i.select)(document.elementFromPoint(t.clientX,t.clientY))};r.svg.on("touchstart",function(){if(!r.transiting){var t=f(),e=t.datum(),n=e&&e.data&&e.data.id?r.updateAngle(e):null,i=n?r.convertToArcData(n):null,a=i&&i.id||void 0;void 0===a?unselectArc():selectArc(this,i,a),r.config.data_onover(i,this)}}).on("touchend",function(){if(!r.transiting){var t=f(),e=t.datum(),n=e&&e.data&&e.data.id?r.updateAngle(e):null,i=n?r.convertToArcData(n):null,a=i&&i.id||void 0;void 0===a?unselectArc():selectArc(this,i,a),r.config.data_onout(i,this)}}).on("touchmove",function(){var t=f(),e=t.datum(),n=e&&e.data&&e.data.id?r.updateAngle(e):null,i=n?r.convertToArcData(n):null,a=i&&i.id||void 0;void 0===a?unselectArc():selectArc(this,i,a)})}o.selectAll("."+s.default.chartArc).select("text").style("opacity","0").attr("class",function(t){return r.isGaugeType(t.data)?s.default.gaugeValue:""}).text(r.textForArcLabel.bind(r)).attr("transform",r.transformForArcLabel.bind(r)).style("font-size",function(t){return r.isGaugeType(t.data)?Math.round(r.radius/5)+"px":""}).transition().duration(t).style("opacity",function(t){return r.isTargetToShow(t.data.id)&&r.isArcType(t.data)?"1":"0"}),o.select("."+s.default.chartArcsTitle).style("opacity",r.hasType("donut")||r.hasType("gauge")?"1":"0"),r.hasType("gauge")&&(r.arcs.select("."+s.default.chartArcsBackground).attr("d",function(){var t={data:[{value:a.gauge_max}],startAngle:a.gauge_startingAngle,endAngle:-1*a.gauge_startingAngle};return r.getArc(t,!0,!0)}),r.arcs.select("."+s.default.chartArcsGaugeUnit).attr("dy",".75em").text(a.gauge_label_show?a.gauge_units:""),r.arcs.select("."+s.default.chartArcsGaugeMin).attr("dx",-1*(r.innerRadius+(r.radius-r.innerRadius)/(a.gauge_fullCircle?1:2))+"px").attr("dy","1.2em").text(a.gauge_label_show?r.textForGaugeMinMax(a.gauge_min,!1):""),r.arcs.select("."+s.default.chartArcsGaugeMax).attr("dx",r.innerRadius+(r.radius-r.innerRadius)/(a.gauge_fullCircle?1:2)+"px").attr("dy","1.2em").text(a.gauge_label_show?r.textForGaugeMinMax(a.gauge_max,!0):""))},initGauge:function(){var t=this.arcs;this.hasType("gauge")&&(t.append("path").attr("class",s.default.chartArcsBackground),t.append("text").attr("class",s.default.chartArcsGaugeUnit).style("text-anchor","middle").style("pointer-events","none"),t.append("text").attr("class",s.default.chartArcsGaugeMin).style("text-anchor","middle").style("pointer-events","none"),t.append("text").attr("class",s.default.chartArcsGaugeMax).style("text-anchor","middle").style("pointer-events","none"))},getGaugeLabelHeight:function(){return this.config.gauge_label_show?20:0}})},function(t,e,n){"use strict";var i=n(1),r=function(t){return t&&t.__esModule?t:{"default":t}}(i);(0,n(0).extend)(r.default.prototype,{hasCaches:function(t){for(var e=0;e=0?o.default.focused:"")},classDefocused:function(t){return" "+(this.defocusedTargetIds.indexOf(t.id)>=0?o.default.defocused:"")},classChartText:function(t){return o.default.chartText+this.classTarget(t.id)},classChartLine:function(t){return o.default.chartLine+this.classTarget(t.id)},classChartBar:function(t){return o.default.chartBar+this.classTarget(t.id)},classChartArc:function(t){return o.default.chartArc+this.classTarget(t.data.id)},getTargetSelectorSuffix:function(t){return t||0===t?("-"+t).replace(/[\s?!@#$%^&*()_=+,.<>'":;\[\]\/|~`{}\\]/g,"-"):""},selectorTarget:function(t,e){return(e||"")+"."+(o.default.target+this.getTargetSelectorSuffix(t))},selectorTargets:function(t,e){var n=this,i=t||[];return i.length?i.map(function(t){return n.selectorTarget(t,e)}):null},selectorLegend:function(t){return"."+(o.default.legendItem+this.getTargetSelectorSuffix(t))},selectorLegends:function(t){var e=this;return t&&t.length?t.map(function(t){return e.selectorLegend(t)}):null}})},function(t,e,n){"use strict";var i=n(1),r=function(t){return t&&t.__esModule?t:{"default":t}}(i);(0,n(0).extend)(r.default.prototype,{getClipPath:function(t){return"url("+(window.navigator.appVersion.toLowerCase().indexOf("msie 9.")>=0?"":document.URL.split("#")[0])+"#"+t+")"},appendClip:function(t,e){return t.append("clipPath").attr("id",e).append("rect")},getAxisClipX:function(t){var e=Math.max(30,this.margin.left);return t?-(1+e):-(e-1)},getAxisClipY:function(t){return t?-20:-this.margin.top},getXAxisClipX:function(){var t=this;return t.getAxisClipX(!t.config.axis_rotated)},getXAxisClipY:function(){var t=this;return t.getAxisClipY(!t.config.axis_rotated)},getYAxisClipX:function(){var t=this;return t.config.axis_y_inner?-1:t.getAxisClipX(t.config.axis_rotated)},getYAxisClipY:function(){var t=this;return t.getAxisClipY(t.config.axis_rotated)},getAxisClipWidth:function(t){var e=this,n=Math.max(30,e.margin.left),i=Math.max(30,e.margin.right);return t?e.width+2+n+i:e.margin.left+20},getAxisClipHeight:function(t){return(t?this.margin.bottom:this.margin.top+this.height)+20},getXAxisClipWidth:function(){var t=this;return t.getAxisClipWidth(!t.config.axis_rotated)},getXAxisClipHeight:function(){var t=this;return t.getAxisClipHeight(!t.config.axis_rotated)},getYAxisClipWidth:function(){var t=this;return t.getAxisClipWidth(t.config.axis_rotated)+(t.config.axis_y_inner?20:0)},getYAxisClipHeight:function(){var t=this;return t.getAxisClipHeight(t.config.axis_rotated)}})},function(t,e,n){"use strict";var i=n(2),r=n(1),a=function(t){return t&&t.__esModule?t:{"default":t}}(r),o=n(0);(0,o.extend)(a.default.prototype,{generateColor:function(){var t=this,e=t.config,n=e.data_colors,r=e.data_color,a=[],s=(0,o.notEmpty)(e.color_pattern)?e.color_pattern:(0,i.scaleOrdinal)(i.schemeCategory10).range();return function(t){var e=t.id||t.data&&t.data.id||t,i=void 0;return n[e]instanceof Function?i=n[e](t):n[e]?i=n[e]:(a.indexOf(e)<0&&a.push(e),i=s[a.indexOf(e)%s.length],n[e]=i),r instanceof Function?r(i,t):i}},generateLevelColor:function(){var t=this,e=t.config,n=e.color_pattern,i=e.color_threshold,r="value"===i.unit,a=i.max||100,s=i.values&&i.values.length?i.values:[];return(0,o.notEmpty)(i)?function(t){for(var e=n[n.length-1],i=0;i0)for(f=e.hasNegativeValueInTargets(t),o=0;o=0}),0!==c.length)for(u=c[0],f&&r[u]&&r[u].forEach(function(t,e){r[u][e]=t<0?t:0}),s=1;s0)&&(r[u][n]+=+t)});return(0,a.min)(Object.keys(r).map(function(t){return(0,a.min)(r[t])}))},getYDomainMax:function(t){var e=this,n=e.config,i=e.mapToIds(t),r=e.getValuesAsIdKeyed(t),o=void 0,s=void 0,u=void 0,c=void 0,l=void 0,f=void 0;if(n.data_groups.length>0)for(f=e.hasPositiveValueInTargets(t),o=0;o=0}),0!==c.length)for(u=c[0],f&&r[u]&&r[u].forEach(function(t,e){r[u][e]=t>0?t:0}),s=1;s=0&&f>=0,m=l<=0&&f<=0;((0,u.isValue)(s)&&_||(0,u.isValue)(c)&&m)&&(h=!1),h&&(_&&(l=0),m&&(f=0));var y=Math.abs(f-l),b=.1*y,w=.1*y;if(void 0!==d){var T=Math.max(Math.abs(l),Math.abs(f));f=d+T,l=d-T}if(g){x=i.getDataLabelLength(l,f,"width");var A=(0,u.diffDomain)(i.y.range()),M=[x[0]/A,x[1]/A];b+=y*(M[1]/(1-M[0]-M[1])),w+=y*(M[0]/(1-M[0]-M[1]))}else v&&(x=i.getDataLabelLength(l,f,"height"),b+=i.axis.convertPixelsToAxisPadding(x[1],y),w+=i.axis.convertPixelsToAxisPadding(x[0],y));"y"===e&&(0,u.notEmpty)(r.axis_y_padding)&&(b=i.axis.getPadding(r.axis_y_padding,"top",b,y),w=i.axis.getPadding(r.axis_y_padding,"bottom",w,y)),"y2"===e&&(0,u.notEmpty)(r.axis_y2_padding)&&(b=i.axis.getPadding(r.axis_y2_padding,"top",b,y),w=i.axis.getPadding(r.axis_y2_padding,"bottom",w,y)),h&&(_&&(w=l),m&&(b=-f));var S=[l-w,f+b];return p?S.reverse():S},getXDomainMin:function(t){var e=this,n=e.config;return(0,u.isDefined)(n.axis_x_min)?e.isTimeSeries()?this.parseDate(n.axis_x_min):n.axis_x_min:(0,a.min)(t,function(t){return(0,a.min)(t.values,function(t){return t.x})})},getXDomainMax:function(t){var e=this,n=e.config;return(0,u.isDefined)(n.axis_x_max)?e.isTimeSeries()?this.parseDate(n.axis_x_max):n.axis_x_max:(0,a.max)(t,function(t){return(0,a.max)(t.values,function(t){return t.x})})},getXDomainPadding:function(t){var e=this,n=e.config,i=t[1]-t[0],a=void 0,o=void 0,s=void 0,c=void 0;return e.isCategorized()?o=0:e.hasType("bar")?(a=e.getMaxDataCount(),o=a>1?i/(a-1)/2:.5):o=.01*i,"object"===(0,r.default)(n.axis_x_padding)&&(0,u.notEmpty)(n.axis_x_padding)?(s=(0,u.isValue)(n.axis_x_padding.left)?n.axis_x_padding.left:o,c=(0,u.isValue)(n.axis_x_padding.right)?n.axis_x_padding.right:o):"number"==typeof n.axis_x_padding?(s=n.axis_x_padding,c=n.axis_x_padding):(s=o,c=o),{left:s,right:c}},getXDomain:function(t){var e=this,n=[e.getXDomainMin(t),e.getXDomainMax(t)],i=n[0],r=n[1],a=e.getXDomainPadding(n),o=0,s=0;return i-r!=0||e.isCategorized()||(e.isTimeSeries()?(i=new Date(.5*i.getTime()),r=new Date(1.5*r.getTime())):(i=0===i?1:.5*i,r=0===r?-1:1.5*r)),(i||0===i)&&(o=e.isTimeSeries()?new Date(i.getTime()-a.left):i-a.left),(r||0===r)&&(s=e.isTimeSeries()?new Date(r.getTime()+a.right):r+a.right),[o,s]},updateXDomain:function(t,e,n,i,r){var o=this,s=o.config;if(n&&(o.x.domain(r||(0,a.extent)(o.getXDomain(t))),o.orgXDomain=o.x.domain(),s.zoom_enabled&&o.zoom.updateScaleExtent(),o.subX.domain(o.x.domain()),o.brush&&o.brush.scale(o.subX)),e){var u=r||!o.brush||o.brushEmpty()?o.orgXDomain:o.getBrushSelection().map(function(t){return o.subX.invert(t)});o.x.domain(u),s.zoom_enabled&&o.zoom.updateScaleExtent()}return i&&o.x.domain(o.trimXDomain(o.x.orgDomain())),o.x.domain()},trimXDomain:function(t){var e=this.getZoomDomain(),n=e[0],i=e[1];return t[0]<=n&&(t[1]=+t[1]+(n-t[0]),t[0]=n),i<=t[1]&&(t[0]=+t[0]-(t[1]-i),t[1]=i),t}})},function(t,e,n){"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}var i=n(5),r=_interopRequireDefault(i),a=n(1),o=_interopRequireDefault(a),s=n(0),u=function(t,e,n){var i=t.config,r="axis_"+e+"_tick_format";return(i[r]?i[r]:t.defaultValueFormat)(n)};(0,s.extend)(o.default.prototype,{getYFormat:function(t){var e=this,n=e.yFormat,i=e.y2Format;return t&&!e.hasType("gauge")&&(n=e.defaultArcValueFormat,i=e.defaultArcValueFormat),function(t,r,a){return("y2"===e.axis.getId(a)?i:n).call(e,t,r)}},yFormat:function(t){return u(this,"y",t)},y2Format:function(t){return u(this,"y2",t)},defaultValueFormat:function(t){return(0,s.isValue)(t)?+t:""},defaultArcValueFormat:function(t,e){return(100*e).toFixed(1)+"%"},dataLabelFormat:function(t){var e=this,n=e.config.data_labels,i=function(t){return(0,s.isValue)(t)?+t:""};return"function"==typeof n.format?n.format:"object"===(0,r.default)(n.format)?n.format[t]?!0===n.format[t]?i:n.format[t]:function(){return""}:i}})},function(t,e,n){"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}var i=n(2),r=n(1),a=_interopRequireDefault(r),o=n(3),s=_interopRequireDefault(o),u=n(0);(0,u.extend)(a.default.prototype,{initGrid:function(){var t=this,e=t.config;t.grid=t.main.append("g").attr("clip-path",t.clipPathForGrid).attr("class",s.default.grid),e.grid_x_show&&t.grid.append("g").attr("class",s.default.xgrids),e.grid_y_show&&t.grid.append("g").attr("class",s.default.ygrids),e.grid_focus_show&&t.grid.append("g").attr("class",s.default.xgridFocus).append("line").attr("class",s.default.xgridFocus),t.xgrid=(0,i.selectAll)([]),e.grid_lines_front||t.initGridLines()},initGridLines:function(){var t=this;t.gridLines=t.main.append("g").attr("clip-path",t.clipPathForGrid).attr("class",s.default.grid+" "+s.default.gridLines),t.gridLines.append("g").attr("class",s.default.xgridLines),t.gridLines.append("g").attr("class",s.default.ygridLines),t.xgridLines=(0,i.selectAll)([])},updateXGrid:function(t){var e=this,n=e.config,r=e.generateGridData(n.grid_x_type,e.x),a=e.isCategorized()?e.xAxis.tickOffset():0;e.xgridAttr=n.axis_rotated?{x1:0,x2:e.width,y1:function(t){return e.x(t)-a},y2:function(t){return e.x(t)-a}}:{x1:function(t){return e.x(t)+a},x2:function(t){return e.x(t)+a},y1:0,y2:e.height},e.xgrid=e.main.select("."+s.default.xgrids).selectAll("."+s.default.xgrid).data(r),e.xgrid.exit().remove(),e.xgrid=e.xgrid.enter().append("line").attr("class",s.default.xgrid).merge(e.xgrid),t||e.xgrid.each(function(){var t=(0,i.select)(this);Object.keys(e.xgridAttr).forEach(function(i){t.attr(i,e.xgridAttr[i]).style("opacity",function(){return t.attr(n.axis_rotated?"y1":"x1")===(n.axis_rotated?e.height:0)?"0":"1"})})})},updateYGrid:function(){var t=this,e=t.config,n=t.yAxis.tickValues()||t.y.ticks(e.grid_y_ticks);t.ygrid=t.main.select("."+s.default.ygrids).selectAll("."+s.default.ygrid).data(n),t.ygrid.exit().remove(),t.ygrid=t.ygrid.enter().append("line").attr("class",s.default.ygrid).merge(t.ygrid),t.ygrid.attr("x1",e.axis_rotated?t.y:0).attr("x2",e.axis_rotated?t.y:t.width).attr("y1",e.axis_rotated?0:t.y).attr("y2",e.axis_rotated?t.height:t.y),t.smoothLines(t.ygrid,"grid")},gridTextAnchor:function(t){return t.position?t.position:"end"},gridTextDx:function(t){return"start"===t.position?4:"middle"===t.position?0:-4},xGridTextX:function(t){return"start"===t.position?-this.height:"middle"===t.position?-this.height/2:0},yGridTextX:function(t){return"start"===t.position?0:"middle"===t.position?this.width/2:this.width},updateGrid:function(t){var e=this,n=e.main,i=e.config;e.grid.style("visibility",e.hasArcType()?"hidden":"visible"),n.select("line."+s.default.xgridFocus).style("visibility","hidden"),i.grid_x_show&&e.updateXGrid(),e.xgridLines=n.select("."+s.default.xgridLines).selectAll("."+s.default.xgridLine).data(i.grid_x_lines),e.xgridLines.exit().transition().duration(t).style("opacity","0").remove();var r=e.xgridLines.enter().append("g").attr("class",function(t){return s.default.xgridLine+(t.class?" "+t.class:"")});r.append("line").style("opacity","0"),r.append("text").attr("text-anchor",e.gridTextAnchor).attr("transform",i.axis_rotated?"":"rotate(-90)").attr("dx",e.gridTextDx).attr("dy",-5).style("opacity","0"),e.xgridLines=r.merge(e.xgridLines),i.grid_y_show&&e.updateYGrid(),e.ygridLines=n.select("."+s.default.ygridLines).selectAll("."+s.default.ygridLine).data(i.grid_y_lines),e.ygridLines.exit().transition().duration(t).style("opacity","0").remove();var a=e.ygridLines.enter().append("g").attr("class",function(t){return s.default.ygridLine+(t.class?" "+t.class:"")});a.append("line").style("opacity","0"),a.append("text").attr("text-anchor",e.gridTextAnchor).attr("transform",i.axis_rotated?"rotate(-90)":"").attr("dx",e.gridTextDx).attr("dy",-5).style("opacity","0"),e.ygridLines=a.merge(e.ygridLines);var o=e.yv.bind(e);e.ygridLines.select("line").transition().duration(t).attr("x1",i.axis_rotated?o:0).attr("x2",i.axis_rotated?o:e.width).attr("y1",i.axis_rotated?0:o).attr("y2",i.axis_rotated?e.height:o).transition().style("opacity","1"),e.ygridLines.select("text").transition().duration(t).attr("x",i.axis_rotated?e.xGridTextX.bind(e):e.yGridTextX.bind(e)).attr("y",o).text(function(t){return t.text}).transition().style("opacity","1")},redrawGrid:function(t){var e=this,n=e.config.axis_rotated,i=e.xv.bind(e),r=e.xgridLines.select("line"),a=e.xgridLines.select("text");return r=(t?r.transition():r).attr("x1",n?0:i).attr("x2",n?e.width:i).attr("y1",n?i:0).attr("y2",n?i:e.height),a=(t?a.transition():a).attr("x",n?e.yGridTextX.bind(e):e.xGridTextX.bind(e)).attr("y",i).text(function(t){return t.text}),[(t?r.transition():r).style("opacity","1"),(t?a.transition():a).style("opacity","1")]},showXGridFocus:function(t){var e=this,n=e.config,i=t.filter(function(t){return t&&(0,u.isValue)(t.value)}),r=e.main.selectAll("line."+s.default.xgridFocus),a=e.xx.bind(e);!n.tooltip_show||e.hasType("scatter")||e.hasArcType()||(r.style("visibility","visible").data([i[0]]).attr(n.axis_rotated?"y1":"x1",a).attr(n.axis_rotated?"y2":"x2",a),e.smoothLines(r,"grid"))},hideXGridFocus:function(){this.main.select("line."+s.default.xgridFocus).style("visibility","hidden")},updateXgridFocus:function(){var t=this,e=t.config;t.main.select("line."+s.default.xgridFocus).attr("x1",e.axis_rotated?0:-10).attr("x2",e.axis_rotated?t.width:-10).attr("y1",e.axis_rotated?-10:0).attr("y2",e.axis_rotated?-10:t.height)},generateGridData:function(t,e){var n=this,i=n.main.select("."+s.default.axisX).selectAll(".tick").size(),r=[];if("year"===t)for(var a=n.getXDomain(),o=a[0].getFullYear(),u=a[1].getFullYear(),c=o;c<=u;c++)r.push(new Date(c+"-01-01 00:00:00"));else r=e.ticks(10),r.length>i&&(r=r.filter(function(t){return(t+"").indexOf(".")<0}));return r},getGridFilterToRemove:function(t){return t?function(e){var n=!1;return[].concat(t).forEach(function(t){("value"in t&&e.value===t.value||"class"in t&&e.class===t.class)&&(n=!0)}),n}:function(){return!0}},removeGridLines:function(t,e){var n=this,i=n.config,r=n.getGridFilterToRemove(t),a=function(t){return!r(t)},o=e?s.default.xgridLines:s.default.ygridLines,u=e?s.default.xgridLine:s.default.ygridLine;n.main.select("."+o).selectAll("."+u).filter(r).transition().duration(i.transition_duration).style("opacity","0").remove(),e?i.grid_x_lines=i.grid_x_lines.filter(a):i.grid_y_lines=i.grid_y_lines.filter(a)}})},function(t,e,n){"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}var i=n(2),r=n(1),a=_interopRequireDefault(r),o=n(3),s=_interopRequireDefault(o),u=n(0);(0,u.extend)(a.default.prototype,{initLegend:function(){var t=this;return t.legendItemTextBox={},t.legendHasRendered=!1,t.legend=t.svg.append("g").attr("transform",t.getTranslate("legend")),t.config.legend_show?void t.updateLegendWithDefaults():(t.legend.style("visibility","hidden"),void(t.hiddenLegendIds=t.mapToIds(t.data.targets)))},updateLegendWithDefaults:function(){var t=this;t.updateLegend(t.mapToIds(t.data.targets),{withTransform:!1,withTransitionForTransform:!1,withTransition:!1})},updateSizeForLegend:function(t,e){var n=this,i=n.config,r={top:n.isLegendTop?n.getCurrentPaddingTop()+i.legend_inset_y+5.5:n.currentHeight-t-n.getCurrentPaddingBottom()-i.legend_inset_y,left:n.isLegendLeft?n.getCurrentPaddingLeft()+i.legend_inset_x+.5:n.currentWidth-e-n.getCurrentPaddingRight()-i.legend_inset_x+.5};n.margin3={top:n.isLegendRight?0:n.isLegendInset?r.top:n.currentHeight-t,right:NaN,bottom:0,left:n.isLegendRight?n.currentWidth-e:n.isLegendInset?r.left:0}},transformLegend:function(t){var e=this;(t?e.legend.transition():e.legend).attr("transform",e.getTranslate("legend"))},updateLegendStep:function(t){this.legendStep=t},updateLegendItemWidth:function(t){this.legendItemWidth=t},updateLegendItemHeight:function(t){this.legendItemHeight=t},getLegendWidth:function(){var t=this;return t.config.legend_show?t.isLegendRight||t.isLegendInset?t.legendItemWidth*(t.legendStep+1):t.currentWidth:0},getLegendHeight:function(){var t=this,e=0;return t.config.legend_show&&(e=t.isLegendRight?t.currentHeight:Math.max(20,t.legendItemHeight)*(t.legendStep+1)),e},opacityForLegend:function(t){return t.classed(s.default.legendItemHidden)?null:"1"},opacityForUnfocusedLegend:function(t){return t.classed(s.default.legendItemHidden)?null:"0.3"},toggleFocusLegend:function(t,e){var n=this,r=n.mapToTargetIds(t);n.legend.selectAll("."+s.default.legendItem).filter(function(t){return r.indexOf(t)>=0}).classed(s.default.legendItemFocused,e).transition().duration(100).style("opacity",function(){return(e?n.opacityForLegend:n.opacityForUnfocusedLegend).call(n,(0,i.select)(this))})},revertLegend:function(){var t=this;t.legend.selectAll("."+s.default.legendItem).classed(s.default.legendItemFocused,!1).transition().duration(100).style("opacity",function(){return t.opacityForLegend((0,i.select)(this))})},showLegend:function(t){var e=this,n=e.config;n.legend_show||(n.legend_show=!0,e.legend.style("visibility","visible"),!e.legendHasRendered&&e.updateLegendWithDefaults()),e.removeHiddenLegendIds(t),e.legend.selectAll(e.selectorLegends(t)).style("visibility","visible").transition().style("opacity",function(){return e.opacityForLegend((0,i.select)(this))})},hideLegend:function(t){var e=this,n=e.config;n.legend_show&&(0,u.isEmpty)(t)&&(n.legend_show=!1,e.legend.style("visibility","hidden")),e.addHiddenLegendIds(t),e.legend.selectAll(e.selectorLegends(t)).style("opacity","0").style("visibility","hidden")},clearLegendItemTextBoxCache:function(){this.legendItemTextBox={}},updateLegend:function(t,e,n){var r=this,a=r.config,o=a.legend_item_tile_width+5,c="touch"===r.inputType,l=0,f=0,d=void 0,h=void 0,p=0,g={},v={},x={},_=[0],m={},y=0,b=void 0,w=t.filter(function(t){return!(0,u.isDefined)(a.data_names[t])||null!==a.data_names[t]}),T=e||{},A=(0,u.getOption)(T,"withTransition",!0),M=(0,u.getOption)(T,"withTransitionForTransform",!0),S=function(t,e){return r.legendItemTextBox[e]||(r.legendItemTextBox[e]=r.getTextRect(t.textContent,s.default.legendItem,t)),r.legendItemTextBox[e]},C=function(t,e,n){var i=n===w.length-1,s=S(t,e),u=s.width+o+(!i||r.isLegendRight||r.isLegendInset?10:0)+a.legend_padding,c=s.height+4,d=r.isLegendRight||r.isLegendInset?c:u,h=r.isLegendRight||r.isLegendInset?r.getLegendHeight():r.getLegendWidth(),b=void 0,T=function(t,e){e||(b=(h-p-d)/2)<10&&(b=(h-d)/2,p=0,y++),m[t]=y,_[y]=r.isLegendInset?10:b,g[t]=p,p+=d};if(0===n&&(p=0,y=0,l=0,f=0),a.legend_show&&!r.isLegendToShow(e))return v[e]=0,x[e]=0,m[e]=0,void(g[e]=0);v[e]=u,x[e]=c,(!l||u>=l)&&(l=u),(!f||c>=f)&&(f=c);var A=r.isLegendRight||r.isLegendInset?f:l;a.legend_equally?(Object.keys(v).forEach(function(t){return v[t]=l}),Object.keys(x).forEach(function(t){return x[t]=f}),b=(h-A*w.length)/2,b<10?(p=0,y=0,w.forEach(function(t){return T(t)})):T(e,!0)):T(e)};r.isLegendInset&&(y=a.legend_inset_step?a.legend_inset_step:w.length,r.updateLegendStep(y)),r.isLegendRight?(d=function(t){return l*m[t]},h=function(t){return _[m[t]]+g[t]}):r.isLegendInset?(d=function(t){return l*m[t]+10},h=function(t){return _[m[t]]+g[t]}):(d=function(t){return _[m[t]]+g[t]},h=function(t){return f*m[t]});var k=function(t,e){return d(t,e)+4+a.legend_item_tile_width},R=function(t,e){return h(t,e)+9},L=function(t,e){return d(t,e)},E=function(t,e){return h(t,e)-5},D=function(t,e){return d(t,e)-2},I=function(t,e){return d(t,e)-2+a.legend_item_tile_width},F=function(t,e){return h(t,e)+4},N=r.legend.selectAll("."+s.default.legendItem).data(w).enter().append("g").attr("class",function(t){return r.generateClass(s.default.legendItem,t)}).style("visibility",function(t){return r.isLegendToShow(t)?"visible":"hidden"}).style("cursor","pointer").on(c?"touchstart":"click",function(t){a.legend_item_onclick?a.legend_item_onclick.call(r,t):i.event.altKey?(r.api.hide(),r.api.show(t)):(r.api.toggle(t),r.isTargetToShow(t)?r.api.focus(t):r.api.revert()),c&&r.hideTooltip()}).on(c?void 0:"mouseover",function(t){a.legend_item_onover?a.legend_item_onover.call(r,t):((0,i.select)(this).classed(s.default.legendItemFocused,!0),!r.transiting&&r.isTargetToShow(t)&&r.api.focus(t))}).on(c?"touchend":"mouseout",function(t){a.legend_item_onout?a.legend_item_onout.call(r,t):((0,i.select)(this).classed(s.default.legendItemFocused,!1),r.api.revert())});N.append("text").text(function(t){return(0,u.isDefined)(a.data_names[t])?a.data_names[t]:t}).each(function(t,e){C(this,t,e)}).style("pointer-events","none").attr("x",r.isLegendRight||r.isLegendInset?k:-200).attr("y",r.isLegendRight||r.isLegendInset?-200:R),N.append("rect").attr("class",s.default.legendItemEvent).style("fill-opacity","0").attr("x",r.isLegendRight||r.isLegendInset?L:-200).attr("y",r.isLegendRight||r.isLegendInset?-200:E),N.append("line").attr("class",s.default.legendItemTile).style("stroke",r.color).style("pointer-events","none").attr("x1",r.isLegendRight||r.isLegendInset?D:-200).attr("y1",r.isLegendRight||r.isLegendInset?-200:F).attr("x2",r.isLegendRight||r.isLegendInset?I:-200).attr("y2",r.isLegendRight||r.isLegendInset?-200:F).attr("stroke-width",a.legend_item_tile_height),b=r.legend.select("."+s.default.legendBackground+" rect"),r.isLegendInset&&l>0&&0===b.size()&&(b=r.legend.insert("g","."+s.default.legendItem).attr("class",s.default.legendBackground).append("rect"));var P=r.legend.selectAll("text").data(w).text(function(t){return(0,u.isDefined)(a.data_names[t])?a.data_names[t]:t}).each(function(t,e){C(this,t,e)});(A?P.transition():P).attr("x",k).attr("y",R);var z=r.legend.selectAll("rect."+s.default.legendItemEvent).data(w);(A?z.transition():z).attr("width",function(t){return v[t]}).attr("height",function(t){return x[t]}).attr("x",L).attr("y",E);var O=r.legend.selectAll("line."+s.default.legendItemTile).data(w);(A?O.transition():O).style("stroke",r.color).attr("x1",D).attr("y1",F).attr("x2",I).attr("y2",F),b&&(A?b.transition():b).attr("height",r.getLegendHeight()-12).attr("width",l*(y+1)+10),r.legend.selectAll("."+s.default.legendItem).classed(s.default.legendItemHidden,function(t){return!r.isTargetToShow(t)}),r.updateLegendItemWidth(l),r.updateLegendItemHeight(f),r.updateLegendStep(y),r.updateSizes(),r.updateScales(),r.updateSvgSize(),r.transformAll(M,n),r.legendHasRendered=!0}})},function(t,e,n){"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}var i=n(2),r=n(1),a=_interopRequireDefault(r),o=n(3),s=_interopRequireDefault(o),u=n(0);(0,u.extend)(a.default.prototype,{initRegion:function(){var t=this;t.region=t.main.append("g").attr("clip-path",t.clipPath).attr("class",s.default.regions)},updateRegion:function(t){var e=this,n=e.config;e.region.style("visibility",e.hasArcType()?"hidden":"visible"),e.mainRegion=e.main.select("."+s.default.regions).selectAll("."+s.default.region).data(n.regions),e.mainRegion.exit().transition().duration(t).style("opacity","0").remove(),e.mainRegion=e.mainRegion.enter().append("g").merge(e.mainRegion).attr("class",e.classRegion.bind(e)),e.mainRegion.append("rect").style("fill-opacity","0")},redrawRegion:function(t){var e=this,n=e.regionX.bind(e),r=e.regionY.bind(e),a=e.regionWidth.bind(e),o=e.regionHeight.bind(e),s=e.mainRegion.select("rect");return s=(t?s.transition():s).attr("x",n).attr("y",r).attr("width",a).attr("height",o),[(t?s.transition():s).style("fill-opacity",function(t){return(0,u.isValue)(t.opacity)?t.opacity:"0.1"}).on("end",function(){(0,i.select)(this.parentNode).selectAll("rect:not([x])").remove()})]},regionX:function(t){var e=this,n=e.config,i="y"===t.axis?e.y:e.y2;return"y"===t.axis||"y2"===t.axis?n.axis_rotated&&"start"in t?i(t.start):0:n.axis_rotated?0:"start"in t?e.x(e.isTimeSeries()?e.parseDate(t.start):t.start):0},regionY:function(t){var e=this,n=e.config,i="y"===t.axis?e.y:e.y2;return"y"===t.axis||"y2"===t.axis?n.axis_rotated?0:"end"in t?i(t.end):0:n.axis_rotated&&"start"in t?e.x(e.isTimeSeries()?e.parseDate(t.start):t.start):0},regionWidth:function(t){var e=this,n=e.config,i="y"===t.axis?e.y:e.y2,r=e.regionX(t),a=void 0;return a="y"===t.axis||"y2"===t.axis?n.axis_rotated&&"end"in t?i(t.end):e.width:n.axis_rotated?e.width:"end"in t?e.x(e.isTimeSeries()?e.parseDate(t.end):t.end):e.width,ai.bar_width_max?i.bar_width_max:r},getBars:function(t,e){var n=this,i=(0,u.isValue)(t)?"-"+t:"";return(e?n.main.selectAll("."+a.default.bars+n.getTargetSelectorSuffix(e)):n.main).selectAll("."+a.default.bar+i)},expandBars:function(t,e,n){var i=this;n&&i.unexpandBars(),i.getBars(t,e).classed(a.default.EXPANDED,!0)},unexpandBars:function(t){this.getBars(t).classed(a.default.EXPANDED,!1)},generateDrawBar:function(t,e){var n=this,i=n.config,r=n.generateGetBarPoints(t,e);return function(t,e){var n=r(t,e),a=i.axis_rotated?1:0,o=i.axis_rotated?0:1;return"M "+n[0][a]+","+n[0][o]+"\n\t\t\tL "+n[1][a]+","+n[1][o]+"\n\t\t\tL "+n[2][a]+","+n[2][o]+"\n\t\t\tL "+n[3][a]+","+n[3][o]+" z"}},generateGetBarPoints:function(t,e){var n=this,i=e?n.subXAxis:n.xAxis,r=t.__max__+1,a=n.getBarW(i,r),o=n.getShapeX(a,r,t,!!e),s=n.getShapeY(!!e),u=n.getShapeOffset(n.isBarType,t,!!e),c=e?n.getSubYScale:n.getYScale;return function(t,e){var i=c.call(n,t.id)(0),r=u(t,e)||i,l=o(t),f=s(t);return n.config.axis_rotated&&(t.value>0&&f=0&&(c+=s(r[l].value)-u))}),c}},isWithinShape:function(t,e){var n=this,r=(0,i.select)(t),o=void 0;return n.isTargetToShow(e.id)?"circle"===t.nodeName?o=n.isStepType(e)?n.isWithinStep(t,n.getYScale(e.id)(e.value)):n.isWithinCircle(t,1.5*n.pointSelectR(e)):"path"===t.nodeName&&(o=!r.classed(a.default.bar)||n.isWithinBar(t)):o=!1,o},getInterpolate:function(t){var e=this,n=e.getInterpolateType(t);return{basis:i.curveBasis,"basis-closed":i.curveBasisClosed,"basis-open":i.curveBasisOpen,bundle:i.curveBundle,cardinal:i.curveCardinal,"cardinal-closed":i.curveCardinalClosed,"cardinal-open":i.curveCardinalOpen,"catmull-rom":i.curveCatmullRom,"catmull-rom-closed":i.curveCatmullRomClosed,"catmull-rom-open":i.curveCatmullRomOpen,"monotone-x":i.curveMonotoneX,"monotone-y":i.curveMonotoneY,natural:i.curveNatural,"linear-closed":i.curveLinearClosed,linear:i.curveLinear,step:i.curveStep}[n]},getInterpolateType:function(t){var e=this,n=e.isInterpolationType(e.config.spline_interpolation_type)?e.config.spline_interpolation_type:"cardinal";return n=e.isSplineType(t)?n:e.isStepType(t)?e.config.line_step_type:"linear"}})},function(t,e,n){"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}var i=n(2),r=n(3),a=_interopRequireDefault(r),o=n(1),s=_interopRequireDefault(o),u=n(0);(0,u.extend)(s.default.prototype,{initLine:function(){this.main.select("."+a.default.chart).append("g").attr("class",a.default.chartLines)},updateTargetsForLine:function(t){var e=this,n=e.config,i=e.classChartLine.bind(e),r=e.classLines.bind(e),o=e.classAreas.bind(e),s=e.classCircles.bind(e),u=e.classFocus.bind(e),c=e.main.select("."+a.default.chartLines).selectAll("."+a.default.chartLine).data(t).attr("class",function(t){return i(t)+u(t)}),l=c.enter().append("g").attr("class",i).style("opacity","0").style("pointer-events","none");l.append("g").attr("class",r),l.append("g").attr("class",o),l.append("g").attr("class",function(t){return e.generateClass(a.default.selectedCircles,t.id)}),l.append("g").attr("class",s).style("cursor",function(t){return n.data_selection_isselectable(t)?"pointer":null}),t.forEach(function(t){e.main.selectAll("."+a.default.selectedCircles+e.getTargetSelectorSuffix(t.id)).selectAll(""+a.default.selectedCircle).each(function(e){e.value=t.values[e.index].value})})},updateLine:function(t){var e=this;e.mainLine=e.main.selectAll("."+a.default.lines).selectAll("."+a.default.line).data(e.lineData.bind(e)),e.mainLine.exit().transition().duration(t).style("opacity","0").remove(),e.mainLine=e.mainLine.enter().append("path").attr("class",e.classLine.bind(e)).style("stroke",e.color).merge(e.mainLine).style("opacity",e.initialOpacity.bind(e)).style("shape-rendering",function(t){return e.isStepType(t)?"crispEdges":""}).attr("transform",null)},redrawLine:function(t,e){return[(e?this.mainLine.transition(Math.random().toString()):this.mainLine).attr("d",t).style("stroke",this.color).style("opacity","1")]},generateDrawLine:function(t,e){var n=this,r=n.config,a=n.generateGetLinePoints(t,e),o=e?n.getSubYScale:n.getYScale,s=function(t){return(e?n.subxx:n.xx).call(n,t)},u=function(t,e){return r.data_groups.length>0?a(t,e)[0][1]:o.call(n,t.id)(t.value)},c=(0,i.line)();return c=r.axis_rotated?c.x(u).y(s):c.x(s).y(u),r.line_connectNull||(c=c.defined(function(t){return null!==t.value})),function(t){var i=e?n.x:n.subX,a=o.call(n,t.id),s=r.line_connectNull?n.filterRemoveNull(t.values):t.values,u=0,l=0,f=void 0;return n.isLineType(t)?r.data_regions[t.id]?f=n.lineWithRegions(s,i,a,r.data_regions[t.id]):(n.isStepType(t)&&(s=n.convertValuesToStep(s)),f=c.curve(n.getInterpolate(t))(s)):(s[0]&&(u=i(s[0].x),l=a(s[0].value)),f=r.axis_rotated?"M "+l+" "+u:"M "+u+" "+l),f||"M 0 0"}},generateGetLinePoints:function(t,e){var n=this,i=n.config,r=t.__max__+1,a=n.getShapeX(0,r,t,!!e),o=n.getShapeY(!!e),s=n.getShapeOffset(n.isLineType,t,!!e),u=e?n.getSubYScale:n.getYScale;return function(t,e){var r=u.call(n,t.id)(0),c=s(t,e)||r,l=a(t),f=o(t);return i.axis_rotated&&(t.value>0&&f0?a(t,e)[0][1]:o.call(n,t.id)(n.getAreaBaseValue(t.id))},c=function(t,e){return r.data_groups.length>0?a(t,e)[1][1]:o.call(n,t.id)(t.value)},l=(0,i.area)();return l=r.axis_rotated?l.x0(u).x1(c).y(s):l.x(s).y0(r.area_above?0:u).y1(c),r.line_connectNull||(l=l.defined(function(t){return null!==t.value})),function(t){var e=r.line_connectNull?n.filterRemoveNull(t.values):t.values,i=0,a=0,o=void 0;return n.isAreaType(t)?(n.isStepType(t)&&(e=n.convertValuesToStep(e)),o=l.curve(n.getInterpolate(t))(e)):(e[0]&&(i=n.x(e[0].x),a=n.getYScale(t.id)(e[0].value)),o=r.axis_rotated?"M "+a+" "+i:"M "+i+" "+a),o||"M 0 0"}},getAreaBaseValue:function(){return 0},generateGetAreaPoints:function(t,e){var n=this,i=n.config,r=t.__max__+1,a=n.getShapeX(0,r,t,!!e),o=n.getShapeY(!!e),s=n.getShapeOffset(n.isAreaType,t,!!e),u=e?n.getSubYScale:n.getYScale;return function(t,e){var r=u.call(n,t.id)(0),c=s(t,e)||r,l=a(t),f=o(t);return i.axis_rotated&&(t.value>0&&f0?(e=t.getShapeIndices(t.isLineType),n=t.generateGetLinePoints(e),t.circleY=function(t,e){return n(t,e)[0][1]}):t.circleY=function(e){return t.getYScale(e.id)(e.value)}},getCircles:function(t,e){var n=this,i=(0,u.isValue)(t)?"-"+t:"";return(e?n.main.selectAll("."+a.default.circles+n.getTargetSelectorSuffix(e)):n.main).selectAll("."+a.default.circle+i)},expandCircles:function(t,e,n){var i=this,r=i.pointExpandedR.bind(i);n&&i.unexpandCircles(),i.getCircles(t,e).classed(a.default.EXPANDED,!0).attr("r",r)},unexpandCircles:function(t){var e=this,n=e.pointR.bind(e);e.getCircles(t).filter(function(){return(0,i.select)(this).classed(a.default.EXPANDED)}).classed(a.default.EXPANDED,!1).attr("r",n)},pointR:function(t){var e=this,n=e.config;return e.isStepType(t)?0:(0,u.isFunction)(n.point_r)?n.point_r(t):n.point_r},pointExpandedR:function(t){var e=this,n=e.config;return n.point_focus_expand_enabled?n.point_focus_expand_r?n.point_focus_expand_r:1.75*e.pointR(t):e.pointR(t)},pointSelectR:function(t){var e=this,n=e.config;return(0,u.isFunction)(n.point_select_r)?n.point_select_r(t):n.point_select_r?n.point_select_r:4*e.pointR(t)},isWithinCircle:function(t,e){var n=(0,i.mouse)(t),r=(0,i.select)(t),a=+r.attr("cx"),o=+r.attr("cy");return Math.sqrt(Math.pow(a-n[0],2)+Math.pow(o-n[1],2))0?n:320/(t.hasType("gauge")&&!e.gauge_fullCircle?2:1)},getCurrentPaddingTop:function(){var t=this,e=t.config,n=(0,s.isValue)(e.padding_top)?e.padding_top:0;return t.title&&t.title.node()&&(n+=t.getTitlePadding()),n},getCurrentPaddingBottom:function(){var t=this.config;return(0,s.isValue)(t.padding_bottom)?t.padding_bottom:0},getCurrentPaddingLeft:function(t){var e=this,n=e.config;return(0,s.isValue)(n.padding_left)?n.padding_left:n.axis_rotated?n.axis_x_show?Math.max((0,s.ceil10)(e.getAxisWidthByAxisId("x",t)),40):1:!n.axis_y_show||n.axis_y_inner?e.axis.getYAxisLabelPosition().isOuter?30:1:(0,s.ceil10)(e.getAxisWidthByAxisId("y",t))},getCurrentPaddingRight:function(){var t=this,e=t.config,n=t.isLegendRight?t.getLegendWidth()+20:0;return(0,s.isValue)(e.padding_right)?e.padding_right+1:e.axis_rotated?10+n:!e.axis_y2_show||e.axis_y2_inner?2+n+(t.axis.getY2AxisLabelPosition().isOuter?20:0):(0,s.ceil10)(t.getAxisWidthByAxisId("y2"))+n},getParentRectValue:function(t){for(var e=this.selectChart.node(),n=void 0;e&&"BODY"!==e.tagName;){try{n=e.getBoundingClientRect()[t]}catch(i){"width"===t&&(n=e.offsetWidth)}if(n)break;e=e.parentNode}return n},getParentWidth:function(){return this.getParentRectValue("width")},getParentHeight:function(){var t=this.selectChart.style("height");return t.indexOf("px")>0?+t.replace("px",""):0},getSvgLeft:function(t){var e=this,n=e.config,i=n.axis_rotated||!n.axis_rotated&&!n.axis_y_inner,r=n.axis_rotated?o.default.axisX:o.default.axisY,a=e.main.select("."+r).node(),s=a&&i?a.getBoundingClientRect():{right:0},u=e.selectChart.node().getBoundingClientRect(),c=e.hasArcType(),l=s.right-u.left-(c?0:e.getCurrentPaddingLeft(t));return l>0?l:0},getAxisWidthByAxisId:function(t,e){var n=this,i=n.axis.getLabelPositionById(t);return n.axis.getMaxTickWidth(t,e)+(i.isInner?20:40)},getHorizontalAxisHeight:function(t){var e=this,n=e.config,i=30;return"x"!==t||n.axis_x_show?"x"===t&&n.axis_x_height?n.axis_x_height:"y"!==t||n.axis_y_show?"y2"!==t||n.axis_y2_show?("x"===t&&!n.axis_rotated&&n.axis_x_tick_rotate&&(i=30+e.axis.getMaxTickWidth(t)*Math.cos(Math.PI*(90-n.axis_x_tick_rotate)/180)),"y"===t&&n.axis_rotated&&n.axis_y_tick_rotate&&(i=30+e.axis.getMaxTickWidth(t)*Math.cos(Math.PI*(90-n.axis_y_tick_rotate)/180)),i+(e.axis.getLabelPositionById(t).isInner?0:10)+("y2"===t?-10:0)):e.rotated_padding_top:!n.legend_show||e.isLegendRight||e.isLegendInset?1:10:8},getEventRectWidth:function(){return Math.max(0,this.xAxis.tickInterval())}})},function(t,e,n){"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}var i=n(2),r=n(1),a=_interopRequireDefault(r),o=n(3),s=_interopRequireDefault(o);(0,n(0).extend)(a.default.prototype,{initText:function(){var t=this;t.main.select("."+s.default.chart).append("g").attr("class",s.default.chartTexts),t.mainText=(0,i.selectAll)([])},updateTargetsForText:function(t){var e=this,n=e.classChartText.bind(e),i=e.classTexts.bind(e),r=e.classFocus.bind(e);e.main.select("."+s.default.chartTexts).selectAll("."+s.default.chartText).data(t).attr("class",function(t){return n(t)+r(t)}).enter().append("g").attr("class",n).style("opacity","0").style("pointer-events","none").append("g").attr("class",i)},updateText:function(t){var e=this,n=e.config,i=e.barOrLineData.bind(e),r=e.classText.bind(e);e.mainText=e.main.selectAll("."+s.default.texts).selectAll("."+s.default.text).data(i),e.mainText.exit().transition().duration(t).style("fill-opacity","0").remove(),e.mainText=e.mainText.enter().append("text").attr("class",r).attr("text-anchor",function(t){return n.axis_rotated?t.value<0?"end":"start":"middle"}).style("stroke","none").style("fill",function(t){return e.color(t)}).style("fill-opacity","0").merge(e.mainText).text(function(t,n,i){return e.dataLabelFormat(t.id)(t.value,t.id,n,i)})},redrawText:function(t,e,n,i){return[(i?this.mainText.transition():this.mainText).attr("x",t).attr("y",e).style("fill",this.color).style("fill-opacity",n?0:this.opacityForText.bind(this))]},getTextRect:function(t,e,n){var r=(0,i.select)("body").append("div").classed("bb",!0),a=r.append("svg").style("visibility","hidden").style("position","fixed").style("top","0px").style("left","0px"),o=(0,i.select)(n).style("font"),s=void 0;return a.selectAll(".dummy").data([t]).enter().append("text").classed(e||"",!0).style("font",o).text(t).each(function(){s=this.getBoundingClientRect()}),r.remove(),s},generateXYForText:function(t,e,n,i){var r=this,a=r.generateGetAreaPoints(t,!1),o=r.generateGetBarPoints(e,!1),s=r.generateGetLinePoints(n,!1),u=i?r.getXForText:r.getYForText;return function(t,e){var n=r.isBarType(t)?o:s;return n=r.isAreaType(t)?a:n,u.call(r,n(t,e),t,this)}},getXForText:function(t,e,n){var i=this,r=n.getBoundingClientRect(),a=void 0,o=void 0;return i.config.axis_rotated?(o=i.isBarType(e)?4:6,a=t[2][1]+o*(e.value<0?-1:1)):a=i.hasType("bar")?(t[2][0]+t[0][0])/2:t[0][0],null===e.value&&(a>i.width?a=i.width-r.width:a<0&&(a=4)),a},getYForText:function(t,e,n){var i=this,r=n.getBoundingClientRect(),a=void 0;return i.config.axis_rotated?a=(t[0][0]+t[2][0]+.6*r.height)/2:(a=t[2][1],e.value<0||0===e.value&&!i.hasPositiveValue?(a+=r.height,i.isBarType(e)&&i.isSafari()?a-=3:!i.isBarType(e)&&i.isChrome()&&(a+=3)):a+=i.isBarType(e)?-3:-6),null!==e.value||i.config.axis_rotated||(athis.height&&(a=this.height-4)),a}})},function(t,e,n){"use strict";var i=n(1),r=function(t){return t&&t.__esModule?t:{"default":t}}(i);(0,n(0).extend)(r.default.prototype,{initTitle:function(){var t=this;t.title=t.svg.append("text").text(t.config.title_text).attr("class",t.CLASS.title)},redrawTitle:function(){var t=this;t.title.attr("x",t.xForTitle.bind(t)).attr("y",t.yForTitle.bind(t))},xForTitle:function(){var t=this,e=t.config,n=e.title_position||"left";return n.indexOf("right")>=0?t.currentWidth-t.getTextRect(t.title.node().textContent,t.CLASS.title,t.title.node()).width-e.title_padding.right:n.indexOf("center")>=0?(t.currentWidth-t.getTextRect(t.title.node().textContent,t.CLASS.title,t.title.node()).width)/2:e.title_padding.left},yForTitle:function(){var t=this;return t.config.title_padding.top+t.getTextRect(t.title.node().textContent,t.CLASS.title,t.title.node()).height},getTitlePadding:function(){var t=this;return t.yForTitle()+t.config.title_padding.bottom}})},function(t,e,n){"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}var i=n(2),r=n(1),a=_interopRequireDefault(r),o=n(3),s=_interopRequireDefault(o),u=n(0);(0,u.extend)(a.default.prototype,{initTooltip:function(){var t=this,e=t.config,n=void 0;if(t.tooltip=t.selectChart.style("position","relative").append("div").attr("class",s.default.tooltipContainer).style("position","absolute").style("pointer-events","none").style("display","none"),e.tooltip_init_show){if(t.isTimeSeries()&&(0,u.isString)(e.tooltip_init_x)){for(e.tooltip_init_x=t.parseDate(e.tooltip_init_x),n=0;n0&&i>0&&(n=t?x.indexOf(t.id):null,i=e?x.indexOf(e.id):null),l?n-i:i-n})}for(d=0;d'+h+"":"",f=''+f),void 0!==(p=(0,u.sanitise)(c(t[d].value,t[d].ratio,t[d].id,t[d].index,t))))){if(null===t[d].name)continue;g=(0,u.sanitise)(s(t[d].name,t[d].ratio,t[d].id,t[d].index)),v=r.levelColor?r.levelColor(t[d].value):i(t[d].id),f+='"}return f+"
'+g+''+p+"
"},tooltipPosition:function(t,e,n,r){var a=this,o=a.config,s=a.hasArcType(),u="touch"===a.inputType,c=(0,i.mouse)(r),l=void 0,f=void 0,d=void 0,h=void 0,p=void 0;return s?(f=u?c[0]:(a.width-(a.isLegendRight?a.getLegendWidth():0))/2+c[0],h=u?c[1]+20:a.height/2+c[1]+20):(l=a.getSvgLeft(!0),o.axis_rotated?(f=l+c[0]+100,d=f+e,p=a.currentWidth-a.getCurrentPaddingRight(),h=a.x(t[0].x)+20):(f=l+a.getCurrentPaddingLeft(!0)+a.x(t[0].x)+20,d=f+e,p=l+a.currentWidth-a.getCurrentPaddingRight(),h=c[1]+15),d>p&&(f-=d-p+20),h+n>a.currentHeight&&(h-=n+30)),h<0&&(h=0),{top:h,left:f}},showTooltip:function(t,e){var n=this,i=n.config,r=n.hasArcType(),a=t.filter(function(t){return t&&(0,u.isValue)(t.value)}),o=i.tooltip_position||n.tooltipPosition;if(0!==a.length&&i.tooltip_show){n.tooltip.html(i.tooltip_contents.call(n,t,n.axis.getXAxisTickFormat(),n.getYFormat(r),n.color)).style("display","block");var s=n.tooltip.property("offsetWidth"),c=n.tooltip.property("offsetHeight"),l=o.call(this,a,s,c,e);n.tooltip.style("top",l.top+"px").style("left",l.left+"px")}},hideTooltip:function(){this.tooltip.style("display","none")}})},function(t,e,n){"use strict";var i=n(1),r=function(t){return t&&t.__esModule?t:{"default":t}}(i),a=n(0);(0,a.extend)(r.default.prototype,{setTargetType:function(t,e){var n=this,i=n.config;n.mapToTargetIds(t).forEach(function(t){n.withoutFadeIn[t]=e===i.data_types[t],i.data_types[t]=e}),t||(i.data_type=e)},hasType:function(t,e){var n=this,i=n.config.data_types,r=e||n.data.targets,a=!1;return r&&r.length?r.forEach(function(e){var n=i[e.id];(n&&n.indexOf(t)>=0||!n&&"line"===t)&&(a=!0)}):Object.keys(i).length?Object.keys(i).forEach(function(e){i[e]===t&&(a=!0)}):a=n.config.data_type===t,a},hasArcType:function(t){return this.hasType("pie",t)||this.hasType("donut",t)||this.hasType("gauge",t)},isLineType:function(t){var e=this.config,n=(0,a.isString)(t)?t:t.id;return!e.data_types[n]||["line","spline","area","area-spline","step","area-step"].indexOf(e.data_types[n])>=0},isStepType:function(t){var e=(0,a.isString)(t)?t:t.id;return["step","area-step"].indexOf(this.config.data_types[e])>=0},isSplineType:function(t){var e=(0,a.isString)(t)?t:t.id;return["spline","area-spline"].indexOf(this.config.data_types[e])>=0},isAreaType:function(t){var e=(0,a.isString)(t)?t:t.id;return["area","area-spline","area-step"].indexOf(this.config.data_types[e])>=0},isBarType:function(t){var e=(0,a.isString)(t)?t:t.id;return"bar"===this.config.data_types[e]},isScatterType:function(t){var e=(0,a.isString)(t)?t:t.id;return"scatter"===this.config.data_types[e]},isPieType:function(t){var e=(0,a.isString)(t)?t:t.id;return"pie"===this.config.data_types[e]},isGaugeType:function(t){var e=(0,a.isString)(t)?t:t.id;return"gauge"===this.config.data_types[e]},isDonutType:function(t){var e=(0,a.isString)(t)?t:t.id;return"donut"===this.config.data_types[e]},isArcType:function(t){return this.isPieType(t)||this.isDonutType(t)||this.isGaugeType(t)},lineData:function(t){return this.isLineType(t)?[t]:[]},arcData:function(t){return this.isArcType(t.data)?[t]:[]},barData:function(t){return this.isBarType(t)?t.values:[]},lineOrScatterData:function(t){return this.isLineType(t)||this.isScatterType(t)?t.values:[]},barOrLineData:function(t){return this.isBarType(t)||this.isLineType(t)?t.values:[]},isInterpolationType:function(t){return["basis","basis-closed","basis-open","bundle","cardinal","cardinal-closed","cardinal-open","catmull-rom","catmull-rom-closed","catmull-rom-open","linear","linear-closed","monotone-x","monotone-y","natural"].indexOf(t)>=0}})},function(t,e,n){"use strict";var i=n(1),r=function(t){return t&&t.__esModule?t:{"default":t}}(i);(0,n(0).extend)(r.default.prototype,{isSafari:function(){var t=window.navigator.userAgent;return t.indexOf("Safari")>=0&&t.indexOf("Chrome")<0},isChrome:function(){return window.navigator.userAgent.indexOf("Chrome")>=0}})},function(t,e,n){e=t.exports=n(61)(void 0),e.push([t.i,"/*-- Chart --*/\n.bb svg {\n font: 10px sans-serif;\n -webkit-tap-highlight-color: transparent; }\n\n.bb path, .bb line {\n fill: none;\n stroke: #000; }\n\n.bb text {\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none; }\n\n.bb-legend-item-tile,\n.bb-xgrid-focus,\n.bb-ygrid,\n.bb-event-rect,\n.bb-bars path {\n shape-rendering: crispEdges; }\n\n.bb-chart-arc path {\n stroke: #fff; }\n\n.bb-chart-arc text {\n fill: #fff;\n font-size: 13px; }\n\n/*-- Axis --*/\n/*-- Grid --*/\n.bb-grid line {\n stroke: #aaa; }\n\n.bb-grid text {\n fill: #aaa; }\n\n.bb-xgrid, .bb-ygrid {\n stroke-dasharray: 3 3; }\n\n/*-- Text on Chart --*/\n.bb-text.bb-empty {\n fill: #808080;\n font-size: 2em; }\n\n/*-- Line --*/\n.bb-line {\n stroke-width: 1px; }\n\n/*-- Point --*/\n.bb-circle._expanded_ {\n stroke-width: 1px;\n stroke: white; }\n\n.bb-selected-circle {\n fill: white;\n stroke-width: 2px; }\n\n/*-- Bar --*/\n.bb-bar {\n stroke-width: 0; }\n .bb-bar._expanded_ {\n fill-opacity: 0.75; }\n\n/*-- Focus --*/\n.bb-target.bb-focused {\n opacity: 1; }\n\n.bb-target.bb-focused path.bb-line, .bb-target.bb-focused path.bb-step {\n stroke-width: 2px; }\n\n.bb-target.bb-defocused {\n opacity: 0.3 !important; }\n\n/*-- Region --*/\n.bb-region {\n fill: steelblue;\n fill-opacity: .1; }\n\n/*-- Brush --*/\n.bb-brush .extent {\n fill-opacity: .1; }\n\n/*-- Select - Drag --*/\n/*-- Legend --*/\n.bb-legend-item {\n font-size: 12px; }\n\n.bb-legend-item-hidden {\n opacity: 0.15; }\n\n.bb-legend-background {\n opacity: 0.75;\n fill: white;\n stroke: lightgray;\n stroke-width: 1; }\n\n/*-- Title --*/\n.bb-title {\n font: 14px sans-serif; }\n\n/*-- Tooltip --*/\n.bb-tooltip-container {\n z-index: 10; }\n\n.bb-tooltip {\n border-collapse: collapse;\n border-spacing: 0;\n background-color: #fff;\n empty-cells: show;\n opacity: 0.9;\n -webkit-box-shadow: 7px 7px 12px -9px #777777;\n -moz-box-shadow: 7px 7px 12px -9px #777777;\n box-shadow: 7px 7px 12px -9px #777777; }\n .bb-tooltip tr {\n border: 1px solid #CCC; }\n .bb-tooltip th {\n background-color: #aaa;\n font-size: 14px;\n padding: 2px 5px;\n text-align: left;\n color: #FFF; }\n .bb-tooltip td {\n font-size: 13px;\n padding: 3px 6px;\n background-color: #fff;\n border-left: 1px dotted #999; }\n .bb-tooltip td > span {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin-right: 6px; }\n .bb-tooltip td.value {\n text-align: right; }\n\n/*-- Area --*/\n.bb-area {\n stroke-width: 0;\n opacity: 0.2; }\n\n/*-- Arc --*/\n.bb-chart-arcs-title {\n dominant-baseline: middle;\n font-size: 1.3em; }\n\n.bb-chart-arcs .bb-chart-arcs-background {\n fill: #e0e0e0;\n stroke: none; }\n\n.bb-chart-arcs .bb-chart-arcs-gauge-unit {\n fill: #000;\n font-size: 16px; }\n\n.bb-chart-arcs .bb-chart-arcs-gauge-max {\n fill: #777; }\n\n.bb-chart-arcs .bb-chart-arcs-gauge-min {\n fill: #777; }\n\n.bb-chart-arc .bb-gauge-value {\n fill: #000; }\n",""])},function(t,e,n){"use strict";e.__esModule=!0;var i=n(6),r=function(t){return t&&t.__esModule?t:{"default":t}}(i),a=function Options(){(0,r.default)(this,Options),this.value={bindto:"#chart",svg_classname:void 0,size_width:void 0,size_height:void 0,padding_left:void 0,padding_right:void 0,padding_top:void 0,padding_bottom:void 0,resize_auto:!0,zoom_enabled:!1,zoom_extent:void 0,zoom_privileged:!1,zoom_rescale:!1,zoom_onzoom:function(){},zoom_onzoomstart:function(){},zoom_onzoomend:function(){},zoom_x_min:void 0,zoom_x_max:void 0,interaction_brighten:!0,interaction_enabled:!0,interaction_inputType_mouse:!0,interaction_inputType_touch:!0,onover:function(){},onout:function(){},onresize:function(){},onresized:function(){},oninit:function(){},onrendered:function(){},transition_duration:350,data_x:void 0,data_xs:{},data_xFormat:"%Y-%m-%d",data_xLocaltime:!0,data_xSort:!0,data_idConverter:function(t){return t},data_names:{},data_classes:{},data_groups:[],data_axes:{},data_type:void 0,data_types:{},data_labels:{},data_order:"desc",data_regions:{},data_color:void 0,data_colors:{},data_hide:!1,data_filter:void 0,data_selection_enabled:!1,data_selection_grouped:!1,data_selection_isselectable:function(){return!0},data_selection_multiple:!0,data_selection_draggable:!1,data_onclick:function(){},data_onover:function(){},data_onout:function(){},data_onselected:function(){},data_onunselected:function(){},data_url:void 0,data_headers:void 0,data_json:void 0,data_rows:void 0,data_columns:void 0,data_mimeType:void 0,data_keys:void 0,data_empty_label_text:"",subchart_show:!1,subchart_size_height:60,subchart_axis_x_show:!0,subchart_onbrush:function(){},color_pattern:[],color_threshold:{},legend_show:!0,legend_hide:!1,legend_position:"bottom",legend_inset_anchor:"top-left",legend_inset_x:10,legend_inset_y:0,legend_inset_step:void 0,legend_item_onclick:void 0,legend_item_onover:void 0,legend_item_onout:void 0,legend_equally:!1,legend_padding:0,legend_item_tile_width:10,legend_item_tile_height:10,axis_rotated:!1,axis_x_show:!0,axis_x_type:"indexed",axis_x_localtime:!0,axis_x_categories:[],axis_x_tick_centered:!1,axis_x_tick_format:void 0,axis_x_tick_culling:{},axis_x_tick_culling_max:10,axis_x_tick_count:void 0,axis_x_tick_fit:!0,axis_x_tick_values:null,axis_x_tick_rotate:0,axis_x_tick_outer:!0,axis_x_tick_multiline:!0,axis_x_tick_width:null,axis_x_max:void 0,axis_x_min:void 0,axis_x_padding:{},axis_x_height:void 0,axis_x_extent:void 0,axis_x_label:{},axis_y_show:!0,axis_y_type:void 0,axis_y_max:void 0,axis_y_min:void 0,axis_y_inverted:!1,axis_y_center:void 0,axis_y_inner:!1,axis_y_label:{},axis_y_tick_format:void 0,axis_y_tick_outer:!0,axis_y_tick_values:null,axis_y_tick_rotate:0,axis_y_tick_count:void 0,axis_y_tick_time_value:void 0,axis_y_padding:{},axis_y_default:void 0,axis_y2_show:!1,axis_y2_max:void 0,axis_y2_min:void 0,axis_y2_inverted:!1,axis_y2_center:void 0,axis_y2_inner:!1,axis_y2_label:{},axis_y2_tick_format:void 0,axis_y2_tick_outer:!0,axis_y2_tick_values:null,axis_y2_tick_count:void 0,axis_y2_padding:{},axis_y2_default:void 0,grid_x_show:!1,grid_x_type:"tick",grid_x_lines:[],grid_y_show:!1,grid_y_lines:[],grid_y_ticks:10,grid_focus_show:!0,grid_lines_front:!0,point_show:!0,point_r:2.5,point_sensitivity:10,point_focus_expand_enabled:!0,point_focus_expand_r:void 0,point_select_r:void 0,line_connectNull:!1,line_step_type:"step",bar_width:void 0,bar_width_ratio:.6,bar_width_max:void 0,bar_zerobased:!0,area_zerobased:!0,area_above:!1,pie_label_show:!0,pie_label_format:void 0,pie_label_threshold:.05,pie_label_ratio:void 0,pie_expand:{},pie_expand_duration:50,pie_padAngle:0,gauge_fullCircle:!1,gauge_label_show:!0,gauge_label_format:void 0,gauge_min:0,gauge_max:100,gauge_startingAngle:-1*Math.PI/2,gauge_label_extents:void 0,gauge_units:void 0,gauge_width:void 0,gauge_expand:{},gauge_expand_duration:50,donut_label_show:!0,donut_label_format:void 0,donut_label_threshold:.05,donut_label_ratio:void 0,donut_width:void 0,donut_title:"",donut_expand:{},donut_expand_duration:50,donut_padAngle:0,spline_interpolation_type:"cardinal",regions:[],tooltip_show:!0,tooltip_grouped:!0,tooltip_format_title:void 0,tooltip_format_name:void 0,tooltip_format_value:void 0,tooltip_position:void 0,tooltip_contents:function(t,e,n,i){return this.getTooltipContent?this.getTooltipContent(t,e,n,i):""},tooltip_init_show:!1,tooltip_init_x:0,tooltip_init_position:{top:"0px",left:"50px"},tooltip_onshow:function(){},tooltip_onhide:function(){},title_text:void 0,title_padding:{top:0,right:0,bottom:0,left:0},title_position:"top-center"}};e.default=a,t.exports=e.default},function(t,e,n){"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}function _interopRequireWildcard(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e.default=t,e}e.__esModule=!0,e.d3=e.bb=void 0;var i=n(2),r=_interopRequireWildcard(i),a=n(4),o=_interopRequireDefault(a),s=n(1),u=_interopRequireDefault(s),c=n(7),l=_interopRequireDefault(c),f=n(0),d=_interopRequireWildcard(f);n(57);var h={version:"1.0.0",generate:function(t){return new o.default(t)},chart:{fn:o.default.prototype,internal:{fn:u.default.prototype,axis:{fn:l.default.prototype}}}};for(var p in d)/^__/.test(p)||(u.default.prototype[p]=d[p]);n(27),n(46),n(41),n(29),n(28),n(30),n(37),n(32),n(51),n(49),n(50),n(48),n(52),n(55),n(43),n(54),n(44),n(53),n(39),n(35),n(45),n(31),n(47),n(33),n(34),n(40),n(42),n(36),n(38),n(15),n(22),n(26),n(19),n(14),n(21),n(24),n(17),n(16),n(20),n(13),n(10),n(12),n(25),n(9),n(18),n(11),n(23),n(8),n(56),e.bb=h,e.d3=r},function(t,e,n){"use strict";e.__esModule=!0;var i="undefined"!=typeof window&&window.Math===Math?window:"undefined"!=typeof self&&self.Math===Math?self:Function("return this")();e.window=i;e.document=i.document},function(t,e){function cssWithMappingToString(t,e){var n=t[1]||"",i=t[3];if(!i)return n;if(e&&"function"==typeof btoa){var r=toComment(i);return[n].concat(i.sources.map(function(t){return"/*# sourceURL="+i.sourceRoot+t+" */"})).concat([r]).join("\n")}return[n].join("\n")}function toComment(t){return"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(t))))+" */"}t.exports=function(t){var e=[];return e.toString=function(){return this.map(function(e){var n=cssWithMappingToString(e,t);return e[2]?"@media "+e[2]+"{"+n+"}":n}).join("")},e.i=function(t,n){"string"==typeof t&&(t=[[null,t,""]]);for(var i={},r=0;r + + + + Chart - Documentation + + + + + + + + + + + + + + + + +
+ +

Chart

+ + + + + + + +
+ +
+ +

+ Chart +

+ + +
+ +
+
+ + + + + +

new Chart()

+ + + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
See:
+
+ +
+ + + +
+ + + + + +
+

Main chart class.

+
    +
  • Note: Instantiated via bb.generate().
  • +
+
+ + + + + + + + + +
Example
+ +
var chart = bb.generate({
 data: {
   columns: [
	    ["x", "2015-11-02", "2015-12-01", "2016-01-01", "2016-02-01", "2016-03-01"],
	    ["count1", 11, 8, 7, 6, 5 ],
	    ["count2", 9, 3, 6, 2, 8 ]
  ]}
}
+ + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + +

Methods

+ + + + + + +

axis:labels(labels)

+ + + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+

Get and set axis labels.

+
+ + + + + + + + + +
Example
+ +
// Update axis' label
chart.axis.labels({
  x: "New X Axis Label",
  y: "New Y Axis Label"
});
+ + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
labels + + +Object + + + +

specified axis' label to be updated.

+ + + + + + + + + + + + + + + + + + + + + +

categories(categories)

+ + + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+

Set category names on category axis.

+
+ + + + + + + + + +
Example
+ +
chart.categories([
     "Category 1", "Category 2", ...
]);
+ + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
categories + + +Array + + + +

This must be an array that includes category names in string. If category names are included in the date by data.x option, this is not required.

+ + + + + + + + + + + + + + + + + + + + + +

category(i, category)

+ + + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+

Set specified category name on category axis.

+
+ + + + + + + + + +
Example
+ +
chart.category(2, "Category 3");
+ + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
i + + +Number + + + +

index of category to be changed

category + + +String + + + +

category value to be changed

+ + + + + + + + + + + + + + + + + + + + + +

color(id)

+ + + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+

Get the color

+
+ + + + + + + + + +
Example
+ +
chart.color("data1");
+ + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
id + + +String + + + +

id to get the color

+ + + + + + + + + + + + + + + + + + + + + +

data(targetIds)

+ + + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+

Get data loaded in the chart.

+
+ + + + + + + + + +
Example
+ +
// Get only data1 data
chart.data("data1");

// Get data1 and data2 data
chart.data(["data1", "data2"]);

// Get all data
chart.data();
+ + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
targetIds + + +String +| + +Array + + + +

If this argument is given, this API returns the specified target data. If this argument is not given, all of data will be returned.

+ + + + + + + + + + + + + + + + + + + + + +

data:shown(targetIds)

+ + + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+

Get data shown in the chart.

+
+ + + + + + + + + +
Example
+ +
// Get shown data by filtering to include only data1 data
chart.data.shown("data1");

// Get shown data by filtering to include data1 and data2 data
chart.data.shown(["data1", "data2"]);

// Get all shown data
chart.data.shown();
+ + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
targetIds + + +String +| + +Array + + + +

If this argument is given, this API filters the data with specified target ids. If this argument is not given, all shown data will be returned.

+ + + + + + + + + + + + + + + + + + + + + +

defocus(Target)

+ + + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+

This API fades out specified targets and reverts the others.

+You can specify multiple targets by giving an array that includes id as String. If no argument is given, all of targets will be faded out.

+
+ + + + + + + + + +
Example
+ +
// data1 will be faded out and the others will be reverted.
chart.defocus("data1");

// data1 and data2 will be faded out and the others will be reverted.
chart.defocus(["data1", "data2"]);

// all targets will be faded out.
chart.defocus();
+ + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
Target + + +String +| + +Array + + + +

ids to be faded out.

+ + + + + + + + + + + + + + + + + + + + + +

destroy()

+ + + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+

Reset the chart object and remove element and events completely.

+
+ + + + + + + + + +
Example
+ +
chart.destroy();
+ + + + + + + + + + + + + + + + + + + + + + + +

flow(args)

+ + + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+

Flow data to the chart.

+By this API, you can append new data points to the chart.

+
+ + + + + + + + + +
Example
+ +
// 2 data points will be apprended to the tail and popped from the head.
// After that, 4 data points will be appended and no data points will be poppoed.
chart.flow({
 columns: [
   ["x", "2013-01-11", "2013-01-21"],
   ["data1", 500, 200],
   ["data2", 100, 300],
   ["data3", 200, 120]
 ],
 done: function () {
   chart.flow({
     columns: [
       ["x", "2013-02-11", "2013-02-12", "2013-02-13", "2013-02-14"],
       ["data1", 200, 300, 100, 250],
       ["data2", 100, 90, 40, 120],
       ["data3", 100, 100, 300, 500]
     ],
     length: 0
   });
 }
});
+ + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
args + + +Object + + + +
    +
  • If json, rows and columns given, the data will be loaded. If data that has the same target id is given, the chart will be appended. Otherwise, new target will be added. One of these is required when calling. If json specified, keys is required as well as data.json
  • +
  • If to is given, the lower x edge will move to that point. If not given, the lower x edge will move by the number of given data points.
  • +
  • If length is given, the lower x edge will move by the number of this argument.
  • +
  • If duration is given, the duration of the transition will be specified value. If not given, transition.duration will be used as default.
  • +
  • If done is given, the specified function will be called when flow ends.
  • +
+ + + + + + + + + + + + + + + + + + + + + +

flush()

+ + + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+

Force to redraw.

+
+ + + + + + + + + +
Example
+ +
chart.flush();
+ + + + + + + + + + + + + + + + + + + + + + + +

focus(targetIdsValue)

+ + + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+

This API highlights specified targets and fade out the others.

+You can specify multiple targets by giving an array that includes id as String. If no argument is given, all of targets will be highlighted.

+
+ + + + + + + + + +
Example
+ +
// data1 will be highlighted and the others will be faded out
 chart.focus("data1");

// data1 and data2 will be highlighted and the others will be faded out
chart.focus(["data1", "data2"]);

// all targets will be highlighted
chart.focus();
+ + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
targetIdsValue + + +String +| + +Array + + + +

Target ids to be highlighted.

+ + + + + + + + + + + + + + + + + + + + + +

groups(groups)

+ + + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+

Update groups for the targets.

+
+ + + + + + + + + +
Example
+ +
// data1 and data2 will be a new group.
 chart.groups([
    ["data1", "data2"]
 ]);
+ + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
groups + + +Array + + + +

This argument needs to be an Array that includes one or more Array that includes target ids to be grouped.

+ + + + + + + + + + + + + + + + + + + + + +

hide(targetIdsValue, options)

+ + + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+

Hide data points

+
+ + + + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
targetIdsValue + + +String +| + +Array + + + +
options + + +Object + + + +
+ + + + + + + + + + + + + + + + + + + + + +

legend:show(targetIds)

+ + + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+

Show legend for each target.

+
+ + + + + + + + + +
Example
+ +
// Show legend for data1.
chart.legend.show("data1");

// Show legend for data1 and data2.
chart.legend.show(["data1", "data2"]);

// Show all legend.
chart.legend.show();
+ + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
targetIds + + +String +| + +Array + + + +
    +
  • If targetIds is given, specified target's legend will be shown.
  • +
  • If only one target is the candidate, String can be passed.
  • +
  • If no argument is given, all of target's legend will be shown.
  • +
+ + + + + + + + + + + + + + + + + + + + + +

load(args)

+ + + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+

Load data to the chart.

+You can specify multiple targets by giving an array that includes id as String. If no argument is given, all of targets will be toggles.

+
    +
  • Note: +unload should be used if some data needs to be unloaded simultaneously. If you call unload API soon after/before load instead of unload param, chart will not be rendered properly because of cancel of animation.
    +done will be called after data loaded, but it's not after rendering. It's because rendering will finish after some transition and there is some time lag between loading and rendering
  • +
+
+ + + + + + + + + +
Example
+ +
// Load data1 and unload data2 and data3
 chart.load({
    columns: [
       ["data1", 100, 200, 150, ...],
       ...
   ],
   unload: ["data2", "data3"]
 });
+ + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
args + + +Object + + + +
    +
  • If url, json, rows and columns given, the data will be loaded. If data that has the same target id is given, the chart will be updated. Otherwise, new target will be added.
  • +
  • If classes given, the classes specifed by data.classes will be updated. classes must be Object that has target id as keys.
  • +
  • If categories given, the categories specifed by axis.x.categories or data.x will be updated. categories must be Array.
  • +
  • If axes given, the axes specifed by data.axes will be updated. axes must be Object that has target id as keys.
  • +
  • If colors given, the colors specifed by data.colors will be updated. colors must be Object that has target id as keys.
  • +
  • If type or types given, the type of targets will be updated. type must be String and types must be Object.
  • +
  • If unload given, data will be unloaded before loading new data. If true given, all of data will be unloaded. If target ids given as String or Array, specified targets will be unloaded.
  • +
  • If done given, the specified function will be called after data loded.
  • +
+ + + + + + + + + + + + + + + + + + + + + +

regions(regions) → {Array}

+ + + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+

Update regions.

+
+ + + + + + + + + +
Example
+ +
// Show 2 regions
chart.regions([
   {axis: "x", start: 5, class: "regionX"},
   {axis: "y", end: 50, class: "regionY"}
]);
+ + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
regions + + +Array + + + +

Regions will be replaced with this argument. The format of this argument is the same as regions.

+ + + + + + + + + + + + + + +
Returns:
+ + +
+

regions

+
+ + + +
+
+ Type +
+
+ +Array + + +
+
+ + + + + + + + + +

regions:add(regions) → {Array}

+ + + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+

Add new region.

+This API adds new region instead of replacing like regions.

+
+ + + + + + + + + +
Example
+ +
// Add a new region
chart.regions.add(
   {axis: "x", start: 5, class: "regionX"}
);

// Add new regions
chart.regions.add([
   {axis: "x", start: 5, class: "regionX"},
   {axis: "y", end: 50, class: "regionY"}
]);
+ + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
regions + + +Array +| + +Object + + + +

New region will be added. The format of this argument is the same as regions and it's possible to give an Object if only one region will be added.

+ + + + + + + + + + + + + + +
Returns:
+ + +
+

regions

+
+ + + +
+
+ Type +
+
+ +Array + + +
+
+ + + + + + + + + +

resize(size)

+ + + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+

Resize the chart.

+
+ + + + + + + + + +
Example
+ +
// Resize to 640x480
chart.resize({
   width: 640,
   height: 480
});
+ + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
size + + +Object + + + +

This argument should include width and height in pixels.

+ + + + + + + + + + + + + + + + + + + + + +

revert(Target)

+ + + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+

This API reverts specified targets.

+You can specify multiple targets by giving an array that includes id as String. If no argument is given, all of targets will be reverted.

+
+ + + + + + + + + +
Example
+ +
// data1 will be reverted.
chart.revert("data1");

// data1 and data2 will be reverted.
chart.revert(["data1", "data2"]);

// all targets will be reverted.
chart.revert();
+ + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
Target + + +String +| + +Array + + + +

ids to be reverted

+ + + + + + + + + + + + + + + + + + + + + +

select(ids, indices, resetOther)

+ + + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+

Set data points to be selected.

+
+ + + + + + + + + +
Example
+ +
// select from 'data1', indices 2 and unselect others selected
 chart.select("data1", 2, true);
+ + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
ids + + +String + + + +
indices + + +Number + + + +
resetOther + + +Boolean + + + +
+ + + + + + + + + + + + + + + + + + + + + +

selected(targetId) → {Array}

+ + + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+

Get selected data points.

+By this API, you can get selected data points information. To use this API, data.selection.enabled needs to be set true.

+
+ + + + + + + + + +
Example
+ +
// all selected data points will be returned.
 chart.selected();

 // all selected data points of data1 will be returned.
 chart.selected("data1");
+ + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
targetId + + +String + + + +

You can filter the result by giving target id that you want to get. If not given, all of data points will be returned.

+ + + + + + + + + + + + + + +
Returns:
+ + +
+

dataPoint

+
+ + + +
+
+ Type +
+
+ +Array + + +
+
+ + + + + + + + + +

show(targetIdsValue, options)

+ + + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+

Show data points

+
+ + + + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
targetIdsValue + + +String +| + +Array + + + +
options + + +Object + + + +
+ + + + + + + + + + + + + + + + + + + + + +

toggle(targetIds, options)

+ + + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+

Toggle data points

+
+ + + + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
targetIds + + +Array + + + +
options + + +Object + + + +
+ + + + + + + + + + + + + + + + + + + + + +

tooltip:show(args)

+ + + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+

Show tooltip

+
+ + + + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
args + + +Array + + + +
+ + + + + + + + + + + + + + + + + + + + + +

transform(type, targetIds)

+ + + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+

Change the type of the chart.

+
+ + + + + + + + + +
Example
+ +
// all targets will be bar chart.
 chart.transform("bar");

 // only data1 will be bar chart.
 chart.transform("bar", "data1");

 // only data1 and data2 will be bar chart.
 chart.transform("bar", ["data1", "data2"]);
+ + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
type + + +String + + + +

Specify the type to be transformed. The types listed in data.type can be used.

targetIds + + +String +| + +Array + + + +

Specify targets to be transformed. If not given, all targets will be the candidate.

+ + + + + + + + + + + + + + + + + + + + + +

unload(args)

+ + + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+

Unload data to the chart.

+You can specify multiple targets by giving an array that includes id as String. If no argument is given, all of targets will be toggles.

+
    +
  • Note: +If you call load API soon after/before unload, unload param of load should be used. Otherwise chart will not be rendered properly because of cancel of animation.
    +done will be called after data loaded, but it's not after rendering. It's because rendering will finish after some transition and there is some time lag between loading and rendering.
  • +
+
+ + + + + + + + + +
Example
+ +
// Unload data2 and data3
 chart.unload({
   ids: ["data2", "data3"]
 });
+ + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
args + + +Object + + + +
    +
  • If ids given, the data that has specified target id will be unloaded. ids should be String or Array. If ids is not specified, all data will be unloaded.
  • +
  • If done given, the specified function will be called after data loded.
  • +
+ + + + + + + + + + + + + + + + + + + + + +

unselect(ids, indices)

+ + + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+

Set data points to be un-selected.

+
+ + + + + + + + + +
Example
+ +
// unselect from 'data1', indices 2
 chart.unselect("data1", 2);
+ + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
ids + + +String + + + +
indices + + +Number + + + +
+ + + + + + + + + + + + + + + + + + + + + +

unzoom()

+ + + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+

Unzoom zoomed area

+
+ + + + + + + + + +
Example
+ +
chart.unzoom();
+ + + + + + + + + + + + + + + + + + + + + + + +

x(x) → {Object}

+ + + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+

Get and set x values for the chart.

+
+ + + + + + + + + +
Example
+ +
// Get current x values
 chart.x();

 // Update x values for all targets
 chart.x([100, 200, 300, 400, ...]);
+ + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
x + + +Array + + + +

If x is given, x values of every target will be updated. If no argument is given, current x values will be returned as an Object whose keys are the target ids.

+ + + + + + + + + + + + + + +
Returns:
+ + +
+

xs

+
+ + + +
+
+ Type +
+
+ +Object + + +
+
+ + + + + + + + + +

xgrids(grids)

+ + + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+

Update x grid lines.

+
+ + + + + + + + + +
Example
+ +
// Show 2 x grid lines
chart.xgrids([
   {value: 1, text: "Label 1"},
   {value: 4, text: "Label 4"}
]);
+ + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
grids + + +Array + + + +

X grid lines will be replaced with this argument. The format of this argument is the same as grid.x.lines.

+ + + + + + + + + + + + + + + + + + + + + +

xgrids:add(grids)

+ + + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+

Add x grid lines.
+This API adds new x grid lines instead of replacing like xgrids.

+
+ + + + + + + + + +
Example
+ +
// Add a new x grid line
chart.xgrids.add(
  {value: 4, text: "Label 4"}
);

// Add new x grid lines
chart.xgrids.add([
  {value: 2, text: "Label 2"},
  {value: 4, text: "Label 4"}
]);
+ + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
grids + + +Array +| + +Object + + + +

New x grid lines will be added. The format of this argument is the same as grid.x.lines and it's possible to give an Object if only one line will be added.

+ + + + + + + + + + + + + + + + + + + + + +

xs(xs) → {Object}

+ + + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+

Get and set x values for the chart.

+
+ + + + + + + + + +
Example
+ +
// Get current x values
 chart.xs();

 // Update x values for all targets
 chart.xs({
   data1: [10, 20, 30, 40, ...],
   data2: [100, 200, 300, 400, ...]
 });
+ + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
xs + + +Array + + + +

If xs is given, specified target's x values will be updated. If no argument is given, current x values will be returned as an Object whose keys are the target ids.

+ + + + + + + + + + + + + + +
Returns:
+ + +
+

xs

+
+ + + +
+
+ Type +
+
+ +Object + + +
+
+ + + + + + + + + +

ygrids(grids)

+ + + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+

Update y grid lines.

+
+ + + + + + + + + +
Example
+ +
// Show 2 y grid lines
chart.ygrids([
   {value: 100, text: "Label 1"},
   {value: 400, text: "Label 4"}
]);
+ + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
grids + + +Array + + + +

Y grid lines will be replaced with this argument. The format of this argument is the same as grid.y.lines.

+ + + + + + + + + + + + + + + + + + + + + +

ygrids:add(grids)

+ + + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+

Add y grid lines.
+This API adds new y grid lines instead of replacing like ygrids.

+
+ + + + + + + + + +
Example
+ +
// Add a new x grid line
chart.ygrids.add(
  {value: 400, text: "Label 4"}
);

// Add new x grid lines
chart.ygrids.add([
  {value: 200, text: "Label 2"},
  {value: 400, text: "Label 4"}
]);
+ + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
grids + + +Array +| + +Object + + + +

New y grid lines will be added. The format of this argument is the same as grid.y.lines and it's possible to give an Object if only one line will be added.

+ + + + + + + + + + + + + + + + + + + + + +

zoom(domainValue)

+ + + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+

Zoom by giving x domain.

+
+ + + + + + + + + +
Example
+ +
// Zoom to specified domain
 chart.zoom([10, 20]);

 // Get the current zoomed domain
 chart.zoom();
+ + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
domainValue + + +Array + + + +

If domain is given, the chart will be zoomed to the given domain. If no argument is given, the current zoomed domain will be returned.

+ + + + + + + + + + + + + + + + + + + + + +

zoom:enable(enabled)

+ + + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+

Enable and disable zooming.

+
+ + + + + + + + + +
Example
+ +
// Enable zooming
 chart.zoom.enable(true);
+ + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
enabled + + +Boolean + + + +

If enabled is true, the feature of zooming will be enabled. If false is given, it will be disabled.

+ + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ +
+ + + + + + + \ No newline at end of file diff --git a/doc/Options.html b/doc/Options.html new file mode 100644 index 000000000..9945323e7 --- /dev/null +++ b/doc/Options.html @@ -0,0 +1,13135 @@ + + + + + Options - Documentation + + + + + + + + + + + + + + + + +
+ +

Options

+ + + + + + + +
+ +
+ +

+ Options +

+ + +
+ +
+
+ + + + + +

new Options()

+ + + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
See:
+
+
    +
  • bb.generate to use these options on generating the chart
  • +
+
+ + + +
+ + + + + +
+

Class to set options on generating chart.

+
    +
  • It's instantiated internally, not exposed for public.
  • +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + +

Members

+ + + +

(static) area :Object

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeAttributesDefaultDescription
area.zerobased + + +Boolean + + + + + + <optional>
+ + + +
+ + true + +

Set if min or max value will be 0 on area chart.

area.above + + +Boolean + + + + + + <optional>
+ + + +
+ + false + +
+ + + + + + +
+

Set area options

+
+ + + +
Type:
+
    +
  • + +Object + + +
  • +
+ + + + + +
Example
+ +
area: {
     zerobased: false,
     above: true
 }
+ + + + + +

(static) axis:rotated :Boolean

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • false
  • +
+ + + + + + + +
+ + + + + +
+

Switch x and y axis position.

+
+ + + +
Type:
+
    +
  • + +Boolean + + +
  • +
+ + + + + +
Example
+ +
axis: {
  rotated: true
}
+ + + + + +

(static) axis:x:categories :Array

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • []
  • +
+ + + + + + + +
+ + + + + +
+

Set category names on category axis. +This must be an array that includes category names in string. If category names are included in the date by data.x option, this is not required.

+
+ + + +
Type:
+
    +
  • + +Array + + +
  • +
+ + + + + +
Example
+ +
axis: {
  x: {
    categories: ["Category 1", "Category 2", ...]
  }
}
+ + + + + +

(static) axis:x:extent :Array

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • undefined
  • +
+ + + + + + + +
+ + + + + +
+

Set default extent for subchart and zoom. This can be an array or function that returns an array.

+
+ + + +
Type:
+
    +
  • + +Array + + +
  • +
+ + + + + +
Example
+ +
axis: {
  x: {
    // [[x0, y0], [x1, y1]], where [x0, y0] is the top-left corner and [x1, y1] is the bottom-right corner
    // https://github.com/d3/d3-brush/blob/master/src/brush.js#L521
    extent: [[0, 0], [200, 60]]
  }
}
+ + + + + +

(static) axis:x:height :Number

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • undefined
  • +
+ + + + + + + +
+ + + + + +
+

Set height of x axis.

+The height of x axis can be set manually by this option. If you need more space for x axis, please use this option for that. The unit is pixel.

+
+ + + +
Type:
+
    +
  • + +Number + + +
  • +
+ + + + + +
Example
+ +
axis: {
  x: {
    height: 20
  }
}
+ + + + + +

(static) axis:x:label :String|Object

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • undefined
  • +
+ + + + + + + +
+ + + + + +
+

Set label on x axis.

+ You can set x axis label and change its position by this option. string and object can be passed and we can change the poisiton by passing object that has position key. Available position differs according to the axis direction (vertical or horizontal). If string set, the position will be the default.

+
    +
  • If it's horizontal axis:
      +
    • inner-right [default]
    • +
    • inner-center
    • +
    • inner-left
    • +
    • outer-right
    • +
    • outer-center
    • +
    • outer-left
    • +
    +
  • +
  • If it's vertical axis:
      +
    • inner-top [default]
    • +
    • inner-middle
    • +
    • inner-bottom
    • +
    • outer-top
    • +
    • outer-middle
    • +
    • outer-bottom
    • +
    +
  • +
+
+ + + +
Type:
+
    +
  • + +String +| + +Object + + +
  • +
+ + + + + +
Example
+ +
axis: {
  x: {
    label: "Your X Axis"
  }
}

axis: {
  x: {
    label: {
       text: "Your X Axis",
       position: "outer-center"
    }
  }
}
+ + + + + +

(static) axis:x:localtime :Boolean

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • true
  • +
+ + + + + + + +
+ + + + + +
+

Set how to treat the timezone of x values.
+If true, treat x value as localtime. If false, convert to UTC internally.

+
+ + + +
Type:
+
    +
  • + +Boolean + + +
  • +
+ + + + + +
Example
+ +
axis: {
  x: {
    localtime: false
  }
}
+ + + + + +

(static) axis:x:max :Number

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • undefined
  • +
+ + + + + + + +
+ + + + + +
+

Set max value of x axis range.

+
+ + + +
Type:
+
    +
  • + +Number + + +
  • +
+ + + + + +
Example
+ +
axis: {
  x: {
    max: 100
  }
}
+ + + + + +

(static) axis:x:min :Number

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • undefined
  • +
+ + + + + + + +
+ + + + + +
+

Set min value of x axis range.

+
+ + + +
Type:
+
    +
  • + +Number + + +
  • +
+ + + + + +
Example
+ +
axis: {
  x: {
    min: -100
  }
}
+ + + + + +

(static) axis:x:padding :Object

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • {}
  • +
+ + + + + + + +
+ + + + + +
+

Set padding for x axis.

+If this option is set, the range of x axis will increase/decrease according to the values. If no padding is needed in the ragen of x axis, 0 should be set. On category axis, this option will be ignored.

+
+ + + +
Type:
+
    +
  • + +Object + + +
  • +
+ + + + + +
Example
+ +
axis: {
  x: {
    padding: {
      left: 0,
      right: 0
    }
  }
}
+ + + + + +

(static) axis:x:show :Boolean

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • true
  • +
+ + + + + + + +
+ + + + + +
+

Show or hide x axis.

+
+ + + +
Type:
+
    +
  • + +Boolean + + +
  • +
+ + + + + +
Example
+ +
axis: {
  x: {
    show: false
  }
}
+ + + + + +

(static) axis:x:tick:centered :Array

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • false
  • +
+ + + + + + + +
+ + + + + +
+

Centerise ticks on category axis.

+
+ + + +
Type:
+
    +
  • + +Array + + +
  • +
+ + + + + +
Example
+ +
axis: {
  x: {
    tick: {
      centered: true
    }
  }
}
+ + + + + +

(static) axis:x:tick:count :Number

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • undefined
  • +
+ + + + + + + +
+ + + + + +
+

The number of x axis ticks to show.

+This option hides tick lines together with tick text. If this option is used on timeseries axis, the ticks position will be determined precisely and not nicely positioned (e.g. it will have rough second value).

+
+ + + +
Type:
+
    +
  • + +Number + + +
  • +
+ + + + + +
Example
+ +
axis: {
  x: {
    tick: {
      count: 5
    }
  }
}
+ + + + + +

(static) axis:x:tick:culling :function

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • - true for indexed axis and timeseries axis - false for category axis
  • +
+ + + + + + + +
+ + + + + +
+

Setting for culling ticks.

+If true is set, the ticks will be culled, then only limitted tick text will be shown. This option does not hide the tick lines. If false is set, all of ticks will be shown.

+We can change the number of ticks to be shown by axis.x.tick.culling.max.

+
+ + + +
Type:
+
    +
  • + +function + + +
  • +
+ + + + + +
Example
+ +
axis: {
  x: {
    tick: {
      culling: false
    }
  }
}
+ + + + + +

(static) axis:x:tick:culling:max :Number

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • 10
  • +
+ + + + + + + +
+ + + + + +
+

The number of tick texts will be adjusted to less than this value.

+
+ + + +
Type:
+
    +
  • + +Number + + +
  • +
+ + + + + +
Example
+ +
axis: {
  x: {
    tick: {
      culling: {
          max: 5
      }
    }
  }
}
+ + + + + +

(static) axis:x:tick:fit :Boolean

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • true
  • +
+ + + + + + + +
+ + + + + +
+

Fit x axis ticks.

+If true set, the ticks will be positioned nicely. If false set, the ticks will be positioned according to x value of the data points.

+
+ + + +
Type:
+
    +
  • + +Boolean + + +
  • +
+ + + + + +
Example
+ +
axis: {
  x: {
    tick: {
      fit: false
    }
  }
}
+ + + + + +

(static) axis:x:tick:format :function

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • undefined
  • +
+ + + + + + + +
+ + + + + +
+

A function to format tick value. Format string is also available for timeseries data.

+
+ + + +
Type:
+
    +
  • + +function + + +
  • +
+ + + + + +
Example
+ +
axis: {
  x: {
    tick: {
      format: function(x) {
          return x.getFullYear();
      }
    }
  }
}
+ + + + + +

(static) axis:x:tick:multiline :Boolean

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • true
  • +
+ + + + + + + +
+ + + + + +
+

Set tick text to be multiline

+
+ + + +
Type:
+
    +
  • + +Boolean + + +
  • +
+ + + + + +
Example
+ +
axis: {
  x: {
    tick: {
      multiline: false
    }
  }
}
+ + + + + +

(static) axis:x:tick:outer :Boolean

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • true
  • +
+ + + + + + + +
+ + + + + +
+

Show x axis outer tick.

+
+ + + +
Type:
+
    +
  • + +Boolean + + +
  • +
+ + + + + +
Example
+ +
axis: {
  x: {
    tick: {
      outer: false
    }
  }
}
+ + + + + +

(static) axis:x:tick:rotate :Number

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • 0
  • +
+ + + + + + + +
+ + + + + +
+

Rotate x axis tick text.
+If you set negative value, it will rotate to opposite direction.

+
+ + + +
Type:
+
    +
  • + +Number + + +
  • +
+ + + + + +
Example
+ +
axis: {
  x: {
    tick: {
      rotate: 60
    }
  }
}
+ + + + + +

(static) axis:x:tick:values :Array

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • null
  • +
+ + + + + + + +
+ + + + + +
+

Set the x values of ticks manually.

+If this option is provided, the position of the ticks will be determined based on those values. This option works with timeseries data and the x values will be parsed accoding to the type of the value and data.xFormat option.

+
+ + + +
Type:
+
    +
  • + +Array + + +
  • +
+ + + + + +
Example
+ +
axis: {
  x: {
    tick: {
      values: [1, 2, 4, 8, 16, 32, ...]
    }
  }
}
+ + + + + +

(static) axis:x:tick:width :Number

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • null
  • +
+ + + + + + + +
+ + + + + +
+

Set tick width

+
+ + + +
Type:
+
    +
  • + +Number + + +
  • +
+ + + + + +
Example
+ +
axis: {
  x: {
    tick: {
      width: 50
    }
  }
}
+ + + + + +

(static) axis:x:type :String

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • indexed
  • +
+ + + + + + + +
+ + + + + +
+

Set type of x axis.

+Available Values: +-timeseries +-category +-indexed

+
+ + + +
Type:
+
    +
  • + +String + + +
  • +
+ + + + + +
Example
+ +
axis: {
  x: {
    type: "timeseries"
  }
}
+ + + + + +

(static) axis:y2:center :Number

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • undefined
  • +
+ + + + + + + +
+ + + + + +
+

Set center value of y2 axis.

+
+ + + +
Type:
+
    +
  • + +Number + + +
  • +
+ + + + + +
Example
+ +
axis: {
  y2: {
    center: 0
  }
}
+ + + + + +

(static) axis:y2:default :Array

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • undefined
  • +
+ + + + + + + +
+ + + + + +
+

Set default range of y2 axis.

+This option set the default value for y2 axis when there is no data on init.

+
+ + + +
Type:
+
    +
  • + +Array + + +
  • +
+ + + + + +
Example
+ +
axis: {
  y2: {
    default: [0, 1000]
  }
}
+ + + + + +

(static) axis:y2:inner :Boolean

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • false
  • +
+ + + + + + + +
+ + + + + +
+

Show y2 axis inside of the chart.

+
+ + + +
Type:
+
    +
  • + +Boolean + + +
  • +
+ + + + + +
Example
+ +
axis: {
  y2: {
    inner: true
  }
}
+ + + + + +

(static) axis:y2:inverted :Boolean

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • false
  • +
+ + + + + + + +
+ + + + + +
+

Change the direction of y2 axis.

+If true set, the direction will be from the top to the bottom.

+
+ + + +
Type:
+
    +
  • + +Boolean + + +
  • +
+ + + + + +
Example
+ +
axis: {
  y2: {
    inverted: true
  }
}
+ + + + + +

(static) axis:y2:label :String|Object

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • {}
  • +
+ + + + + + + +
+ + + + + +
+

Set label on y2 axis.

+You can set y2 axis label and change its position by this option. This option works in the same way as axis.x.label.

+
+ + + +
Type:
+
    +
  • + +String +| + +Object + + +
  • +
+ + + + + +
Example
+ +
axis: {
  y2: {
    label: "Your Y2 Axis"
  }
}

axis: {
  y2: {
    label: {
       text: "Your Y2 Axis",
       position: "outer-middle"
    }
  }
}
+ + + + + +

(static) axis:y2:max :Number

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • undefined
  • +
+ + + + + + + +
+ + + + + +
+

Set max value of y2 axis.

+
+ + + +
Type:
+
    +
  • + +Number + + +
  • +
+ + + + + +
Example
+ +
axis: {
  y2: {
    max: 1000
  }
}
+ + + + + +

(static) axis:y2:min :Number

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • undefined
  • +
+ + + + + + + +
+ + + + + +
+

Set min value of y2 axis.

+
+ + + +
Type:
+
    +
  • + +Number + + +
  • +
+ + + + + +
Example
+ +
axis: {
  y2: {
    min: -1000
  }
}
+ + + + + +

(static) axis:y2:padding :Number

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • {}
  • +
+ + + + + + + +
+ + + + + +
+

Set the number of y2 axis ticks. +Note: This works in the same way as axis.y.tick.count.

+
+ + + +
Type:
+
    +
  • + +Number + + +
  • +
+ + + + + +
Example
+ +
axis: {
  y2: {
    padding: {
      top: 100,
      bottom: 100
    }
  }
}
+ + + + + +

(static) axis:y2:show :Array

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • false
  • +
+ + + + + + + +
+ + + + + +
+

Show or hide y2 axis.

+
+ + + +
Type:
+
    +
  • + +Array + + +
  • +
+ + + + + +
Example
+ +
axis: {
  y2: {
    show: true
  }
}
+ + + + + +

(static) axis:y2:tick:count :Number

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • undefined
  • +
+ + + + + + + +
+ + + + + +
+

Set the number of y2 axis ticks. +Note: This works in the same way as axis.y.tick.count.

+
+ + + +
Type:
+
    +
  • + +Number + + +
  • +
+ + + + + +
Example
+ +
axis: {
  y2: {
    tick: {
      count: 5
    }
  }
}
+ + + + + +

(static) axis:y2:tick:format :function

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • undefined
  • +
+ + + + + + + +
+ + + + + +
+

Set formatter for y2 axis tick text.

+This option works in the same way as axis.y.format.

+
+ + + +
Type:
+
    +
  • + +function + + +
  • +
+ + + + + +
Example
+ +
axis: {
  y2: {
    tick: {
      format: d3.format("$,")
      //or format: function(d) { return "$" + d; }
    }
  }
}
+ + + + + +

(static) axis:y2:tick:outer :Boolean

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • true
  • +
+ + + + + + + +
+ + + + + +
+

Show or hide y2 axis outer tick.

+
+ + + +
Type:
+
    +
  • + +Boolean + + +
  • +
+ + + + + +
Example
+ +
axis: {
  y2: {
    tick: {
      outer: false
    }
  }
}
+ + + + + +

(static) axis:y2:tick:values :Array

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • null
  • +
+ + + + + + + +
+ + + + + +
+

Set y2 axis tick values manually.

+
+ + + +
Type:
+
    +
  • + +Array + + +
  • +
+ + + + + +
Example
+ +
axis: {
  y2: {
    tick: {
      values: [100, 1000, 10000]
    }
  }
}
+ + + + + +

(static) axis:y:center :Number

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • undefined
  • +
+ + + + + + + +
+ + + + + +
+

Set center value of y axis.

+
+ + + +
Type:
+
    +
  • + +Number + + +
  • +
+ + + + + +
Example
+ +
axis: {
  y: {
    center: 0
  }
}
+ + + + + +

(static) axis:y:default :Array

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • undefined
  • +
+ + + + + + + +
+ + + + + +
+

Set default range of y axis.

+This option set the default value for y axis when there is no data on init.

+
+ + + +
Type:
+
    +
  • + +Array + + +
  • +
+ + + + + +
Example
+ +
axis: {
  y: {
    default: [0, 1000]
  }
}
+ + + + + +

(static) axis:y:format :function

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • undefined
  • +
+ + + + + + + +
+ + + + + +
+

Set formatter for y axis tick text.

+This option accepts d3.format object as well as a function you define.

+
+ + + +
Type:
+
    +
  • + +function + + +
  • +
+ + + + + +
Example
+ +
axis: {
  x: {
    tick: {
      format: function(x) {
          return x.getFullYear();
      }
    }
  }
}
+ + + + + +

(static) axis:y:inner :Boolean

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • false
  • +
+ + + + + + + +
+ + + + + +
+

Show y axis inside of the chart.

+
+ + + +
Type:
+
    +
  • + +Boolean + + +
  • +
+ + + + + +
Example
+ +
axis: {
  y: {
    inner: true
  }
}
+ + + + + +

(static) axis:y:inverted :Boolean

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • false
  • +
+ + + + + + + +
+ + + + + +
+

Change the direction of y axis.

+If true set, the direction will be from the top to the bottom.

+
+ + + +
Type:
+
    +
  • + +Boolean + + +
  • +
+ + + + + +
Example
+ +
axis: {
  y: {
    inverted: true
  }
}
+ + + + + +

(static) axis:y:label :String|Object

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • {}
  • +
+ + + + + + + +
+ + + + + +
+

Set label on y axis.

+You can set y axis label and change its position by this option. This option works in the same way as axis.x.label.

+
+ + + +
Type:
+
    +
  • + +String +| + +Object + + +
  • +
+ + + + + +
Example
+ +
axis: {
  y: {
    label: "Your Y Axis"
  }
}

axis: {
  y: {
    label: {
       text: "Your Y Axis",
       position: "outer-middle"
    }
  }
}
+ + + + + +

(static) axis:y:max :Number

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • undefined
  • +
+ + + + + + + +
+ + + + + +
+

Set max value of y axis. +Note: Padding will be added based on this value, so if you don't need the padding, please set axis.y.padding to disable it (e.g. axis.y.padding = 0).

+
+ + + +
Type:
+
    +
  • + +Number + + +
  • +
+ + + + + +
Example
+ +
axis: {
  y: {
    max: 1000
  }
}
+ + + + + +

(static) axis:y:min :Number

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • undefined
  • +
+ + + + + + + +
+ + + + + +
+

Set min value of y axis. +Note: Padding will be added based on this value, so if you don't need the padding, please set axis.y.padding to disable it (e.g. axis.y.padding = 0).

+
+ + + +
Type:
+
    +
  • + +Number + + +
  • +
+ + + + + +
Example
+ +
axis: {
  y: {
    min: 1000
  }
}
+ + + + + +

(static) axis:y:padding :Object

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • {}
  • +
+ + + + + + + +
+ + + + + +
+

Set padding for y axis.

+You can set padding for y axis to create more space on the edge of the axis. This option accepts object and it can include top and bottom. top, bottom will be treated as pixels.

+
+ + + +
Type:
+
    +
  • + +Object + + +
  • +
+ + + + + +
Example
+ +
axis: {
  y: {
    padding: {
      top: 0,
      bottom: 0
    }
  }
}
+ + + + + +

(static) axis:y:show :Boolean

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • true
  • +
+ + + + + + + +
+ + + + + +
+

Show or hide y axis.

+
+ + + +
Type:
+
    +
  • + +Boolean + + +
  • +
+ + + + + +
Example
+ +
axis: {
  y: {
    show: false
  }
}
+ + + + + +

(static) axis:y:tick:count :Number

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • undefined
  • +
+ + + + + + + +
+ + + + + +
+

Set the number of y axis ticks.

+Note: The position of the ticks will be calculated precisely, so the values on the ticks will not be rounded nicely. In the case, axis.y.tick.format or axis.y.tick.values will be helpful.

+
+ + + +
Type:
+
    +
  • + +Number + + +
  • +
+ + + + + +
Example
+ +
axis: {
  y: {
    tick: {
      count: 5
    }
  }
}
+ + + + + +

(static) axis:y:tick:outer :Boolean

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • true
  • +
+ + + + + + + +
+ + + + + +
+

Show y axis outer tick.

+
+ + + +
Type:
+
    +
  • + +Boolean + + +
  • +
+ + + + + +
Example
+ +
axis: {
  y: {
    tick: {
      outer: false
    }
  }
}
+ + + + + +

(static) axis:y:tick:values :Array

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • null
  • +
+ + + + + + + +
+ + + + + +
+

Set y axis tick values manually.

+
+ + + +
Type:
+
    +
  • + +Array + + +
  • +
+ + + + + +
Example
+ +
axis: {
  y: {
    tick: {
      values: [100, 1000, 10000]
    }
  }
}
+ + + + + +

(static) axis:y:type :String

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • undefined
  • +
+ + + + + + + +
+ + + + + +
+

Set type of y axis. +Available Values: +-timeseries +-category +-indexed

+
+ + + +
Type:
+
    +
  • + +String + + +
  • +
+ + + + + +
Example
+ +
axis: {
  y: {
    type: "timeseries"
  }
}
+ + + + + +

(static) bar :Object

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeAttributesDefaultDescription
bar.width + + +Number + + + + + + <optional>
+ + + +
+ +

Change the width of bar chart.

+
Properties
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeAttributesDefaultDescription
ratio + + +Number + + + + + + <optional>
+ + + +
+ + 0.6 + +

Change the width of bar chart by ratio.

max + + +Number + + + + + + <optional>
+ + + +
+ +
+ +
bar.zerobased + + +Boolean + + + + + + <optional>
+ + + +
+ + true + +

Set if min or max value will be 0 on bar chart.

+ + + + + + +
+

Set bar options

+
+ + + +
Type:
+
    +
  • + +Object + + +
  • +
+ + + + + +
Example
+ +
bar: {
     width: 10,
     // or
     width: {
         ratio: 0.2,
         max: 200
     },
     zerobased: false
 }
+ + + + + +

(static) bindto :String

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • #chart
  • +
+ + + + + + + +
+ + + + + +
+

bindto The CSS selector or the element which the chart will be set to. D3 selection object can be specified. If other chart is set already, it will be replaced with the new one (only one chart can be set in one element).

+If this option is not specified, the chart will be generated but not be set. Instead, we can access the element by chart.element and set it by ourselves.

+
+

NOTE: When chart is not binded, bb starts observing if chart.element is binded by MutationObserver. In this case, polyfill is required in IE9 and IE10 becuase they do not support MutationObserver. On the other hand, if chart always will be binded, polyfill will not be required because MutationObserver will never be called.

+
+
+ + + +
Type:
+
    +
  • + +String + + +
  • +
+ + + + + +
Example
+ +
bindto: "#myContainer"

// or element
bindto: document.getElementById("myContainer")

// or D3 selection object
bindto: d3.select("#myContainer")
+ + + + + +

(static) color :Object

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeAttributesDescription
color.pattern + + +Array + + + + + + <optional>
+ + + +

custom color pattern

color.threshold + + +Object + + + + + + <optional>
+ + + +

color threshold

+
Properties
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeAttributesDefaultDescription
unit + + +String + + + + + + <optional>
+ + + +
+ +

unit

value + + +Array + + + + + + <optional>
+ + + +
+ +

value

max + + +Array + + + + + + <optional>
+ + + +
+ + 100 + +

max value

+ +
+ + + + + + +
+

Set color of the data values

+
+ + + +
Type:
+
    +
  • + +Object + + +
  • +
+ + + + + +
Example
+ +
color: {
     pattern: ["#1f77b4", "#aec7e8", ...]
 }
+ + + + + +

(static) data:axes :Object

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • {}
  • +
+ + + + + + + +
+ + + + + +
+

Set y axis the data related to. y and y2 can be used.

+
+ + + +
Type:
+
    +
  • + +Object + + +
  • +
+ + + + + +
Example
+ +
data: {
axes: {
    data1: "y",
    data2: "y2"
  }
}
+ + + + + +

(static) data:classes :Object

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • {}
  • +
+ + + + + + + +
+ + + + + +
+

Set custom data class.

+If this option is specified, the element g for the data has an additional class that has the prefix 'bb-target-' (eg. bb-target-additional-data1-class).

+
+ + + +
Type:
+
    +
  • + +Object + + +
  • +
+ + + + + +
Example
+ +
data: {
  classes: {
    data1: "additional-data1-class",
    data2: "additional-data2-class"
  }
}
+ + + + + +

(static) data:color :function

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • undefined
  • +
+ + + + + + + +
+ + + + + +
+

Set color converter function.

+This option should a function and the specified function receives color (e.g. '#ff0000') and d that has data parameters like id, value, index, etc. And it must return a string that represents color (e.g. '#00ff00').

+
+ + + +
Type:
+
    +
  • + +function + + +
  • +
+ + + + + +
Example
+ +
data: {
  color: function(color, d) { ... }
}
+ + + + + +

(static) data:colors :Object

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • {}
  • +
+ + + + + + + +
+ + + + + +
+

Set color for each data.

+
+ + + +
Type:
+
    +
  • + +Object + + +
  • +
+ + + + + +
Example
+ +
data: {
  colors: {
    data1: "#ff0000",
    ...
  }
}
+ + + + + +

(static) data:empty:label:text :String

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • ""
  • +
+ + + + + + + +
+ + + + + +
+

Set text displayed when empty data.

+
+ + + +
Type:
+
    +
  • + +String + + +
  • +
+ + + + + +
Example
+ +
data: {
  empty: {
    label: {
      text: "No Data"
    }
  }
}
+ + + + + +

(static) data:groups :Array

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • []
  • +
+ + + + + + + +
+ + + + + +
+

Set groups for the data for stacking.

+
+ + + +
Type:
+
    +
  • + +Array + + +
  • +
+ + + + + +
Example
+ +
data: {
  groups: [
    ["data1", "data2"],
    ["data3"]
  ]
}
+ + + + + +

(static) data:hide :Boolean|Array

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • false
  • +
+ + + + + + + +
+ + + + + +
+

Hide each data when the chart appears.

+If true specified, all of data will be hidden. If multiple ids specified as an array, those will be hidden.

+
+ + + +
Type:
+
    +
  • + +Boolean +| + +Array + + +
  • +
+ + + + + +
Example
+ +
data: {
  // all of data will be hidden
  hide: true
  // specified data will be hidden
  hide: ["data1", ...]
}
+ + + + + +

(static) data:labels :Boolean

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • false
  • +
+ + + + + + + +
+ + + + + +
+

Show labels on each data points.

+
+ + + +
Type:
+
    +
  • + +Boolean + + +
  • +
+ + + + + +
Example
+ +
data: {
  labels: true
}
+ + + + + +

(static) data:labels:format :Object

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • {}
  • +
+ + + + + + + +
+ + + + + +
+

Set formatter function for data labels.
+The formatter function receives 4 arguments such as v, id, i, j and it must return a string that will be shown as the label. The arguments are:

+
    +
  • v is the value of the data point where the label is shown.
  • +
  • id is the id of the data where the label is shown.
  • +
  • i is the index of the data point where the label is shown.
  • +
  • j is the sub index of the data point where the label is shown.

    +Formatter function can be defined for each data by specifying as an object and D3 formatter function can be set (ex. d3.format('$'))
  • +
+
+ + + +
Type:
+
    +
  • + +Object + + +
  • +
+ + + + + +
Example
+ +
data: {
  labels: {
    format: function(v, id, i, j) { ... }
    // it's possible to set for each data
    //format: {
    //    data1: function(v, id, i, j) { ... },
    //    ...
    //}
  }
}
+ + + + + +

(static) data:names :Object

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • {}
  • +
+ + + + + + + +
+ + + + + +
+

Set custom data name.

+
+ + + +
Type:
+
    +
  • + +Object + + +
  • +
+ + + + + +
Example
+ +
data: {
  names: {
    data1: "Data Name 1",
    data2: "Data Name 2"
  }
}
+ + + + + +

(static) data:onclick :function

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • function() {}
  • +
+ + + + + + + +
+ + + + + +
+

Set a callback for click event on each data point.

+This callback will be called when each data point clicked and will receive d and element as the arguments. d is the data clicked and element is the element clicked. In this callback, this will be the Chart object.

+
+ + + +
Type:
+
    +
  • + +function + + +
  • +
+ + + + + +
Example
+ +
data: {
    onclick: function(d, element) { ... }
}
+ + + + + +

(static) data:onout :function

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • function() {}
  • +
+ + + + + + + +
+ + + + + +
+

Set a callback for mouse/touch out event on each data point.

+This callback will be called when mouse cursor or via touch moves out each data point and will receive d as the argument. d is the data where mouse cursor moves out. In this callback, this will be the Chart object.

+
+ + + +
Type:
+
    +
  • + +function + + +
  • +
+ + + + + +
Example
+ +
data: {
    onout: function(d) { ... }
}
+ + + + + +

(static) data:onover :function

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • function() {}
  • +
+ + + + + + + +
+ + + + + +
+

Set a callback for mouse/touch over event on each data point.

+This callback will be called when mouse cursor or via touch moves onto each data point and will receive d as the argument. d is the data where mouse cursor moves onto. In this callback, this will be the Chart object.

+
+ + + +
Type:
+
    +
  • + +function + + +
  • +
+ + + + + +
Example
+ +
data: {
    onover: function(d) { ... }
}
+ + + + + +

(static) data:onselected :function

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • function() {}
  • +
+ + + + + + + +
+ + + + + +
+

Set a callback for on data selection.

+
+ + + +
Type:
+
    +
  • + +function + + +
  • +
+ + + + + +
Example
+ +
data: {
    onselected: function(d) { ... }
}
+ + + + + +

(static) data:onunselected :function

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • function() {}
  • +
+ + + + + + + +
+ + + + + +
+

Set a callback for on data un-selection.

+
+ + + +
Type:
+
    +
  • + +function + + +
  • +
+ + + + + +
Example
+ +
data: {
    onunselected: function(d) { ... }
}
+ + + + + +

(static) data:order :String|function

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • desc
  • +
+ + + + + + + +
+ + + + + +
+

This option changes the order of stacking the data and pieces of pie/donut. If null specified, it will be the order the data loaded. If function specified, it will be used to sort the data and it will recieve the data as argument.

+ Available Values:

+
    +
  • desc
  • +
  • asc
  • +
  • function(data1, data2) { ... }
  • +
  • null
  • +
+
+ + + +
Type:
+
    +
  • + +String +| + +function + + +
  • +
+ + + + + +
Example
+ +
data: {
  lorder: "asc"
}
+ + + + + +

(static) data:regions :Object

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • {}
  • +
+ + + + + + + +
+ + + + + +
+

Define regions for each data.

+The values must be an array for each data and it should include an object that has start, end, style. If start is not set, the start will be the first data point. If end is not set, the end will be the last data point.
+Currently this option supports only line chart and dashed style. If this option specified, the line will be dashed only in the regions.

+
+ + + +
Type:
+
    +
  • + +Object + + +
  • +
+ + + + + +
Example
+ +
data: {
  regions: {
    data1: [{
        "start": 1,
        "end": 2,
        "style": "dashed"
    }, {
        "start":3
    }],
    ...
  }
}
+ + + + + +

(static) data:selection:draggable :Boolean

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • false
  • +
+ + + + + + + +
+ + + + + +
+

Enable to select data points by dragging.

+If this option set true, data points can be selected by dragging. +Note: If this option set true, scrolling on the chart will be disabled because dragging event will handle the event.

+
+ + + +
Type:
+
    +
  • + +Boolean + + +
  • +
+ + + + + +
Example
+ +
data: {
    selection: {
      draggable: true
  }
}
+ + + + + +

(static) data:selection:enabled :Boolean

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • false
  • +
+ + + + + + + +
+ + + + + +
+

Set data selection enabled.

+If this option is set true, we can select the data points and get/set its state of selection by API (e.g. select, unselect, selected).

+
+ + + +
Type:
+
    +
  • + +Boolean + + +
  • +
+ + + + + +
Example
+ +
data: {
    selection: {
      enabled: true
  }
}
+ + + + + +

(static) data:selection:grouped :Boolean

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • false
  • +
+ + + + + + + +
+ + + + + +
+

Set grouped selection enabled.

+If this option set true, multiple data points that have same x value will be selected by one selection.

+
+ + + +
Type:
+
    +
  • + +Boolean + + +
  • +
+ + + + + +
Example
+ +
data: {
    selection: {
      grouped: true
  }
}
+ + + + + +

(static) data:selection:isselectable :function

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • function() { return true; }
  • +
+ + + + + + + +
+ + + + + +
+

Set a callback for each data point to determine if it's selectable or not.

+The callback will receive d as an argument and it has some parameters like id, value, index. This callback should return boolean.

+
+ + + +
Type:
+
    +
  • + +function + + +
  • +
+ + + + + +
Example
+ +
data: {
    selection: {
      isselectable: function(d) { ... }
  }
}
+ + + + + +

(static) data:selection:multiple :Boolean

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • true
  • +
+ + + + + + + +
+ + + + + +
+

Set multiple data points selection enabled.

+If this option set true, multile data points can have the selected state at the same time. If false set, only one data point can have the selected state and the others will be unselected when the new data point is selected.

+
+ + + +
Type:
+
    +
  • + +Boolean + + +
  • +
+ + + + + +
Example
+ +
data: {
    selection: {
      multiple: false
  }
}
+ + + + + +

(static) data:type :String

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • line
  • +
+ + + + + + + +
+ + + + + +
+

Set chart type at once.

+If this option is specified, the type will be applied to every data. This setting can be overwritten by data.types.

+Available Values:

+
    +
  • line
  • +
  • spline
  • +
  • step
  • +
  • area
  • +
  • area-spline
  • +
  • area-step
  • +
  • bar
  • +
  • scatter
  • +
  • pie
  • +
  • donut
  • +
  • gauge
  • +
+
+ + + +
Type:
+
    +
  • + +String + + +
  • +
+ + + + + +
Example
+ +
data: {
 type: "bar"
}
+ + + + + +

(static) data:types :Object

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • {}
  • +
+ + + + + + + +
+ + + + + +
+

Set chart type for each data.
+This setting overwrites data.type setting.

+
+ + + +
Type:
+
    +
  • + +Object + + +
  • +
+ + + + + +
Example
+ +
data: {
  types: {
    data1: "bar",
    data2: "spline"
  }
}
+ + + + + +

(static) data:x :String

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • undefined
  • +
+ + + + + + + +
+ + + + + +
+

Specify the key of x values in the data.

+We can show the data with non-index x values by this option. This option is required when the type of x axis is timeseries. If this option is set on category axis, the values of the data on the key will be used for category names.

+
+ + + +
Type:
+
    +
  • + +String + + +
  • +
+ + + + + +
Example
+ +
data: {
  x: "date"
}
+ + + + + +

(static) data:xFormat :String

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • %Y-%m-%d
  • +
+ + + + + +
See:
+
+ +
+ + + +
+ + + + + +
+

Set a format to parse string specifed as x.

+
+ + + +
Type:
+
    +
  • + +String + + +
  • +
+ + + + + +
Example
+ +
data: {
  xFormat: "%Y-%m-%d %H:%M:%S"
}
+ + + + + +

(static) data:xLocaltime :Boolean

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • true
  • +
+ + + + + + + +
+ + + + + +
+

Set localtime format to parse x axis.

+
+ + + +
Type:
+
    +
  • + +Boolean + + +
  • +
+ + + + + +
Example
+ +
data: {
  xLocaltime: false
}
+ + + + + +

(static) data:xs :Object

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • {}
  • +
+ + + + + + + +
+ + + + + +
+

Specify the keys of the x values for each data.

+This option can be used if we want to show the data that has different x values.

+
+ + + +
Type:
+
    +
  • + +Object + + +
  • +
+ + + + + +
Example
+ +
data: {
  xs: {
   data1: "x1",
   data2: "x2"
  }
}
+ + + + + +

(static) data:xSort :Boolean

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • true
  • +
+ + + + + + + +
+ + + + + +
+

Sort on x axis.

+
+ + + +
Type:
+
    +
  • + +Boolean + + +
  • +
+ + + + + +
Example
+ +
data: {
  xSort: false
}
+ + + + + +

(static) donut :Object

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeAttributesDefaultDescription
donut.label.show + + +Boolean + + + + + + <optional>
+ + + +
+ + true + +

Show or hide label on each donut piece.

donut.label.format + + +function + + + + + + <optional>
+ + + +
+ +

Set formatter for the label on each donut piece.

donut.label.threshold + + +Number + + + + + + <optional>
+ + + +
+ + 0.05 + +

Set threshold to show/hide labels.

donut.expand + + +Boolean + + + + + + <optional>
+ + + +
+ + true + +

Enable or disable expanding donut pieces.

donut.width + + +Number + + + + + + <optional>
+ + + +
+ +

Set width of donut chart.

donut.title + + +String + + + + + + <optional>
+ + + +
+ + "" + +

Set title of donut chart.

donut.padAngle + + +Number + + + + + + <optional>
+ + + +
+ + 0 + +

Set padding between data.

+ + + + + + +
+

Set donut options

+
+ + + +
Type:
+
    +
  • + +Object + + +
  • +
+ + + + + +
Example
+ +
donut: {
     label: {
         show: false,
         format: function(value, ratio, id) {
             return d3.format("$")(value);
         },
         threshold: 0.1
     },
     expand: false,
     width: 10,
     title: "Donut Title",
     padAngle: 0.2
 }
+ + + + + +

(static) gauge :Object

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeAttributesDefaultDescription
gauge.fullCircle + + +Boolean + + + + + + <optional>
+ + + +
+ + false + +
gauge.label.show + + +Boolean + + + + + + <optional>
+ + + +
+ + true + +

Show or hide label on gauge.

gauge.label.format + + +function + + + + + + <optional>
+ + + +
+ +

Set formatter for the label on gauge.

gauge.expand + + +Boolean + + + + + + <optional>
+ + + +
+ + true + +

Enable or disable expanding gauge.

+
Properties
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeAttributesDefaultDescription
duration + + +Number + + + + + + <optional>
+ + + +
+ + 50 + +
+ +
gauge.min + + +Number + + + + + + <optional>
+ + + +
+ + 0 + +

Set min value of the gauge.

gauge.max + + +Number + + + + + + <optional>
+ + + +
+ + 100 + +

Set max value of the gauge.

gauge.startingAngle + + +Number + + + + + + <optional>
+ + + +
+ + -1 * Math.PI / 2 + +
gauge.units + + +String + + + + + + <optional>
+ + + +
+ +

Set units of the gauge.

gauge.width + + +Number + + + + + + <optional>
+ + + +
+ +

Set width of gauge chart.

+ + + + + + +
+

Set gauge options

+
+ + + +
Type:
+
    +
  • + +Object + + +
  • +
+ + + + + +
Example
+ +
gauge: {
     label: {
         show: false,
         format: function(value, ratio) {
             return value;
         }
     },
     expand: false,
     min: -100,
     max: 200,
     units: "%",
     width: 10
 }
+ + + + + +

(static) grid :Object

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • undefined
  • +
+ + + + + + + +
+ + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeAttributesDefaultDescription
x.show + + +Boolean + + + + + + <optional>
+ + + +
+ + false + +

Show grids along x axis.

x.lines + + +Boolean + + + + + + <optional>
+ + + +
+ + [] + +

Show additional grid lines along x axis.
+ This option accepts array including object that has value, text, position and class. text, position and class are optional. For position, start, middle and end (default) are available. + If x axis is category axis, value can be category name. If x axis is timeseries axis, value can be date string, Date object and unixtime integer.

y.show + + +Boolean + + + + + + <optional>
+ + + +
+ + false + +

Show grids along x axis.

y.lines + + +Boolean + + + + + + <optional>
+ + + +
+ + [] + +

Show additional grid lines along y axis.
+ This option accepts array including object that has value, text, position and class.

y.ticks + + +Boolean + + + + + + <optional>
+ + + +
+ + 10 + +
focus.show + + +Boolean + + + + + + <optional>
+ + + +
+ + true + +

Show grids when focus.

lines.front + + +Boolean + + + + + + <optional>
+ + + +
+ + true + +
+ + + + + + +
+

Set related options

+
+ + + +
Type:
+
    +
  • + +Object + + +
  • +
+ + + + + +
Example
+ +
grid: {
  x: {
    show: true,
    lines: [
      {value: 2, text: "Label on 2"},
      {value: 5, text: "Label on 5", class: "label-5"}
      {value: 6, text: "Label on 6", position: "start"}
    ]
  },
	 y: {
    show: true,
    lines: [
      {value: 100, text: "Label on 100"},
      {value: 200, text: "Label on 200", class: "label-200"}
      {value: 300, text: "Label on 300", position: 'middle'}
    ],
    ticks: 5
  },
  focus: {
     show: false
  },
  lines: {
     front: false
  }
}
+ + + + + +

(static) interaction :Object

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeAttributesDefaultDescription
interaction.enabled + + +Boolean + + + + + + <optional>
+ + + +
+ + true + +

Indicate if the chart should have interactions.
+ If false is set, all of interactions (showing/hiding tooltip, selection, mouse events, etc) will be disabled.

interaction.brighten + + +Boolean + + + + + + <optional>
+ + + +
+ + true + +
interaction.inputType.mouse + + +Boolean + + + + + + <optional>
+ + + +
+ + true + +

enable or disable mouse interaction

interaction.inputType.touch + + +Boolean + + + + + + <optional>
+ + + +
+ + true + +

enable or disable touch interaction

+ + + + + + +
+

Interaction options

+
+ + + +
Type:
+
    +
  • + +Object + + +
  • +
+ + + + + +
Example
+ +
interaction: {
   enabled: false,
   inputType: {
       mouse: true,
       touch: false
   }
}
+ + + + + +

(static) legend :Object

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeAttributesDefaultDescription
legend.show + + +Boolean + + + + + + <optional>
+ + + +
+ + true + +

Show or hide legend.

legend.hide + + +Boolean + + + + + + <optional>
+ + + +
+ + false + +

Hide legend + If true given, all legend will be hidden. If string or array given, only the legend that has the id will be hidden.

legend.position + + +String + + + + + + <optional>
+ + + +
+ + bottom + +

Change the position of legend.
+ Available values are: bottom, right and inset are supported.

legend.inset + + +Object + + + + + + <optional>
+ + + +
+ + {anchor: 'top-left',x: 10,y: 0,step: undefined} + +

Change inset legend attributes.
+ This option accepts object that has the keys anchor, x, y and step. + anchor decides the position of the legend. These anchors are available:

+
 - top-left
+ - top-right
+ - bottom-left
+ - bottom-right

x and y set the position of the legend based on the anchor.
+ step defines the max step the lagend has (e.g. If 2 set and legend has 3 legend item, the legend 2 columns).

legend.item.onclick + + +function + + + + + + <optional>
+ + + +
+ +

Set click event handler to the legend item.

legend.item.onover + + +function + + + + + + <optional>
+ + + +
+ +

Set mouse/touch over event handler to the legend item.

legend.item.onout + + +function + + + + + + <optional>
+ + + +
+ +

Set mouse/touch out event handler to the legend item.

+ + + + + + +
+

Legend options

+
+ + + +
Type:
+
    +
  • + +Object + + +
  • +
+ + + + + +
Example
+ +
legend: {
     show: true,
     hide: true,
     //or hide: "data1"
     //or hide: ["data1", "data2"]
     position: "bottom",  // bottom, right, inset
     inset: {
         anchor: "top-right"  // top-left, top-right, bottom-left, bottom-right
         x: 20,
         y: 10,
         step: 2
     },
     onclick: function(id) { ... },
     onover: function(id) { ... },
     onout: function(id) { ... }
 }
+ + + + + +

(static) line :Object

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeAttributesDefaultDescription
line.connectNull + + +Boolean + + + + + + <optional>
+ + + +
+ + false + +

Set if null data point will be connected or not.
+ If true set, the region of null data will be connected without any data point. If false set, the region of null data will not be connected and get empty.

line.step_type + + +Boolean + + + + + + <optional>
+ + + +
+ + step + +

Change step type for step chart.
+Available values:

+
    +
  • step
  • +
  • step-before
  • +
  • step-after
  • +
+ + + + + + +
+

Set line options

+
+ + + +
Type:
+
    +
  • + +Object + + +
  • +
+ + + + + +
Example
+ +
line: {
     connectNull: true,
     step: {
         type: "step-after"
     }
 }
+ + + + + +

(static) oninit :function

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • function(){}
  • +
+ + + + + + + +
+ + + + + +
+

Set a callback to execute when the chart is initialized.

+
+ + + +
Type:
+
    +
  • + +function + + +
  • +
+ + + + + +
Example
+ +
oninit: function() {
  ...
}
+ + + + + +

(static) onout :function

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • function(){}
  • +
+ + + + + + + +
+ + + + + +
+

Set a callback to execute when mouse/touch leaves the chart.

+
+ + + +
Type:
+
    +
  • + +function + + +
  • +
+ + + + + +
Example
+ +
onout: function() {
  ...
}
+ + + + + +

(static) onover :function

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • function(){}
  • +
+ + + + + + + +
+ + + + + +
+

Set a callback to execute when mouse/touch enters the chart.

+
+ + + +
Type:
+
    +
  • + +function + + +
  • +
+ + + + + +
Example
+ +
onover: function() {
  ...
}
+ + + + + +

(static) onrendered :function

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • function(){}
  • +
+ + + + + + + +
+ + + + + +
+

Set a callback which is executed when the chart is rendered. Basically, this callback will be called in each time when the chart is redrawed.

+
+ + + +
Type:
+
    +
  • + +function + + +
  • +
+ + + + + +
Example
+ +
onrendered: function() {
  ...
}
+ + + + + +

(static) onresize :function

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • function(){}
  • +
+ + + + + + + +
+ + + + + +
+

Set a callback to execute when user resizes the screen.

+
+ + + +
Type:
+
    +
  • + +function + + +
  • +
+ + + + + +
Example
+ +
onresize: function() {
  ...
}
+ + + + + +

(static) onresized :function

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • function(){}
  • +
+ + + + + + + +
+ + + + + +
+

SSet a callback to execute when screen resize finished.

+
+ + + +
Type:
+
    +
  • + +function + + +
  • +
+ + + + + +
Example
+ +
onresized: function() {
  ...
}
+ + + + + +

(static) padding :Object

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeAttributesDescription
padding.top + + +Number + + + + + + <optional>
+ + + +

padding on the top of chart

padding.right + + +Number + + + + + + <optional>
+ + + +

padding on the right of chart

padding.bottom + + +Number + + + + + + <optional>
+ + + +

padding on the bottom of chart

padding.left + + +Number + + + + + + <optional>
+ + + +

padding on the left of chart

+ + + + + + +
+

The padding of the chart element.

+
+ + + +
Type:
+
    +
  • + +Object + + +
  • +
+ + + + + +
Example
+ +
padding: {
  top: 20,
  right: 20,
  bottom: 20,
  left: 20
}
+ + + + + +

(static) pie :Object

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeAttributesDefaultDescription
pie.label.show + + +Boolean + + + + + + <optional>
+ + + +
+ + true + +

Show or hide label on each pie piece.

pie.label.format + + +function + + + + + + <optional>
+ + + +
+ +

Set formatter for the label on each pie piece.

pie.label.threshold + + +Number + + + + + + <optional>
+ + + +
+ + 0.05 + +

Set threshold to show/hide labels.

pie.expand + + +Boolean + + + + + + <optional>
+ + + +
+ + true + +

Enable or disable expanding pie pieces.

pie.padAngle + + +Number + + + + + + <optional>
+ + + +
+ + 0 + +

Set padding between data.

+ + + + + + +
+

Set pie options

+
+ + + +
Type:
+
    +
  • + +Object + + +
  • +
+ + + + + +
Example
+ +
pie: {
     label: {
         show: false,
         format: function(value, ratio, id) {
             return d3.format("$")(value);
         },
         threshold: 0.1
     },
     expand: false,
     padAngle: 0.1
 }
+ + + + + +

(static) point :Object

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeAttributesDefaultDescription
point.show + + +Boolean + + + + + + <optional>
+ + + +
+ + true + +

Whether to show each point in line.

point.r + + +Number + + + + + + <optional>
+ + + +
+ + 2.5 + +

The radius size of each point.

point.focus.expand.enabled + + +Boolean + + + + + + <optional>
+ + + +
+ + true + +

Whether to expand each point on focus.

point.focus.expand.r + + +Boolean + + + + + + <optional>
+ + + +
+ + point.r*1.75 + +

The radius size of each point on focus.

point.select.r + + +Number + + + + + + <optional>
+ + + +
+ + point.r*4 + +

The radius size of each point on selected.

+ + + + + + +
+

Set point options

+
+ + + +
Type:
+
    +
  • + +Object + + +
  • +
+ + + + + +
Example
+ +
point: {
     show: false,
     r: 5,
     focus: {
         expand: {
             enabled: true,
             r: 1
         }
     },
     select: {
         r: 3
     }
 }
+ + + + + +

(static) regions :Array

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Default Value:
+
    +
  • []
  • +
+ + + + + + + +
+ + + + + +
+

Show rectangles inside the chart.

+This option accepts array including object that has axis, start, end and class. The keys start, end and class are optional. +axis must be x, y or y2. start and end should be the value where regions start and end. If not specified, the edge values will be used. If timeseries x axis, date string, Date object and unixtime integer can be used. If class is set, the region element will have it as class.

+
+ + + +
Type:
+
    +
  • + +Array + + +
  • +
+ + + + + +
Example
+ +
regions: [
	 {
	     axis: "x",
	     start: 1,
	     end: 4,
	     class: "region-1-4"
	 }
 ]
+ + + + + +

(static) resize :Object

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeAttributesDefaultDescription
resize.auto + + +Boolean + + + + + + <optional>
+ + + +
+ + true + +

Set chart resize automatically on viewport changes.

+ + + + + + +
+

Set chart resize options

+
+ + + +
Type:
+
    +
  • + +Object + + +
  • +
+ + + + + +
Example
+ +
resize: {
     auto: false
 }
+ + + + + +

(static) size :Object

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeAttributesDescription
size.width + + +Number + + + + + + <optional>
+ + + +

width of the chart element

size.height + + +Number + + + + + + <optional>
+ + + +

height of the chart element

+ + + + + + +
+

The desired size of the chart element. +If value is not specified, the width of the chart will be calculated by the size of the parent element it's appended to.

+
+ + + +
Type:
+
    +
  • + +Object + + +
  • +
+ + + + + +
Example
+ +
size: {
  width: 640,
  height: 480
}
+ + + + + +

(static) spline :Object

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeAttributesDefaultDescription
spline.interpolation.type + + +String + + + + + + <optional>
+ + + +
+ + cardinal + +
+ + + + + + +
+

Set spline options

+
+ + + +
Type:
+
    +
  • + +Object + + +
  • +
+ + + + + +
Example
+ +
spline: {
     interpolation: {
         type: "cardinal"
     }
 }
+ + + + + +

(static) subchart :Object

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeAttributesDefaultDescription
subchart.show + + +Boolean + + + + + + <optional>
+ + + +
+ + false + +

Show sub chart on the bottom of the chart.

subchart.size.height + + +Boolean + + + + + + <optional>
+ + + +
+ +

Change the height of the subchart.

subchart.onbrush + + +Boolean + + + + + + <optional>
+ + + +
+ +

Set callback for brush event.
+ Specified function receives the current zoomed x domain.

+ + + + + + +
+

Set subchart options

+
+ + + +
Type:
+
    +
  • + +Object + + +
  • +
+ + + + + +
Example
+ +
subchart: {
     show: true,
     size: {
         height: 20
     },
     onbrush: function(domain) { ... }
 }
+ + + + + +

(static) svg :Object

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeAttributesDescription
svg.classname + + +String + + + + + + <optional>
+ + + +

class name for svg element

+ + + + + + +
+

Set svg element's class name

+
+ + + +
Type:
+
    +
  • + +Object + + +
  • +
+ + + + + +
Example
+ +
svg: {
  classname: "test_class"
}
+ + + + + +

(static) title :Object

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeAttributesDefaultDescription
title.text + + +String + + + + + + <optional>
+ + + +
+ +
title.padding.top + + +Number + + + + + + <optional>
+ + + +
+ + 0 + +
title.padding.right + + +Number + + + + + + <optional>
+ + + +
+ + 0 + +
title.padding.bottom + + +Number + + + + + + <optional>
+ + + +
+ + 0 + +
title.padding.left + + +Number + + + + + + <optional>
+ + + +
+ + 0 + +
title.position + + +String + + + + + + <optional>
+ + + +
+ + top-center + +
+ + + + + + +
+

Set title options

+
+ + + +
Type:
+
    +
  • + +Object + + +
  • +
+ + + + + +
Example
+ +
title: {
     text: "Title Text",
     padding: {
         top: 10,
         right: 10,
         bottom: 10,
         left: 10
     },
     position: "top-center"
 }
+ + + + + +

(static) tooltip :Object

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeAttributesDefaultDescription
tooltip.show + + +Boolean + + + + + + <optional>
+ + + +
+ + true + +

Show or hide tooltip.

tooltip.grouped + + +Boolean + + + + + + <optional>
+ + + +
+ + true + +

Set if tooltip is grouped or not for the data points.

tooltip.format.title + + +function + + + + + + <optional>
+ + + +
+ +

Set format for the title of tooltip.
+ Specified function receives x of the data point to show.

tooltip.format.name + + +function + + + + + + <optional>
+ + + +
+ +

Set format for the name of each data in tooltip.
+ Specified function receives name, ratio, id and index of the data point to show. ratio will be undefined if the chart is not donut/pie/gauge.

tooltip.format.value + + +function + + + + + + <optional>
+ + + +
+ +

Set format for the value of each data in tooltip.
+ Specified function receives name, ratio, id and index of the data point to show. ratio will be undefined if the chart is not donut/pie/gauge. + If undefined returned, the row of that value will be skipped.

tooltip.position + + +function + + + + + + <optional>
+ + + +
+ +

Set custom position for the tooltip.
+ This option can be used to modify the tooltip position by returning object that has top and left.

tooltip.contents + + +function + + + + + + <optional>
+ + + +
+ +

Set custom HTML for the tooltip.
+ Specified function receives data, defaultTitleFormat, defaultValueFormat and color of the data point to show. If tooltip.grouped is true, data includes multiple data points.

+ + + + + + +
+

Tooltip options

+
+ + + +
Type:
+
    +
  • + +Object + + +
  • +
+ + + + + +
Example
+ +
tooltip: {
     show: true,
     grouped: false,
     format: {
         title: function(x) { return "Data " + x; },
         name: function(name, ratio, id, index) { return name; },
         value: function(value, ratio, id, index) { return ratio; }
     },
     position: function(data, width, height, element) {
         return {top: 0, left: 0}
     },
     contents: function(d, defaultTitleFormat, defaultValueFormat, color) {
         return ... // formatted html as you want
     }
 }
+ + + + + +

(static) transition :Object

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeAttributesDefaultDescription
transition.duration + + +Number + + + + + + <optional>
+ + + +
+ + 350 + +

duration in milliseconds

+ + + + + + +
+

Set duration of transition (in milliseconds) for chart animation.

+NOTE:If 0or null set, transition will be skipped. So, this makes initial rendering faster especially in case you have a lot of data.

+
+ + + +
Type:
+
    +
  • + +Object + + +
  • +
+ + + + + +
Example
+ +
transition: {
 duration: 500
}
+ + + + + +

(static) zoom :Object

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeAttributesDefaultDescription
zoom.enabled + + +Boolean + + + + + + <optional>
+ + + +
+ + false + +

Enable zooming.

zoom.rescale + + +Boolean + + + + + + <optional>
+ + + +
+ + false + +

Enable to rescale after zooming.
+ If true set, y domain will be updated according to the zoomed region.

zoom.extent + + +Array + + + + + + <optional>
+ + + +
+ + [1, 10] + +

Change zoom extent.

zoom.onzoom + + +function + + + + + + <optional>
+ + + +
+ + function(){} + +

Set callback that is called when the chart is zooming.
+ Specified function receives the zoomed domain.

zoom.onzoomstart + + +function + + + + + + <optional>
+ + + +
+ + function(){} + +

Set callback that is called when zooming starts.
+ Specified function receives the zoom event.

zoom.onzoomend + + +function + + + + + + <optional>
+ + + +
+ + function(){} + +

Set callback that is called when zooming ends.
+ Specified function receives the zoomed domain.

+ + + + + + +
+

Set zoom options

+
+ + + +
Type:
+
    +
  • + +Object + + +
  • +
+ + + + + +
Example
+ +
zoom: {
     enabled: true,
     rescale: true,
     extent: [1, 100]  // enable more zooming
     onzoom: function(domain) { ... },
     onzoomstart: function(event) { ... },
     onzoomend: function(domain) { ... }
 }
+ + + + + + + + + + + +
+ +
+ + + + +
+ +
+ + + + + + + \ No newline at end of file diff --git a/doc/bb.html b/doc/bb.html new file mode 100644 index 000000000..1fa30f4f5 --- /dev/null +++ b/doc/bb.html @@ -0,0 +1,436 @@ + + + + + bb - Documentation + + + + + + + + + + + + + + + + +
+ +

bb

+ + + + + + + +
+ +
+ +

+ bb +

+ + +
+ +
+
+ + + +
+ + +
Source:
+
+ + + +
Version:
+
  • 1.0.0
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + +
+ + + + + + + + + + + + +

Members

+ + + +

(static) version

+ + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
version + + +String + + + +

version

+ + + + + + +
+

Version information

+
+ + + + + + + +
Example
+ +
bb.version;  // "1.0.0"
+ + + + + + + +

Methods

+ + + + + + +

(static) generate(options) → {Chart}

+ + + + + + +
+ + +
Source:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
See:
+
+
    +
  • Options for different generation options
  • + +
  • Chart for different methods API
  • +
+
+ + + +
+ + + + + +
+

generate charts

+
+ + + + + + + + + +
Examples
+ +
<!-- chart holder -->
<div id="LineChart"></div>
+ +
// generate chart with options
 var chart = bb.generate({
     "bindto": "#LineChart"
     "data": {
         "columns": [
             ["data1", 30, 200, 100, 400, 150, 250],
             ["data2", 50, 20, 10, 40, 15, 25]
          ]
     }
 });

 // call some API
 // ex) get the data of 'data1'
 chart.data("data1");
+ + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
options + + +Options + + + +

chart options

+ + + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +Chart + + +
+
+ + + + + + + + + + +
+ +
+ + + + +
+ +
+ + + + + + + \ No newline at end of file diff --git a/doc/billboard.js.html b/doc/billboard.js.html new file mode 100644 index 000000000..ae2fee07b --- /dev/null +++ b/doc/billboard.js.html @@ -0,0 +1,10050 @@ + + + + + billboard.js - Documentation + + + + + + + + + + + + + + + + +
+ +

billboard.js

+ + + + + + + +
+
+
/*!
+ * Copyright (c) 2017 NAVER Corp.
+ * billboard.js project is licensed under the MIT license
+ * 
+ * billboard.js, JavaScript chart library
+ * http://naver.github.io/billboard.js/
+ * 
+ * @version 1.0.0
+ */
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory(require("d3"));
+	else if(typeof define === 'function' && define.amd)
+		define(["d3"], factory);
+	else {
+		var a = typeof exports === 'object' ? factory(require("d3")) : factory(root["d3"]);
+		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
+	}
+})(this, function(__WEBPACK_EXTERNAL_MODULE_2__) {
+return /******/ (function(modules) { // webpackBootstrap
+/******/ 	// The module cache
+/******/ 	var installedModules = {};
+/******/
+/******/ 	// The require function
+/******/ 	function __webpack_require__(moduleId) {
+/******/
+/******/ 		// Check if module is in cache
+/******/ 		if(installedModules[moduleId]) {
+/******/ 			return installedModules[moduleId].exports;
+/******/ 		}
+/******/ 		// Create a new module (and put it into the cache)
+/******/ 		var module = installedModules[moduleId] = {
+/******/ 			i: moduleId,
+/******/ 			l: false,
+/******/ 			exports: {}
+/******/ 		};
+/******/
+/******/ 		// Execute the module function
+/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ 		// Flag the module as loaded
+/******/ 		module.l = true;
+/******/
+/******/ 		// Return the exports of the module
+/******/ 		return module.exports;
+/******/ 	}
+/******/
+/******/
+/******/ 	// expose the modules object (__webpack_modules__)
+/******/ 	__webpack_require__.m = modules;
+/******/
+/******/ 	// expose the module cache
+/******/ 	__webpack_require__.c = installedModules;
+/******/
+/******/ 	// identity function for calling harmony imports with the correct context
+/******/ 	__webpack_require__.i = function(value) { return value; };
+/******/
+/******/ 	// define getter function for harmony exports
+/******/ 	__webpack_require__.d = function(exports, name, getter) {
+/******/ 		if(!__webpack_require__.o(exports, name)) {
+/******/ 			Object.defineProperty(exports, name, {
+/******/ 				configurable: false,
+/******/ 				enumerable: true,
+/******/ 				get: getter
+/******/ 			});
+/******/ 		}
+/******/ 	};
+/******/
+/******/ 	// getDefaultExport function for compatibility with non-harmony modules
+/******/ 	__webpack_require__.n = function(module) {
+/******/ 		var getter = module && module.__esModule ?
+/******/ 			function getDefault() { return module['default']; } :
+/******/ 			function getModuleExports() { return module; };
+/******/ 		__webpack_require__.d(getter, 'a', getter);
+/******/ 		return getter;
+/******/ 	};
+/******/
+/******/ 	// Object.prototype.hasOwnProperty.call
+/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ 	// __webpack_public_path__
+/******/ 	__webpack_require__.p = "";
+/******/
+/******/ 	// Load entry module and return exports
+/******/ 	return __webpack_require__(__webpack_require__.s = 59);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+exports.__esModule = !0;
+exports.isObject = exports.isArray = exports.merge = exports.getRectSegList = exports.removeEvent = exports.addEvent = exports.extend = exports.brushEmpty = exports.getBrushSelection = exports.isEmpty = exports.diffDomain = exports.getPathBox = exports.sanitise = exports.hasValue = exports.isString = exports.getOption = exports.asHalfPixel = exports.isFunction = exports.ceil10 = exports.notEmpty = exports.isUndefined = exports.isDefined = exports.isValue = undefined;
+
+var _typeof2 = __webpack_require__(5),
+    _typeof3 = _interopRequireDefault(_typeof2),
+    _d = __webpack_require__(2),
+    _classes = __webpack_require__(3),
+    _classes2 = _interopRequireDefault(_classes);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/**
+ * Copyright (c) 2017 NAVER Corp.
+ * billboard.js project is licensed under the MIT license
+ */
+var isValue = function (v) {
+	return v || v === 0;
+},
+    isFunction = function (o) {
+	return typeof o === "function";
+},
+    isString = function (o) {
+	return typeof o === "string";
+},
+    isUndefined = function (v) {
+	return typeof v === "undefined";
+},
+    isDefined = function (v) {
+	return typeof v !== "undefined";
+},
+    ceil10 = function (v) {
+	return Math.ceil(v / 10) * 10;
+},
+    asHalfPixel = function (n) {
+	return Math.ceil(n) + 0.5;
+},
+    diffDomain = function (d) {
+	return d[1] - d[0];
+},
+    isEmpty = function (o) {
+	return typeof o === "undefined" || o === null || isString(o) && o.length === 0 || (typeof o === "undefined" ? "undefined" : (0, _typeof3.default)(o)) === "object" && Object.keys(o).length === 0;
+},
+    notEmpty = function (o) {
+	return !isEmpty(o);
+},
+    getOption = function (options, key, defaultValue) {
+	return isDefined(options[key]) ? options[key] : defaultValue;
+},
+    hasValue = function (dict, value) {
+	var found = !1;
+
+	return Object.keys(dict).forEach(function (key) {
+		return dict[key] === value && (found = !0);
+	}), found;
+},
+    sanitise = function (str) {
+	return typeof str === "string" ? str.replace(/</g, "&lt;").replace(/>/g, "&gt;") : str;
+},
+    getRectSegList = function (path) {
+	/*
+  * seg1 ---------- seg2
+  *   |               |
+  *   |               |
+  *   |               |
+  * seg0 ---------- seg3
+  * */
+	var bbox = path.getBBox(),
+	    list = [];
+
+	// seg0
+
+
+	return list.push({
+		x: bbox.x,
+		y: bbox.y + bbox.height
+	}), list.push({
+		x: bbox.x,
+		y: bbox.y
+	}), list.push({
+		x: bbox.x + bbox.width,
+		y: bbox.y
+	}), list.push({
+		x: bbox.x + bbox.width,
+		y: bbox.y + bbox.height
+	}), list;
+},
+    getPathBox = function (path) {
+	var box = path.getBoundingClientRect(),
+	    items = getRectSegList(path),
+	    minX = items[0].x,
+	    minY = Math.min(items[0].y, items[1].y);
+
+
+	return {
+		x: minX,
+		y: minY,
+		width: box.width,
+		height: box.height
+	};
+},
+    getBrushSelection = function () {
+	var selection = null,
+	    event = _d.event;
+
+	// check from event
+
+
+	return event && event.constructor.name === "BrushEvent" ? selection = event.selection : this.context && (selection = this.context.select("." + _classes2.default.brush).node()) && (selection = (0, _d.brushSelection)(selection)), selection;
+},
+    brushEmpty = function () {
+	var selection = this.getBrushSelection();
+
+	return !selection || selection[0] === selection[1];
+};
+
+// substitution of SVGPathSeg API polyfill
+
+
+// return brush selection array
+
+
+function extend() {
+	var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
+	    source = arguments[1],
+	    p = void 0;
+
+
+	for (p in source) target[p] = source[p];
+	return target;
+}
+
+var SUPPORT_ADDEVENTLISTENER = !!("addEventListener" in document),
+    SUPPORT_PASSIVE = function () {
+	var supportsPassiveOption = !1;
+
+	try {
+		SUPPORT_ADDEVENTLISTENER && Object.defineProperty && document.addEventListener("test", null, Object.defineProperty({}, "passive", {
+			get: function get() {
+				supportsPassiveOption = !0;
+			}
+		}));
+	} catch (e) {}
+	return supportsPassiveOption;
+}();
+
+
+function addEvent(element, type, handler, eventListenerOptions) {
+	if (SUPPORT_ADDEVENTLISTENER) {
+		var options = eventListenerOptions || !1;
+
+		(typeof eventListenerOptions === "undefined" ? "undefined" : (0, _typeof3.default)(eventListenerOptions)) === "object" && (options = !!SUPPORT_PASSIVE && eventListenerOptions), element.addEventListener(type, handler, options);
+	} else element.attachEvent ? element.attachEvent("on" + type, handler) : element["on" + type] = handler;
+}
+
+function removeEvent(element, type, handler) {
+	element.removeEventListener ? element.removeEventListener(type, handler, !1) : element.detachEvent ? element.detachEvent("on" + type, handler) : element["on" + type] = null;
+}
+
+/**
+ * Check if is array
+ * @param arr *
+ * @returns {Boolean}
+ * @private
+ */
+var isArray = function (arr) {
+	return arr && arr.constructor === Array;
+},
+    isObject = function (obj) {
+	return obj && !obj.nodeType && (typeof obj === "undefined" ? "undefined" : (0, _typeof3.default)(obj)) === "object" && !isArray(obj);
+},
+    merge = function (target) {
+	for (var _len = arguments.length, objectN = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) objectN[_key - 1] = arguments[_key];
+
+	if (!objectN.length || objectN.length === 1 && !objectN[0]) return target;
+
+	var source = objectN.shift();
+
+	return isObject(target) && isObject(source) && Object.keys(source).forEach(function (key) {
+		var value = source[key];
+
+		isObject(value) ? (!target[key] && (target[key] = {}), target[key] = merge(target[key], value)) : target[key] = isArray(value) ? value.concat() : value;
+	}), extend.apply(undefined, [target].concat(objectN));
+};
+
+/**
+ * Check if is object
+ * @param {Object} obj
+ * @returns {Boolean}
+ * @private
+ */
+
+
+/**
+ * Merge object returning new object
+ * @param {Object} target
+ * @param {Object} objectN
+ * @returns {Object} merged target object
+ * @private
+ * @example
+ *  var target = { a: 1 };
+ *  utils.extend(target, { b: 2, c: 3 });
+ *  target;  // { a: 1, b: 2, c: 3 };
+ */
+exports.isValue = isValue;
+exports.isDefined = isDefined;
+exports.isUndefined = isUndefined;
+exports.notEmpty = notEmpty;
+exports.ceil10 = ceil10;
+exports.isFunction = isFunction;
+exports.asHalfPixel = asHalfPixel;
+exports.getOption = getOption;
+exports.isString = isString;
+exports.hasValue = hasValue;
+exports.sanitise = sanitise;
+exports.getPathBox = getPathBox;
+exports.diffDomain = diffDomain;
+exports.isEmpty = isEmpty;
+exports.getBrushSelection = getBrushSelection;
+exports.brushEmpty = brushEmpty;
+exports.extend = extend;
+exports.addEvent = addEvent;
+exports.removeEvent = removeEvent;
+exports.getRectSegList = getRectSegList;
+exports.merge = merge;
+exports.isArray = isArray;
+exports.isObject = isObject;
+
+/***/ }),
+/* 1 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+exports.__esModule = !0;
+
+var _classCallCheck2 = __webpack_require__(6),
+    _classCallCheck3 = _interopRequireDefault(_classCallCheck2),
+    _d = __webpack_require__(2),
+    _Axis = __webpack_require__(7),
+    _Axis2 = _interopRequireDefault(_Axis),
+    _classes = __webpack_require__(3),
+    _classes2 = _interopRequireDefault(_classes),
+    _util = __webpack_require__(0);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/**
+ * Internal chart class.
+ * - Note: Instantiated internally, not exposed for public.
+ * @class ChartInternal
+ * @ignore
+ * @private
+*/
+/**
+ * Copyright (c) 2017 NAVER Corp.
+ * billboard.js project is licensed under the MIT license
+ */
+var ChartInternal = function () {
+	function ChartInternal(api) {
+		(0, _classCallCheck3.default)(this, ChartInternal);
+
+		var $$ = this;
+
+		$$.api = api, $$.config = $$.getOptions(), $$.data = {}, $$.cache = {}, $$.axes = {};
+	}
+
+	return ChartInternal.prototype.beforeInit = function beforeInit() {
+		// can do something
+	}, ChartInternal.prototype.afterInit = function afterInit() {
+		// can do something
+	}, ChartInternal.prototype.init = function init() {
+		var $$ = this,
+		    config = $$.config;
+
+
+		if ($$.initParams(), config.data_url) $$.convertUrlToData(config.data_url, config.data_mimeType, config.data_headers, config.data_keys, $$.initWithData);else if (config.data_json) $$.initWithData($$.convertJsonToData(config.data_json, config.data_keys));else if (config.data_rows) $$.initWithData($$.convertRowsToData(config.data_rows));else if (config.data_columns) $$.initWithData($$.convertColumnsToData(config.data_columns));else throw Error("url or json or rows or columns is required.");
+	}, ChartInternal.prototype.initParams = function initParams() {
+		var $$ = this,
+		    config = $$.config;
+		$$.clipId = "bb-" + +new Date() + "-clip", $$.clipIdForXAxis = $$.clipId + "-xaxis", $$.clipIdForYAxis = $$.clipId + "-yaxis", $$.clipIdForGrid = $$.clipId + "-grid", $$.clipIdForSubchart = $$.clipId + "-subchart", $$.clipPath = $$.getClipPath($$.clipId), $$.clipPathForXAxis = $$.getClipPath($$.clipIdForXAxis), $$.clipPathForYAxis = $$.getClipPath($$.clipIdForYAxis), $$.clipPathForGrid = $$.getClipPath($$.clipIdForGrid), $$.clipPathForSubchart = $$.getClipPath($$.clipIdForSubchart), $$.dragStart = null, $$.dragging = !1, $$.flowing = !1, $$.cancelClick = !1, $$.mouseover = !1, $$.transiting = !1, $$.color = $$.generateColor(), $$.levelColor = $$.generateLevelColor(), $$.dataTimeFormat = config.data_xLocaltime ? _d.timeParse : _d.utcParse, $$.axisTimeFormat = config.axis_x_localtime ? _d.timeFormat : _d.utcFormat, $$.defaultAxisTimeFormat = function (d) {
+			var specifier = d.getMilliseconds() && ".%L" || d.getSeconds() && ".:%S" || d.getMinutes() && "%I:%M" || d.getHours() && "%I %p" || d.getDay() && d.getDate() !== 1 && "%-m/%-d" || d.getDate() !== 1 && "%b %d" || d.getMonth() && "%-m/%-d" || "%Y/%-m/%-d";
+
+			return $$.axisTimeFormat(specifier)(d);
+		}, $$.hiddenTargetIds = [], $$.hiddenLegendIds = [], $$.focusedTargetIds = [], $$.defocusedTargetIds = [], $$.xOrient = config.axis_rotated ? "left" : "bottom", $$.yOrient = config.axis_rotated ? config.axis_y_inner ? "top" : "bottom" : config.axis_y_inner ? "right" : "left", $$.y2Orient = config.axis_rotated ? config.axis_y2_inner ? "bottom" : "top" : config.axis_y2_inner ? "left" : "right", $$.subXOrient = config.axis_rotated ? "left" : "bottom", $$.isLegendRight = config.legend_position === "right", $$.isLegendInset = config.legend_position === "inset", $$.isLegendTop = config.legend_inset_anchor === "top-left" || config.legend_inset_anchor === "top-right", $$.isLegendLeft = config.legend_inset_anchor === "top-left" || config.legend_inset_anchor === "bottom-left", $$.legendStep = 0, $$.legendItemWidth = 0, $$.legendItemHeight = 0, $$.currentMaxTickWidths = {
+			x: 0,
+			y: 0,
+			y2: 0
+		}, $$.rotated_padding_left = 30, $$.rotated_padding_right = config.axis_rotated && !config.axis_x_show ? 0 : 30, $$.rotated_padding_top = 5, $$.withoutFadeIn = {}, $$.intervalForObserveInserted = undefined, $$.inputType = $$.convertInputType(), $$.axes.subx = (0, _d.selectAll)([]);
+	}, ChartInternal.prototype.initWithData = function initWithData(data) {
+		var $$ = this,
+		    config = $$.config,
+		    binding = !0;
+		$$.axis = new _Axis2.default($$), $$.initPie && $$.initPie(), $$.initBrush && $$.initBrush(), $$.initZoom && $$.initZoom(), $$.selectChart = config.bindto ? typeof config.bindto.node === "function" ? config.bindto : (0, _d.select)(config.bindto) : (0, _d.selectAll)([]), $$.selectChart.empty() && ($$.selectChart = (0, _d.select)(document.createElement("div")).style("opacity", "0"), $$.observeInserted($$.selectChart), binding = !1), $$.selectChart.html("").classed("bb", !0), $$.data.xs = {}, $$.data.targets = $$.convertDataToTargets(data), config.data_filter && ($$.data.targets = $$.data.targets.filter(config.data_filter)), config.data_hide && $$.addHiddenTargetIds(config.data_hide === !0 ? $$.mapToIds($$.data.targets) : config.data_hide), config.legend_hide && $$.addHiddenLegendIds(config.legend_hide === !0 ? $$.mapToIds($$.data.targets) : config.legend_hide), $$.hasType("gauge") && (config.legend_show = !1), $$.updateSizes(), $$.updateScales(), $$.x.domain((0, _d.extent)($$.getXDomain($$.data.targets))), $$.y.domain($$.getYDomain($$.data.targets, "y")), $$.y2.domain($$.getYDomain($$.data.targets, "y2")), $$.subX.domain($$.x.domain()), $$.subY.domain($$.y.domain()), $$.subY2.domain($$.y2.domain()), $$.orgXDomain = $$.x.domain();
+
+
+		// -- Basic Elements --
+
+		var isTouch = $$.inputType === "touch";
+
+		// Define svg
+		$$.svg = $$.selectChart.append("svg").style("overflow", "hidden").on(isTouch ? "touchstart" : "mouseenter", function () {
+			return config.onover.call($$);
+		}).on(isTouch ? "touchend" : "mouseleave", function () {
+			return config.onout.call($$);
+		}), $$.config.svg_classname && $$.svg.attr("class", $$.config.svg_classname);
+
+
+		// Define defs
+		var defs = $$.svg.append("defs");
+
+		$$.clipChart = $$.appendClip(defs, $$.clipId), $$.clipXAxis = $$.appendClip(defs, $$.clipIdForXAxis), $$.clipYAxis = $$.appendClip(defs, $$.clipIdForYAxis), $$.clipGrid = $$.appendClip(defs, $$.clipIdForGrid), $$.clipSubchart = $$.appendClip(defs, $$.clipIdForSubchart), $$.updateSvgSize();
+
+
+		// Set initialized scales to brush and zoom
+		// if ($$.brush) { $$.brush.scale($$.subX); }
+		// if (config.zoom_enabled) { $$.zoom.scale($$.x); }
+
+		// Define regions
+		var main = $$.svg.append("g").attr("transform", $$.getTranslate("main"));
+
+		$$.main = main, config.subchart_show && $$.initSubchart && $$.initSubchart(), $$.initTooltip && $$.initTooltip(), $$.initLegend && $$.initLegend(), $$.initTitle && $$.initTitle(), main.append("text").attr("class", _classes2.default.text + " " + _classes2.default.empty).attr("text-anchor", "middle" // horizontal centering of text at x position in all browsers.
+		).attr("dominant-baseline", "middle"), $$.initRegion(), $$.initGrid(), main.append("g").attr("clip-path", $$.clipPath).attr("class", _classes2.default.chart), config.grid_lines_front && $$.initGridLines(), $$.initEventRect(), $$.initChartElements(), main.insert("rect", config.zoom_privileged ? null : "g." + _classes2.default.regions).attr("class", _classes2.default.zoomRect).attr("width", $$.width).attr("height", $$.height).style("opacity", "0").on("dblclick.zoom", null), config.axis_x_extent && $$.brush.scale($$.getDefaultExtent()), $$.axis.init(), $$.updateTargets($$.data.targets), binding && ($$.updateDimension(), $$.config.oninit.call($$), $$.redraw({
+			withTransition: !1,
+			withTransform: !0,
+			withUpdateXDomain: !0,
+			withUpdateOrgXDomain: !0,
+			withTransitionForAxis: !1
+		})), $$.bindResize(), $$.api.element = $$.selectChart.node();
+	}, ChartInternal.prototype.initChartElements = function initChartElements() {
+		this.initBar && this.initBar(), this.initLine && this.initLine(), this.initArc && this.initArc(), this.initGauge && this.initGauge(), this.initText && this.initText();
+	}, ChartInternal.prototype.smoothLines = function smoothLines(el, type) {
+		type === "grid" && el.each(function () {
+			var g = (0, _d.select)(this),
+			    x1 = g.attr("x1"),
+			    x2 = g.attr("x2"),
+			    y1 = g.attr("y1"),
+			    y2 = g.attr("y2");
+			g.attr({
+				"x1": Math.ceil(x1),
+				"x2": Math.ceil(x2),
+				"y1": Math.ceil(y1),
+				"y2": Math.ceil(y2)
+			});
+		});
+	}, ChartInternal.prototype.updateSizes = function updateSizes() {
+		var $$ = this,
+		    config = $$.config,
+		    legendHeight = $$.legend ? $$.getLegendHeight() : 0,
+		    legendWidth = $$.legend ? $$.getLegendWidth() : 0,
+		    legendHeightForBottom = $$.isLegendRight || $$.isLegendInset ? 0 : legendHeight,
+		    hasArc = $$.hasArcType(),
+		    xAxisHeight = config.axis_rotated || hasArc ? 0 : $$.getHorizontalAxisHeight("x"),
+		    subchartHeight = config.subchart_show && !hasArc ? config.subchart_size_height + xAxisHeight : 0;
+		$$.currentWidth = $$.getCurrentWidth(), $$.currentHeight = $$.getCurrentHeight(), $$.margin = config.axis_rotated ? {
+			top: $$.getHorizontalAxisHeight("y2") + $$.getCurrentPaddingTop(),
+			right: hasArc ? 0 : $$.getCurrentPaddingRight(),
+			bottom: $$.getHorizontalAxisHeight("y") + legendHeightForBottom + $$.getCurrentPaddingBottom(),
+			left: subchartHeight + (hasArc ? 0 : $$.getCurrentPaddingLeft())
+		} : {
+			top: 4 + $$.getCurrentPaddingTop(), // for top tick text
+			right: hasArc ? 0 : $$.getCurrentPaddingRight(),
+			bottom: xAxisHeight + subchartHeight + legendHeightForBottom + $$.getCurrentPaddingBottom(),
+			left: hasArc ? 0 : $$.getCurrentPaddingLeft()
+		}, $$.margin2 = config.axis_rotated ? {
+			top: $$.margin.top,
+			right: NaN,
+			bottom: 20 + legendHeightForBottom,
+			left: $$.rotated_padding_left
+		} : {
+			top: $$.currentHeight - subchartHeight - legendHeightForBottom,
+			right: NaN,
+			bottom: xAxisHeight + legendHeightForBottom,
+			left: $$.margin.left
+		}, $$.margin3 = {
+			top: 0,
+			right: NaN,
+			bottom: 0,
+			left: 0
+		}, $$.updateSizeForLegend && $$.updateSizeForLegend(legendHeight, legendWidth), $$.width = $$.currentWidth - $$.margin.left - $$.margin.right, $$.height = $$.currentHeight - $$.margin.top - $$.margin.bottom, $$.width < 0 && ($$.width = 0), $$.height < 0 && ($$.height = 0), $$.width2 = config.axis_rotated ? $$.margin.left - $$.rotated_padding_left - $$.rotated_padding_right : $$.width, $$.height2 = config.axis_rotated ? $$.height : $$.currentHeight - $$.margin2.top - $$.margin2.bottom, $$.width2 < 0 && ($$.width2 = 0), $$.height2 < 0 && ($$.height2 = 0), $$.arcWidth = $$.width - ($$.isLegendRight ? legendWidth + 10 : 0), $$.arcHeight = $$.height - ($$.isLegendRight ? 0 : 10), $$.hasType("gauge") && !config.gauge_fullCircle && ($$.arcHeight += $$.height - $$.getGaugeLabelHeight()), $$.updateRadius && $$.updateRadius(), $$.isLegendRight && hasArc && ($$.margin3.left = $$.arcWidth / 2 + $$.radiusExpanded * 1.1);
+	}, ChartInternal.prototype.updateTargets = function updateTargets(targets) {
+		var $$ = this;
+
+		// -- Main --
+
+		// -- Text -- //
+		$$.updateTargetsForText(targets), $$.updateTargetsForBar(targets), $$.updateTargetsForLine(targets), $$.hasArcType() && $$.updateTargetsForArc && $$.updateTargetsForArc(targets), $$.updateTargetsForSubchart && $$.updateTargetsForSubchart(targets), $$.showTargets();
+	}, ChartInternal.prototype.showTargets = function showTargets() {
+		var $$ = this;
+
+		$$.svg.selectAll("." + _classes2.default.target).filter(function (d) {
+			return $$.isTargetToShow(d.id);
+		}).transition().duration($$.config.transition_duration).style("opacity", "1");
+	}, ChartInternal.prototype.redraw = function redraw() {
+		var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
+		    transitionsValue = arguments[1],
+		    $$ = this,
+		    main = $$.main,
+		    config = $$.config,
+		    areaIndices = $$.getShapeIndices($$.isAreaType),
+		    barIndices = $$.getShapeIndices($$.isBarType),
+		    lineIndices = $$.getShapeIndices($$.isLineType),
+		    waitForDraw = void 0,
+		    flow = void 0,
+		    hideAxis = $$.hasArcType(),
+		    targetsToShow = $$.filterTargetsToShow($$.data.targets),
+		    xv = $$.xv.bind($$),
+		    tickValues = void 0,
+		    intervalForCulling = void 0,
+		    xDomainForZoom = void 0,
+		    withY = (0, _util.getOption)(options, "withY", !0),
+		    withSubchart = (0, _util.getOption)(options, "withSubchart", !0),
+		    withTransition = (0, _util.getOption)(options, "withTransition", !0),
+		    withTransform = (0, _util.getOption)(options, "withTransform", !1),
+		    withUpdateXDomain = (0, _util.getOption)(options, "withUpdateXDomain", !1),
+		    withUpdateOrgXDomain = (0, _util.getOption)(options, "withUpdateOrgXDomain", !1),
+		    withTrimXDomain = (0, _util.getOption)(options, "withTrimXDomain", !0),
+		    withUpdateXAxis = (0, _util.getOption)(options, "withUpdateXAxis", withUpdateXDomain),
+		    withLegend = (0, _util.getOption)(options, "withLegend", !1),
+		    withEventRect = (0, _util.getOption)(options, "withEventRect", !0),
+		    withDimension = (0, _util.getOption)(options, "withDimension", !0),
+		    withTransitionForExit = (0, _util.getOption)(options, "withTransitionForExit", withTransition),
+		    withTransitionForAxis = (0, _util.getOption)(options, "withTransitionForAxis", withTransition),
+		    duration = withTransition ? config.transition_duration : 0,
+		    durationForExit = withTransitionForExit ? duration : 0,
+		    durationForAxis = withTransitionForAxis ? duration : 0,
+		    transitions = transitionsValue || $$.axis.generateTransitions(durationForAxis);
+
+
+		// show/hide if manual culling needed
+		if ($$.inputType === "touch" && $$.hideTooltip(), withLegend && config.legend_show ? $$.updateLegend($$.mapToIds($$.data.targets), options, transitions) : withDimension && $$.updateDimension(!0), $$.isCategorized() && targetsToShow.length === 0 && $$.x.domain([0, $$.axes.x.selectAll(".tick").size()]), targetsToShow.length ? ($$.updateXDomain(targetsToShow, withUpdateXDomain, withUpdateOrgXDomain, withTrimXDomain), !config.axis_x_tick_values && (tickValues = $$.axis.updateXAxisTickValues(targetsToShow))) : ($$.xAxis.tickValues([]), $$.subXAxis.tickValues([])), config.zoom_rescale && !options.flow && (xDomainForZoom = $$.x.orgDomain()), $$.y.domain($$.getYDomain(targetsToShow, "y", xDomainForZoom)), $$.y2.domain($$.getYDomain(targetsToShow, "y2", xDomainForZoom)), !config.axis_y_tick_values && config.axis_y_tick_count && $$.yAxis.tickValues($$.axis.generateTickValues($$.y.domain(), config.axis_y_tick_count, $$.isTimeSeriesY())), !config.axis_y2_tick_values && config.axis_y2_tick_count && $$.y2Axis.tickValues($$.axis.generateTickValues($$.y2.domain(), config.axis_y2_tick_count)), $$.axis.redraw(transitions, hideAxis), $$.axis.updateLabels(withTransition), (withUpdateXDomain || withUpdateXAxis) && targetsToShow.length) if (config.axis_x_tick_culling && tickValues) {
+				for (var _i = 1; _i < tickValues.length; _i++) if (tickValues.length / _i < config.axis_x_tick_culling_max) {
+					intervalForCulling = _i;
+
+					break;
+				}
+
+				$$.svg.selectAll("." + _classes2.default.axisX + " .tick text").each(function (e) {
+					var index = tickValues.indexOf(e);
+
+					index >= 0 && (0, _d.select)(this).style("display", index % intervalForCulling ? "none" : "block");
+				});
+			} else $$.svg.selectAll("." + _classes2.default.axisX + " .tick text").style("display", "block");
+
+		// setup drawer - MEMO: these must be called after axis updated
+		var drawArea = $$.generateDrawArea ? $$.generateDrawArea(areaIndices, !1) : undefined,
+		    drawBar = $$.generateDrawBar ? $$.generateDrawBar(barIndices) : undefined,
+		    drawLine = $$.generateDrawLine ? $$.generateDrawLine(lineIndices, !1) : undefined,
+		    xForText = $$.generateXYForText(areaIndices, barIndices, lineIndices, !0),
+		    yForText = $$.generateXYForText(areaIndices, barIndices, lineIndices, !1);
+
+		withY && ($$.subY.domain($$.getYDomain(targetsToShow, "y")), $$.subY2.domain($$.getYDomain(targetsToShow, "y2"))), $$.updateXgridFocus(), main.select("text." + _classes2.default.text + "." + _classes2.default.empty).attr("x", $$.width / 2).attr("y", $$.height / 2).text(config.data_empty_label_text).transition().style("opacity", targetsToShow.length ? 0 : 1), $$.updateGrid(duration), $$.updateRegion(duration), $$.updateBar(durationForExit), $$.updateLine(durationForExit), $$.updateArea(durationForExit), $$.updateCircle(), $$.hasDataLabel() && $$.updateText(durationForExit), $$.redrawTitle && $$.redrawTitle(), $$.redrawArc && $$.redrawArc(duration, durationForExit, withTransform), config.subchart_show && $$.redrawSubchart && $$.redrawSubchart(withSubchart, transitions, duration, durationForExit, areaIndices, barIndices, lineIndices), main.selectAll("." + _classes2.default.selectedCircles).filter($$.isBarType.bind($$)).selectAll("circle").remove(), config.interaction_enabled && !options.flow && withEventRect && ($$.redrawEventRect(), $$.updateZoom && $$.updateZoom()), $$.updateCircleY();
+
+
+		// generate circle x/y functions depending on updated params
+		var cx = ($$.config.axis_rotated ? $$.circleY : $$.circleX).bind($$),
+		    cy = ($$.config.axis_rotated ? $$.circleX : $$.circleY).bind($$);
+		options.flow && (flow = $$.generateFlow({
+			targets: targetsToShow,
+			flow: options.flow,
+			duration: options.flow.duration,
+			drawBar: drawBar,
+			drawLine: drawLine,
+			drawArea: drawArea,
+			cx: cx,
+			cy: cy,
+			xv: xv,
+			xForText: xForText,
+			yForText: yForText
+		})), (duration || flow) && $$.isTabVisible() ? (0, _d.transition)().duration(duration).each(function () {
+			waitForDraw = $$.generateWait(), [$$.redrawBar(drawBar, !0), $$.redrawLine(drawLine, !0), $$.redrawArea(drawArea, !0), $$.redrawCircle(cx, cy, !0, flow), $$.redrawText(xForText, yForText, options.flow, !0), $$.redrawRegion(!0), $$.redrawGrid(!0)].reduce(function (acc, t1) {
+				return t1.forEach(function (t2) {
+					acc.push(t2);
+				}), acc;
+			}, []).forEach(function (t) {
+				waitForDraw.add(t);
+			});
+		}).call(waitForDraw, function () {
+			flow && flow(), config.onrendered && config.onrendered.call($$);
+		}) : ($$.redrawBar(drawBar), $$.redrawLine(drawLine), $$.redrawArea(drawArea), $$.redrawCircle(cx, cy), $$.redrawText(xForText, yForText, options.flow), $$.redrawRegion(), $$.redrawGrid(), config.onrendered && config.onrendered.call($$)), $$.mapToIds($$.data.targets).forEach(function (id) {
+			$$.withoutFadeIn[id] = !0;
+		});
+	}, ChartInternal.prototype.updateAndRedraw = function updateAndRedraw() {
+		var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
+		    $$ = this,
+		    config = $$.config,
+		    transitions = void 0;
+		options.withTransition = (0, _util.getOption)(options, "withTransition", !0), options.withTransform = (0, _util.getOption)(options, "withTransform", !1), options.withLegend = (0, _util.getOption)(options, "withLegend", !1), options.withUpdateXDomain = !0, options.withUpdateOrgXDomain = !0, options.withTransitionForExit = !1, options.withTransitionForTransform = (0, _util.getOption)(options, "withTransitionForTransform", options.withTransition), $$.updateSizes(), options.withLegend && config.legend_show || (transitions = $$.axis.generateTransitions(options.withTransitionForAxis ? config.transition_duration : 0), $$.updateScales(), $$.updateSvgSize(), $$.transformAll(options.withTransitionForTransform, transitions)), $$.redraw(options, transitions);
+	}, ChartInternal.prototype.redrawWithoutRescale = function redrawWithoutRescale() {
+		this.redraw({
+			withY: !1,
+			withSubchart: !1,
+			withEventRect: !1,
+			withTransitionForAxis: !1
+		});
+	}, ChartInternal.prototype.isTimeSeries = function isTimeSeries() {
+		return this.config.axis_x_type === "timeseries";
+	}, ChartInternal.prototype.isCategorized = function isCategorized() {
+		return this.config.axis_x_type.indexOf("categor") >= 0;
+	}, ChartInternal.prototype.isCustomX = function isCustomX() {
+		var $$ = this,
+		    config = $$.config;
+
+
+		return !$$.isTimeSeries() && (config.data_x || (0, _util.notEmpty)(config.data_xs));
+	}, ChartInternal.prototype.isTimeSeriesY = function isTimeSeriesY() {
+		return this.config.axis_y_type === "timeseries";
+	}, ChartInternal.prototype.getTranslate = function getTranslate(target) {
+		var $$ = this,
+		    config = $$.config,
+		    x = void 0,
+		    y = void 0;
+
+
+		return target === "main" ? (x = (0, _util.asHalfPixel)($$.margin.left), y = (0, _util.asHalfPixel)($$.margin.top)) : target === "context" ? (x = (0, _util.asHalfPixel)($$.margin2.left), y = (0, _util.asHalfPixel)($$.margin2.top)) : target === "legend" ? (x = $$.margin3.left, y = $$.margin3.top) : target === "x" ? (x = 0, y = config.axis_rotated ? 0 : $$.height) : target === "y" ? (x = 0, y = config.axis_rotated ? $$.height : 0) : target === "y2" ? (x = config.axis_rotated ? 0 : $$.width, y = config.axis_rotated ? 1 : 0) : target === "subx" ? (x = 0, y = config.axis_rotated ? 0 : $$.height2) : target === "arc" && (x = $$.arcWidth / 2, y = $$.arcHeight / 2), "translate(" + x + ", " + y + ")";
+	}, ChartInternal.prototype.initialOpacity = function initialOpacity(d) {
+		return d.value !== null && this.withoutFadeIn[d.id] ? "1" : "0";
+	}, ChartInternal.prototype.initialOpacityForCircle = function initialOpacityForCircle(d) {
+		return d.value !== null && this.withoutFadeIn[d.id] ? this.opacityForCircle(d) : "0";
+	}, ChartInternal.prototype.opacityForCircle = function opacityForCircle(d) {
+		var opacity = this.config.point_show ? "1" : "0";
+
+		return (0, _util.isValue)(d.value) ? this.isScatterType(d) ? "0.5" : opacity : "0";
+	}, ChartInternal.prototype.opacityForText = function opacityForText() {
+		return this.hasDataLabel() ? "1" : "0";
+	}, ChartInternal.prototype.xx = function xx(d) {
+		return this.config.zoom_enabled && this.zoomScale ? d ? this.zoomScale(d.x) : null : d ? this.x(d.x) : null;
+	}, ChartInternal.prototype.xv = function xv(d) {
+		var $$ = this,
+		    value = d.value;
+
+
+		return $$.isTimeSeries() ? value = $$.parseDate(d.value) : $$.isCategorized() && typeof d.value === "string" && (value = $$.config.axis_x_categories.indexOf(d.value)), Math.ceil($$.x(value));
+	}, ChartInternal.prototype.yv = function yv(d) {
+		var $$ = this,
+		    yScale = d.axis && d.axis === "y2" ? $$.y2 : $$.y;
+
+
+		return Math.ceil(yScale(d.value));
+	}, ChartInternal.prototype.subxx = function subxx(d) {
+		return d ? this.subX(d.x) : null;
+	}, ChartInternal.prototype.transformMain = function transformMain(withTransition, transitions) {
+		var $$ = this,
+		    xAxis = void 0,
+		    yAxis = void 0,
+		    y2Axis = void 0;
+		transitions && transitions.axisX ? xAxis = transitions.axisX : (xAxis = $$.main.select("." + _classes2.default.axisX), withTransition && (xAxis = xAxis.transition())), transitions && transitions.axisY ? yAxis = transitions.axisY : (yAxis = $$.main.select("." + _classes2.default.axisY), withTransition && (yAxis = yAxis.transition())), transitions && transitions.axisY2 ? y2Axis = transitions.axisY2 : (y2Axis = $$.main.select("." + _classes2.default.axisY2), withTransition && (y2Axis = y2Axis.transition())), (withTransition ? $$.main.transition() : $$.main).attr("transform", $$.getTranslate("main")), xAxis.attr("transform", $$.getTranslate("x")), yAxis.attr("transform", $$.getTranslate("y")), y2Axis.attr("transform", $$.getTranslate("y2")), $$.main.select("." + _classes2.default.chartArcs).attr("transform", $$.getTranslate("arc"));
+	}, ChartInternal.prototype.transformAll = function transformAll(withTransition, transitions) {
+		var $$ = this;
+
+		$$.transformMain(withTransition, transitions), $$.config.subchart_show && $$.transformContext(withTransition, transitions), $$.legend && $$.transformLegend(withTransition);
+	}, ChartInternal.prototype.updateSvgSize = function updateSvgSize() {
+		var $$ = this,
+		    brush = $$.svg.select("." + _classes2.default.brush + " .overlay"),
+		    brushHeight = brush.size() ? brush.attr("height") : 0;
+		$$.svg.attr("width", $$.currentWidth).attr("height", $$.currentHeight), $$.svg.selectAll(["#" + $$.clipId, "#" + $$.clipIdForGrid]).select("rect").attr("width", $$.width).attr("height", $$.height), $$.svg.select("#" + $$.clipIdForXAxis).select("rect").attr("x", $$.getXAxisClipX.bind($$)).attr("y", $$.getXAxisClipY.bind($$)).attr("width", $$.getXAxisClipWidth.bind($$)).attr("height", $$.getXAxisClipHeight.bind($$)), $$.svg.select("#" + $$.clipIdForYAxis).select("rect").attr("x", $$.getYAxisClipX.bind($$)).attr("y", $$.getYAxisClipY.bind($$)).attr("width", $$.getYAxisClipWidth.bind($$)).attr("height", $$.getYAxisClipHeight.bind($$)), $$.svg.select("#" + $$.clipIdForSubchart).select("rect").attr("width", $$.width).attr("height", brushHeight), $$.svg.select("." + _classes2.default.zoomRect).attr("width", $$.width).attr("height", $$.height), $$.selectChart.style("max-height", $$.currentHeight + "px"), $$.brush && $$.brush.scale($$.subX, brushHeight);
+	}, ChartInternal.prototype.updateDimension = function updateDimension(withoutAxis) {
+		var $$ = this;
+
+		withoutAxis || ($$.config.axis_rotated ? ($$.axes.x.call($$.xAxis), $$.axes.subx.call($$.subXAxis)) : ($$.axes.y.call($$.yAxis), $$.axes.y2.call($$.y2Axis))), $$.updateSizes(), $$.updateScales(withoutAxis), $$.updateSvgSize(), $$.transformAll(!1);
+	}, ChartInternal.prototype.observeInserted = function observeInserted(selection) {
+		var $$ = this;
+
+		if (typeof MutationObserver === "undefined") return void (console && console.error && console.error("MutationObserver not defined."));
+
+		var observer = new MutationObserver(function (mutations) {
+			mutations.forEach(function (mutation) {
+				mutation.type === "childList" && mutation.previousSibling && (observer.disconnect(), $$.intervalForObserveInserted = window.setInterval(function () {
+					selection.node().parentNode && (window.clearInterval($$.intervalForObserveInserted), $$.updateDimension(), $$.brush && $$.brush.update(), $$.config.oninit.call($$), $$.redraw({
+						withTransform: !0,
+						withUpdateXDomain: !0,
+						withUpdateOrgXDomain: !0,
+						withTransition: !1,
+						withTransitionForTransform: !1,
+						withLegend: !0
+					}), selection.transition().style("opacity", "1"));
+				}, 10));
+			});
+		});
+
+		observer.observe(selection.node(), {
+			attributes: !0,
+			childList: !0,
+			characterData: !0
+		});
+	}, ChartInternal.prototype.bindResize = function bindResize() {
+		var $$ = this,
+		    config = $$.config;
+		$$.resizeFunction = $$.generateResize(), $$.resizeFunction.add(function () {
+			config.onresize.call($$);
+		}), config.resize_auto && $$.resizeFunction.add(function () {
+			$$.resizeTimeout !== undefined && window.clearTimeout($$.resizeTimeout), $$.resizeTimeout = window.setTimeout(function () {
+				delete $$.resizeTimeout, $$.api.flush();
+			}, 100);
+		}), $$.resizeFunction.add(function () {
+			config.onresized.call($$);
+		}), (0, _util.addEvent)(window, "resize", $$.resizeFunction);
+	}, ChartInternal.prototype.generateResize = function generateResize() {
+
+		function callResizeFunctions() {
+			resizeFunctions.forEach(function (f) {
+				return f();
+			});
+		}
+
+		var resizeFunctions = [];
+
+		return callResizeFunctions.add = function (f) {
+			resizeFunctions.push(f);
+		}, callResizeFunctions.remove = function (f) {
+			for (var i = 0; i < resizeFunctions.length; i++) if (resizeFunctions[i] === f) {
+				resizeFunctions.splice(i, 1);
+
+				break;
+			}
+		}, callResizeFunctions;
+	}, ChartInternal.prototype.endall = function endall(transition, callback) {
+		var n = 0;
+
+		transition.each(function () {
+			return ++n;
+		}).on("end", function () {
+			for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) args[_key] = arguments[_key];
+
+			--n || callback.apply.apply(callback, [this].concat(args));
+		});
+	}, ChartInternal.prototype.generateWait = function generateWait() {
+		var transitionsToWait = [],
+		    f = function (transition, callback) {
+
+			function loop() {
+				var done = 0;
+
+				transitionsToWait.forEach(function (t) {
+					if (t.empty()) return void (done += 1);
+
+					try {
+						t.transition();
+					} catch (e) {
+						done += 1;
+					}
+				}), done === transitionsToWait.length ? (clearTimeout(timer), callback && callback()) : timer = setTimeout(loop, 20);
+			}
+
+			var timer = void 0;loop();
+		};
+
+
+		return f.add = function (transition) {
+			Array.isArray(transition) ? transitionsToWait = [].concat(transitionsToWait, transition) : transitionsToWait.push(transition);
+		}, f;
+	}, ChartInternal.prototype.parseDate = function parseDate(date) {
+		var $$ = this,
+		    parsedDate = void 0;
+
+
+		return date instanceof Date ? parsedDate = date : typeof date === "string" ? parsedDate = $$.dataTimeFormat($$.config.data_xFormat)(date) : typeof date === "number" && !isNaN(date) && (parsedDate = new Date(+date)), (!parsedDate || isNaN(+parsedDate)) && console && console.error && console.error("Failed to parse x '" + date + "' to Date object"), parsedDate;
+	}, ChartInternal.prototype.isTabVisible = function isTabVisible() {
+		var hidden = void 0;
+
+		return typeof document.hidden === "undefined" ? typeof document.mozHidden === "undefined" ? typeof document.msHidden === "undefined" ? typeof document.webkitHidden !== "undefined" && (hidden = "webkitHidden") : hidden = "msHidden" : hidden = "mozHidden" : hidden = "hidden", !document[hidden];
+	}, ChartInternal.prototype.convertInputType = function convertInputType() {
+		var $$ = this,
+		    config = $$.config,
+		    hasMouse = !!config.interaction_inputType_mouse && !!("onmouseover" in window),
+		    hasTouch = void 0;
+
+
+		return config.interaction_inputType_touch ? (hasTouch = "ontouchstart" in window || window.DocumentTouch && document instanceof window.DocumentTouch, /PhantomJS/.test(window.navigator.userAgent) && (hasTouch = !1)) : hasTouch = !1, hasTouch && "touch" || hasMouse && "mouse" || null;
+	}, ChartInternal;
+}();
+
+exports.default = ChartInternal;
+module.exports = exports["default"];
+
+/***/ }),
+/* 2 */
+/***/ (function(module, exports) {
+
+module.exports = __WEBPACK_EXTERNAL_MODULE_2__;
+
+/***/ }),
+/* 3 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+exports.__esModule = !0;
+/**
+ * Copyright (c) 2017 NAVER Corp.
+ * billboard.js project is licensed under the MIT license
+ */
+var CLASS = {
+	target: "bb-target",
+	chart: "bb-chart",
+	chartLine: "bb-chart-line",
+	chartLines: "bb-chart-lines",
+	chartBar: "bb-chart-bar",
+	chartBars: "bb-chart-bars",
+	chartText: "bb-chart-text",
+	chartTexts: "bb-chart-texts",
+	chartArc: "bb-chart-arc",
+	chartArcs: "bb-chart-arcs",
+	chartArcsTitle: "bb-chart-arcs-title",
+	chartArcsBackground: "bb-chart-arcs-background",
+	chartArcsGaugeUnit: "bb-chart-arcs-gauge-unit",
+	chartArcsGaugeMax: "bb-chart-arcs-gauge-max",
+	chartArcsGaugeMin: "bb-chart-arcs-gauge-min",
+	selectedCircle: "bb-selected-circle",
+	selectedCircles: "bb-selected-circles",
+	eventRect: "bb-event-rect",
+	eventRects: "bb-event-rects",
+	eventRectsSingle: "bb-event-rects-single",
+	eventRectsMultiple: "bb-event-rects-multiple",
+	zoomRect: "bb-zoom-rect",
+	brush: "bb-brush",
+	focused: "bb-focused",
+	defocused: "bb-defocused",
+	region: "bb-region",
+	regions: "bb-regions",
+	title: "bb-title",
+	tooltipContainer: "bb-tooltip-container",
+	tooltip: "bb-tooltip",
+	tooltipName: "bb-tooltip-name",
+	shape: "bb-shape",
+	shapes: "bb-shapes",
+	line: "bb-line",
+	lines: "bb-lines",
+	bar: "bb-bar",
+	bars: "bb-bars",
+	circle: "bb-circle",
+	circles: "bb-circles",
+	arc: "bb-arc",
+	arcs: "bb-arcs",
+	area: "bb-area",
+	areas: "bb-areas",
+	empty: "bb-empty",
+	text: "bb-text",
+	texts: "bb-texts",
+	gaugeValue: "bb-gauge-value",
+	grid: "bb-grid",
+	gridLines: "bb-grid-lines",
+	xgrid: "bb-xgrid",
+	xgrids: "bb-xgrids",
+	xgridLine: "bb-xgrid-line",
+	xgridLines: "bb-xgrid-lines",
+	xgridFocus: "bb-xgrid-focus",
+	ygrid: "bb-ygrid",
+	ygrids: "bb-ygrids",
+	ygridLine: "bb-ygrid-line",
+	ygridLines: "bb-ygrid-lines",
+	axis: "bb-axis",
+	axisX: "bb-axis-x",
+	axisXLabel: "bb-axis-x-label",
+	axisY: "bb-axis-y",
+	axisYLabel: "bb-axis-y-label",
+	axisY2: "bb-axis-y2",
+	axisY2Label: "bb-axis-y2-label",
+	legendBackground: "bb-legend-background",
+	legendItem: "bb-legend-item",
+	legendItemEvent: "bb-legend-item-event",
+	legendItemTile: "bb-legend-item-tile",
+	legendItemHidden: "bb-legend-item-hidden",
+	legendItemFocused: "bb-legend-item-focused",
+	dragarea: "bb-dragarea",
+	EXPANDED: "_expanded_",
+	SELECTED: "_selected_",
+	INCLUDED: "_included_"
+};
+
+exports.default = CLASS;
+module.exports = exports["default"];
+
+/***/ }),
+/* 4 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+exports.__esModule = !0;
+
+var _classCallCheck2 = __webpack_require__(6),
+    _classCallCheck3 = _interopRequireDefault(_classCallCheck2),
+    _ChartInternal = __webpack_require__(1),
+    _ChartInternal2 = _interopRequireDefault(_ChartInternal);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/**
+ * Main chart class.
+ * - Note: Instantiated via `bb.generate()`.
+ * @class Chart
+ * @example
+ * var chart = bb.generate({
+ *  data: {
+ *    columns: [
+ *	    ["x", "2015-11-02", "2015-12-01", "2016-01-01", "2016-02-01", "2016-03-01"],
+ * 	    ["count1", 11, 8, 7, 6, 5 ],
+ *	    ["count2", 9, 3, 6, 2, 8 ]
+ *   ]}
+ * }
+ * @see {@link bb.generate} for the initialization.
+*/
+var Chart = function Chart(config) {
+  (0, _classCallCheck3.default)(this, Chart);
+
+  var $$ = new _ChartInternal2.default(this);
+
+  this.internal = $$, $$.loadConfig(config), $$.beforeInit(config), $$.init(), $$.afterInit(config), function bindThis(fn, target, argThis) {
+    Object.keys(fn).forEach(function (key) {
+      target[key] = fn[key].bind(argThis), Object.keys(fn[key]).length && bindThis(fn[key], target[key], argThis);
+    });
+  }(Chart.prototype, this, this);
+}; /**
+    * Copyright (c) 2017 NAVER Corp.
+    * billboard.js project is licensed under the MIT license
+    * @license MIT
+    * @ignore
+    */
+
+
+exports.default = Chart;
+module.exports = exports["default"];
+
+/***/ }),
+/* 5 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+exports.__esModule = true;
+
+function _typeof(obj) { return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj; }
+
+exports.default = function (obj) {
+  return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj === "undefined" ? "undefined" : _typeof(obj);
+};
+
+/***/ }),
+/* 6 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+exports.__esModule = true;
+
+exports.default = function (instance, Constructor) {
+  if (!(instance instanceof Constructor)) {
+    throw new TypeError("Cannot call a class as a function");
+  }
+};
+
+/***/ }),
+/* 7 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+exports.__esModule = !0;
+
+var _typeof2 = __webpack_require__(5),
+    _typeof3 = _interopRequireDefault(_typeof2),
+    _classCallCheck2 = __webpack_require__(6),
+    _classCallCheck3 = _interopRequireDefault(_classCallCheck2),
+    _d = __webpack_require__(2),
+    _util = __webpack_require__(0),
+    _bb = __webpack_require__(8),
+    _bb2 = _interopRequireDefault(_bb),
+    _classes = __webpack_require__(3),
+    _classes2 = _interopRequireDefault(_classes);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/**
+ * Copyright (c) 2017 NAVER Corp.
+ * billboard.js project is licensed under the MIT license
+ */
+var Axis = function () {
+	function Axis(owner) {
+		(0, _classCallCheck3.default)(this, Axis), this.owner = owner;
+	}
+
+	return Axis.prototype.init = function init() {
+		var $$ = this.owner,
+		    config = $$.config,
+		    main = $$.main;
+		$$.axes.x = main.append("g").attr("class", _classes2.default.axis + " " + _classes2.default.axisX).attr("clip-path", $$.clipPathForXAxis).attr("transform", $$.getTranslate("x")).style("visibility", config.axis_x_show ? "visible" : "hidden"), $$.axes.x.append("text").attr("class", _classes2.default.axisXLabel).attr("transform", config.axis_rotated ? "rotate(-90)" : "").style("text-anchor", this.textAnchorForXAxisLabel.bind(this)), $$.axes.y = main.append("g").attr("class", _classes2.default.axis + " " + _classes2.default.axisY).attr("clip-path", config.axis_y_inner ? "" : $$.clipPathForYAxis).attr("transform", $$.getTranslate("y")).style("visibility", config.axis_y_show ? "visible" : "hidden"), $$.axes.y.append("text").attr("class", _classes2.default.axisYLabel).attr("transform", config.axis_rotated ? "" : "rotate(-90)").style("text-anchor", this.textAnchorForYAxisLabel.bind(this)), $$.axes.y2 = main.append("g").attr("class", _classes2.default.axis + " " + _classes2.default.axisY2
+		// clip-path?
+		).attr("transform", $$.getTranslate("y2")).style("visibility", config.axis_y2_show ? "visible" : "hidden"), $$.axes.y2.append("text").attr("class", _classes2.default.axisY2Label).attr("transform", config.axis_rotated ? "" : "rotate(-90)").style("text-anchor", this.textAnchorForY2AxisLabel.bind(this));
+	}, Axis.prototype.getXAxis = function getXAxis(scale, orient, tickFormat, tickValues, withOuterTick, withoutTransition, withoutRotateTickText) {
+		var $$ = this.owner,
+		    config = $$.config,
+		    axisParams = {
+			isCategory: $$.isCategorized(),
+			withOuterTick: withOuterTick,
+			tickMultiline: config.axis_x_tick_multiline,
+			tickWidth: config.axis_x_tick_width,
+			tickTextRotate: withoutRotateTickText ? 0 : config.axis_x_tick_rotate,
+			withoutTransition: withoutTransition
+		},
+		    axis = (0, _bb2.default)(axisParams).scale(scale).orient(orient),
+		    newTickValues = tickValues;
+
+
+		return $$.isTimeSeries() && tickValues && typeof tickValues !== "function" && (newTickValues = tickValues.map(function (v) {
+			return $$.parseDate(v);
+		})), axis.tickFormat(tickFormat).tickValues(newTickValues), $$.isCategorized() && (axis.tickCentered(config.axis_x_tick_centered), (0, _util.isEmpty)(config.axis_x_tick_culling) && (config.axis_x_tick_culling = !1)), axis;
+	}, Axis.prototype.updateXAxisTickValues = function updateXAxisTickValues(targets, axis) {
+		var $$ = this.owner,
+		    config = $$.config,
+		    tickValues = void 0;
+
+		return (config.axis_x_tick_fit || config.axis_x_tick_count) && (tickValues = this.generateTickValues($$.mapTargetsToUniqueXs(targets), config.axis_x_tick_count, $$.isTimeSeries())), axis ? axis.tickValues(tickValues) : ($$.xAxis.tickValues(tickValues), $$.subXAxis.tickValues(tickValues)), tickValues;
+	}, Axis.prototype.getYAxis = function getYAxis(scale, orient, tickFormat, tickValues, withOuterTick, withoutTransition, withoutRotateTickText) {
+		var $$ = this.owner,
+		    config = $$.config,
+		    axisParams = {
+			withOuterTick: withOuterTick,
+			withoutTransition: withoutTransition,
+			tickTextRotate: withoutRotateTickText ? 0 : config.axis_y_tick_rotate
+		},
+		    axis = (0, _bb2.default)(axisParams).scale(scale).orient(orient).tickFormat(tickFormat);
+
+		return $$.isTimeSeriesY() ? axis.ticks(config.axis_y_tick_time_value) : axis.tickValues(tickValues), axis;
+	}, Axis.prototype.getId = function getId(id) {
+		var config = this.owner.config;
+
+		return id in config.data_axes ? config.data_axes[id] : "y";
+	}, Axis.prototype.getXAxisTickFormat = function getXAxisTickFormat() {
+		var $$ = this.owner,
+		    config = $$.config,
+		    format = void 0;
+
+
+		return format = $$.isTimeSeries() ? $$.defaultAxisTimeFormat : $$.isCategorized() ? $$.categoryName : function (v) {
+			return v < 0 ? v.toFixed(0) : v;
+		}, config.axis_x_tick_format && ((0, _util.isFunction)(config.axis_x_tick_format) ? format = config.axis_x_tick_format : $$.isTimeSeries() && (format = function (date) {
+			return date ? $$.axisTimeFormat(config.axis_x_tick_format)(date) : "";
+		})), (0, _util.isFunction)(format) ? function (v) {
+			return format.call($$, v);
+		} : format;
+	}, Axis.prototype.getTickValues = function getTickValues(tickValues, axis) {
+		var values = void 0;
+
+		return values = tickValues ? tickValues : axis ? axis.tickValues() : undefined, values;
+	}, Axis.prototype.getXAxisTickValues = function getXAxisTickValues() {
+		return this.getTickValues(this.owner.config.axis_x_tick_values, this.owner.xAxis);
+	}, Axis.prototype.getYAxisTickValues = function getYAxisTickValues() {
+		return this.getTickValues(this.owner.config.axis_y_tick_values, this.owner.yAxis);
+	}, Axis.prototype.getY2AxisTickValues = function getY2AxisTickValues() {
+		return this.getTickValues(this.owner.config.axis_y2_tick_values, this.owner.y2Axis);
+	}, Axis.prototype.getLabelOptionByAxisId = function getLabelOptionByAxisId(axisId) {
+		var $$ = this.owner,
+		    config = $$.config,
+		    option = void 0;
+
+		return axisId === "y" ? option = config.axis_y_label : axisId === "y2" ? option = config.axis_y2_label : axisId === "x" && (option = config.axis_x_label), option;
+	}, Axis.prototype.getLabelText = function getLabelText(axisId) {
+		var option = this.getLabelOptionByAxisId(axisId),
+		    text = void 0;
+
+		return text = (0, _util.isString)(option) ? option : option ? option.text : null, text;
+	}, Axis.prototype.setLabelText = function setLabelText(axisId, text) {
+		var $$ = this.owner,
+		    config = $$.config,
+		    option = this.getLabelOptionByAxisId(axisId);
+		(0, _util.isString)(option) ? axisId === "y" ? config.axis_y_label = text : axisId === "y2" ? config.axis_y2_label = text : axisId === "x" && (config.axis_x_label = text) : option && (option.text = text);
+	}, Axis.prototype.getLabelPosition = function getLabelPosition(axisId, defaultPosition) {
+		var option = this.getLabelOptionByAxisId(axisId),
+		    position = (typeof option === "undefined" ? "undefined" : (0, _typeof3.default)(option)) === "object" && option.position ? option.position : defaultPosition;
+
+
+		return {
+			isInner: !!~position.indexOf("inner"),
+			isOuter: !!~position.indexOf("outer"),
+			isLeft: !!~position.indexOf("left"),
+			isCenter: !!~position.indexOf("center"),
+			isRight: !!~position.indexOf("right"),
+			isTop: !!~position.indexOf("top"),
+			isMiddle: !!~position.indexOf("middle"),
+			isBottom: !!~position.indexOf("bottom")
+		};
+	}, Axis.prototype.getXAxisLabelPosition = function getXAxisLabelPosition() {
+		return this.getLabelPosition("x", this.owner.config.axis_rotated ? "inner-top" : "inner-right");
+	}, Axis.prototype.getYAxisLabelPosition = function getYAxisLabelPosition() {
+		return this.getLabelPosition("y", this.owner.config.axis_rotated ? "inner-right" : "inner-top");
+	}, Axis.prototype.getY2AxisLabelPosition = function getY2AxisLabelPosition() {
+		return this.getLabelPosition("y2", this.owner.config.axis_rotated ? "inner-right" : "inner-top");
+	}, Axis.prototype.getLabelPositionById = function getLabelPositionById(id) {
+		var label = void 0;
+
+		return label = id === "y2" ? this.getY2AxisLabelPosition() : id === "y" ? this.getYAxisLabelPosition() : this.getXAxisLabelPosition(), label;
+	}, Axis.prototype.textForXAxisLabel = function textForXAxisLabel() {
+		return this.getLabelText("x");
+	}, Axis.prototype.textForYAxisLabel = function textForYAxisLabel() {
+		return this.getLabelText("y");
+	}, Axis.prototype.textForY2AxisLabel = function textForY2AxisLabel() {
+		return this.getLabelText("y2");
+	}, Axis.prototype.xForAxisLabel = function xForAxisLabel(forHorizontal, position) {
+		var $$ = this.owner,
+		    x = void 0;
+
+		return x = forHorizontal ? position.isLeft ? 0 : position.isCenter ? $$.width / 2 : $$.width : position.isBottom ? -$$.height : position.isMiddle ? -$$.height / 2 : 0, x;
+	}, Axis.prototype.dxForAxisLabel = function dxForAxisLabel(forHorizontal, position) {
+		var dx = void 0;
+
+		return dx = forHorizontal ? position.isLeft ? "0.5em" : position.isRight ? "-0.5em" : "0" : position.isTop ? "-0.5em" : position.isBottom ? "0.5em" : "0", dx;
+	}, Axis.prototype.textAnchorForAxisLabel = function textAnchorForAxisLabel(forHorizontal, position) {
+		var anchor = void 0;
+
+		return anchor = forHorizontal ? position.isLeft ? "start" : position.isCenter ? "middle" : "end" : position.isBottom ? "start" : position.isMiddle ? "middle" : "end", anchor;
+	}, Axis.prototype.xForXAxisLabel = function xForXAxisLabel() {
+		return this.xForAxisLabel(!this.owner.config.axis_rotated, this.getXAxisLabelPosition());
+	}, Axis.prototype.xForYAxisLabel = function xForYAxisLabel() {
+		return this.xForAxisLabel(this.owner.config.axis_rotated, this.getYAxisLabelPosition());
+	}, Axis.prototype.xForY2AxisLabel = function xForY2AxisLabel() {
+		return this.xForAxisLabel(this.owner.config.axis_rotated, this.getY2AxisLabelPosition());
+	}, Axis.prototype.dxForXAxisLabel = function dxForXAxisLabel() {
+		return this.dxForAxisLabel(!this.owner.config.axis_rotated, this.getXAxisLabelPosition());
+	}, Axis.prototype.dxForYAxisLabel = function dxForYAxisLabel() {
+		return this.dxForAxisLabel(this.owner.config.axis_rotated, this.getYAxisLabelPosition());
+	}, Axis.prototype.dxForY2AxisLabel = function dxForY2AxisLabel() {
+		return this.dxForAxisLabel(this.owner.config.axis_rotated, this.getY2AxisLabelPosition());
+	}, Axis.prototype.dyForXAxisLabel = function dyForXAxisLabel() {
+		var $$ = this.owner,
+		    config = $$.config,
+		    position = this.getXAxisLabelPosition();
+		return config.axis_rotated ? position.isInner ? "1.2em" : -25 - this.getMaxTickWidth("x") : position.isInner ? "-0.5em" : config.axis_x_height ? config.axis_x_height - 10 : "3em";
+	}, Axis.prototype.dyForYAxisLabel = function dyForYAxisLabel() {
+		var $$ = this.owner,
+		    position = this.getYAxisLabelPosition();
+		return $$.config.axis_rotated ? position.isInner ? "-0.5em" : "3em" : position.isInner ? "1.2em" : -10 - ($$.config.axis_y_inner ? 0 : this.getMaxTickWidth("y") + 10);
+	}, Axis.prototype.dyForY2AxisLabel = function dyForY2AxisLabel() {
+		var $$ = this.owner,
+		    position = this.getY2AxisLabelPosition();
+		return $$.config.axis_rotated ? position.isInner ? "1.2em" : "-2.2em" : position.isInner ? "-0.5em" : 15 + ($$.config.axis_y2_inner ? 0 : this.getMaxTickWidth("y2") + 15);
+	}, Axis.prototype.textAnchorForXAxisLabel = function textAnchorForXAxisLabel() {
+		var $$ = this.owner;
+
+		return this.textAnchorForAxisLabel(!$$.config.axis_rotated, this.getXAxisLabelPosition());
+	}, Axis.prototype.textAnchorForYAxisLabel = function textAnchorForYAxisLabel() {
+		var $$ = this.owner;
+
+		return this.textAnchorForAxisLabel($$.config.axis_rotated, this.getYAxisLabelPosition());
+	}, Axis.prototype.textAnchorForY2AxisLabel = function textAnchorForY2AxisLabel() {
+		var $$ = this.owner;
+
+		return this.textAnchorForAxisLabel($$.config.axis_rotated, this.getY2AxisLabelPosition());
+	}, Axis.prototype.getMaxTickWidth = function getMaxTickWidth(id, withoutRecompute) {
+		var $$ = this.owner,
+		    config = $$.config,
+		    maxWidth = 0,
+		    dummy = void 0,
+		    svg = void 0;
+
+
+		if (withoutRecompute && $$.currentMaxTickWidths[id]) return $$.currentMaxTickWidths[id];
+
+		if ($$.svg) {
+			var targetsToShow = $$.filterTargetsToShow($$.data.targets),
+			    scale = void 0,
+			    axis = void 0;
+			id === "y" ? (scale = $$.y.copy().domain($$.getYDomain(targetsToShow, "y")), axis = this.getYAxis(scale, $$.yOrient, config.axis_y_tick_format, $$.yAxisTickValues, !1, !0, !0)) : id === "y2" ? (scale = $$.y2.copy().domain($$.getYDomain(targetsToShow, "y2")), axis = this.getYAxis(scale, $$.y2Orient, config.axis_y2_tick_format, $$.y2AxisTickValues, !1, !0, !0)) : (scale = $$.x.copy().domain($$.getXDomain(targetsToShow)), axis = this.getXAxis(scale, $$.xOrient, $$.xAxisTickFormat, $$.xAxisTickValues, !1, !0, !0), this.updateXAxisTickValues(targetsToShow, axis)), dummy = (0, _d.select)("body").append("div").classed("bb", !0), svg = dummy.append("svg").style("visibility", "hidden").style("position", "fixed").style("top", "0px").style("left", "0px"), svg.append("g").call(axis).each(function () {
+				(0, _d.select)(this).selectAll("text").each(function () {
+					var box = this.getBoundingClientRect();
+
+					maxWidth < box.width && (maxWidth = box.width);
+				}), dummy.remove();
+			});
+		}
+
+		return $$.currentMaxTickWidths[id] = maxWidth <= 0 ? $$.currentMaxTickWidths[id] : maxWidth, $$.currentMaxTickWidths[id];
+	}, Axis.prototype.updateLabels = function updateLabels(withTransition) {
+		var $$ = this.owner,
+		    axisXLabel = $$.main.select("." + _classes2.default.axisX + " ." + _classes2.default.axisXLabel),
+		    axisYLabel = $$.main.select("." + _classes2.default.axisY + " ." + _classes2.default.axisYLabel),
+		    axisY2Label = $$.main.select("." + _classes2.default.axisY2 + "  ." + _classes2.default.axisY2Label);
+		(withTransition ? axisXLabel.transition() : axisXLabel).attr("x", this.xForXAxisLabel.bind(this)).attr("dx", this.dxForXAxisLabel.bind(this)).attr("dy", this.dyForXAxisLabel.bind(this)).text(this.textForXAxisLabel.bind(this)), (withTransition ? axisYLabel.transition() : axisYLabel).attr("x", this.xForYAxisLabel.bind(this)).attr("dx", this.dxForYAxisLabel.bind(this)).attr("dy", this.dyForYAxisLabel.bind(this)).text(this.textForYAxisLabel.bind(this)), (withTransition ? axisY2Label.transition() : axisY2Label).attr("x", this.xForY2AxisLabel.bind(this)).attr("dx", this.dxForY2AxisLabel.bind(this)).attr("dy", this.dyForY2AxisLabel.bind(this)).text(this.textForY2AxisLabel.bind(this));
+	}, Axis.prototype.getPadding = function getPadding(padding, key, defaultValue, domainLength) {
+		var p = typeof padding === "number" ? padding : padding[key];
+
+		// assume padding is pixels if unit is not specified
+		return (0, _util.isValue)(p) ? padding.unit === "ratio" ? padding[key] * domainLength : this.convertPixelsToAxisPadding(p, domainLength) : defaultValue;
+	}, Axis.prototype.convertPixelsToAxisPadding = function convertPixelsToAxisPadding(pixels, domainLength) {
+		var $$ = this.owner,
+		    length = $$.config.axis_rotated ? $$.width : $$.height;
+
+
+		return domainLength * (pixels / length);
+	}, Axis.prototype.generateTickValues = function generateTickValues(values, tickCount, forTimeSeries) {
+		var tickValues = values,
+		    start = void 0,
+		    end = void 0,
+		    count = void 0,
+		    interval = void 0,
+		    i = void 0,
+		    tickValue = void 0;
+
+
+		if (tickCount) {
+			var targetCount = (0, _util.isFunction)(tickCount) ? tickCount() : tickCount;
+
+			// compute ticks according to tickCount
+			if (targetCount === 1) tickValues = [values[0]];else if (targetCount === 2) tickValues = [values[0], values[values.length - 1]];else if (targetCount > 2) {
+
+				for (count = targetCount - 2, start = values[0], end = values[values.length - 1], interval = (end - start) / (count + 1), tickValues = [start], i = 0; i < count; i++) tickValue = +start + interval * (i + 1), tickValues.push(forTimeSeries ? new Date(tickValue) : tickValue);
+				tickValues.push(end);
+			}
+		}
+
+		return forTimeSeries || (tickValues = tickValues.sort(function (a, b) {
+			return a - b;
+		})), tickValues;
+	}, Axis.prototype.generateTransitions = function generateTransitions(duration) {
+		var $$ = this.owner,
+		    axes = $$.axes;
+
+
+		return {
+			axisX: duration ? axes.x.transition().duration(duration) : axes.x,
+			axisY: duration ? axes.y.transition().duration(duration) : axes.y,
+			axisY2: duration ? axes.y2.transition().duration(duration) : axes.y2,
+			axisSubX: duration ? axes.subx.transition().duration(duration) : axes.subx
+		};
+	}, Axis.prototype.redraw = function redraw(transitions, isHidden) {
+		var $$ = this.owner;
+
+		$$.axes.x.style("opacity", isHidden ? "0" : "1"), $$.axes.y.style("opacity", isHidden ? "0" : "1"), $$.axes.y2.style("opacity", isHidden ? "0" : "1"), $$.axes.subx.style("opacity", isHidden ? "0" : "1"), transitions.axisX.call($$.xAxis), transitions.axisY.call($$.yAxis), transitions.axisY2.call($$.y2Axis), transitions.axisSubX.call($$.subXAxis);
+	}, Axis;
+}();
+
+exports.default = Axis;
+module.exports = exports["default"];
+
+/***/ }),
+/* 8 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+exports.__esModule = !0;
+
+var _typeof2 = __webpack_require__(5),
+    _typeof3 = _interopRequireDefault(_typeof2);
+
+exports.default = function () {
+
+	function axisX(selection, x) {
+		selection.attr("transform", function (d) {
+			return "translate(" + Math.ceil(x(d) + tickOffset) + ", 0)";
+		});
+	}
+
+	function axisY(selection, y) {
+		selection.attr("transform", function (d) {
+			return "translate(0," + Math.ceil(y(d)) + ")";
+		});
+	}
+
+	function scaleExtent(domain) {
+		var start = domain[0],
+		    stop = domain[domain.length - 1];
+
+
+		return start < stop ? [start, stop] : [stop, start];
+	}
+
+	function generateTicks(scale) {
+		var ticks = [];
+
+		if (scale.ticks) return scale.ticks.apply(scale, tickArguments ? Array.prototype.slice.call(tickArguments) : []).map(function (v) {
+				return (
+					// round the tick value if is number
+					/(string|number)/.test(typeof v === "undefined" ? "undefined" : (0, _typeof3.default)(v)) && !isNaN(v) ? Math.round(v * 10) / 10 : v
+				);
+			});
+
+		for (var domain = scale.domain(), i = Math.ceil(domain[0]); i < domain[1]; i++) ticks.push(i);
+
+		return ticks.length > 0 && ticks[0] > 0 && ticks.unshift(ticks[0] - (ticks[1] - ticks[0])), ticks;
+	}
+
+	function copyScale() {
+		var newScale = scale.copy();
+
+		if (params.isCategory || !newScale.domain().length) {
+			var domain = scale.domain();
+
+			newScale.domain([domain[0], domain[1] - 1]);
+		}
+
+		return newScale;
+	}
+
+	function textFormatted(v) {
+		var formatted = tickFormat ? tickFormat(v) : v;
+
+		return typeof formatted === "undefined" ? "" : formatted;
+	}
+
+	function getSizeFor1Char(tick) {
+		if (tickTextCharSize) return tickTextCharSize;
+		var size = {
+			h: 11.5,
+			w: 5.5
+		};
+
+		return tick.select("text").text(textFormatted).each(function (d) {
+			var box = this.getBoundingClientRect(),
+			    text = textFormatted(d),
+			    h = box.height,
+			    w = text ? box.width / text.length : undefined;
+			h && w && (size.h = h, size.w = w);
+		}).text(""), tickTextCharSize = size, size;
+	}
+
+	function transitionise(selection) {
+		return params.withoutTransition ? selection : selection.transition(transition);
+	}
+
+	function axis(g) {
+		g.each(function () {
+
+			// this should be called only when category axis
+			function splitTickText(d, maxWidthValue) {
+
+				function split(splitted, text) {
+					spaceIndex = undefined;
+
+					for (var i = 1; i < text.length; i++)
+
+					// if text width gets over tick width, split by space index or crrent index
+					if (text.charAt(i) === " " && (spaceIndex = i), subtext = text.substr(0, i + 1), textWidth = sizeFor1Char.w * subtext.length, maxWidth < textWidth) return split(splitted.concat(text.substr(0, spaceIndex || i)), text.slice(spaceIndex ? spaceIndex + 1 : i));
+
+					return splitted.concat(text);
+				}
+
+				var tickText = textFormatted(d),
+				    maxWidth = maxWidthValue,
+				    subtext = void 0,
+				    spaceIndex = void 0,
+				    textWidth = void 0;
+				return Object.prototype.toString.call(tickText) === "[object Array]" ? tickText : ((!maxWidth || maxWidth <= 0) && (maxWidth = isVertical ? 95 : params.isCategory ? Math.ceil(scale1(ticks[1]) - scale1(ticks[0])) - 12 : 110), split([], tickText + ""));
+			}
+
+			function tspanDy(d, i) {
+				var dy = sizeFor1Char.h;
+
+				return i === 0 && (dy = orient === "left" || orient === "right" ? -((counts[d.index] - 1) * (sizeFor1Char.h / 2) - 3) : ".71em"), dy;
+			}
+
+			var g = (0, _d.select)(this);
+
+			axis.g = g;
+
+
+			var scale0 = this.__chart__ || scale,
+			    scale1 = copyScale();
+			this.__chart__ = scale1;
+
+
+			// count of tick data in array
+			var ticks = tickValues || generateTicks(scale1),
+			    tick = g.selectAll(".tick").data(ticks, scale1),
+			    tickEnter = tick.enter().insert("g", ".domain").attr("class", "tick").style("opacity", "1"),
+			    tickExit = tick.exit().remove();
+
+			// update selection
+
+
+			// enter selection
+
+
+			// MEMO: No exit transition. The reason is this transition affects max tick width calculation because old tick will be included in the ticks.
+			tick = tickEnter.merge(tick);
+
+
+			var tickUpdate = transitionise(tick).style("opacity", "1"),
+			    tickTransform = void 0,
+			    tickX = void 0,
+			    tickY = void 0,
+			    range = scale.rangeExtent ? scale.rangeExtent() : scaleExtent(scale.range()),
+			    path = g.selectAll(".domain").data([0]),
+			    pathUpdate = path.enter().append("path").attr("class", "domain").merge(transitionise(path));
+
+			// update selection - data join
+
+
+			// enter + update selection
+			tickEnter.append("line"), tickEnter.append("text");
+
+
+			var lineEnter = tickEnter.select("line"),
+			    lineUpdate = tickUpdate.select("line"),
+			    textEnter = tickEnter.select("text"),
+			    textUpdate = tickUpdate.select("text");
+			params.isCategory ? (tickOffset = Math.ceil((scale1(1) - scale1(0)) / 2), tickX = tickCentered ? 0 : tickOffset, tickY = tickCentered ? tickOffset : 0) : (tickX = 0, tickOffset = tickX);
+
+
+			var tspan = void 0,
+			    sizeFor1Char = getSizeFor1Char(g.select(".tick")),
+			    counts = [],
+			    tickLength = Math.max(innerTickSize, 0) + tickPadding,
+			    isVertical = orient === "left" || orient === "right",
+			    text = tick.select("text");tspan = text.selectAll("tspan").data(function (d, i) {
+				var splitted = params.tickMultiline ? splitTickText(d, params.tickWidth) : [].concat(textFormatted(d));
+
+				return counts[i] = splitted.length, splitted.map(function (s) {
+					return {
+						index: i,
+						splitted: s
+					};
+				});
+			}), tspan.exit().remove(), tspan = tspan.enter().append("tspan").merge(tspan).text(function (d) {
+				return d.splitted;
+			});
+
+
+			var rotate = params.tickTextRotate;
+
+			if (orient === "bottom" ? (tickTransform = axisX, lineEnter.attr("y2", innerTickSize), textEnter.attr("y", tickLength), lineUpdate.attr("x1", tickX).attr("x2", tickX).attr("y2", function (d) {
+				var tickPosition = scale(d) + (tickCentered ? 0 : tickOffset);
+
+				return range[0] < tickPosition && tickPosition < range[1] ? innerTickSize : 0;
+			}), textUpdate.attr("x", 0).attr("y", function (r) {
+				return r ? 11.5 - 2.5 * (r / 15) * (r > 0 ? 1 : -1) : tickLength;
+			}(rotate)).style("text-anchor", function (r) {
+				return r ? r > 0 ? "start" : "end" : "middle";
+			}(rotate)).attr("transform", function (r) {
+				return r ? "rotate(" + r + ")" : "";
+			}(rotate)), tspan.attr("x", 0).attr("dy", tspanDy).attr("dx", function (r) {
+				return r ? 8 * Math.sin(Math.PI * (r / 180)) : 0;
+			}(rotate)), pathUpdate.attr("d", "M" + range[0] + "," + outerTickSize + "V0H" + range[1] + "V" + outerTickSize)) : orient === "top" ? (tickTransform = axisX, lineEnter.attr("y2", -innerTickSize), textEnter.attr("y", -tickLength), lineUpdate.attr("x2", 0).attr("y2", -innerTickSize), textUpdate.attr("x", 0).attr("y", -tickLength), text.style("text-anchor", "middle"), tspan.attr("x", 0).attr("dy", "0em"), pathUpdate.attr("d", "M" + range[0] + "," + -outerTickSize + "V0H" + range[1] + "V" + -outerTickSize)) : orient === "left" ? (tickTransform = axisY, lineEnter.attr("x2", -innerTickSize), textEnter.attr("x", -tickLength), lineUpdate.attr("x2", -innerTickSize).attr("y1", tickY).attr("y2", tickY), textUpdate.attr("x", -tickLength).attr("y", tickOffset), text.style("text-anchor", "end"), tspan.attr("x", -tickLength).attr("dy", tspanDy), pathUpdate.attr("d", "M" + -outerTickSize + "," + range[0] + "H0V" + range[1] + "H" + -outerTickSize)) : orient === "right" ? (tickTransform = axisY, lineEnter.attr("x2", innerTickSize), textEnter.attr("x", tickLength), lineUpdate.attr("x2", innerTickSize).attr("y2", 0), textUpdate.attr("x", tickLength).attr("y", 0), text.style("text-anchor", "start"), tspan.attr("x", tickLength).attr("dy", tspanDy), pathUpdate.attr("d", "M" + outerTickSize + "," + range[0] + "H0V" + range[1] + "H" + outerTickSize)) : void 0, scale1.bandwidth) {
+				var x = scale1,
+				    dx = x.bandwidth() / 2;
+				scale0 = function scale0(d) {
+					return x(d) + dx;
+				}, scale1 = scale0;
+			} else scale0.bandwidth ? scale0 = scale1 : tickExit.call(tickTransform, scale1);
+
+			tickEnter.call(tickTransform, scale0), tickUpdate.call(tickTransform, scale1);
+		});
+	}
+
+	var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
+	    scale = (0, _d.scaleLinear)(),
+	    orient = "bottom",
+	    innerTickSize = 6,
+	    outerTickSize = params.withOuterTick ? 6 : 0,
+	    tickPadding = 3,
+	    tickValues = null,
+	    tickFormat = void 0,
+	    tickArguments = void 0,
+	    tickOffset = 0,
+	    tickCulling = !0,
+	    tickCentered = void 0,
+	    transition = void 0;
+
+
+	return axis.scale = function (x) {
+		return arguments.length ? (scale = x, axis) : scale;
+	}, axis.orient = function (x) {
+		return arguments.length ? (orient = x in {
+			top: 1,
+			right: 1,
+			bottom: 1,
+			left: 1
+		} ? x + "" : "bottom", axis) : orient;
+	}, axis.tickFormat = function (format) {
+		return arguments.length ? (tickFormat = format, axis) : tickFormat;
+	}, axis.tickCentered = function (isCentered) {
+		return arguments.length ? (tickCentered = isCentered, axis) : tickCentered;
+	}, axis.tickOffset = function () {
+		return tickOffset;
+	}, axis.tickInterval = function () {
+		var interval = void 0;
+
+		if (params.isCategory) interval = tickOffset * 2;else {
+			var length = axis.g.select("path.domain").node().getTotalLength() - outerTickSize * 2;
+
+			interval = length / axis.g.selectAll("line").size();
+		}
+
+		return interval === Infinity ? 0 : interval;
+	}, axis.ticks = function () {
+		for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) args[_key] = arguments[_key];
+
+		return args.length ? (tickArguments = Array.prototype.slice.call(args), axis) : tickArguments;
+	}, axis.tickCulling = function (culling) {
+		return arguments.length ? (tickCulling = culling, axis) : tickCulling;
+	}, axis.tickValues = function (x) {
+		if (typeof x === "function") tickValues = function tickValues() {
+				return x(scale.domain());
+			};else {
+			if (!arguments.length) return tickValues;
+
+			tickValues = x;
+		}
+
+		return this;
+	}, axis.setTransition = function (t) {
+		return transition = t, this;
+	}, axis;
+};
+
+var _d = __webpack_require__(2);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+// Features:
+// 1. category axis
+// 2. ceil values of translate/x/y to int for half pixel antialiasing
+// 3. multiline tick text
+var tickTextCharSize = void 0; /**
+                                * Copyright (c) 2017 NAVER Corp.
+                                * billboard.js project is licensed under the MIT license
+                                */
+module.exports = exports["default"];
+
+/***/ }),
+/* 9 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _typeof2 = __webpack_require__(5),
+    _typeof3 = _interopRequireDefault(_typeof2),
+    _Chart = __webpack_require__(4),
+    _Chart2 = _interopRequireDefault(_Chart),
+    _util = __webpack_require__(0);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/**
+ * Set the min/max value
+ * @param $$
+ * @param type
+ * @param value
+ * @return {undefined}
+ */
+/**
+ * Copyright (c) 2017 NAVER Corp.
+ * billboard.js project is licensed under the MIT license
+ */
+var setMinMax = function ($$, type, value) {
+  var config = $$.config,
+      axisY = "axis_y_" + type,
+      axisY2 = "axis_y2_" + type;
+
+
+  return typeof value !== "undefined" && ((typeof value === "undefined" ? "undefined" : (0, _typeof3.default)(value)) === "object" ? ((0, _util.isValue)(value.x) && (config["axis_x_" + type] = value.x), (0, _util.isValue)(value.y) && (config[axisY] = value.y), (0, _util.isValue)(value.y2) && (config[axisY2] = value.y2)) : (config[axisY] = value, config[axisY2] = value), $$.redraw({
+    withUpdateOrgXDomain: !0,
+    withUpdateXDomain: !0
+  })), undefined;
+},
+    getMinMax = function ($$, type) {
+  var config = $$.config;
+
+
+  return {
+    x: config["axis_x_" + type],
+    y: config["axis_y_" + type],
+    y2: config["axis_y2_" + type]
+  };
+},
+    axis = function () {};
+
+/**
+ * Get the min/max value
+ * @param $$
+ * @param type
+ * @return {{x, y, y2}}
+ */
+
+
+/**
+ * Define axis
+ */
+
+
+/**
+ * Get and set axis labels.
+ * @method axis:labels
+ * @instance
+ * @memberof Chart
+ * @param {Object} labels specified axis' label to be updated.
+ * @example
+ * // Update axis' label
+ * chart.axis.labels({
+ *   x: "New X Axis Label",
+ *   y: "New Y Axis Label"
+ * });
+ */
+axis.labels = function (labels) {
+  var $$ = this.internal;
+
+  arguments.length && (Object.keys(labels).forEach(function (axisId) {
+    $$.axis.setLabelText(axisId, labels[axisId]);
+  }), $$.axis.updateLabels());
+}, axis.min = function (min) {
+  return arguments.length ? setMinMax(this.internal, "min", min) : getMinMax(this.internal, "min");
+}, axis.max = function (max) {
+  return arguments.length ? setMinMax(this.internal, "max", max) : getMinMax(this.internal, "max");
+}, axis.range = function (range) {
+  if (arguments.length) (0, _util.isDefined)(range.max) && this.axis.max(range.max), (0, _util.isDefined)(range.min) && this.axis.min(range.min);else return {
+      max: this.axis.max(),
+      min: this.axis.min()
+    };
+
+  return undefined;
+}, (0, _util.extend)(_Chart2.default.prototype, { axis: axis });
+
+/***/ }),
+/* 10 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _Chart = __webpack_require__(4),
+    _Chart2 = _interopRequireDefault(_Chart),
+    _util = __webpack_require__(0);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/**
+ * Copyright (c) 2017 NAVER Corp.
+ * billboard.js project is licensed under the MIT license
+ */
+(0, _util.extend)(_Chart2.default.prototype, {
+	/**
+  * Set specified category name on category axis.
+  * @method category
+  * @instance
+  * @memberof Chart
+  * @param {Number} i index of category to be changed
+  * @param {String} category category value to be changed
+  * @example
+  * chart.category(2, "Category 3");
+  */
+	category: function category(i, _category) {
+		var $$ = this.internal,
+		    config = $$.config;
+
+
+		return arguments.length > 1 && (config.axis_x_categories[i] = _category, $$.redraw()), config.axis_x_categories[i];
+	},
+
+
+	/**
+  * Set category names on category axis.
+  * @method categories
+  * @instance
+  * @memberof Chart
+  * @param {Array} categories This must be an array that includes category names in string. If category names are included in the date by data.x option, this is not required.
+  * @example
+  * chart.categories([
+  *      "Category 1", "Category 2", ...
+  * ]);
+  */
+	categories: function categories(_categories) {
+		var $$ = this.internal,
+		    config = $$.config;
+		return arguments.length ? (config.axis_x_categories = _categories, $$.redraw(), config.axis_x_categories) : config.axis_x_categories;
+	}
+});
+
+/***/ }),
+/* 11 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _Chart = __webpack_require__(4),
+    _Chart2 = _interopRequireDefault(_Chart),
+    _browser = __webpack_require__(60),
+    _util = __webpack_require__(0);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+(0, _util.extend)(_Chart2.default.prototype, {
+	/**
+  * Resize the chart.
+  * @method resize
+  * @instance
+  * @memberof Chart
+  * @param {Object} size This argument should include width and height in pixels.
+  * @example
+  * // Resize to 640x480
+  * chart.resize({
+  *    width: 640,
+  *    height: 480
+  * });
+  */
+	resize: function resize(size) {
+		var config = this.internal.config;
+
+		config.size_width = size ? size.width : null, config.size_height = size ? size.height : null, this.flush();
+	},
+
+
+	/**
+  * Force to redraw.
+  * @method flush
+  * @instance
+  * @memberof Chart
+  * @example
+  * chart.flush();
+  */
+	flush: function flush() {
+		this.internal.updateAndRedraw({
+			withLegend: !0,
+			withTransition: !1,
+			withTransitionForTransform: !1
+		});
+	},
+
+
+	/**
+  * Reset the chart object and remove element and events completely.
+  * @method destroy
+  * @instance
+  * @memberof Chart
+  * @example
+  * chart.destroy();
+  */
+	destroy: function destroy() {
+		var $$ = this.internal;
+
+		return _browser.window.clearInterval($$.intervalForObserveInserted), $$.resizeTimeout !== undefined && _browser.window.clearTimeout($$.resizeTimeout), (0, _util.removeEvent)(_browser.window, "resize", $$.resizeFunction), $$.selectChart.classed("bb", !1).html(""), Object.keys($$).forEach(function (key) {
+			$$[key] = null;
+		}), null;
+	}
+}); /**
+     * Copyright (c) 2017 NAVER Corp.
+     * billboard.js project is licensed under the MIT license
+     */
+
+/***/ }),
+/* 12 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _Chart = __webpack_require__(4),
+    _Chart2 = _interopRequireDefault(_Chart),
+    _util = __webpack_require__(0);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/**
+ * Copyright (c) 2017 NAVER Corp.
+ * billboard.js project is licensed under the MIT license
+ */
+(0, _util.extend)(_Chart2.default.prototype, {
+	/**
+  * Get the color
+  * @method color
+  * @instance
+  * @memberof Chart
+  * @param {String} id id to get the color
+  * @example
+  * chart.color("data1");
+  */
+	color: function color(id) {
+		var $$ = this.internal;
+
+		return $$.color(id); // more patterns
+	}
+});
+
+/***/ }),
+/* 13 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _Chart = __webpack_require__(4),
+    _Chart2 = _interopRequireDefault(_Chart),
+    _util = __webpack_require__(0);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/**
+ * Get data loaded in the chart.
+ * @method data
+ * @instance
+ * @memberof Chart
+ * @param {String|Array} targetIds If this argument is given, this API returns the specified target data. If this argument is not given, all of data will be returned.
+ * @example
+ * // Get only data1 data
+ * chart.data("data1");
+ *
+ * // Get data1 and data2 data
+ * chart.data(["data1", "data2"]);
+ *
+ * // Get all data
+ * chart.data();
+ */
+/**
+ * Copyright (c) 2017 NAVER Corp.
+ * billboard.js project is licensed under the MIT license
+ */
+var data = function (targetIds) {
+  var targets = this.internal.data.targets;
+
+  return typeof targetIds === "undefined" ? targets : targets.filter(function (t) {
+    return [].concat(targetIds).indexOf(t.id) >= 0;
+  });
+};
+
+/**
+ * Get data shown in the chart.
+ * @method data:shown
+ * @instance
+ * @memberof Chart
+ * @param {String|Array} targetIds If this argument is given, this API filters the data with specified target ids. If this argument is not given, all shown data will be returned.
+ * @example
+ * // Get shown data by filtering to include only data1 data
+ * chart.data.shown("data1");
+ *
+ * // Get shown data by filtering to include data1 and data2 data
+ * chart.data.shown(["data1", "data2"]);
+ *
+ * // Get all shown data
+ * chart.data.shown();
+ */
+data.shown = function (targetIds) {
+  return this.internal.filterTargetsToShow(this.data(targetIds));
+}, data.values = function (targetId) {
+  var values = null;
+
+  if (targetId) {
+    var targets = this.data(targetId);
+
+    targets && targets[0] && (values = targets[0].values.map(function (d) {
+      return d.value;
+    }));
+  }
+
+  return values;
+}, data.names = function (names) {
+
+  return this.internal.clearLegendItemTextBoxCache(), this.internal.updateDataAttributes("names", names);
+}, data.colors = function (colors) {
+  return this.internal.updateDataAttributes("colors", colors);
+}, data.axes = function (axes) {
+  return this.internal.updateDataAttributes("axes", axes);
+}, (0, _util.extend)(_Chart2.default.prototype, { data: data });
+
+/***/ }),
+/* 14 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _d = __webpack_require__(2),
+    _Chart = __webpack_require__(4),
+    _Chart2 = _interopRequireDefault(_Chart),
+    _ChartInternal = __webpack_require__(1),
+    _ChartInternal2 = _interopRequireDefault(_ChartInternal),
+    _util = __webpack_require__(0),
+    _classes = __webpack_require__(3),
+    _classes2 = _interopRequireDefault(_classes);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+(0, _util.extend)(_Chart2.default.prototype, {
+	/**
+  * Flow data to the chart.<br><br>
+  * By this API, you can append new data points to the chart.
+  * @method flow
+  * @instance
+  * @memberof Chart
+  * @param {Object} args
+  * - If json, rows and columns given, the data will be loaded. If data that has the same target id is given, the chart will be appended. Otherwise, new target will be added. One of these is required when calling. If json specified, keys is required as well as data.json
+  * - If to is given, the lower x edge will move to that point. If not given, the lower x edge will move by the number of given data points.
+  * - If length is given, the lower x edge will move by the number of this argument.
+  * - If duration is given, the duration of the transition will be specified value. If not given, transition.duration will be used as default.
+  * - If done is given, the specified function will be called when flow ends.
+  * @example
+  * // 2 data points will be apprended to the tail and popped from the head.
+  * // After that, 4 data points will be appended and no data points will be poppoed.
+  * chart.flow({
+  *  columns: [
+  *    ["x", "2013-01-11", "2013-01-21"],
+  *    ["data1", 500, 200],
+  *    ["data2", 100, 300],
+  *    ["data3", 200, 120]
+  *  ],
+  *  done: function () {
+  *    chart.flow({
+  *      columns: [
+  *        ["x", "2013-02-11", "2013-02-12", "2013-02-13", "2013-02-14"],
+  *        ["data1", 200, 300, 100, 250],
+  *        ["data2", 100, 90, 40, 120],
+  *        ["data3", 100, 100, 300, 500]
+  *      ],
+  *      length: 0
+  *    });
+  *  }
+  * });
+  */
+	flow: function flow(args) {
+		var $$ = this.internal,
+		    notfoundIds = [],
+		    orgDataCount = $$.getMaxDataCount(),
+		    data = void 0,
+		    domain = void 0,
+		    length = 0,
+		    tail = 0,
+		    diff = void 0,
+		    to = void 0;
+
+
+		if (args.json) data = $$.convertJsonToData(args.json, args.keys);else if (args.rows) data = $$.convertRowsToData(args.rows);else if (args.columns) data = $$.convertColumnsToData(args.columns);else return;
+
+		var targets = $$.convertDataToTargets(data, !0);
+
+		// Update/Add data
+		$$.data.targets.forEach(function (t) {
+			var found = !1,
+			    i = void 0,
+			    j = void 0;
+
+
+			for (i = 0; i < targets.length; i++) if (t.id === targets[i].id) {
+
+				for (found = !0, t.values[t.values.length - 1] && (tail = t.values[t.values.length - 1].index + 1), length = targets[i].values.length, j = 0; j < length; j++) targets[i].values[j].index = tail + j, $$.isTimeSeries() || (targets[i].values[j].x = tail + j);
+				t.values = t.values.concat(targets[i].values), targets.splice(i, 1);
+
+				break;
+			}
+
+			found || notfoundIds.push(t.id);
+		}), $$.data.targets.forEach(function (t) {
+			var i = void 0,
+			    j = void 0;
+
+
+			for (i = 0; i < notfoundIds.length; i++) if (t.id === notfoundIds[i]) for (tail = t.values[t.values.length - 1].index + 1, j = 0; j < length; j++) t.values.push({
+					id: t.id,
+					index: tail + j,
+					x: $$.isTimeSeries() ? $$.getOtherTargetX(tail + j) : tail + j,
+					value: null
+				});
+		}), $$.data.targets.length && targets.forEach(function (t) {
+			var i = void 0,
+			    missing = [];
+
+
+			for (i = $$.data.targets[0].values[0].index; i < tail; i++) missing.push({
+				id: t.id,
+				index: i,
+				x: $$.isTimeSeries() ? $$.getOtherTargetX(i) : i,
+				value: null
+			});
+
+			t.values.forEach(function (v) {
+				v.index += tail, $$.isTimeSeries() || (v.x += tail);
+			}), t.values = missing.concat(t.values);
+		}), $$.data.targets = $$.data.targets.concat(targets);
+		// add remained
+
+		// check data count because behavior needs to change when it"s only one
+		// const dataCount = $$.getMaxDataCount();
+		var baseTarget = $$.data.targets[0],
+		    baseValue = baseTarget.values[0];
+
+
+		// Update length to flow if needed
+		(0, _util.isDefined)(args.to) ? (length = 0, to = $$.isTimeSeries() ? $$.parseDate(args.to) : args.to, baseTarget.values.forEach(function (v) {
+			v.x < to && length++;
+		})) : (0, _util.isDefined)(args.length) && (length = args.length), orgDataCount ? orgDataCount === 1 && $$.isTimeSeries() && (diff = (baseTarget.values[baseTarget.values.length - 1].x - baseValue.x) / 2, domain = [new Date(+baseValue.x - diff), new Date(+baseValue.x + diff)], $$.updateXDomain(null, !0, !0, !1, domain)) : (diff = $$.isTimeSeries() ? baseTarget.values.length > 1 ? baseTarget.values[baseTarget.values.length - 1].x - baseValue.x : baseValue.x - $$.getXDomain($$.data.targets)[0] : 1, domain = [baseValue.x - diff, baseValue.x], $$.updateXDomain(null, !0, !0, !1, domain)), $$.updateTargets($$.data.targets), $$.redraw({
+			flow: {
+				index: baseValue.index,
+				length: length,
+				duration: (0, _util.isValue)(args.duration) ? args.duration : $$.config.transition_duration,
+				done: args.done,
+				orgDataCount: orgDataCount
+			},
+			withLegend: !0,
+			withTransition: orgDataCount > 1,
+			withTrimXDomain: !1,
+			withUpdateXAxis: !0
+		});
+	}
+}), (0, _util.extend)(_ChartInternal2.default.prototype, {
+	/**
+  * Generate flow
+  * @memberof ChartInternal
+  * @private
+  * @param {Object} args
+  * @return {Function}
+  */
+	generateFlow: function generateFlow(args) {
+		var $$ = this,
+		    config = $$.config;
+
+
+		return function () {
+			var targets = args.targets,
+			    flow = args.flow,
+			    drawBar = args.drawBar,
+			    drawLine = args.drawLine,
+			    drawArea = args.drawArea,
+			    cx = args.cx,
+			    cy = args.cy,
+			    xv = args.xv,
+			    xForText = args.xForText,
+			    yForText = args.yForText,
+			    duration = args.duration,
+			    translateX = void 0,
+			    scaleX = 1,
+			    flowIndex = flow.index,
+			    flowLength = flow.length,
+			    flowStart = $$.getValueOnIndex($$.data.targets[0].values, flowIndex),
+			    flowEnd = $$.getValueOnIndex($$.data.targets[0].values, flowIndex + flowLength),
+			    orgDomain = $$.x.domain(),
+			    durationForFlow = flow.duration || duration,
+			    done = flow.done || function () {},
+			    wait = $$.generateWait(),
+			    xgrid = $$.xgrid || (0, _d.selectAll)([]),
+			    xgridLines = $$.xgridLines || (0, _d.selectAll)([]),
+			    mainRegion = $$.mainRegion || (0, _d.selectAll)([]),
+			    mainText = $$.mainText || (0, _d.selectAll)([]),
+			    mainBar = $$.mainBar || (0, _d.selectAll)([]),
+			    mainLine = $$.mainLine || (0, _d.selectAll)([]),
+			    mainArea = $$.mainArea || (0, _d.selectAll)([]),
+			    mainCircle = $$.mainCircle || (0, _d.selectAll)([]);
+
+
+			// set flag
+			$$.flowing = !0, $$.data.targets.forEach(function (d) {
+				d.values.splice(0, flowLength);
+			});
+
+
+			// update x domain to generate axis elements for flow
+			var domain = $$.updateXDomain(targets, !0, !0);
+
+			// update elements related to x scale
+			$$.updateXGrid && $$.updateXGrid(!0), flow.orgDataCount ? flow.orgDataCount === 1 || (flowStart && flowStart.x) === (flowEnd && flowEnd.x) ? translateX = $$.x(orgDomain[0]) - $$.x(domain[0]) : $$.isTimeSeries() ? translateX = $$.x(orgDomain[0]) - $$.x(domain[0]) : translateX = $$.x(flowStart.x) - $$.x(flowEnd.x) : $$.data.targets[0].values.length === 1 ? $$.isTimeSeries() ? (flowStart = $$.getValueOnIndex($$.data.targets[0].values, 0), flowEnd = $$.getValueOnIndex($$.data.targets[0].values, $$.data.targets[0].values.length - 1), translateX = $$.x(flowStart.x) - $$.x(flowEnd.x)) : translateX = (0, _util.diffDomain)(domain) / 2 : translateX = $$.x(orgDomain[0]) - $$.x(domain[0]), scaleX = (0, _util.diffDomain)(orgDomain) / (0, _util.diffDomain)(domain);
+
+			var transform = "translate(" + translateX + ",0) scale(" + scaleX + ",1)";
+
+			$$.hideXGridFocus();
+
+
+			var gt = (0, _d.transition)().ease(_d.easeLinear).duration(durationForFlow);
+
+			wait.add([$$.axes.x.transition(gt).call($$.xAxis.setTransition(gt)), mainBar.transition(gt).attr("transform", transform), mainLine.transition(gt).attr("transform", transform), mainArea.transition(gt).attr("transform", transform), mainCircle.transition(gt).attr("transform", transform), mainText.transition(gt).attr("transform", transform), mainRegion.filter($$.isRegionOnX).transition(gt).attr("transform", transform), xgrid.transition(gt).attr("transform", transform), xgridLines.transition(gt).attr("transform", transform)]), gt.call(wait, function () {
+				var i = void 0,
+				    shapes = [],
+				    texts = [],
+				    eventRects = [];
+
+
+				// remove flowed elements
+				if (flowLength) {
+					for (i = 0; i < flowLength; i++) shapes.push("." + _classes2.default.shape + "-" + (flowIndex + i)), texts.push("." + _classes2.default.text + "-" + (flowIndex + i)), eventRects.push("." + _classes2.default.eventRect + "-" + (flowIndex + i));
+
+					$$.svg.selectAll("." + _classes2.default.shapes).selectAll(shapes).remove(), $$.svg.selectAll("." + _classes2.default.texts).selectAll(texts).remove(), $$.svg.selectAll("." + _classes2.default.eventRects).selectAll(eventRects).remove(), $$.svg.select("." + _classes2.default.xgrid).remove();
+				}
+
+				// draw again for removing flowed elements and reverting attr
+				xgrid.size() && xgrid.attr("transform", null).attr($$.xgridAttr), xgridLines.attr("transform", null), xgridLines.select("line").attr("x1", config.axis_rotated ? 0 : xv).attr("x2", config.axis_rotated ? $$.width : xv), xgridLines.select("text").attr("x", config.axis_rotated ? $$.width : 0).attr("y", xv), mainBar.attr("transform", null).attr("d", drawBar), mainLine.attr("transform", null).attr("d", drawLine), mainArea.attr("transform", null).attr("d", drawArea), mainCircle.attr("transform", null).attr("cx", cx).attr("cy", cy), mainText.attr("transform", null).attr("x", xForText).attr("y", yForText).style("fill-opacity", $$.opacityForText.bind($$)), mainRegion.attr("transform", null), mainRegion.select("rect").filter($$.isRegionOnX).attr("x", $$.regionX.bind($$)).attr("width", $$.regionWidth.bind($$)), config.interaction_enabled && $$.redrawEventRect(), done(), $$.flowing = !1;
+			});
+		};
+	}
+}); /**
+     * Copyright (c) 2017 NAVER Corp.
+     * billboard.js project is licensed under the MIT license
+     */
+
+/***/ }),
+/* 15 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _d = __webpack_require__(2),
+    _Chart = __webpack_require__(4),
+    _Chart2 = _interopRequireDefault(_Chart),
+    _classes = __webpack_require__(3),
+    _classes2 = _interopRequireDefault(_classes),
+    _util = __webpack_require__(0);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/**
+ * Copyright (c) 2017 NAVER Corp.
+ * billboard.js project is licensed under the MIT license
+ */
+(0, _util.extend)(_Chart2.default.prototype, {
+		/**
+   * This API highlights specified targets and fade out the others.<br><br>
+   * You can specify multiple targets by giving an array that includes id as String. If no argument is given, all of targets will be highlighted.
+   * @method focus
+   * @instance
+   * @memberof Chart
+   * @param {String|Array} targetIdsValue Target ids to be highlighted.
+   * @example
+   *  // data1 will be highlighted and the others will be faded out
+   *  chart.focus("data1");
+   *
+   * // data1 and data2 will be highlighted and the others will be faded out
+   * chart.focus(["data1", "data2"]);
+   *
+   * // all targets will be highlighted
+   * chart.focus();
+   */
+		focus: function focus(targetIdsValue) {
+				var $$ = this.internal,
+				    targetIds = $$.mapToTargetIds(targetIdsValue),
+				    candidates = $$.svg.selectAll($$.selectorTargets(targetIds.filter($$.isTargetToShow, $$)));
+				this.revert(), this.defocus(), candidates.classed(_classes2.default.focused, !0).classed(_classes2.default.defocused, !1), $$.hasArcType() && $$.expandArc(targetIds), $$.toggleFocusLegend(targetIds, !0), $$.focusedTargetIds = targetIds, $$.defocusedTargetIds = $$.defocusedTargetIds.filter(function (id) {
+						return targetIds.indexOf(id) < 0;
+				});
+		},
+
+
+		/**
+   * This API fades out specified targets and reverts the others.<br><br>
+   * You can specify multiple targets by giving an array that includes id as String. If no argument is given, all of targets will be faded out.
+   * @method defocus
+   * @instance
+   * @memberof Chart
+   * @param {String|Array} Target ids to be faded out.
+   * @example
+   * // data1 will be faded out and the others will be reverted.
+   * chart.defocus("data1");
+   *
+   * // data1 and data2 will be faded out and the others will be reverted.
+   * chart.defocus(["data1", "data2"]);
+   *
+   * // all targets will be faded out.
+   * chart.defocus();
+   */
+		defocus: function defocus(targetIdsValue) {
+				var $$ = this.internal,
+				    targetIds = $$.mapToTargetIds(targetIdsValue),
+				    candidates = $$.svg.selectAll($$.selectorTargets(targetIds.filter($$.isTargetToShow, $$)));
+				candidates.classed(_classes2.default.focused, !1).classed(_classes2.default.defocused, !0), $$.hasArcType() && $$.unexpandArc(targetIds), $$.toggleFocusLegend(targetIds, !1), $$.focusedTargetIds = $$.focusedTargetIds.filter(function (id) {
+						return targetIds.indexOf(id) < 0;
+				}), $$.defocusedTargetIds = targetIds;
+		},
+
+
+		/**
+   * This API reverts specified targets.<br><br>
+   * You can specify multiple targets by giving an array that includes id as String. If no argument is given, all of targets will be reverted.
+   * @method revert
+   * @instance
+   * @memberof Chart
+   * @param {String|Array} Target ids to be reverted
+   * @example
+   * // data1 will be reverted.
+   * chart.revert("data1");
+   *
+   * // data1 and data2 will be reverted.
+   * chart.revert(["data1", "data2"]);
+   *
+   * // all targets will be reverted.
+   * chart.revert();
+   */
+		revert: function revert(targetIdsValue) {
+				var $$ = this.internal,
+				    targetIds = $$.mapToTargetIds(targetIdsValue),
+				    candidates = $$.svg.selectAll($$.selectorTargets(targetIds));
+				// should be for all targets
+
+				candidates.classed(_classes2.default.focused, !1).classed(_classes2.default.defocused, !1), $$.hasArcType() && $$.unexpandArc(targetIds), $$.config.legend_show && ($$.showLegend(targetIds.filter($$.isLegendToShow.bind($$))), $$.legend.selectAll($$.selectorLegends(targetIds)).filter(function () {
+						return (0, _d.select)(this).classed(_classes2.default.legendItemFocused);
+				}).classed(_classes2.default.legendItemFocused, !1)), $$.focusedTargetIds = [], $$.defocusedTargetIds = [];
+		}
+});
+
+/***/ }),
+/* 16 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _Chart = __webpack_require__(4),
+    _Chart2 = _interopRequireDefault(_Chart),
+    _util = __webpack_require__(0);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/**
+ * Update x grid lines.
+ * @method xgrids
+ * @instance
+ * @memberof Chart
+ * @param {Array} grids X grid lines will be replaced with this argument. The format of this argument is the same as grid.x.lines.
+ * @example
+ *  // Show 2 x grid lines
+ * chart.xgrids([
+ *    {value: 1, text: "Label 1"},
+ *    {value: 4, text: "Label 4"}
+ * ]);
+ */
+/**
+ * Copyright (c) 2017 NAVER Corp.
+ * billboard.js project is licensed under the MIT license
+ */
+var xgrids = function (grids) {
+  var $$ = this.internal,
+      config = $$.config;
+  return grids ? (config.grid_x_lines = grids, $$.redrawWithoutRescale(), config.grid_x_lines) : config.grid_x_lines;
+};
+
+/**
+ * Add x grid lines.<br>
+ * This API adds new x grid lines instead of replacing like xgrids.
+ * @method xgrids:add
+ * @instance
+ * @memberof Chart
+ * @param {Array|Object} grids New x grid lines will be added. The format of this argument is the same as grid.x.lines and it's possible to give an Object if only one line will be added.
+ * @example
+ *  // Add a new x grid line
+ * chart.xgrids.add(
+ *   {value: 4, text: "Label 4"}
+ * );
+ *
+ * // Add new x grid lines
+ * chart.xgrids.add([
+ *   {value: 2, text: "Label 2"},
+ *   {value: 4, text: "Label 4"}
+ * ]);
+ */
+xgrids.add = function (grids) {
+  return this.xgrids(this.internal.config.grid_x_lines.concat(grids || []));
+}, xgrids.remove = function (params) {
+  this.internal.removeGridLines(params, !0);
+};
+
+
+/**
+ * Update y grid lines.
+ * @method ygrids
+ * @instance
+ * @memberof Chart
+ * @param {Array} grids Y grid lines will be replaced with this argument. The format of this argument is the same as grid.y.lines.
+ * @example
+ *  // Show 2 y grid lines
+ * chart.ygrids([
+ *    {value: 100, text: "Label 1"},
+ *    {value: 400, text: "Label 4"}
+ * ]);
+ */
+var ygrids = function (grids) {
+  var $$ = this.internal,
+      config = $$.config;
+  return grids ? (config.grid_y_lines = grids, $$.redrawWithoutRescale(), config.grid_y_lines) : config.grid_y_lines;
+};
+
+/**
+ * Add y grid lines.<br>
+ * This API adds new y grid lines instead of replacing like ygrids.
+ * @method ygrids:add
+ * @instance
+ * @memberof Chart
+ * @param {Array|Object} grids New y grid lines will be added. The format of this argument is the same as grid.y.lines and it's possible to give an Object if only one line will be added.
+ * @example
+ *  // Add a new x grid line
+ * chart.ygrids.add(
+ *   {value: 400, text: "Label 4"}
+ * );
+ *
+ * // Add new x grid lines
+ * chart.ygrids.add([
+ *   {value: 200, text: "Label 2"},
+ *   {value: 400, text: "Label 4"}
+ * ]);
+ */
+ygrids.add = function (grids) {
+  return this.ygrids(this.internal.config.grid_y_lines.concat(grids || []));
+}, ygrids.remove = function (params) {
+  this.internal.removeGridLines(params, !1);
+}, (0, _util.extend)(_Chart2.default.prototype, {
+  xgrids: xgrids,
+  ygrids: ygrids
+});
+
+/***/ }),
+/* 17 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _Chart = __webpack_require__(4),
+    _Chart2 = _interopRequireDefault(_Chart),
+    _util = __webpack_require__(0);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/**
+ * Copyright (c) 2017 NAVER Corp.
+ * billboard.js project is licensed under the MIT license
+ */
+(0, _util.extend)(_Chart2.default.prototype, {
+	/**
+  * Update groups for the targets.
+  * @method groups
+  * @instance
+  * @memberof Chart
+  * @param {Array} groups This argument needs to be an Array that includes one or more Array that includes target ids to be grouped.
+  * @example
+  *  // data1 and data2 will be a new group.
+  *  chart.groups([
+  *     ["data1", "data2"]
+  *  ]);
+  */
+	groups: function groups(_groups) {
+		var $$ = this.internal,
+		    config = $$.config;
+		return (0, _util.isUndefined)(_groups) ? config.data_groups : (config.data_groups = _groups, $$.redraw(), config.data_groups);
+	}
+});
+
+/***/ }),
+/* 18 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _Chart = __webpack_require__(4),
+    _Chart2 = _interopRequireDefault(_Chart),
+    _util = __webpack_require__(0);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/**
+ * Define legend
+ */
+/**
+ * Copyright (c) 2017 NAVER Corp.
+ * billboard.js project is licensed under the MIT license
+ */
+var legend = function () {};
+
+/**
+ * Show legend for each target.
+ * @method legend:show
+ * @instance
+ * @memberof Chart
+ * @param {String|Array} targetIds
+ * - If targetIds is given, specified target's legend will be shown.
+ * - If only one target is the candidate, String can be passed.
+ * - If no argument is given, all of target's legend will be shown.
+ * @example
+ * // Show legend for data1.
+ * chart.legend.show("data1");
+ *
+ * // Show legend for data1 and data2.
+ * chart.legend.show(["data1", "data2"]);
+ *
+ * // Show all legend.
+ * chart.legend.show();
+ */
+legend.show = function (targetIds) {
+  var $$ = this.internal;
+
+  $$.showLegend($$.mapToTargetIds(targetIds)), $$.updateAndRedraw({ withLegend: !0 });
+}, legend.hide = function (targetIds) {
+  var $$ = this.internal;
+
+  $$.hideLegend($$.mapToTargetIds(targetIds)), $$.updateAndRedraw({ withLegend: !0 });
+}, (0, _util.extend)(_Chart2.default.prototype, { legend: legend });
+
+/***/ }),
+/* 19 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _Chart = __webpack_require__(4),
+    _Chart2 = _interopRequireDefault(_Chart),
+    _util = __webpack_require__(0);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/**
+ * Copyright (c) 2017 NAVER Corp.
+ * billboard.js project is licensed under the MIT license
+ */
+(0, _util.extend)(_Chart2.default.prototype, {
+	/**
+  * Load data to the chart.<br><br>
+  * You can specify multiple targets by giving an array that includes id as String. If no argument is given, all of targets will be toggles.
+  * - <b>Note:</b>
+  * unload should be used if some data needs to be unloaded simultaneously. If you call unload API soon after/before load instead of unload param, chart will not be rendered properly because of cancel of animation.<br>
+  * done will be called after data loaded, but it's not after rendering. It's because rendering will finish after some transition and there is some time lag between loading and rendering
+  * @method load
+  * @instance
+  * @memberof Chart
+  * @param {Object} args
+  * - If url, json, rows and columns given, the data will be loaded. If data that has the same target id is given, the chart will be updated. Otherwise, new target will be added.
+  * - If classes given, the classes specifed by data.classes will be updated. classes must be Object that has target id as keys.
+  * - If categories given, the categories specifed by axis.x.categories or data.x will be updated. categories must be Array.
+  * - If axes given, the axes specifed by data.axes will be updated. axes must be Object that has target id as keys.
+  * - If colors given, the colors specifed by data.colors will be updated. colors must be Object that has target id as keys.
+  * - If type or types given, the type of targets will be updated. type must be String and types must be Object.
+  * - If unload given, data will be unloaded before loading new data. If true given, all of data will be unloaded. If target ids given as String or Array, specified targets will be unloaded.
+  * - If done given, the specified function will be called after data loded.
+  * @example
+  *  // Load data1 and unload data2 and data3
+  *  chart.load({
+  *     columns: [
+  *        ["data1", 100, 200, 150, ...],
+  *        ...
+  *    ],
+  *    unload: ["data2", "data3"]
+  *  });
+  */
+	load: function load(args) {
+		var $$ = this.internal,
+		    config = $$.config;
+
+		// update xs if specified
+
+
+		// use cache if exists
+		return args.xs && $$.addXs(args.xs), "names" in args && this.data.names(args.names), "classes" in args && Object.keys(args.classes).forEach(function (id) {
+			config.data_classes[id] = args.classes[id];
+		}), "categories" in args && $$.isCategorized() && (config.axis_x_categories = args.categories), "axes" in args && Object.keys(args.axes).forEach(function (id) {
+			config.data_axes[id] = args.axes[id];
+		}), "colors" in args && Object.keys(args.colors).forEach(function (id) {
+			config.data_colors[id] = args.colors[id];
+		}), "cacheIds" in args && $$.hasCaches(args.cacheIds) ? void $$.load($$.getCaches(args.cacheIds), args.done) : void ("unload" in args ? $$.unload($$.mapToTargetIds(typeof args.unload === "boolean" && args.unload ? null : args.unload), function () {
+			return $$.loadFromArgs(args);
+		}) : $$.loadFromArgs(args));
+
+		// unload if needed
+	},
+
+
+	/**
+  * Unload data to the chart.<br><br>
+  * You can specify multiple targets by giving an array that includes id as String. If no argument is given, all of targets will be toggles.
+  * - <b>Note:</b>
+  * If you call load API soon after/before unload, unload param of load should be used. Otherwise chart will not be rendered properly because of cancel of animation.<br>
+  * `done` will be called after data loaded, but it's not after rendering. It's because rendering will finish after some transition and there is some time lag between loading and rendering.
+  * @method unload
+  * @instance
+  * @memberof Chart
+  * @param {Object} args
+  * - If ids given, the data that has specified target id will be unloaded. ids should be String or Array. If ids is not specified, all data will be unloaded.
+  * - If done given, the specified function will be called after data loded.
+  * @example
+  *  // Unload data2 and data3
+  *  chart.unload({
+  *    ids: ["data2", "data3"]
+  *  });
+  */
+	unload: function unload(argsValue) {
+		var $$ = this.internal,
+		    args = argsValue || {};
+		args instanceof Array ? args = { ids: args } : typeof args === "string" && (args = { ids: [args] }), $$.unload($$.mapToTargetIds(args.ids), function () {
+			$$.redraw({
+				withUpdateOrgXDomain: !0,
+				withUpdateXDomain: !0,
+				withLegend: !0
+			}), args.done && args.done();
+		});
+	}
+});
+
+/***/ }),
+/* 20 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _Chart = __webpack_require__(4),
+    _Chart2 = _interopRequireDefault(_Chart),
+    _classes = __webpack_require__(3),
+    _classes2 = _interopRequireDefault(_classes),
+    _util = __webpack_require__(0);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/**
+ * Update regions.
+ * @method regions
+ * @instance
+ * @memberof Chart
+ * @param {Array} regions Regions will be replaced with this argument. The format of this argument is the same as regions.
+ * @return {Array} regions
+ * @example
+ * // Show 2 regions
+ * chart.regions([
+ *    {axis: "x", start: 5, class: "regionX"},
+ *    {axis: "y", end: 50, class: "regionY"}
+ * ]);
+ */
+var regions = function (_regions) {
+  var $$ = this.internal,
+      config = $$.config;
+  return _regions ? (config.regions = _regions, $$.redrawWithoutRescale(), config.regions) : config.regions;
+};
+
+/**
+ * Add new region.<br><br>
+ * This API adds new region instead of replacing like regions.
+ * @method regions:add
+ * @instance
+ * @memberof Chart
+ * @param {Array|Object} regions New region will be added. The format of this argument is the same as regions and it's possible to give an Object if only one region will be added.
+ * @return {Array} regions
+ * @example
+ * // Add a new region
+ * chart.regions.add(
+ *    {axis: "x", start: 5, class: "regionX"}
+ * );
+ *
+ * // Add new regions
+ * chart.regions.add([
+ *    {axis: "x", start: 5, class: "regionX"},
+ *    {axis: "y", end: 50, class: "regionY"}
+ *]);
+ */
+/**
+ * Copyright (c) 2017 NAVER Corp.
+ * billboard.js project is licensed under the MIT license
+ */
+regions.add = function (regions) {
+  var $$ = this.internal,
+      config = $$.config;
+  return regions ? (config.regions = config.regions.concat(regions), $$.redrawWithoutRescale(), config.regions) : config.regions;
+}, regions.remove = function (optionsValue) {
+  var $$ = this.internal,
+      config = $$.config,
+      options = optionsValue || {},
+      duration = $$.getOption(options, "duration", config.transition_duration),
+      classes = $$.getOption(options, "classes", [_classes2.default.region]),
+      regions = $$.main.select("." + _classes2.default.regions).selectAll(classes.map(function (c) {
+    return "." + c;
+  }));
+
+
+  return (duration ? regions.transition().duration(duration) : regions).style("opacity", "0").remove(), config.regions = config.regions.filter(function (region) {
+    var found = !1;
+
+    return !region.class || (region.class.split(" ").forEach(function (c) {
+      classes.indexOf(c) >= 0 && (found = !0);
+    }), !found);
+  }), config.regions;
+}, (0, _util.extend)(_Chart2.default.prototype, { regions: regions });
+
+/***/ }),
+/* 21 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _d = __webpack_require__(2),
+    _Chart = __webpack_require__(4),
+    _Chart2 = _interopRequireDefault(_Chart),
+    _util = __webpack_require__(0),
+    _classes = __webpack_require__(3),
+    _classes2 = _interopRequireDefault(_classes);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/**
+ * Copyright (c) 2017 NAVER Corp.
+ * billboard.js project is licensed under the MIT license
+ */
+(0, _util.extend)(_Chart2.default.prototype, {
+	/**
+  * Get selected data points.<br><br>
+  * By this API, you can get selected data points information. To use this API, data.selection.enabled needs to be set true.
+  * @method selected
+  * @instance
+  * @memberof Chart
+  * @param {String} targetId You can filter the result by giving target id that you want to get. If not given, all of data points will be returned.
+  * @return {Array} dataPoint
+  * @example
+  *  // all selected data points will be returned.
+  *  chart.selected();
+  *
+  *  // all selected data points of data1 will be returned.
+  *  chart.selected("data1");
+  */
+	selected: function selected(targetId) {
+		var $$ = this.internal,
+		    dataPoint = [];
+
+
+		return $$.main.selectAll("." + (_classes2.default.shapes + $$.getTargetSelectorSuffix(targetId))).selectAll("." + _classes2.default.shape).filter(function () {
+			return (0, _d.select)(this).classed(_classes2.default.SELECTED);
+		}).each(function (d) {
+			return dataPoint.push(d);
+		}), dataPoint;
+	},
+
+
+	/**
+  * Set data points to be selected.
+  * @method select
+  * @instance
+  * @memberof Chart
+  * @param {String} ids
+  * @param {Number} indices
+  * @param {Boolean} resetOther
+  * @example
+  *  // select from 'data1', indices 2 and unselect others selected
+  *  chart.select("data1", 2, true);
+  */
+	select: function select(ids, indices, resetOther) {
+		var $$ = this.internal,
+		    config = $$.config;
+		config.data_selection_enabled && $$.main.selectAll("." + _classes2.default.shapes).selectAll("." + _classes2.default.shape).each(function (d, i) {
+			var shape = (0, _d.select)(this),
+			    id = d.data ? d.data.id : d.id,
+			    toggle = $$.getToggle(this, d).bind($$),
+			    isTargetId = config.data_selection_grouped || !ids || ids.indexOf(id) >= 0,
+			    isTargetIndex = !indices || indices.indexOf(i) >= 0,
+			    isSelected = shape.classed(_classes2.default.SELECTED);
+
+
+			// line/area selection not supported yet
+			shape.classed(_classes2.default.line) || shape.classed(_classes2.default.area) || (isTargetId && isTargetIndex ? config.data_selection_isselectable(d) && !isSelected && toggle(!0, shape.classed(_classes2.default.SELECTED, !0), d, i) : (0, _util.isDefined)(resetOther) && resetOther && isSelected && toggle(!1, shape.classed(_classes2.default.SELECTED, !1), d, i));
+		});
+	},
+
+
+	/**
+  * Set data points to be un-selected.
+  * @method unselect
+  * @instance
+  * @memberof Chart
+  * @param {String} ids
+  * @param {Number} indices
+  * @example
+  *  // unselect from 'data1', indices 2
+  *  chart.unselect("data1", 2);
+  */
+	unselect: function unselect(ids, indices) {
+		var $$ = this.internal,
+		    config = $$.config;
+		config.data_selection_enabled && $$.main.selectAll("." + _classes2.default.shapes).selectAll("." + _classes2.default.shape).each(function (d, i) {
+			var shape = (0, _d.select)(this),
+			    id = d.data ? d.data.id : d.id,
+			    toggle = $$.getToggle(this, d).bind($$),
+			    isTargetId = config.data_selection_grouped || !ids || ids.indexOf(id) >= 0,
+			    isTargetIndex = !indices || indices.indexOf(i) >= 0,
+			    isSelected = shape.classed(_classes2.default.SELECTED);
+
+
+			// line/area selection not supported yet
+			shape.classed(_classes2.default.line) || shape.classed(_classes2.default.area) || isTargetId && isTargetIndex && config.data_selection_isselectable(d) && isSelected && toggle(!1, shape.classed(_classes2.default.SELECTED, !1), d, i);
+		});
+	}
+});
+
+/***/ }),
+/* 22 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _Chart = __webpack_require__(4),
+    _Chart2 = _interopRequireDefault(_Chart),
+    _util = __webpack_require__(0);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/**
+ * Copyright (c) 2017 NAVER Corp.
+ * billboard.js project is licensed under the MIT license
+ */
+(0, _util.extend)(_Chart2.default.prototype, {
+	/**
+  * Show data points
+  * @method show
+  * @instance
+  * @memberof Chart
+  * @param {String|Array} targetIdsValue
+  * @param {Object} options
+  */
+	show: function show(targetIdsValue) {
+		var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
+		    $$ = this.internal,
+		    targetIds = $$.mapToTargetIds(targetIdsValue);
+		$$.removeHiddenTargetIds(targetIds);
+
+		var targets = $$.svg.selectAll($$.selectorTargets(targetIds));
+
+		targets.transition().style("opacity", "1", "important").call($$.endall, function () {
+			targets.style("opacity", null).style("opacity", "1");
+		}), options.withLegend && $$.showLegend(targetIds), $$.redraw({
+			withUpdateOrgXDomain: !0,
+			withUpdateXDomain: !0,
+			withLegend: !0
+		});
+	},
+
+
+	/**
+  * Hide data points
+  * @method hide
+  * @instance
+  * @memberof Chart
+  * @param {String|Array} targetIdsValue
+  * @param {Object} options
+  */
+	hide: function hide(targetIdsValue) {
+		var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
+		    $$ = this.internal,
+		    targetIds = $$.mapToTargetIds(targetIdsValue);
+		$$.addHiddenTargetIds(targetIds);
+
+		var targets = $$.svg.selectAll($$.selectorTargets(targetIds));
+
+		targets.transition().style("opacity", "0", "important").call($$.endall, function () {
+			targets.style("opacity", null).style("opacity", "0");
+		}), options.withLegend && $$.hideLegend(targetIds), $$.redraw({
+			withUpdateOrgXDomain: !0,
+			withUpdateXDomain: !0,
+			withLegend: !0
+		});
+	},
+
+
+	/**
+  * Toggle data points
+  * @method toggle
+  * @instance
+  * @memberof Chart
+  * @param {Array} targetIds
+  * @param {Object} options
+  */
+	toggle: function toggle(targetIds) {
+		var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
+		    that = this,
+		    $$ = this.internal;
+		$$.mapToTargetIds(targetIds).forEach(function (targetId) {
+			$$.isTargetToShow(targetId) ? that.hide(targetId, options) : that.show(targetId, options);
+		});
+	}
+});
+
+/***/ }),
+/* 23 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _Chart = __webpack_require__(4),
+    _Chart2 = _interopRequireDefault(_Chart),
+    _util = __webpack_require__(0);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/**
+ * Define tooltip
+ */
+/**
+ * Copyright (c) 2017 NAVER Corp.
+ * billboard.js project is licensed under the MIT license
+ */
+var tooltip = function () {};
+
+/**
+ * Show tooltip
+ * @method tooltip:show
+ * @instance
+ * @memberof Chart
+ * @param {Array} args
+ */
+tooltip.show = function (args) {
+	var $$ = this.internal,
+	    index = void 0,
+	    mouse = void 0;
+
+
+	// determine mouse position on the chart
+	args.mouse && (mouse = args.mouse), args.data ? $$.isMultipleX() ? (mouse = [$$.x(args.data.x), $$.getYScale(args.data.id)(args.data.value)], index = null) : index = (0, _util.isValue)(args.data.index) ? args.data.index : $$.getIndexByX(args.data.x) : typeof args.x === "undefined" ? typeof args.index !== "undefined" && (index = args.index) : index = $$.getIndexByX(args.x), $$.dispatchEvent("mouseover", index, mouse), $$.dispatchEvent("mousemove", index, mouse), $$.config.tooltip_onshow.call($$, args.data);
+}, tooltip.hide = function () {
+	this.internal.dispatchEvent("mouseout", 0), this.internal.config.tooltip_onhide.call(this);
+}, (0, _util.extend)(_Chart2.default.prototype, { tooltip: tooltip });
+
+/***/ }),
+/* 24 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _Chart = __webpack_require__(4),
+    _Chart2 = _interopRequireDefault(_Chart),
+    _ChartInternal = __webpack_require__(1),
+    _ChartInternal2 = _interopRequireDefault(_ChartInternal),
+    _util = __webpack_require__(0);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+(0, _util.extend)(_Chart2.default.prototype, {
+	/**
+  * Change the type of the chart.
+  * @method transform
+  * @instance
+  * @memberof Chart
+  * @param {String} type Specify the type to be transformed. The types listed in data.type can be used.
+  * @param {String|Array} targetIds Specify targets to be transformed. If not given, all targets will be the candidate.
+  * @example
+  *  // all targets will be bar chart.
+  *  chart.transform("bar");
+  *
+  *  // only data1 will be bar chart.
+  *  chart.transform("bar", "data1");
+  *
+  *  // only data1 and data2 will be bar chart.
+  *  chart.transform("bar", ["data1", "data2"]);
+  */
+	transform: function transform(type, targetIds) {
+		var $$ = this.internal,
+		    options = ["pie", "donut"].indexOf(type) >= 0 ? { withTransform: !0 } : null;
+		$$.transformTo(targetIds, type, options);
+	}
+}), (0, _util.extend)(_ChartInternal2.default.prototype, {
+	/**
+  * Change the type of the chart.
+  * @private
+  * @param {String|Array} targetIds
+  * @param {String} type
+  * @param {Object} optionsForRedraw
+  */
+	transformTo: function transformTo(targetIds, type, optionsForRedraw) {
+		var $$ = this,
+		    withTransitionForAxis = !$$.hasArcType(),
+		    options = optionsForRedraw || { withTransitionForAxis: withTransitionForAxis };
+		options.withTransitionForTransform = !1, $$.transiting = !1, $$.setTargetType(targetIds, type), $$.updateTargets($$.data.targets), $$.updateAndRedraw(options);
+	}
+}); /**
+     * Copyright (c) 2017 NAVER Corp.
+     * billboard.js project is licensed under the MIT license
+     */
+
+/***/ }),
+/* 25 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _Chart = __webpack_require__(4),
+    _Chart2 = _interopRequireDefault(_Chart),
+    _util = __webpack_require__(0);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/**
+ * Copyright (c) 2017 NAVER Corp.
+ * billboard.js project is licensed under the MIT license
+ */
+(0, _util.extend)(_Chart2.default.prototype, {
+	/**
+  * Get and set x values for the chart.
+  * @method x
+  * @instance
+  * @memberof Chart
+  * @param {Array} x If x is given, x values of every target will be updated. If no argument is given, current x values will be returned as an Object whose keys are the target ids.
+  * @return {Object} xs
+  * @example
+  *  // Get current x values
+  *  chart.x();
+  *
+  *  // Update x values for all targets
+  *  chart.x([100, 200, 300, 400, ...]);
+  */
+	x: function x(_x) {
+		var $$ = this.internal;
+
+		return arguments.length && ($$.updateTargetX($$.data.targets, _x), $$.redraw({
+			withUpdateOrgXDomain: !0,
+			withUpdateXDomain: !0
+		})), $$.data.xs;
+	},
+
+
+	/**
+  * Get and set x values for the chart.
+  * @method xs
+  * @instance
+  * @memberof Chart
+  * @param {Array} xs If xs is given, specified target's x values will be updated. If no argument is given, current x values will be returned as an Object whose keys are the target ids.
+  * @return {Object} xs
+  * @example
+  *  // Get current x values
+  *  chart.xs();
+  *
+  *  // Update x values for all targets
+  *  chart.xs({
+  *    data1: [10, 20, 30, 40, ...],
+  *    data2: [100, 200, 300, 400, ...]
+  *  });
+  */
+	xs: function xs(_xs) {
+		var $$ = this.internal;
+
+		return arguments.length && ($$.updateTargetXs($$.data.targets, _xs), $$.redraw({
+			withUpdateOrgXDomain: !0,
+			withUpdateXDomain: !0
+		})), $$.data.xs;
+	}
+});
+
+/***/ }),
+/* 26 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _d = __webpack_require__(2),
+    _Chart = __webpack_require__(4),
+    _Chart2 = _interopRequireDefault(_Chart),
+    _util = __webpack_require__(0);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/**
+ * Zoom by giving x domain.
+ * @method zoom
+ * @instance
+ * @memberof Chart
+ * @param {Array} domainValue If domain is given, the chart will be zoomed to the given domain. If no argument is given, the current zoomed domain will be returned.
+ * @example
+ *  // Zoom to specified domain
+ *  chart.zoom([10, 20]);
+ *
+ *  // Get the current zoomed domain
+ *  chart.zoom();
+ */
+var zoom = function (domainValue) {
+	var $$ = this.internal,
+	    domain = domainValue,
+	    resultDomain = void 0;
+
+
+	if (domain) {
+
+		if ($$.isTimeSeries() && (domain = domain.map(function (x) {
+			return $$.parseDate(x);
+		})), $$.config.subchart_show) {
+			var xScale = $$.zoomScale || $$.x;
+
+			$$.brush.getSelection().call($$.brush.move, [xScale(domain[0]), xScale(domain[1])]), resultDomain = domain;
+		} else {
+			var orgDomain = $$.x.orgDomain(),
+			    k = (orgDomain[1] - orgDomain[0]) / (domain[1] - domain[0]),
+			    tx = $$.isTimeSeries() ? 0 - k * $$.x(domain[0].getTime()) : domain[0] - k * $$.x(domain[0]);
+			$$.zoom.updateTransformScale(_d.zoomIdentity.translate(tx, 0).scale(k)), resultDomain = $$.zoomScale.domain();
+		}
+
+		$$.redraw({
+			withTransition: !0,
+			withY: $$.config.zoom_rescale
+		}), $$.config.zoom_onzoom.call(this, $$.x.orgDomain());
+	} else resultDomain = ($$.zoomScale || $$.x).domain();
+	return resultDomain;
+};
+
+/**
+ * Enable and disable zooming.
+ * @method zoom:enable
+ * @instance
+ * @memberof Chart
+ * @param {Boolean} enabled If enabled is true, the feature of zooming will be enabled. If false is given, it will be disabled.
+ * @example
+ *  // Enable zooming
+ *  chart.zoom.enable(true);
+ */
+/**
+ * Copyright (c) 2017 NAVER Corp.
+ * billboard.js project is licensed under the MIT license
+ */
+zoom.enable = function (enabled) {
+	var $$ = this.internal;
+
+	$$.config.zoom_enabled = enabled, $$.updateAndRedraw();
+}, zoom.max = function (max) {
+	var $$ = this.internal,
+	    config = $$.config;
+
+
+	if (max === 0 || max) config.zoom_x_max = (0, _d.max)([$$.orgXDomain[1], max]);else return config.zoom_x_max;
+
+	return undefined;
+}, zoom.min = function (min) {
+	var $$ = this.internal,
+	    config = $$.config;
+
+
+	if (min === 0 || min) config.zoom_x_min = (0, _d.min)([$$.orgXDomain[0], min]);else return config.zoom_x_min;
+
+	return undefined;
+}, zoom.range = function (range) {
+	if (arguments.length) (0, _util.isDefined)(range.max) && this.domain.max(range.max), (0, _util.isDefined)(range.min) && this.domain.min(range.min);else return {
+			max: this.domain.max(),
+			min: this.domain.min()
+		};
+
+	return undefined;
+}, (0, _util.extend)(_Chart2.default.prototype, {
+	zoom: zoom,
+	/**
+  * Unzoom zoomed area
+  * @method unzoom
+  * @instance
+  * @memberof Chart
+  * @example
+  *  chart.unzoom();
+  */
+	unzoom: function unzoom() {
+		var $$ = this.internal;
+
+		$$.config.subchart_show ? $$.brush.getSelection().call($$.brush.move, null) : $$.zoom.updateTransformScale(_d.zoomIdentity), $$.redraw({
+			withTransition: !0,
+			withY: $$.config.zoom_rescale
+		});
+	}
+});
+
+/***/ }),
+/* 27 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _typeof2 = __webpack_require__(5),
+    _typeof3 = _interopRequireDefault(_typeof2),
+    _Options = __webpack_require__(58),
+    _Options2 = _interopRequireDefault(_Options),
+    _ChartInternal = __webpack_require__(1),
+    _ChartInternal2 = _interopRequireDefault(_ChartInternal),
+    _util = __webpack_require__(0);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+(0, _util.extend)(_ChartInternal2.default.prototype, {
+	getOptions: function getOptions() {
+		var config = new _Options2.default();
+
+		return (0, _util.merge)(config.value, this.additionalConfig);
+	},
+
+
+	additionalConfig: {},
+
+	loadConfig: function loadConfig(config) {
+
+		function find() {
+			var key = keys.shift();
+
+			return key && target && (typeof target === "undefined" ? "undefined" : (0, _typeof3.default)(target)) === "object" && key in target ? (target = target[key], find()) : key ? undefined : target;
+		}
+
+		var thisConfig = this.config,
+		    target = void 0,
+		    keys = void 0,
+		    read = void 0;
+		Object.keys(thisConfig).forEach(function (key) {
+			target = config, keys = key.split("_"), read = find(), (0, _util.isDefined)(read) && (thisConfig[key] = read);
+		});
+	}
+}); /**
+     * Copyright (c) 2017 NAVER Corp.
+     * billboard.js project is licensed under the MIT license
+     */
+
+/***/ }),
+/* 28 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _d = __webpack_require__(2),
+    _ChartInternal = __webpack_require__(1),
+    _ChartInternal2 = _interopRequireDefault(_ChartInternal),
+    _util = __webpack_require__(0);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+(0, _util.extend)(_ChartInternal2.default.prototype, {
+	convertUrlToData: function convertUrlToData(url) {
+		var _this = this,
+		    mimeType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "csv",
+		    headers = arguments[2],
+		    keys = arguments[3],
+		    done = arguments[4],
+		    type = mimeType,
+		    req = (0, _d.request)(url);
+
+		if (headers) for (var _iterator = Object.keys(headers), _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
+				var _ref;
+
+				if (_isArray) {
+					if (_i >= _iterator.length) break;
+					_ref = _iterator[_i++];
+				} else {
+					if (_i = _iterator.next(), _i.done) break;
+					_ref = _i.value;
+				}
+
+				var header = _ref;
+				req.header(header, headers[header]);
+			}
+
+		req.get(function (error, data) {
+			var d = void 0;
+
+			if (!data) throw new Error(error.responseURL + " " + error.status + " (" + error.statusText + ")");
+
+			var response = data.response || data.responseText;
+
+			d = type === "json" ? _this.convertJsonToData(JSON.parse(response), keys) : type === "tsv" ? _this.convertTsvToData(response) : _this.convertCsvToData(response), done.call(_this, d);
+		});
+	},
+	convertCsvToData: function convertCsvToData(xsv) {
+		var rows = (0, _d.csvParseRows)(xsv),
+		    d = void 0;
+
+
+		return rows.length === 1 ? (d = [{}], rows[0].forEach(function (id) {
+			d[0][id] = null;
+		})) : d = (0, _d.csvParse)(xsv), d;
+	},
+	convertTsvToData: function convertTsvToData(xsv) {
+		var rows = (0, _d.tsvParseRows)(xsv),
+		    d = void 0;
+
+
+		return rows.length === 1 ? (d = [{}], rows[0].forEach(function (id) {
+			d[0][id] = null;
+		})) : d = (0, _d.tsvParse)(xsv), d;
+	},
+	convertJsonToData: function convertJsonToData(json, keys) {
+		var _this2 = this,
+		    newRows = [],
+		    targetKeys = void 0,
+		    data = void 0;
+
+		return keys ? (keys.x ? (targetKeys = keys.value.concat(keys.x), this.config.data_x = keys.x) : targetKeys = keys.value, newRows.push(targetKeys), json.forEach(function (o) {
+
+			for (var newRow = [], v = void 0, _iterator2 = targetKeys, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {
+				var _ref2;
+
+				if (_isArray2) {
+					if (_i2 >= _iterator2.length) break;
+					_ref2 = _iterator2[_i2++];
+				} else {
+					if (_i2 = _iterator2.next(), _i2.done) break;
+					_ref2 = _i2.value;
+				}
+
+				var key = _ref2;
+				v = _this2.findValueInJson(o, key), (0, _util.isUndefined)(v) && (v = null), newRow.push(v);
+			}
+			newRows.push(newRow);
+		}), data = this.convertRowsToData(newRows)) : (Object.keys(json).forEach(function (key) {
+			return newRows.push([key].concat(json[key]));
+		}), data = this.convertColumnsToData(newRows)), data;
+	},
+	findValueInJson: function findValueInJson(object, path) {
+		var convertedPath = path.replace(/\[(\w+)\]/g, ".$1"),
+		    pathArray = convertedPath.replace(/^\./, "").split("."),
+		    target = object; // convert indexes to properties (replace [] with .)
+		// strip a leading dot
+
+
+		for (var _iterator3 = pathArray, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) {
+			var _ref3;
+
+			if (_isArray3) {
+				if (_i3 >= _iterator3.length) break;
+				_ref3 = _iterator3[_i3++];
+			} else {
+				if (_i3 = _iterator3.next(), _i3.done) break;
+				_ref3 = _i3.value;
+			}
+
+			var k = _ref3;
+
+			if (k in target) target = target[k];else {
+				target = undefined;
+
+				break;
+			}
+		}
+		return target;
+	},
+	convertRowsToData: function convertRowsToData(rows) {
+		var keys = rows[0],
+		    newRows = [],
+		    newRow = {},
+		    i = void 0,
+		    j = void 0;
+
+
+		for (i = 1; i < rows.length; i++) {
+			for (newRow = {}, j = 0; j < rows[i].length; j++) {
+				if ((0, _util.isUndefined)(rows[i][j])) throw new Error("Source data is missing a component at (" + i + ", " + j + ")!");
+				newRow[keys[j]] = rows[i][j];
+			}
+			newRows.push(newRow);
+		}
+
+		return newRows;
+	},
+	convertColumnsToData: function convertColumnsToData(columns) {
+		var newRows = [],
+		    i = void 0,
+		    j = void 0,
+		    key = void 0;
+
+
+		for (i = 0; i < columns.length; i++) for (key = columns[i][0], j = 1; j < columns[i].length; j++) {
+			if ((0, _util.isUndefined)(newRows[j - 1]) && (newRows[j - 1] = {}), (0, _util.isUndefined)(columns[i][j])) throw new Error("Source data is missing a component at (" + i + ", " + j + ")!");
+			newRows[j - 1][key] = columns[i][j];
+		}
+		return newRows;
+	},
+	convertDataToTargets: function convertDataToTargets(data, appendXs) {
+		var _this3 = this,
+		    $$ = this,
+		    config = $$.config,
+		    ids = (0, _d.keys)(data[0]).filter($$.isNotX, $$),
+		    xs = (0, _d.keys)(data[0]).filter($$.isX, $$);
+
+		ids.forEach(function (id) {
+			var xKey = _this3.getXKey(id);
+
+			_this3.isCustomX() || _this3.isTimeSeries() ? xs.indexOf(xKey) >= 0 ? _this3.data.xs[id] = (appendXs && $$.data.xs[id] ? $$.data.xs[id] : []).concat(data.map(function (d) {
+				return d[xKey];
+			}).filter(_util.isValue).map(function (rawX, i) {
+				return $$.generateTargetX(rawX, id, i);
+			})) : config.data_x ? _this3.data.xs[id] = _this3.getOtherTargetXs() : (0, _util.notEmpty)(config.data_xs) && ($$.data.xs[id] = $$.getXValuesOfXKey(xKey, $$.data.targets)) : $$.data.xs[id] = data.map(function (d, i) {
+				return i;
+			});
+		}), ids.forEach(function (id) {
+			if (!$$.data.xs[id]) throw new Error("x is not defined for id = \"" + id + "\".");
+		});
+
+
+		// convert to target
+		var targets = ids.map(function (id, index) {
+			var convertedId = config.data_idConverter(id);
+
+			return {
+				id: convertedId,
+				id_org: id,
+				values: data.map(function (d, i) {
+					var xKey = $$.getXKey(id),
+					    rawX = d[xKey],
+					    value = d[id] === null || isNaN(d[id]) ? null : +d[id],
+					    x = void 0;
+
+					// use x as categories if custom x and categorized
+
+					return $$.isCustomX() && $$.isCategorized() && index === 0 && !(0, _util.isUndefined)(rawX) ? (index === 0 && i === 0 && (config.axis_x_categories = []), x = config.axis_x_categories.indexOf(rawX), x === -1 && (x = config.axis_x_categories.length, config.axis_x_categories.push(rawX))) : x = $$.generateTargetX(rawX, id, i), ((0, _util.isUndefined)(d[id]) || $$.data.xs[id].length <= i) && (x = undefined), { x: x, value: value, id: convertedId };
+				}).filter(function (v) {
+					return (0, _util.isDefined)(v.x);
+				})
+			};
+		});
+
+		// finish targets
+
+
+		return targets.forEach(function (t) {
+			var i = void 0;
+
+			// sort values by its x
+			config.data_xSort && (t.values = t.values.sort(function (v1, v2) {
+				var x1 = v1.x || v1.x === 0 ? v1.x : Infinity,
+				    x2 = v2.x || v2.x === 0 ? v2.x : Infinity;
+
+
+				return x1 - x2;
+			})), i = 0, t.values.forEach(function (v) {
+				v.index = i++;
+			}), $$.data.xs[t.id].sort(function (v1, v2) {
+				return v1 - v2;
+			});
+		}), $$.hasNegativeValue = $$.hasNegativeValueInTargets(targets), $$.hasPositiveValue = $$.hasPositiveValueInTargets(targets), config.data_type && $$.setTargetType($$.mapToIds(targets).filter(function (id) {
+			return !(id in config.data_types);
+		}), config.data_type), targets.forEach(function (d) {
+			$$.addCache(d.id_org, d);
+		}), targets;
+	}
+}); /**
+     * Copyright (c) 2017 NAVER Corp.
+     * billboard.js project is licensed under the MIT license
+     */
+
+/***/ }),
+/* 29 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _typeof2 = __webpack_require__(5),
+    _typeof3 = _interopRequireDefault(_typeof2),
+    _d = __webpack_require__(2),
+    _classes = __webpack_require__(3),
+    _classes2 = _interopRequireDefault(_classes),
+    _ChartInternal = __webpack_require__(1),
+    _ChartInternal2 = _interopRequireDefault(_ChartInternal),
+    _util = __webpack_require__(0);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/**
+ * Copyright (c) 2017 NAVER Corp.
+ * billboard.js project is licensed under the MIT license
+ */
+(0, _util.extend)(_ChartInternal2.default.prototype, {
+	isX: function isX(key) {
+		var $$ = this,
+		    config = $$.config,
+		    dataKey = config.data_x && key === config.data_x,
+		    existValue = (0, _util.notEmpty)(config.data_xs) && (0, _util.hasValue)(config.data_xs, key);
+
+
+		return dataKey || existValue;
+	},
+	isNotX: function isNotX(key) {
+		return !this.isX(key);
+	},
+	getXKey: function getXKey(id) {
+		var $$ = this,
+		    config = $$.config;
+
+
+		return config.data_x ? config.data_x : (0, _util.notEmpty)(config.data_xs) ? config.data_xs[id] : null;
+	},
+	getXValuesOfXKey: function getXValuesOfXKey(key, targets) {
+		var $$ = this,
+		    ids = targets && (0, _util.notEmpty)(targets) ? $$.mapToIds(targets) : [],
+		    xValues = void 0;
+
+		return ids.forEach(function (id) {
+			$$.getXKey(id) === key && (xValues = $$.data.xs[id]);
+		}), xValues;
+	},
+	getIndexByX: function getIndexByX(x) {
+		var $$ = this,
+		    data = $$.filterByX($$.data.targets, x);
+
+
+		return data.length ? data[0].index : null;
+	},
+	getXValue: function getXValue(id, i) {
+		var $$ = this;
+
+		return id in $$.data.xs && $$.data.xs[id] && (0, _util.isValue)($$.data.xs[id][i]) ? $$.data.xs[id][i] : i;
+	},
+	getOtherTargetXs: function getOtherTargetXs() {
+		var $$ = this,
+		    idsForX = Object.keys($$.data.xs);
+
+
+		return idsForX.length ? $$.data.xs[idsForX[0]] : null;
+	},
+	getOtherTargetX: function getOtherTargetX(index) {
+		var xs = this.getOtherTargetXs();
+
+		return xs && index < xs.length ? xs[index] : null;
+	},
+	addXs: function addXs(xs) {
+		var $$ = this;
+
+		Object.keys(xs).forEach(function (id) {
+			$$.config.data_xs[id] = xs[id];
+		});
+	},
+	hasMultipleX: function hasMultipleX(xs) {
+		// https://github.com/d3/d3-collection
+		return (0, _d.set)(Object.keys(xs).map(function (id) {
+			return xs[id];
+		})).size() > 1;
+	},
+	isMultipleX: function isMultipleX() {
+		return (0, _util.notEmpty)(this.config.data_xs) || !this.config.data_xSort || this.hasType("scatter");
+	},
+	addName: function addName(data) {
+		var $$ = this,
+		    name = void 0;
+
+		return data && (name = $$.config.data_names[data.id], data.name = name === undefined ? data.id : name), data;
+	},
+	getValueOnIndex: function getValueOnIndex(values, index) {
+		var valueOnIndex = values.filter(function (v) {
+			return v.index === index;
+		});
+
+		return valueOnIndex.length ? valueOnIndex[0] : null;
+	},
+	updateTargetX: function updateTargetX(targets, x) {
+		var $$ = this;
+
+		targets.forEach(function (t) {
+			t.values.forEach(function (v, i) {
+				v.x = $$.generateTargetX(x[i], t.id, i);
+			}), $$.data.xs[t.id] = x;
+		});
+	},
+	updateTargetXs: function updateTargetXs(targets, xs) {
+		var $$ = this;
+
+		targets.forEach(function (t) {
+			xs[t.id] && $$.updateTargetX([t], xs[t.id]);
+		});
+	},
+	generateTargetX: function generateTargetX(rawX, id, index) {
+		var $$ = this,
+		    x = void 0;
+
+		return x = $$.isTimeSeries() ? rawX ? $$.parseDate(rawX) : $$.parseDate($$.getXValue(id, index)) : $$.isCustomX() && !$$.isCategorized() ? (0, _util.isValue)(rawX) ? +rawX : $$.getXValue(id, index) : index, x;
+	},
+	cloneTarget: function cloneTarget(target) {
+		return {
+			id: target.id,
+			id_org: target.id_org,
+			values: target.values.map(function (d) {
+				return { x: d.x, value: d.value, id: d.id };
+			})
+		};
+	},
+	updateXs: function updateXs() {
+		var $$ = this;
+
+		$$.data.targets.length && ($$.xs = [], $$.data.targets[0].values.forEach(function (v) {
+			$$.xs[v.index] = v.x;
+		}));
+	},
+	getPrevX: function getPrevX(i) {
+		var x = this.xs[i - 1];
+
+		return typeof x === "undefined" ? null : x;
+	},
+	getNextX: function getNextX(i) {
+		var x = this.xs[i + 1];
+
+		return typeof x === "undefined" ? null : x;
+	},
+	getMaxDataCount: function getMaxDataCount() {
+		var $$ = this;
+
+		return (0, _d.max)($$.data.targets, function (t) {
+			return t.values.length;
+		});
+	},
+	getMaxDataCountTarget: function getMaxDataCountTarget(targets) {
+		var length = targets.length,
+		    max = 0,
+		    maxTarget = void 0;
+
+		return length > 1 ? targets.forEach(function (t) {
+			t.values.length > max && (maxTarget = t, max = t.values.length);
+		}) : maxTarget = length ? targets[0] : null, maxTarget;
+	},
+	getEdgeX: function getEdgeX(targets) {
+		return targets.length ? [(0, _d.min)(targets, function (t) {
+			return t.values[0].x;
+		}), (0, _d.max)(targets, function (t) {
+			return t.values[t.values.length - 1].x;
+		})] : [0, 0];
+	},
+	mapToIds: function mapToIds(targets) {
+		return targets.map(function (d) {
+			return d.id;
+		});
+	},
+	mapToTargetIds: function mapToTargetIds(ids) {
+		var $$ = this;
+
+		return ids ? [].concat(ids) : $$.mapToIds($$.data.targets);
+	},
+	hasTarget: function hasTarget(targets, id) {
+		var ids = this.mapToIds(targets),
+		    i = void 0;
+
+
+		for (i = 0; i < ids.length; i++) if (ids[i] === id) return !0;
+		return !1;
+	},
+	isTargetToShow: function isTargetToShow(targetId) {
+		return this.hiddenTargetIds.indexOf(targetId) < 0;
+	},
+	isLegendToShow: function isLegendToShow(targetId) {
+		return this.hiddenLegendIds.indexOf(targetId) < 0;
+	},
+	filterTargetsToShow: function filterTargetsToShow(targets) {
+		var $$ = this;
+
+		return targets.filter(function (t) {
+			return $$.isTargetToShow(t.id);
+		});
+	},
+	mapTargetsToUniqueXs: function mapTargetsToUniqueXs(targets) {
+		var $$ = this,
+		    xs = (0, _d.set)((0, _d.merge)(targets.map(function (t) {
+			return t.values.map(function (v) {
+				return +v.x;
+			});
+		}))).values();
+
+		return xs = $$.isTimeSeries() ? xs.map(function (x) {
+			return new Date(+x);
+		}) : xs.map(function (x) {
+			return +x;
+		}), xs.sort(function (a, b) {
+			return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
+		});
+	},
+	addHiddenTargetIds: function addHiddenTargetIds(targetIds) {
+		this.hiddenTargetIds = this.hiddenTargetIds.concat(targetIds);
+	},
+	removeHiddenTargetIds: function removeHiddenTargetIds(targetIds) {
+		this.hiddenTargetIds = this.hiddenTargetIds.filter(function (id) {
+			return targetIds.indexOf(id) < 0;
+		});
+	},
+	addHiddenLegendIds: function addHiddenLegendIds(targetIds) {
+		this.hiddenLegendIds = this.hiddenLegendIds.concat(targetIds);
+	},
+	removeHiddenLegendIds: function removeHiddenLegendIds(targetIds) {
+		this.hiddenLegendIds = this.hiddenLegendIds.filter(function (id) {
+			return targetIds.indexOf(id) < 0;
+		});
+	},
+	getValuesAsIdKeyed: function getValuesAsIdKeyed(targets) {
+		var ys = {};
+
+		return targets.forEach(function (t) {
+			ys[t.id] = [], t.values.forEach(function (v) {
+				ys[t.id].push(v.value);
+			});
+		}), ys;
+	},
+	checkValueInTargets: function checkValueInTargets(targets, checker) {
+		var ids = Object.keys(targets),
+		    i = void 0,
+		    j = void 0,
+		    values = void 0;
+
+
+		for (i = 0; i < ids.length; i++) for (values = targets[ids[i]].values, j = 0; j < values.length; j++) if (checker(values[j].value)) return !0;
+		return !1;
+	},
+	hasNegativeValueInTargets: function hasNegativeValueInTargets(targets) {
+		return this.checkValueInTargets(targets, function (v) {
+			return v < 0;
+		});
+	},
+	hasPositiveValueInTargets: function hasPositiveValueInTargets(targets) {
+		return this.checkValueInTargets(targets, function (v) {
+			return v > 0;
+		});
+	},
+	isOrderDesc: function isOrderDesc() {
+		var config = this.config;
+
+		return typeof config.data_order === "string" && config.data_order.toLowerCase() === "desc";
+	},
+	isOrderAsc: function isOrderAsc() {
+		var config = this.config;
+
+		return typeof config.data_order === "string" && config.data_order.toLowerCase() === "asc";
+	},
+	orderTargets: function orderTargets(targets) {
+		var $$ = this,
+		    config = $$.config,
+		    orderAsc = $$.isOrderAsc(),
+		    orderDesc = $$.isOrderDesc();
+		// TODO: accept name array for order
+		return orderAsc || orderDesc ? targets.sort(function (t1, t2) {
+			var reducer = function (p, c) {
+				return p + Math.abs(c.value);
+			},
+			    t1Sum = t1.values.reduce(reducer, 0),
+			    t2Sum = t2.values.reduce(reducer, 0);
+
+
+			return orderAsc ? t2Sum - t1Sum : t1Sum - t2Sum;
+		}) : (0, _util.isFunction)(config.data_order) && targets.sort(config.data_order), targets;
+	},
+	filterByX: function filterByX(targets, x) {
+		return (0, _d.merge)(targets.map(function (t) {
+			return t.values;
+		})).filter(function (v) {
+			return v.x - x === 0;
+		});
+	},
+	filterRemoveNull: function filterRemoveNull(data) {
+		return data.filter(function (d) {
+			return (0, _util.isValue)(d.value);
+		});
+	},
+	filterByXDomain: function filterByXDomain(targets, xDomain) {
+		return targets.map(function (t) {
+			return {
+				id: t.id,
+				id_org: t.id_org,
+				values: t.values.filter(function (v) {
+					return xDomain[0] <= v.x && v.x <= xDomain[1];
+				})
+			};
+		});
+	},
+	hasDataLabel: function hasDataLabel() {
+		var config = this.config;
+
+		if (typeof config.data_labels === "boolean" && config.data_labels) return !0;
+		return (0, _typeof3.default)(config.data_labels) === "object" && (0, _util.notEmpty)(config.data_labels);
+	},
+	getDataLabelLength: function getDataLabelLength(min, max, key) {
+		var $$ = this,
+		    lengths = [0, 0];
+
+		return $$.selectChart.select("svg").selectAll(".dummy").data([min, max]).enter().append("text").text(function (d) {
+			return $$.dataLabelFormat(d.id)(d);
+		}).each(function (d, i) {
+			lengths[i] = this.getBoundingClientRect()[key] * 1.3;
+		}).remove(), lengths;
+	},
+	isNoneArc: function isNoneArc(d) {
+		return this.hasTarget(this.data.targets, d.id);
+	},
+	isArc: function isArc(d) {
+		return "data" in d && this.hasTarget(this.data.targets, d.data.id);
+	},
+	findSameXOfValues: function findSameXOfValues(values, index) {
+		var targetX = values[index].x,
+		    sames = [],
+		    i = void 0;
+
+
+		for (i = index - 1; i >= 0 && !(targetX !== values[i].x); i--) sames.push(values[i]);
+		for (i = index; i < values.length && !(targetX !== values[i].x); i++) sames.push(values[i]);
+		return sames;
+	},
+	findClosestFromTargets: function findClosestFromTargets(targets, pos) {
+		var $$ = this,
+		    candidates = targets.map(function (target) {
+			return $$.findClosest(target.values, pos);
+		});
+		// map to array of closest points of each target
+
+		// decide closest point and return
+		return $$.findClosest(candidates, pos);
+	},
+	findClosest: function findClosest(values, pos) {
+		var $$ = this,
+		    minDist = $$.config.point_sensitivity,
+		    closest = void 0;
+
+		// find mouseovering bar
+
+
+		return values.filter(function (v) {
+			return v && $$.isBarType(v.id);
+		}).forEach(function (v) {
+			var shape = $$.main.select().node("." + _classes2.default.bars + $$.getTargetSelectorSuffix(v.id) + "." + _classes2.default.bar + "-" + v.index);
+
+			!closest && $$.isWithinBar(shape) && (closest = v);
+		}), values.filter(function (v) {
+			return v && !$$.isBarType(v.id);
+		}).forEach(function (v) {
+			var d = $$.dist(v, pos);
+
+			d < minDist && (minDist = d, closest = v);
+		}), closest;
+	},
+	dist: function dist(data, pos) {
+		var $$ = this,
+		    config = $$.config,
+		    xIndex = config.axis_rotated ? 1 : 0,
+		    yIndex = config.axis_rotated ? 0 : 1,
+		    y = $$.circleY(data, data.index),
+		    x = $$.x(data.x);
+
+
+		return Math.sqrt(Math.pow(x - pos[xIndex], 2) + Math.pow(y - pos[yIndex], 2));
+	},
+	convertValuesToStep: function convertValuesToStep(values) {
+		var converted = [].concat(values),
+		    i = void 0;
+
+
+		if (!this.isCategorized()) return values;
+
+		for (i = values.length + 1; i > 0; i--) converted[i] = converted[i - 1];
+
+		return converted[0] = {
+			x: converted[0].x - 1,
+			value: converted[0].value,
+			id: converted[0].id
+		}, converted[values.length + 1] = {
+			x: converted[values.length].x + 1,
+			value: converted[values.length].value,
+			id: converted[values.length].id
+		}, converted;
+	},
+	updateDataAttributes: function updateDataAttributes(name, attrs) {
+		var $$ = this,
+		    config = $$.config,
+		    current = config["data_" + name];
+		return typeof attrs === "undefined" ? current : (Object.keys(attrs).forEach(function (id) {
+			current[id] = attrs[id];
+		}), $$.redraw({ withLegend: !0 }), current);
+	}
+});
+
+/***/ }),
+/* 30 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _classes = __webpack_require__(3),
+    _classes2 = _interopRequireDefault(_classes),
+    _ChartInternal = __webpack_require__(1),
+    _ChartInternal2 = _interopRequireDefault(_ChartInternal),
+    _util = __webpack_require__(0);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+(0, _util.extend)(_ChartInternal2.default.prototype, {
+	load: function load(rawTargets, args) {
+		var $$ = this,
+		    targets = rawTargets;
+		targets && (args.filter && (targets = targets.filter(args.filter)), (args.type || args.types) && targets.forEach(function (t) {
+			var type = args.types && args.types[t.id] ? args.types[t.id] : args.type;
+
+			$$.setTargetType(t.id, type);
+		}), $$.data.targets.forEach(function (d) {
+			for (var i = 0; i < targets.length; i++) if (d.id === targets[i].id) {
+				d.values = targets[i].values, targets.splice(i, 1);
+
+				break;
+			}
+		}), $$.data.targets = $$.data.targets.concat(targets)), $$.updateTargets($$.data.targets), $$.redraw({ withUpdateOrgXDomain: !0, withUpdateXDomain: !0, withLegend: !0 }), args.done && args.done();
+	},
+	loadFromArgs: function loadFromArgs(args) {
+		var $$ = this;
+
+		args.data ? $$.load($$.convertDataToTargets(args.data), args) : args.url ? $$.convertUrlToData(args.url, args.mimeType, args.headers, args.keys, function (data) {
+			$$.load($$.convertDataToTargets(data), args);
+		}) : args.json ? $$.load($$.convertDataToTargets($$.convertJsonToData(args.json, args.keys)), args) : args.rows ? $$.load($$.convertDataToTargets($$.convertRowsToData(args.rows)), args) : args.columns ? $$.load($$.convertDataToTargets($$.convertColumnsToData(args.columns)), args) : $$.load(null, args);
+	},
+	unload: function unload(rawTargetIds, customDoneCb) {
+		var $$ = this,
+		    done = customDoneCb,
+		    targetIds = rawTargetIds;
+
+
+		// If no target, call done and return
+		return done || (done = function () {}), targetIds = targetIds.filter(function (id) {
+			return $$.hasTarget($$.data.targets, id);
+		}), targetIds && targetIds.length !== 0 ? void ($$.svg.selectAll(targetIds.map(function (id) {
+			return $$.selectorTarget(id);
+		})).transition().style("opacity", "0").remove().call($$.endall, done), targetIds.forEach(function (id) {
+			$$.withoutFadeIn[id] = !1, $$.legend && $$.legend.selectAll("." + _classes2.default.legendItem + $$.getTargetSelectorSuffix(id)).remove(), $$.data.targets = $$.data.targets.filter(function (t) {
+				return t.id !== id;
+			});
+		})) : void done();
+	}
+}); /**
+     * Copyright (c) 2017 NAVER Corp.
+     * billboard.js project is licensed under the MIT license
+     */
+
+/***/ }),
+/* 31 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _d = __webpack_require__(2),
+    _ChartInternal = __webpack_require__(1),
+    _ChartInternal2 = _interopRequireDefault(_ChartInternal),
+    _classes = __webpack_require__(3),
+    _classes2 = _interopRequireDefault(_classes),
+    _util = __webpack_require__(0);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/**
+ * Copyright (c) 2017 NAVER Corp.
+ * billboard.js project is licensed under the MIT license
+ */
+(0, _util.extend)(_ChartInternal2.default.prototype, {
+	/**
+  * Called when dragging.
+  * Data points can be selected.
+  * @private
+  * @param {Object} mouse Object
+  */
+	drag: function drag(mouse) {
+		var $$ = this,
+		    config = $$.config,
+		    main = $$.main;
+		// do nothing if not selectable
+		// skip when single selection because drag is used for multiple selection
+
+		if (!$$.hasArcType() && config.data_selection_enabled && (!config.zoom_enabled || $$.zoom.altDomain) && config.data_selection_multiple) {
+				var sx = $$.dragStart[0],
+				    sy = $$.dragStart[1],
+				    mx = mouse[0],
+				    my = mouse[1],
+				    minX = Math.min(sx, mx),
+				    maxX = Math.max(sx, mx),
+				    minY = config.data_selection_grouped ? $$.margin.top : Math.min(sy, my),
+				    maxY = config.data_selection_grouped ? $$.height : Math.max(sy, my);
+				main.select("." + _classes2.default.dragarea).attr("x", minX).attr("y", minY).attr("width", maxX - minX).attr("height", maxY - minY), main.selectAll("." + _classes2.default.shapes).selectAll("." + _classes2.default.shape).filter(function (d) {
+					return config.data_selection_isselectable(d);
+				}).each(function (d, i) {
+					var shape = (0, _d.select)(this),
+					    isSelected = shape.classed(_classes2.default.SELECTED),
+					    isIncluded = shape.classed(_classes2.default.INCLUDED),
+					    _x = void 0,
+					    _y = void 0,
+					    _w = void 0,
+					    _h = void 0,
+					    toggle = void 0,
+					    isWithin = !1,
+					    box = void 0;
+
+
+					if (shape.classed(_classes2.default.circle)) _x = shape.attr("cx") * 1, _y = shape.attr("cy") * 1, toggle = $$.togglePoint, isWithin = minX < _x && _x < maxX && minY < _y && _y < maxY;else if (shape.classed(_classes2.default.bar)) box = (0, _util.getPathBox)(this), _x = box.x, _y = box.y, _w = box.width, _h = box.height, toggle = $$.togglePath, isWithin = !(maxX < _x || _x + _w < minX) && !(maxY < _y || _y + _h < minY);else
+						// line/area selection not supported yet
+						return;
+					isWithin ^ isIncluded && (shape.classed(_classes2.default.INCLUDED, !isIncluded), shape.classed(_classes2.default.SELECTED, !isSelected), toggle.call($$, !isSelected, shape, d, i));
+				});
+			} // skip if zoomable because of conflict drag dehavior
+	},
+
+
+	/**
+  * Called when the drag starts.
+  * Adds and Shows the drag area.
+  * @private
+  * @param {Object} mouse Object
+  */
+	dragstart: function dragstart(mouse) {
+		var $$ = this,
+		    config = $$.config;
+		// do nothing if not selectable
+		$$.hasArcType() || !config.data_selection_enabled || ($$.dragStart = mouse, $$.main.select("." + _classes2.default.chart).append("rect").attr("class", _classes2.default.dragarea).style("opacity", "0.1"), $$.dragging = !0);
+	},
+
+
+	/**
+  * Called when the drag finishes.
+  * Removes the drag area.
+  * @private
+  */
+	dragend: function dragend() {
+		var $$ = this,
+		    config = $$.config;
+		// do nothing if not selectable
+		$$.hasArcType() || !config.data_selection_enabled || ($$.main.select("." + _classes2.default.dragarea).transition().duration(100).style("opacity", "0").remove(), $$.main.selectAll("." + _classes2.default.shape).classed(_classes2.default.INCLUDED, !1), $$.dragging = !1);
+	}
+}); // interpolate
+
+/***/ }),
+/* 32 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _d = __webpack_require__(2),
+    _ChartInternal = __webpack_require__(1),
+    _ChartInternal2 = _interopRequireDefault(_ChartInternal),
+    _classes = __webpack_require__(3),
+    _classes2 = _interopRequireDefault(_classes),
+    _util = __webpack_require__(0);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/**
+ * Copyright (c) 2017 NAVER Corp.
+ * billboard.js project is licensed under the MIT license
+ */
+(0, _util.extend)(_ChartInternal2.default.prototype, {
+	/**
+  * Initialize the area that detects the event.
+  * Add a container for the zone that detects the event.
+  * @private
+  */
+	initEventRect: function initEventRect() {
+		var $$ = this;
+
+		$$.main.select("." + _classes2.default.chart).append("g").attr("class", _classes2.default.eventRects).style("fill-opacity", "0");
+	},
+
+
+	/**
+  * Redraws the area that detects the event.
+  * @private
+  */
+	redrawEventRect: function redrawEventRect() {
+		var $$ = this,
+		    config = $$.config,
+		    isMultipleX = $$.isMultipleX(),
+		    eventRects = $$.main.select("." + _classes2.default.eventRects).style("cursor", config.zoom_enabled ? config.axis_rotated ? "ns-resize" : "ew-resize" : null).classed(_classes2.default.eventRectsMultiple, isMultipleX).classed(_classes2.default.eventRectsSingle, !isMultipleX),
+		    eventRectUpdate = void 0,
+		    maxDataCountTarget = void 0;
+
+		// rects for mouseover
+
+
+		// clear old rects
+
+
+		if (eventRects.selectAll("." + _classes2.default.eventRect).remove(), $$.eventRect = eventRects.selectAll("." + _classes2.default.eventRect), isMultipleX ? (eventRectUpdate = $$.eventRect.data([0]), eventRectUpdate = $$.generateEventRectsForMultipleXs(eventRectUpdate.enter() // enter : only one rect will be added
+		).merge(eventRectUpdate), $$.updateEventRect(eventRectUpdate)) : (maxDataCountTarget = $$.getMaxDataCountTarget($$.data.targets), eventRects.datum(maxDataCountTarget ? maxDataCountTarget.values : []), $$.eventRect = eventRects.selectAll("." + _classes2.default.eventRect), eventRectUpdate = $$.eventRect.data(function (d) {
+			return d;
+		}), eventRectUpdate.exit().remove(), eventRectUpdate = $$.generateEventRectsForSingleX(eventRectUpdate.enter()).merge(eventRectUpdate), $$.updateEventRect(eventRectUpdate)), $$.inputType === "touch" && !$$.hasArcType()) {
+			var getEventRect = function () {
+				var touch = _d.event.changedTouches[0];
+
+				return (0, _d.select)(document.elementFromPoint(touch.clientX, touch.clientY));
+			},
+			    getIndex = function (eventRect) {
+				var index = eventRect && eventRect.attr("class") && eventRect.attr("class").replace(new RegExp("(" + _classes2.default.eventRect + "-?|s)", "g"), "") * 1;
+
+				return (isNaN(index) || index === null) && (index = -1), index;
+			},
+			    startClientY = void 0,
+			    selectRect = function (context) {
+				var eventType = _d.event.type,
+				    touch = _d.event.changedTouches[0],
+				    axisRotated = $$.config.axis_rotated,
+				    currentClientY = touch.clientY;
+
+				// If movement is less than 5px, scrolling outside the chart is prevented from working.
+
+
+				if (eventType === "touchstart") startClientY = currentClientY, axisRotated && _d.event.preventDefault();else if (eventType === "touchmove" && startClientY) {
+					var moveY = Math.abs(startClientY - currentClientY);
+
+					!axisRotated && moveY < 5 && _d.event.preventDefault();
+				}
+
+				if (isMultipleX) $$.selectRectForMultipleXs(context);else {
+					var eventRect = getEventRect(),
+					    index = getIndex(eventRect);
+					index === -1 ? $$.unselectRect() : $$.selectRectForSingle(context, eventRect, index);
+				}
+			},
+			    touchHandler = function () {
+				var eventRect = getEventRect();
+
+				if (eventRect.classed(_classes2.default.eventRect)) {
+					if ($$.dragging || $$.flowing || $$.hasArcType()) return;
+
+					selectRect(this);
+				} else $$.unselectRect();
+			};
+
+			$$.svg.on("touchstart", touchHandler).on("touchmove", touchHandler).on("touchend", function () {
+				var eventRect = getEventRect();
+
+				if (eventRect.classed(_classes2.default.eventRect)) {
+					if ($$.hasArcType() || !$$.toggleShape || $$.cancelClick) return void ($$.cancelClick && ($$.cancelClick = !1));
+
+					// Call event handler
+					var index = getIndex(eventRect);
+
+					isMultipleX || index === -1 || $$.main.selectAll("." + _classes2.default.shape + "-" + index).each(function (d2) {
+						return config.data_onout.call($$.api, d2);
+					});
+				}
+			});
+		}
+	},
+
+
+	/**
+  * Updates the location and size of the eventRect.
+  * @private
+  * @param {Object} D3.select(CLASS.eventRects) object.
+  */
+	updateEventRect: function updateEventRect(eventRectUpdate) {
+		var $$ = this,
+		    config = $$.config,
+		    eventRectData = eventRectUpdate || $$.eventRect.data(),
+		    x = void 0,
+		    y = void 0,
+		    w = void 0,
+		    h = void 0; // set update selection if null
+
+
+		if ($$.isMultipleX()) x = 0, y = 0, w = $$.width, h = $$.height;else {
+			var rectW = void 0,
+			    rectX = void 0;
+
+
+			if (($$.isCustomX() || $$.isTimeSeries()) && !$$.isCategorized()) $$.updateXs(), rectW = function (d) {
+					var prevX = $$.getPrevX(d.index),
+					    nextX = $$.getNextX(d.index);
+
+
+					// if there this is a single data point make the eventRect full width (or height)
+					return prevX === null && nextX === null ? config.axis_rotated ? $$.height : $$.width : (prevX === null && (prevX = $$.x.domain()[0]), nextX === null && (nextX = $$.x.domain()[1]), Math.max(0, ($$.x(nextX) - $$.x(prevX)) / 2));
+				}, rectX = function (d) {
+					var nextX = $$.getNextX(d.index),
+					    thisX = $$.data.xs[d.id][d.index],
+					    prevX = $$.getPrevX(d.index);
+
+
+					// if there this is a single data point position the eventRect at 0
+					return prevX === null && nextX === null ? 0 : (prevX === null && (prevX = $$.x.domain()[0]), ($$.x(thisX) + $$.x(prevX)) / 2);
+				};else {
+				var edgs = $$.getEdgeX($$.data.targets);
+
+				rectW = ($$.x(edgs[1]) - $$.x(edgs[0])) / $$.getMaxDataCount(), rectX = function (d) {
+					return $$.x(d.x) - rectW / 2;
+				};
+			}
+
+			x = config.axis_rotated ? 0 : rectX, y = config.axis_rotated ? rectX : 0, w = config.axis_rotated ? $$.width : rectW, h = config.axis_rotated ? rectW : $$.height;
+		}
+
+		eventRectData.attr("class", $$.classEvent.bind($$)).attr("x", x).attr("y", y).attr("width", w).attr("height", h);
+	},
+	selectRectForSingle: function selectRectForSingle(context, eventRect, index) {
+		var $$ = this,
+		    config = $$.config,
+		    selectedData = $$.filterTargetsToShow($$.data.targets).map(function (t) {
+			return $$.addName($$.getValueOnIndex(t.values, index));
+		});
+		// Show tooltip
+		config.tooltip_grouped && ($$.showTooltip(selectedData, context), $$.showXGridFocus(selectedData), !config.data_selection_enabled || config.data_selection_grouped) || $$.main.selectAll("." + _classes2.default.shape + "-" + index).each(function () {
+			(0, _d.select)(this).classed(_classes2.default.EXPANDED, !0), config.data_selection_enabled && eventRect.style("cursor", config.data_selection_grouped ? "pointer" : null), config.tooltip_grouped || ($$.hideXGridFocus(), $$.hideTooltip(), !config.data_selection_grouped && ($$.unexpandCircles(index), $$.unexpandBars(index)));
+		}).filter(function (d) {
+			return $$.isWithinShape(this, d);
+		}).each(function (d) {
+			config.data_selection_enabled && (config.data_selection_grouped || config.data_selection_isselectable(d)) && eventRect.style("cursor", "pointer"), config.tooltip_grouped || ($$.showTooltip([d], this), $$.showXGridFocus([d]), config.point_focus_expand_enabled && $$.expandCircles(index, d.id, !0), $$.expandBars(index, d.id, !0));
+		});
+	},
+	selectRectForMultipleXs: function selectRectForMultipleXs(context) {
+		var $$ = this,
+		    config = $$.config,
+		    targetsToShow = $$.filterTargetsToShow($$.data.targets);
+
+		// show tooltip when cursor is close to some point
+		if (!$$.dragging && !$$.hasArcType(targetsToShow)) {
+
+				var mouse = (0, _d.mouse)($$.main.select("." + _classes2.default.eventRects + " ." + _classes2.default.eventRect).node()),
+				    closest = $$.findClosestFromTargets(targetsToShow, mouse),
+				    sameXData = void 0;
+
+
+				if ($$.mouseover && (!closest || closest.id !== $$.mouseover.id) && (config.data_onout.call($$.api, $$.mouseover), $$.mouseover = undefined), !closest) return void $$.unselectRect();
+
+				sameXData = $$.isScatterType(closest) || !config.tooltip_grouped ? [closest] : $$.filterByX(targetsToShow, closest.x);
+				var selectedData = sameXData.map(function (d) {
+					return $$.addName(d);
+				});
+
+				$$.showTooltip(selectedData, context), config.point_focus_expand_enabled && $$.expandCircles(closest.index, closest.id, !0), $$.expandBars(closest.index, closest.id, !0), $$.showXGridFocus(selectedData), ($$.isBarType(closest.id) || $$.dist(closest, mouse) < config.point_sensitivity) && ($$.svg.select("" + _classes2.default.eventRect).style("cursor", "pointer"), !$$.mouseover && (config.data_onover.call($$.api, closest), $$.mouseover = closest));
+			} // do nothing when dragging
+	},
+
+
+	/**
+  * Unselect EventRect.
+  * @private
+  */
+	unselectRect: function unselectRect() {
+		var $$ = this;
+
+		$$.svg.select("." + _classes2.default.eventRect).style("cursor", null), $$.hideXGridFocus(), $$.hideTooltip(), $$.unexpandCircles(), $$.unexpandBars();
+	},
+
+
+	/**
+  * Create eventRect for each data on the x-axis.
+  * Register touch and drag events.
+  * @private
+  * @param {Object} D3.select(CLASS.eventRects) object.
+  * @returns {Object} D3.select(CLASS.eventRects) object.
+  */
+	generateEventRectsForSingleX: function generateEventRectsForSingleX(eventRectEnter) {
+		var $$ = this,
+		    config = $$.config,
+		    isMouse = $$.inputType === "mouse";
+
+
+		return eventRectEnter.append("rect").attr("class", $$.classEvent.bind($$)).style("cursor", config.data_selection_enabled && config.data_selection_grouped ? "pointer" : null).on(isMouse ? "mouseover" : undefined, function (d) {
+			if (!($$.dragging || $$.flowing || $$.hasArcType())) {
+					// do nothing while dragging/flowing
+
+					var index = d.index;
+
+					// Expand shapes for selection
+					config.point_focus_expand_enabled && $$.expandCircles(index, null, !0), $$.expandBars(index, null, !0), index !== -1 && $$.main.selectAll("." + _classes2.default.shape + "-" + index).each(function (d2) {
+						return config.data_onover.call($$.api, d2);
+					});
+				}
+		}).on(isMouse ? "mousemove" : undefined, function (d) {
+			if (!($$.dragging || $$.flowing || $$.hasArcType())) {
+					// do nothing while dragging/flowing
+
+					var index = d.index,
+					    eventRect = $$.svg.select("." + _classes2.default.eventRect + "-" + index);
+					$$.isStepType(d) && $$.config.line_step_type === "step-after" && (0, _d.mouse)(this)[0] < $$.x($$.getXValue(d.id, index)) && (index -= 1), index === -1 ? $$.unselectRect() : $$.selectRectForSingle(this, eventRect, index);
+				}
+		}).on(isMouse ? "mouseout" : undefined, function (d) {
+			if ($$.config && !$$.hasArcType()) {
+					// chart is destroyed
+
+					var index = d.index;
+
+					$$.unselectRect(), $$.main.selectAll("." + _classes2.default.shape + "-" + index).each(function (d2) {
+						return config.data_onout.call($$.api, d2);
+					});
+				}
+		}).on(isMouse ? "click" : undefined, function (d) {
+			if ($$.hasArcType() || !$$.toggleShape || $$.cancelClick) return void ($$.cancelClick && ($$.cancelClick = !1));
+
+			var index = d.index;
+
+			$$.main.selectAll("." + _classes2.default.shape + "-" + index).each(function (d2) {
+				(config.data_selection_grouped || $$.isWithinShape(this, d2)) && ($$.toggleShape(this, d2, index), $$.config.data_onclick.call($$.api, d2, this));
+			});
+		}).call(config.data_selection_draggable && $$.drag ? (0, _d.drag)().origin(Object).on("drag", function () {
+			$$.drag((0, _d.mouse)(this));
+		}).on("dragstart", function () {
+			$$.dragstart((0, _d.mouse)(this));
+		}).on("dragend", function () {
+			$$.dragend();
+		}) : function () {});
+	},
+
+
+	/**
+  * Create an eventRect,
+  * Register touch and drag events.
+  * @private
+  * @param {Object} D3.select(CLASS.eventRects) object.
+  * @returns {Object} D3.select(CLASS.eventRects) object.
+  */
+	generateEventRectsForMultipleXs: function generateEventRectsForMultipleXs(eventRectEnter) {
+		var $$ = this,
+		    config = $$.config,
+		    isMouse = $$.inputType === "mouse";
+
+
+		return eventRectEnter.append("rect").attr("x", 0).attr("y", 0).attr("width", $$.width).attr("height", $$.height).attr("class", _classes2.default.eventRect).on(isMouse ? "mouseover" : undefined, function () {
+			$$.selectRectForMultipleXs(this);
+		}).on(isMouse ? "mouseout" : undefined, function () {
+			!$$.config || $$.hasArcType() || $$.unselectRect(); // chart is destroyed
+		}).on(isMouse ? "mousemove" : undefined, function () {
+			$$.selectRectForMultipleXs(this);
+		}).on(isMouse ? "click" : undefined, function () {
+			var _this = this,
+			    targetsToShow = $$.filterTargetsToShow($$.data.targets);
+
+			// select if selection enabled
+			if (!$$.hasArcType(targetsToShow)) {
+
+					var mouse = (0, _d.mouse)(this),
+					    closest = $$.findClosestFromTargets(targetsToShow, mouse);
+					!closest || ($$.isBarType(closest.id) || $$.dist(closest, mouse) < config.point_sensitivity) && $$.main.selectAll("." + _classes2.default.shapes + $$.getTargetSelectorSuffix(closest.id)).selectAll("." + _classes2.default.shape + "-" + closest.index).each(function () {
+						(config.data_selection_grouped || $$.isWithinShape(_this, closest)) && ($$.toggleShape(_this, closest, closest.index), $$.config.data_onclick.call($$.api, closest, _this));
+					});
+				}
+		}).call(config.data_selection_draggable && $$.drag ? (0, _d.drag)().origin(Object).on("drag", function () {
+			$$.drag((0, _d.mouse)(this));
+		}).on("dragstart", function () {
+			$$.dragstart((0, _d.mouse)(this));
+		}).on("dragend", function () {
+			$$.dragend();
+		}) : function () {});
+	},
+
+
+	/**
+  * Dispatch an event.
+  * @private
+  * @param {String} type event type
+  * @param {Number} index Index of eventRect
+  * @param {Object} mouse Object
+  */
+	dispatchEvent: function dispatchEvent(type, index, mouse) {
+		var $$ = this,
+		    selector = $$.isMultipleX() ? "." + _classes2.default.eventRect : _classes2.default.eventRect + "-" + index,
+		    eventRect = $$.main.select(selector).node(),
+		    box = eventRect.getBoundingClientRect(),
+		    x = box.left + (mouse ? mouse[0] : 0),
+		    y = box.top + (mouse ? mouse[1] : 0),
+		    event = document.createEvent("MouseEvents").initMouseEvent(type, !0, !0, window, 0, x, y, x, y, !1, !1, !1, !1, 0, null);
+		eventRect.dispatchEvent(event);
+	}
+});
+
+/***/ }),
+/* 33 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _d = __webpack_require__(2),
+    _ChartInternal = __webpack_require__(1),
+    _ChartInternal2 = _interopRequireDefault(_ChartInternal),
+    _classes = __webpack_require__(3),
+    _classes2 = _interopRequireDefault(_classes),
+    _util = __webpack_require__(0);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/**
+ * Copyright (c) 2017 NAVER Corp.
+ * billboard.js project is licensed under the MIT license
+ */
+(0, _util.extend)(_ChartInternal2.default.prototype, {
+	/**
+  * Initialize the brush.
+  * @private
+  */
+	initBrush: function initBrush() {
+		var $$ = this;
+
+		// set the brush
+		$$.brush = $$.config.axis_rotated ? (0, _d.brushY)() : (0, _d.brushX)();
+
+
+		// set "brush" event
+		var brushHandler = function () {
+			$$.redrawForBrush();
+		};
+
+		$$.brush.on("start", function () {
+			$$.inputType === "touch" && $$.hideTooltip(), brushHandler();
+		}).on("brush", brushHandler), $$.brush.update = function () {
+			var extent = this.extent()();
+
+			return extent[1].filter(function (v) {
+				return isNaN(v);
+			}).length === 0 && $$.context && $$.context.select("." + _classes2.default.brush).call(this), this;
+		}, $$.brush.scale = function (scale, height) {
+			var overlay = $$.svg.select(".bb-brush .overlay"),
+			    extent = [[0, 0]];
+			scale.range ? extent.push([scale.range()[1], (height || !overlay.empty()) && ~~overlay.attr("height") || 60]) : scale.constructor === Array && extent.push(scale), $$.config.axis_rotated && extent.reverse(), this.extent($$.config.axis_x_extent || extent), this.update();
+		}, $$.brush.getSelection = function () {
+			return $$.context ? $$.context.select("." + _classes2.default.brush) : (0, _d.select)([]);
+		};
+	},
+
+
+	/**
+  * Initialize the subchart.
+  * @private
+  */
+	initSubchart: function initSubchart() {
+		var $$ = this,
+		    config = $$.config,
+		    visibility = config.subchart_show ? "visible" : "hidden";
+		$$.context = $$.svg.append("g").attr("transform", $$.getTranslate("context"));
+
+
+		var context = $$.context;
+
+		context.style("visibility", visibility), context.append("g").attr("clip-path", $$.clipPathForSubchart).attr("class", _classes2.default.chart), context.select("." + _classes2.default.chart).append("g").attr("class", _classes2.default.chartBars), context.select("." + _classes2.default.chart).append("g").attr("class", _classes2.default.chartLines), context.append("g").attr("clip-path", $$.clipPath).attr("class", _classes2.default.brush).call($$.brush), $$.axes.subx = context.append("g").attr("class", _classes2.default.axisX).attr("transform", $$.getTranslate("subx")).attr("clip-path", config.axis_rotated ? "" : $$.clipPathForXAxis).style("visibility", config.subchart_axis_x_show ? visibility : "hidden");
+	},
+
+
+	/**
+  * Update sub chart
+  * @private
+  * @param {Object} $$.data.targets
+  */
+	updateTargetsForSubchart: function updateTargetsForSubchart(targets) {
+		var $$ = this,
+		    context = $$.context,
+		    config = $$.config,
+		    classChartBar = $$.classChartBar.bind($$),
+		    classBars = $$.classBars.bind($$),
+		    classChartLine = $$.classChartLine.bind($$),
+		    classLines = $$.classLines.bind($$),
+		    classAreas = $$.classAreas.bind($$);
+
+
+		if (config.subchart_show) {
+			// -- Bar --//
+			var contextBarUpdate = context.select("." + _classes2.default.chartBars).selectAll("." + _classes2.default.chartBar).data(targets).attr("class", classChartBar),
+			    contextBarEnter = contextBarUpdate.enter().append("g").style("opacity", "0").attr("class", classChartBar).merge(contextBarUpdate);
+
+
+			// Bars for each data
+			contextBarEnter.append("g").attr("class", classBars);
+
+
+			// -- Line --//
+			var contextLineUpdate = context.select("." + _classes2.default.chartLines).selectAll("." + _classes2.default.chartLine).data(targets).attr("class", classChartLine),
+			    contextLineEnter = contextLineUpdate.enter().append("g").style("opacity", "0").attr("class", classChartLine).merge(contextLineUpdate);
+
+
+			// Lines for each data
+			contextLineEnter.append("g").attr("class", classLines), contextLineEnter.append("g").attr("class", classAreas), context.selectAll("." + _classes2.default.brush + " rect").attr(config.axis_rotated ? "width" : "height", config.axis_rotated ? $$.width2 : $$.height2);
+		}
+	},
+
+
+	/**
+  * Update the bar of the sub chart
+  * @private
+  * @param {Object} durationForExit
+  */
+	updateBarForSubchart: function updateBarForSubchart(durationForExit) {
+		var $$ = this;
+
+		$$.contextBar = $$.context.selectAll("." + _classes2.default.bars).selectAll("." + _classes2.default.bar).data($$.barData.bind($$)), $$.contextBar.exit().transition().duration(durationForExit).style("opacity", "0").remove(), $$.contextBar = $$.contextBar.enter().append("path").attr("class", $$.classBar.bind($$)).style("stroke", "none").style("fill", $$.color).merge($$.contextBar).style("opacity", $$.initialOpacity.bind($$));
+	},
+
+
+	/**
+  * Redraw the bar of the subchart
+  * @private
+  * @param {String} path in subchart bar
+  * @param {Boolean} whether or not to transition.
+  * @param {Number} transition duration
+  */
+	redrawBarForSubchart: function redrawBarForSubchart(drawBarOnSub, withTransition, duration) {
+		var contextBar = void 0;
+
+		contextBar = withTransition ? this.contextBar.transition(Math.random().toString()).duration(duration) : this.contextBar, contextBar.attr("d", drawBarOnSub).style("opacity", "1");
+	},
+
+
+	/**
+  * Update the line of the sub chart
+  * @private
+  * @param {Number} Fade-out transition duration
+  */
+	updateLineForSubchart: function updateLineForSubchart(durationForExit) {
+		var $$ = this;
+
+		$$.contextLine = $$.context.selectAll("." + _classes2.default.lines).selectAll("." + _classes2.default.line).data($$.lineData.bind($$)), $$.contextLine.exit().transition().duration(durationForExit).style("opacity", "0").remove(), $$.contextLine = $$.contextLine.enter().append("path").attr("class", $$.classLine.bind($$)).style("stroke", $$.color).merge($$.contextLine).style("opacity", $$.initialOpacity.bind($$));
+	},
+
+
+	/**
+  * Redraw the line of the subchart
+  * @private
+  * @param {String} path in subchart line
+  * @param {Boolean} whether or not to transition
+  * @param {Number} transition duration
+  */
+	redrawLineForSubchart: function redrawLineForSubchart(drawLineOnSub, withTransition, duration) {
+		var contextLine = void 0;
+
+		contextLine = withTransition ? this.contextLine.transition(Math.random().toString()).duration(duration) : this.contextLine, contextLine.attr("d", drawLineOnSub).style("opacity", "1");
+	},
+
+
+	/**
+  * Update the area of the sub chart
+  * @private
+  * @param {Number} Fade-out transition duration
+  */
+	updateAreaForSubchart: function updateAreaForSubchart(durationForExit) {
+		var $$ = this;
+
+		$$.contextArea = $$.context.selectAll("." + _classes2.default.areas).selectAll("." + _classes2.default.area).data($$.lineData.bind($$)), $$.contextArea.exit().transition().duration(durationForExit).style("opacity", "0").remove(), $$.contextArea = $$.contextArea.enter().append("path").attr("class", $$.classArea.bind($$)).style("fill", $$.color).style("opacity", function () {
+			return $$.orgAreaOpacity = (0, _d.select)(this).style("opacity"), "0";
+		}).merge($$.contextArea).style("opacity", "0");
+	},
+
+	/**
+  * Redraw the area of the subchart
+  * @private
+  * @param {String} path in subchart line
+  * @param {Boolean} whether or not to transition
+  * @param {Number} transition duration
+  */
+	redrawAreaForSubchart: function redrawAreaForSubchart(drawAreaOnSub, withTransition, duration) {
+		var contextArea = void 0;
+
+		contextArea = withTransition ? this.contextArea.transition(Math.random().toString()).duration(duration) : this.contextArea, contextArea.attr("d", drawAreaOnSub).style("fill", this.color).style("opacity", this.orgAreaOpacity);
+	},
+
+
+	/**
+  * Redraw subchart.
+  * @private
+  * @param {Boolean} whether or not to show subchart
+  * @param Do not use.
+  * @param {Number} transition duration
+  * @param Do not use.
+  * @param {Object} area Indices
+  * @param {Object} bar Indices
+  * @param {Object} line Indices
+  */
+	redrawSubchart: function redrawSubchart(withSubchart, transitions, duration, durationForExit, areaIndices, barIndices, lineIndices) {
+		var $$ = this,
+		    config = $$.config;
+
+
+		// subchart
+		if ($$.context.style("visibility", config.subchart_show ? "visible" : "hidden"), config.subchart_show && (_d.event && _d.event.type === "zoom" && $$.brush.update(), withSubchart)) {
+			$$.brushEmpty() || $$.brush.update();
+
+
+			// setup drawer - MEMO: this must be called after axis updated
+			var drawAreaOnSub = $$.generateDrawArea(areaIndices, !0),
+			    drawBarOnSub = $$.generateDrawBar(barIndices, !0),
+			    drawLineOnSub = $$.generateDrawLine(lineIndices, !0);
+			$$.updateBarForSubchart(duration), $$.updateLineForSubchart(duration), $$.updateAreaForSubchart(duration), $$.redrawBarForSubchart(drawBarOnSub, duration, duration), $$.redrawLineForSubchart(drawLineOnSub, duration, duration), $$.redrawAreaForSubchart(drawAreaOnSub, duration, duration);
+		}
+	},
+
+	/**
+  * Redraw the brush.
+  * @private
+  */
+	redrawForBrush: function redrawForBrush() {
+		var $$ = this,
+		    x = $$.x;
+		$$.redraw({
+			withTransition: !1,
+			withY: $$.config.zoom_rescale,
+			withSubchart: !1,
+			withUpdateXDomain: !0,
+			withDimension: !1
+		}), $$.config.subchart_onbrush.call($$.api, x.orgDomain());
+	},
+
+
+	/**
+  * Transform context
+  * @private
+  * @param {Boolean} indicates transition is enabled
+  * @param {Object} The return value of the generateTransitions method of Axis.
+  */
+	transformContext: function transformContext(withTransition, transitions) {
+		var $$ = this,
+		    subXAxis = void 0;
+		transitions && transitions.axisSubX ? subXAxis = transitions.axisSubX : (subXAxis = $$.context.select("." + _classes2.default.axisX), withTransition && (subXAxis = subXAxis.transition())), $$.context.attr("transform", $$.getTranslate("context")), subXAxis.attr("transform", $$.getTranslate("subx"));
+	},
+
+
+	/**
+  * Get default extent
+  * @private
+  * @returns {Array} default extent
+  */
+	getDefaultExtent: function getDefaultExtent() {
+		var $$ = this,
+		    config = $$.config,
+		    extent = (0, _util.isFunction)(config.axis_x_extent) ? config.axis_x_extent($$.getXDomain($$.data.targets)) : config.axis_x_extent;
+
+
+		return $$.isTimeSeries() && (extent = [$$.parseDate(extent[0]), $$.parseDate(extent[1])]), extent;
+	}
+});
+
+/***/ }),
+/* 34 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _d = __webpack_require__(2),
+    _ChartInternal = __webpack_require__(1),
+    _ChartInternal2 = _interopRequireDefault(_ChartInternal),
+    _classes = __webpack_require__(3),
+    _classes2 = _interopRequireDefault(_classes),
+    _util = __webpack_require__(0);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/**
+ * Copyright (c) 2017 NAVER Corp.
+ * billboard.js project is licensed under the MIT license
+ */
+(0, _util.extend)(_ChartInternal2.default.prototype, {
+	/**
+  * Initialize zoom.
+  * @private
+  */
+	initZoom: function initZoom() {
+		var $$ = this,
+		    config = $$.config,
+		    startEvent = void 0;
+		$$.zoomScale = null, $$.zoom = (0, _d.zoom)().duration(0).on("start", function () {
+			startEvent = _d.event.sourceEvent, $$.zoom.altDomain = _d.event.sourceEvent.altKey ? $$.x.orgDomain() : null, config.zoom_onzoomstart.call($$.api, _d.event.sourceEvent);
+		}).on("zoom", function () {
+			$$.redrawForZoom.call($$);
+		}).on("end", function () {
+			var event = _d.event.sourceEvent;
+
+			// if click, do nothing. otherwise, click interaction will be canceled.
+			event && startEvent.clientX === event.clientX && startEvent.clientY === event.clientY || ($$.redrawEventRect(), $$.updateZoom(), config.zoom_onzoomend.call($$.api, $$.x.orgDomain()));
+		}), $$.zoom.orgScaleExtent = function () {
+			var extent = config.zoom_extent ? config.zoom_extent : [1, 10];
+
+			return [extent[0], Math.max($$.getMaxDataCount() / extent[1], extent[1])];
+		}, $$.zoom.updateScaleExtent = function () {
+			var ratio = (0, _util.diffDomain)($$.x.orgDomain()) / (0, _util.diffDomain)($$.getZoomDomain()),
+			    extent = this.orgScaleExtent();
+
+			return this.scaleExtent([extent[0] * ratio, extent[1] * ratio]), this;
+		}, $$.zoom.updateTransformScale = function (transform) {
+			var newScale = transform.rescaleX($$.x);
+
+			newScale.domain($$.trimXDomain(newScale.domain())), $$.zoomScale = newScale, $$.xAxis.scale($$.zoomScale), $$.main.select("." + _classes2.default.eventRects).node().__zoom = transform;
+		};
+	},
+
+
+	/**
+  * Get zoom domain
+  * @private
+  * @returns {Array} zoom domain
+  */
+	getZoomDomain: function getZoomDomain() {
+		var $$ = this,
+		    config = $$.config,
+		    min = (0, _d.min)([$$.orgXDomain[0], config.zoom_x_min]),
+		    max = (0, _d.max)([$$.orgXDomain[1], config.zoom_x_max]);
+
+
+		return [min, max];
+	},
+
+
+	/**
+  * Update zoom
+  * @private
+  */
+	updateZoom: function updateZoom() {
+		var $$ = this,
+		    z = $$.config.zoom_enabled ? $$.zoom : function () {};
+
+
+		// bind zoom module
+		// $$.main.select(`.${CLASS.zoomRect}`)
+		// 	.call(z)
+		// 	.on("dblclick.zoom", null);
+
+		$$.main.select("." + _classes2.default.eventRects).call(z).on("dblclick.zoom", null);
+	},
+
+
+	/**
+  * Redraw the zoom.
+  * @private
+  */
+	redrawForZoom: function redrawForZoom() {
+		var $$ = this,
+		    config = $$.config;
+
+
+		if (config.zoom_enabled) {
+				var zoom = $$.zoom,
+				    x = $$.x,
+				    event = _d.event,
+				    transform = event.transform;
+				return $$.zoom.updateTransformScale(transform), $$.filterTargetsToShow($$.data.targets).length === 0 ? void 0 : event.sourceEvent.type === "mousemove" && zoom.altDomain ? (x.domain(zoom.altDomain), void transform.scale($$.zoomScale).updateScaleExtent()) : void ($$.isCategorized() && x.orgDomain()[0] === $$.orgXDomain[0] && x.domain([$$.orgXDomain[0] - 1e-10, x.orgDomain()[1]]), $$.redraw({
+					withTransition: !1,
+					withY: config.zoom_rescale,
+					withSubchart: !1,
+					withEventRect: !1,
+					withDimension: !1
+				}), event.sourceEvent.type === "mousemove" && ($$.cancelClick = !0), config.zoom_onzoom.call($$.api, x.orgDomain()));
+			}
+	}
+});
+
+/***/ }),
+/* 35 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _d = __webpack_require__(2),
+    _ChartInternal = __webpack_require__(1),
+    _ChartInternal2 = _interopRequireDefault(_ChartInternal),
+    _classes = __webpack_require__(3),
+    _classes2 = _interopRequireDefault(_classes),
+    _util = __webpack_require__(0);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/**
+ * Copyright (c) 2017 NAVER Corp.
+ * billboard.js project is licensed under the MIT license
+ */
+(0, _util.extend)(_ChartInternal2.default.prototype, {
+	initPie: function initPie() {
+		var $$ = this,
+		    config = $$.config;
+		$$.pie = (0, _d.pie)().padAngle(config[config.data_type + "_padAngle"] || 0).value(function (d) {
+			return d.values.reduce(function (a, b) {
+				return a + b.value;
+			}, 0);
+		}), config.data_order || $$.pie.sort(null);
+	},
+	updateRadius: function updateRadius() {
+		var $$ = this,
+		    config = $$.config,
+		    w = config.gauge_width || config.donut_width;
+		$$.radiusExpanded = Math.min($$.arcWidth, $$.arcHeight) / 2, $$.radius = $$.radiusExpanded * 0.95, $$.innerRadiusRatio = w ? ($$.radius - w) / $$.radius : 0.6, $$.innerRadius = $$.hasType("donut") || $$.hasType("gauge") ? $$.radius * $$.innerRadiusRatio : 0;
+	},
+	updateArc: function updateArc() {
+		var $$ = this;
+
+		$$.svgArc = $$.getSvgArc(), $$.svgArcExpanded = $$.getSvgArcExpanded(), $$.svgArcExpandedSub = $$.getSvgArcExpanded(0.98);
+	},
+	updateAngle: function updateAngle(dValue) {
+		var $$ = this,
+		    config = $$.config,
+		    d = dValue,
+		    found = !1,
+		    index = 0,
+		    gMin = void 0,
+		    gMax = void 0,
+		    gTic = void 0,
+		    gValue = void 0;
+		return config ? ($$.pie($$.filterTargetsToShow($$.data.targets)).forEach(function (t) {
+			found || t.data.id !== d.data.id || (found = !0, d = t, d.index = index), index++;
+		}), isNaN(d.startAngle) && (d.startAngle = 0), isNaN(d.endAngle) && (d.endAngle = d.startAngle), $$.isGaugeType(d.data) && (gMin = config.gauge_min, gMax = config.gauge_max, gTic = Math.PI * (config.gauge_fullCircle ? 2 : 1) / (gMax - gMin), gValue = d.value < gMin ? 0 : d.value < gMax ? d.value - gMin : gMax - gMin, d.startAngle = config.gauge_startingAngle, d.endAngle = d.startAngle + gTic * gValue), found ? d : null) : null;
+	},
+	getSvgArc: function getSvgArc() {
+		var $$ = this,
+		    arc = (0, _d.arc)().outerRadius($$.radius).innerRadius($$.innerRadius),
+		    newArc = function (d, withoutUpdate) {
+			if (withoutUpdate) return arc(d); // for interpolate
+
+			var updated = $$.updateAngle(d);
+
+			return updated ? arc(updated) : "M 0 0";
+		};
+
+		// TODO: extends all function
+
+
+		return newArc.centroid = arc.centroid, newArc;
+	},
+	getSvgArcExpanded: function getSvgArcExpanded(rate) {
+		var $$ = this,
+		    arc = (0, _d.arc)().outerRadius($$.radiusExpanded * (rate || 1)).innerRadius($$.innerRadius);
+
+
+		return function (d) {
+			var updated = $$.updateAngle(d);
+
+			return updated ? arc(updated) : "M 0 0";
+		};
+	},
+	getArc: function getArc(d, withoutUpdate, force) {
+		return force || this.isArcType(d.data) ? this.svgArc(d, withoutUpdate) : "M 0 0";
+	},
+	transformForArcLabel: function transformForArcLabel(d) {
+		var $$ = this,
+		    config = $$.config,
+		    updated = $$.updateAngle(d),
+		    c = void 0,
+		    x = void 0,
+		    y = void 0,
+		    h = void 0,
+		    ratio = void 0,
+		    translate = "";
+
+		return updated && !$$.hasType("gauge") && (c = this.svgArc.centroid(updated), x = isNaN(c[0]) ? 0 : c[0], y = isNaN(c[1]) ? 0 : c[1], h = Math.sqrt(x * x + y * y), ratio = $$.hasType("donut") && config.donut_label_ratio ? (0, _util.isFunction)(config.donut_label_ratio) ? config.donut_label_ratio(d, $$.radius, h) : config.donut_label_ratio : $$.hasType("pie") && config.pie_label_ratio ? (0, _util.isFunction)(config.pie_label_ratio) ? config.pie_label_ratio(d, $$.radius, h) : config.pie_label_ratio : $$.radius && (h ? (36 / $$.radius > 0.375 ? 1.175 - 36 / $$.radius : 0.8) * $$.radius / h : 0), translate = "translate(" + x * ratio + "," + y * ratio + ")"), translate;
+	},
+	getArcRatio: function getArcRatio(d) {
+		var $$ = this,
+		    config = $$.config,
+		    whole = Math.PI * ($$.hasType("gauge") && !config.gauge_fullCircle ? 1 : 2);
+
+
+		return d ? (d.endAngle - d.startAngle) / whole : null;
+	},
+	convertToArcData: function convertToArcData(d) {
+		return this.addName({
+			id: d.data.id,
+			value: d.value,
+			ratio: this.getArcRatio(d),
+			index: d.index
+		});
+	},
+	textForArcLabel: function textForArcLabel(d) {
+		var $$ = this;
+
+		if (!$$.shouldShowArcLabel()) return "";
+		var updated = $$.updateAngle(d),
+		    value = updated ? updated.value : null,
+		    ratio = $$.getArcRatio(updated),
+		    id = d.data.id;
+
+
+		if (!$$.hasType("gauge") && !$$.meetsArcLabelThreshold(ratio)) return "";
+		var format = $$.getArcLabelFormat();
+
+		return format ? format(value, ratio, id) : $$.defaultArcValueFormat(value, ratio);
+	},
+	textForGaugeMinMax: function textForGaugeMinMax(value, isMax) {
+		var format = this.getGaugeLabelExtents();
+
+		return format ? format(value, isMax) : value;
+	},
+	expandArc: function expandArc(targetIds) {
+		var $$ = this,
+		    interval = void 0;
+
+
+		// MEMO: avoid to cancel transition
+		if ($$.transiting) return void (interval = window.setInterval(function () {
+				$$.transiting || (window.clearInterval(interval), $$.legend.selectAll(".bb-legend-item-focused").size() > 0 && $$.expandArc(targetIds));
+			}, 10));
+
+		var newTargetIds = $$.mapToTargetIds(targetIds);
+
+		$$.svg.selectAll($$.selectorTargets(newTargetIds, "." + _classes2.default.chartArc)).each(function (d) {
+			$$.shouldExpand(d.data.id) && (0, _d.select)(this).selectAll("path").transition().duration($$.expandDuration(d.data.id)).attr("d", $$.svgArcExpanded).transition().duration($$.expandDuration(d.data.id) * 2).attr("d", $$.svgArcExpandedSub).each(function (v) {
+				$$.isDonutType(v.data);
+			});
+		});
+	},
+	unexpandArc: function unexpandArc(targetIds) {
+		var $$ = this;
+
+		if (!$$.transiting) {
+
+				var newTargetIds = $$.mapToTargetIds(targetIds);
+
+				$$.svg.selectAll($$.selectorTargets(newTargetIds, "." + _classes2.default.chartArc)).selectAll("path").transition().duration(function (d) {
+					return $$.expandDuration(d.data.id);
+				}).attr("d", $$.svgArc), $$.svg.selectAll("" + _classes2.default.arc).style("opacity", "1");
+			}
+	},
+	expandDuration: function expandDuration(id) {
+		var $$ = this,
+		    config = $$.config;
+		return $$.isDonutType(id) ? config.donut_expand_duration : $$.isGaugeType(id) ? config.gauge_expand_duration : $$.isPieType(id) ? config.pie_expand_duration : 50;
+	},
+	shouldExpand: function shouldExpand(id) {
+		var $$ = this,
+		    config = $$.config;
+
+
+		return $$.isDonutType(id) && config.donut_expand || $$.isGaugeType(id) && config.gauge_expand || $$.isPieType(id) && config.pie_expand;
+	},
+	shouldShowArcLabel: function shouldShowArcLabel() {
+		var $$ = this,
+		    config = $$.config,
+		    shouldShow = !0;
+
+		// when gauge, always true
+		return $$.hasType("donut") ? shouldShow = config.donut_label_show : $$.hasType("pie") && (shouldShow = config.pie_label_show), shouldShow;
+	},
+	meetsArcLabelThreshold: function meetsArcLabelThreshold(ratio) {
+		var $$ = this,
+		    config = $$.config,
+		    threshold = $$.hasType("donut") ? config.donut_label_threshold : config.pie_label_threshold;
+
+
+		return ratio >= threshold;
+	},
+	getArcLabelFormat: function getArcLabelFormat() {
+		var $$ = this,
+		    config = $$.config,
+		    format = config.pie_label_format;
+
+		return $$.hasType("gauge") ? format = config.gauge_label_format : $$.hasType("donut") && (format = config.donut_label_format), format;
+	},
+	getGaugeLabelExtents: function getGaugeLabelExtents() {
+		var config = this.config;
+
+		return config.gauge_label_extents;
+	},
+	getArcTitle: function getArcTitle() {
+		var $$ = this;
+
+		return $$.hasType("donut") ? $$.config.donut_title : "";
+	},
+	updateTargetsForArc: function updateTargetsForArc(targets) {
+		var $$ = this,
+		    main = $$.main,
+		    classChartArc = $$.classChartArc.bind($$),
+		    classArcs = $$.classArcs.bind($$),
+		    classFocus = $$.classFocus.bind($$),
+		    mainPieUpdate = main.select("." + _classes2.default.chartArcs).selectAll("." + _classes2.default.chartArc).data($$.pie(targets)).attr("class", function (d) {
+			return classChartArc(d) + classFocus(d.data);
+		}),
+		    mainPieEnter = mainPieUpdate.enter().append("g").attr("class", classChartArc);
+		mainPieEnter.append("g").attr("class", classArcs).merge(mainPieUpdate), mainPieEnter.append("text").attr("dy", $$.hasType("gauge") ? "-.1em" : ".35em").style("opacity", "0").style("text-anchor", "middle").style("pointer-events", "none");
+	},
+	initArc: function initArc() {
+		var $$ = this;
+
+		$$.arcs = $$.main.select("." + _classes2.default.chart).append("g").attr("class", _classes2.default.chartArcs).attr("transform", $$.getTranslate("arc")), $$.arcs.append("text").attr("class", _classes2.default.chartArcsTitle).style("text-anchor", "middle").text($$.getArcTitle());
+	},
+	redrawArc: function redrawArc(duration, durationForExit, withTransform) {
+
+		function selectArc(_this, arcData, id) {
+			$$.expandArc(id), $$.api.focus(id), $$.toggleFocusLegend(id, !0), $$.showTooltip([arcData], _this);
+		}
+
+		function unselectArc(arcData) {
+			var id = arcData && arcData.id || undefined;
+
+			$$.unexpandArc(id), $$.api.revert(), $$.revertLegend(), $$.hideTooltip();
+		}
+
+		var $$ = this,
+		    config = $$.config,
+		    main = $$.main,
+		    isTouch = $$.inputType === "touch",
+		    isMouse = $$.inputType === "mouse",
+		    mainArc = main.selectAll("." + _classes2.default.arcs).selectAll("." + _classes2.default.arc).data($$.arcData.bind($$));
+
+
+		if (mainArc.exit().transition().duration(durationForExit).style("opacity", "0").remove(), mainArc = mainArc.enter().append("path").attr("class", $$.classArc.bind($$)).style("fill", function (d) {
+			return $$.color(d.data);
+		}).style("cursor", function (d) {
+			return config.interaction_enabled && (config.data_selection_isselectable(d) ? "pointer" : null);
+		}).style("opacity", "0").each(function (d) {
+			$$.isGaugeType(d.data) && (d.startAngle = config.gauge_startingAngle, d.endAngle = config.gauge_startingAngle), this._current = d;
+		}).merge(mainArc), mainArc.attr("transform", function (d) {
+			return !$$.isGaugeType(d.data) && withTransform ? "scale(0)" : "";
+		}).style("opacity", function (d) {
+			return d === this._current ? "0" : "1";
+		}).on(isMouse ? "mouseover" : undefined, config.interaction_enabled ? function (d) {
+			if (!$$.transiting) // skip while transiting
+				{
+
+					var updated = $$.updateAngle(d),
+					    arcData = updated ? $$.convertToArcData(updated) : null,
+					    id = arcData && arcData.id || undefined;
+					selectArc(this, arcData, id), $$.config.data_onover(arcData, this);
+				}
+		} : null).on(isMouse ? "mouseout" : undefined, config.interaction_enabled ? function (d) {
+			if (!$$.transiting) // skip while transiting
+				{
+					var updated = $$.updateAngle(d),
+					    arcData = updated ? $$.convertToArcData(updated) : null;
+					unselectArc(), $$.config.data_onout(arcData, this);
+				}
+		} : null).on(isMouse ? "mousemove" : undefined, config.interaction_enabled ? function (d) {
+			var updated = $$.updateAngle(d),
+			    arcData = updated ? $$.convertToArcData(updated) : null;
+			$$.showTooltip([arcData], this);
+		} : null).on(isMouse ? "click" : undefined, config.interaction_enabled ? function (d, i) {
+			var updated = $$.updateAngle(d),
+			    arcData = void 0;
+			updated && (arcData = $$.convertToArcData(updated), $$.toggleShape && $$.toggleShape(this, arcData, i), $$.config.data_onclick.call($$.api, arcData, this));
+		} : null).each(function () {
+			$$.transiting = !0;
+		}).transition().duration(duration).attrTween("d", function (d) {
+			var updated = $$.updateAngle(d);
+
+			if (!updated) return function () {
+					return "M 0 0";
+				};
+
+			isNaN(this._current.startAngle) && (this._current.startAngle = 0), isNaN(this._current.endAngle) && (this._current.endAngle = this._current.startAngle);
+
+
+			var interpolate = (0, _d.interpolate)(this._current, updated);
+
+			return this._current = interpolate(0), function (t) {
+				var interpolated = interpolate(t);
+
+				// data.id will be updated by interporator
+				return interpolated.data = d.data, $$.getArc(interpolated, !0);
+			};
+		}).attr("transform", withTransform ? "scale(1)" : "").style("fill", function (d) {
+			return $$.levelColor ? $$.levelColor(d.data.values[0].value) : $$.color(d.data.id);
+		}
+		// Where gauge reading color would receive customization.
+		).style("opacity", "1").call($$.endall, function () {
+			$$.transiting = !1;
+		}), isTouch && config.interaction_enabled && $$.hasArcType()) {
+			var getEventArc = function () {
+				var touch = _d.event.changedTouches[0],
+				    eventArc = (0, _d.select)(document.elementFromPoint(touch.clientX, touch.clientY));
+
+
+				return eventArc;
+			};
+
+			$$.svg.on("touchstart", function () {
+				if (!$$.transiting) // skip while transiting
+					{
+
+						var eventArc = getEventArc(),
+						    datum = eventArc.datum(),
+						    updated = datum && datum.data && datum.data.id ? $$.updateAngle(datum) : null,
+						    arcData = updated ? $$.convertToArcData(updated) : null,
+						    id = arcData && arcData.id || undefined;
+						id === undefined ? unselectArc() : selectArc(this, arcData, id), $$.config.data_onover(arcData, this);
+					}
+			}).on("touchend", function () {
+				if (!$$.transiting) // skip while transiting
+					{
+						var eventArc = getEventArc(),
+						    datum = eventArc.datum(),
+						    updated = datum && datum.data && datum.data.id ? $$.updateAngle(datum) : null,
+						    arcData = updated ? $$.convertToArcData(updated) : null,
+						    id = arcData && arcData.id || undefined;
+						id === undefined ? unselectArc() : selectArc(this, arcData, id), $$.config.data_onout(arcData, this);
+					}
+			}).on("touchmove", function () {
+				var eventArc = getEventArc(),
+				    datum = eventArc.datum(),
+				    updated = datum && datum.data && datum.data.id ? $$.updateAngle(datum) : null,
+				    arcData = updated ? $$.convertToArcData(updated) : null,
+				    id = arcData && arcData.id || undefined;
+				id === undefined ? unselectArc() : selectArc(this, arcData, id);
+			});
+		}
+
+		main.selectAll("." + _classes2.default.chartArc).select("text").style("opacity", "0").attr("class", function (d) {
+			return $$.isGaugeType(d.data) ? _classes2.default.gaugeValue : "";
+		}).text($$.textForArcLabel.bind($$)).attr("transform", $$.transformForArcLabel.bind($$)).style("font-size", function (d) {
+			return $$.isGaugeType(d.data) ? Math.round($$.radius / 5) + "px" : "";
+		}).transition().duration(duration).style("opacity", function (d) {
+			return $$.isTargetToShow(d.data.id) && $$.isArcType(d.data) ? "1" : "0";
+		}), main.select("." + _classes2.default.chartArcsTitle).style("opacity", $$.hasType("donut") || $$.hasType("gauge") ? "1" : "0"), $$.hasType("gauge") && ($$.arcs.select("." + _classes2.default.chartArcsBackground).attr("d", function () {
+			var d = {
+				data: [{ value: config.gauge_max }],
+				startAngle: config.gauge_startingAngle,
+				endAngle: -1 * config.gauge_startingAngle
+			};
+
+			return $$.getArc(d, !0, !0);
+		}), $$.arcs.select("." + _classes2.default.chartArcsGaugeUnit).attr("dy", ".75em").text(config.gauge_label_show ? config.gauge_units : ""), $$.arcs.select("." + _classes2.default.chartArcsGaugeMin).attr("dx", -1 * ($$.innerRadius + ($$.radius - $$.innerRadius) / (config.gauge_fullCircle ? 1 : 2)) + "px").attr("dy", "1.2em").text(config.gauge_label_show ? $$.textForGaugeMinMax(config.gauge_min, !1) : ""), $$.arcs.select("." + _classes2.default.chartArcsGaugeMax).attr("dx", $$.innerRadius + ($$.radius - $$.innerRadius) / (config.gauge_fullCircle ? 1 : 2) + "px").attr("dy", "1.2em").text(config.gauge_label_show ? $$.textForGaugeMinMax(config.gauge_max, !0) : ""));
+	},
+	initGauge: function initGauge() {
+		var arcs = this.arcs;
+
+		this.hasType("gauge") && (arcs.append("path").attr("class", _classes2.default.chartArcsBackground), arcs.append("text").attr("class", _classes2.default.chartArcsGaugeUnit).style("text-anchor", "middle").style("pointer-events", "none"), arcs.append("text").attr("class", _classes2.default.chartArcsGaugeMin).style("text-anchor", "middle").style("pointer-events", "none"), arcs.append("text").attr("class", _classes2.default.chartArcsGaugeMax).style("text-anchor", "middle").style("pointer-events", "none"));
+	},
+	getGaugeLabelHeight: function getGaugeLabelHeight() {
+		return this.config.gauge_label_show ? 20 : 0;
+	}
+});
+
+/***/ }),
+/* 36 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _ChartInternal = __webpack_require__(1),
+    _ChartInternal2 = _interopRequireDefault(_ChartInternal),
+    _util = __webpack_require__(0);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/**
+ * Copyright (c) 2017 NAVER Corp.
+ * billboard.js project is licensed under the MIT license
+ */
+(0, _util.extend)(_ChartInternal2.default.prototype, {
+	hasCaches: function hasCaches(ids) {
+		for (var i = 0; i < ids.length; i++) if (!(ids[i] in this.cache)) return !1;
+
+		return !0;
+	},
+	addCache: function addCache(id, target) {
+		this.cache[id] = this.cloneTarget(target);
+	},
+	getCaches: function getCaches(ids) {
+		var targets = [];
+
+		for (var i = 0; i < ids.length; i++) ids[i] in this.cache && targets.push(this.cloneTarget(this.cache[ids[i]]));
+		return targets;
+	}
+});
+
+/***/ }),
+/* 37 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _ChartInternal = __webpack_require__(1),
+    _ChartInternal2 = _interopRequireDefault(_ChartInternal),
+    _util = __webpack_require__(0);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/**
+ * Copyright (c) 2017 NAVER Corp.
+ * billboard.js project is licensed under the MIT license
+ */
+(0, _util.extend)(_ChartInternal2.default.prototype, {
+	/**
+  * Category Name
+  * @private
+  * @param {Number} index
+  * @returns {String} gategory Name
+  */
+	categoryName: function categoryName(i) {
+		var config = this.config;
+
+		return i < config.axis_x_categories.length ? config.axis_x_categories[i] : i;
+	}
+});
+
+/***/ }),
+/* 38 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _ChartInternal = __webpack_require__(1),
+    _ChartInternal2 = _interopRequireDefault(_ChartInternal),
+    _classes = __webpack_require__(3),
+    _classes2 = _interopRequireDefault(_classes),
+    _util = __webpack_require__(0);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+(0, _util.extend)(_ChartInternal2.default.prototype, {
+	CLASS: _classes2.default,
+
+	generateClass: function generateClass(prefix, targetId) {
+		return " " + prefix + " " + (prefix + this.getTargetSelectorSuffix(targetId));
+	},
+	classText: function classText(d) {
+		return this.generateClass(_classes2.default.text, d.index);
+	},
+	classTexts: function classTexts(d) {
+		return this.generateClass(_classes2.default.texts, d.id);
+	},
+	classShape: function classShape(d) {
+		return this.generateClass(_classes2.default.shape, d.index);
+	},
+	classShapes: function classShapes(d) {
+		return this.generateClass(_classes2.default.shapes, d.id);
+	},
+	classLine: function classLine(d) {
+		return this.classShape(d) + this.generateClass(_classes2.default.line, d.id);
+	},
+	classLines: function classLines(d) {
+		return this.classShapes(d) + this.generateClass(_classes2.default.lines, d.id);
+	},
+	classCircle: function classCircle(d) {
+		return this.classShape(d) + this.generateClass(_classes2.default.circle, d.index);
+	},
+	classCircles: function classCircles(d) {
+		return this.classShapes(d) + this.generateClass(_classes2.default.circles, d.id);
+	},
+	classBar: function classBar(d) {
+		return this.classShape(d) + this.generateClass(_classes2.default.bar, d.index);
+	},
+	classBars: function classBars(d) {
+		return this.classShapes(d) + this.generateClass(_classes2.default.bars, d.id);
+	},
+	classArc: function classArc(d) {
+		return this.classShape(d.data) + this.generateClass(_classes2.default.arc, d.data.id);
+	},
+	classArcs: function classArcs(d) {
+		return this.classShapes(d.data) + this.generateClass(_classes2.default.arcs, d.data.id);
+	},
+	classArea: function classArea(d) {
+		return this.classShape(d) + this.generateClass(_classes2.default.area, d.id);
+	},
+	classAreas: function classAreas(d) {
+		return this.classShapes(d) + this.generateClass(_classes2.default.areas, d.id);
+	},
+	classRegion: function classRegion(d, i) {
+		return this.generateClass(_classes2.default.region, i) + " " + ("class" in d ? d.class : "");
+	},
+	classEvent: function classEvent(d) {
+		return this.generateClass(_classes2.default.eventRect, d.index);
+	},
+	classTarget: function classTarget(id) {
+		var additionalClassSuffix = this.config.data_classes[id],
+		    additionalClass = "";
+
+
+		return additionalClassSuffix && (additionalClass = " " + _classes2.default.target + "-" + additionalClassSuffix), this.generateClass(_classes2.default.target, id) + additionalClass;
+	},
+	classFocus: function classFocus(d) {
+		return this.classFocused(d) + this.classDefocused(d);
+	},
+	classFocused: function classFocused(d) {
+		return " " + (this.focusedTargetIds.indexOf(d.id) >= 0 ? _classes2.default.focused : "");
+	},
+	classDefocused: function classDefocused(d) {
+		return " " + (this.defocusedTargetIds.indexOf(d.id) >= 0 ? _classes2.default.defocused : "");
+	},
+	classChartText: function classChartText(d) {
+		return _classes2.default.chartText + this.classTarget(d.id);
+	},
+	classChartLine: function classChartLine(d) {
+		return _classes2.default.chartLine + this.classTarget(d.id);
+	},
+	classChartBar: function classChartBar(d) {
+		return _classes2.default.chartBar + this.classTarget(d.id);
+	},
+	classChartArc: function classChartArc(d) {
+		return _classes2.default.chartArc + this.classTarget(d.data.id);
+	},
+	getTargetSelectorSuffix: function getTargetSelectorSuffix(targetId) {
+		return targetId || targetId === 0 ? ("-" + targetId).replace(/[\s?!@#$%^&*()_=+,.<>'":;\[\]\/|~`{}\\]/g, "-") : "";
+	},
+	selectorTarget: function selectorTarget(id, prefix) {
+		return (prefix || "") + "." + (_classes2.default.target + this.getTargetSelectorSuffix(id));
+	},
+	selectorTargets: function selectorTargets(idsValue, prefix) {
+		var $$ = this,
+		    ids = idsValue || [];
+
+
+		return ids.length ? ids.map(function (id) {
+			return $$.selectorTarget(id, prefix);
+		}) : null;
+	},
+	selectorLegend: function selectorLegend(id) {
+		return "." + (_classes2.default.legendItem + this.getTargetSelectorSuffix(id));
+	},
+	selectorLegends: function selectorLegends(ids) {
+		var $$ = this;
+
+		return ids && ids.length ? ids.map(function (id) {
+			return $$.selectorLegend(id);
+		}) : null;
+	}
+}); /**
+     * Copyright (c) 2017 NAVER Corp.
+     * billboard.js project is licensed under the MIT license
+     */
+
+/***/ }),
+/* 39 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _ChartInternal = __webpack_require__(1),
+    _ChartInternal2 = _interopRequireDefault(_ChartInternal),
+    _util = __webpack_require__(0);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/**
+ * Copyright (c) 2017 NAVER Corp.
+ * billboard.js project is licensed under the MIT license
+ */
+(0, _util.extend)(_ChartInternal2.default.prototype, {
+	getClipPath: function getClipPath(id) {
+		var isIE9 = window.navigator.appVersion.toLowerCase().indexOf("msie 9.") >= 0;
+
+		return "url(" + (isIE9 ? "" : document.URL.split("#")[0]) + "#" + id + ")";
+	},
+	appendClip: function appendClip(parent, id) {
+		return parent.append("clipPath").attr("id", id).append("rect");
+	},
+	getAxisClipX: function getAxisClipX(forHorizontal) {
+		// axis line width + padding for left
+		var left = Math.max(30, this.margin.left);
+
+		return forHorizontal ? -(1 + left) : -(left - 1);
+	},
+	getAxisClipY: function getAxisClipY(forHorizontal) {
+		return forHorizontal ? -20 : -this.margin.top;
+	},
+	getXAxisClipX: function getXAxisClipX() {
+		var $$ = this;
+
+		return $$.getAxisClipX(!$$.config.axis_rotated);
+	},
+	getXAxisClipY: function getXAxisClipY() {
+		var $$ = this;
+
+		return $$.getAxisClipY(!$$.config.axis_rotated);
+	},
+	getYAxisClipX: function getYAxisClipX() {
+		var $$ = this;
+
+		return $$.config.axis_y_inner ? -1 : $$.getAxisClipX($$.config.axis_rotated);
+	},
+	getYAxisClipY: function getYAxisClipY() {
+		var $$ = this;
+
+		return $$.getAxisClipY($$.config.axis_rotated);
+	},
+	getAxisClipWidth: function getAxisClipWidth(forHorizontal) {
+		var $$ = this,
+		    left = Math.max(30, $$.margin.left),
+		    right = Math.max(30, $$.margin.right);
+
+
+		// width + axis line width + padding for left/right
+		return forHorizontal ? $$.width + 2 + left + right : $$.margin.left + 20;
+	},
+	getAxisClipHeight: function getAxisClipHeight(forHorizontal) {
+		// less than 20 is not enough to show the axis label 'outer' without legend
+		return (forHorizontal ? this.margin.bottom : this.margin.top + this.height) + 20;
+	},
+	getXAxisClipWidth: function getXAxisClipWidth() {
+		var $$ = this;
+
+		return $$.getAxisClipWidth(!$$.config.axis_rotated);
+	},
+	getXAxisClipHeight: function getXAxisClipHeight() {
+		var $$ = this;
+
+		return $$.getAxisClipHeight(!$$.config.axis_rotated);
+	},
+	getYAxisClipWidth: function getYAxisClipWidth() {
+		var $$ = this;
+
+		return $$.getAxisClipWidth($$.config.axis_rotated) + ($$.config.axis_y_inner ? 20 : 0);
+	},
+	getYAxisClipHeight: function getYAxisClipHeight() {
+		var $$ = this;
+
+		return $$.getAxisClipHeight($$.config.axis_rotated);
+	}
+});
+
+/***/ }),
+/* 40 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _d = __webpack_require__(2),
+    _ChartInternal = __webpack_require__(1),
+    _ChartInternal2 = _interopRequireDefault(_ChartInternal),
+    _util = __webpack_require__(0);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+(0, _util.extend)(_ChartInternal2.default.prototype, {
+	generateColor: function generateColor() {
+		var $$ = this,
+		    config = $$.config,
+		    colors = config.data_colors,
+		    callback = config.data_color,
+		    ids = [],
+		    pattern = (0, _util.notEmpty)(config.color_pattern) ? config.color_pattern : (0, _d.scaleOrdinal)(_d.schemeCategory10).range();
+
+
+		return function (d) {
+			var id = d.id || d.data && d.data.id || d,
+			    color = void 0;
+
+			// if callback function is provided
+
+
+			return colors[id] instanceof Function ? color = colors[id](d) : colors[id] ? color = colors[id] : (ids.indexOf(id) < 0 && ids.push(id), color = pattern[ids.indexOf(id) % pattern.length], colors[id] = color), callback instanceof Function ? callback(color, d) : color;
+		};
+	},
+	generateLevelColor: function generateLevelColor() {
+		var $$ = this,
+		    config = $$.config,
+		    colors = config.color_pattern,
+		    threshold = config.color_threshold,
+		    asValue = threshold.unit === "value",
+		    max = threshold.max || 100,
+		    values = threshold.values && threshold.values.length ? threshold.values : [];
+
+
+		return (0, _util.notEmpty)(threshold) ? function (value) {
+			var color = colors[colors.length - 1];
+
+			for (var v, i = 0; i < values.length; i++) if (v = asValue ? value : value * 100 / max, v < values[i]) {
+				color = colors[i];
+
+				break;
+			}
+
+			return color;
+		} : null;
+	}
+}); /**
+     * Copyright (c) 2017 NAVER Corp.
+     * billboard.js project is licensed under the MIT license
+     */
+
+/***/ }),
+/* 41 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _typeof2 = __webpack_require__(5),
+    _typeof3 = _interopRequireDefault(_typeof2),
+    _d = __webpack_require__(2),
+    _ChartInternal = __webpack_require__(1),
+    _ChartInternal2 = _interopRequireDefault(_ChartInternal),
+    _util = __webpack_require__(0);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+// selection
+(0, _util.extend)(_ChartInternal2.default.prototype, {
+	getYDomainMin: function getYDomainMin(targets) {
+		var $$ = this,
+		    config = $$.config,
+		    ids = $$.mapToIds(targets),
+		    ys = $$.getValuesAsIdKeyed(targets),
+		    j = void 0,
+		    k = void 0,
+		    baseId = void 0,
+		    idsInGroup = void 0,
+		    id = void 0,
+		    hasNegativeValue = void 0;
+
+
+		if (config.data_groups.length > 0) for (hasNegativeValue = $$.hasNegativeValueInTargets(targets), j = 0; j < config.data_groups.length; j++) if (idsInGroup = config.data_groups[j].filter(function (v) {
+				return ids.indexOf(v) >= 0;
+			}), idsInGroup.length !== 0)
+
+				// Compute min
+				for (baseId = idsInGroup[0], hasNegativeValue && ys[baseId] && ys[baseId].forEach(function (v, i) {
+					ys[baseId][i] = v < 0 ? v : 0;
+				}), k = 1; k < idsInGroup.length; k++) (id = idsInGroup[k], !!ys[id]) && ys[id].forEach(function (v, i) {
+					$$.axis.getId(id) === $$.axis.getId(baseId) && ys[baseId] && !(hasNegativeValue && +v > 0) && (ys[baseId][i] += +v);
+				});
+		return (0, _d.min)(Object.keys(ys).map(function (key) {
+			return (0, _d.min)(ys[key]);
+		}));
+	},
+	getYDomainMax: function getYDomainMax(targets) {
+		var $$ = this,
+		    config = $$.config,
+		    ids = $$.mapToIds(targets),
+		    ys = $$.getValuesAsIdKeyed(targets),
+		    j = void 0,
+		    k = void 0,
+		    baseId = void 0,
+		    idsInGroup = void 0,
+		    id = void 0,
+		    hasPositiveValue = void 0;
+
+
+		if (config.data_groups.length > 0) for (hasPositiveValue = $$.hasPositiveValueInTargets(targets), j = 0; j < config.data_groups.length; j++) if (idsInGroup = config.data_groups[j].filter(function (v) {
+				return ids.indexOf(v) >= 0;
+			}), idsInGroup.length !== 0)
+				// Compute max
+				for (baseId = idsInGroup[0], hasPositiveValue && ys[baseId] && ys[baseId].forEach(function (v, i) {
+					ys[baseId][i] = v > 0 ? v : 0;
+				}), k = 1; k < idsInGroup.length; k++) (id = idsInGroup[k], !!ys[id]) && ys[id].forEach(function (v, i) {
+					$$.axis.getId(id) === $$.axis.getId(baseId) && ys[baseId] && !(hasPositiveValue && +v < 0) && (ys[baseId][i] += +v);
+				});
+		return (0, _d.max)(Object.keys(ys).map(function (key) {
+			return (0, _d.max)(ys[key]);
+		}));
+	},
+	getYDomain: function getYDomain(targets, axisId, xDomain) {
+		var $$ = this,
+		    config = $$.config,
+		    targetsByAxisId = targets.filter(function (t) {
+			return $$.axis.getId(t.id) === axisId;
+		}),
+		    yTargets = xDomain ? $$.filterByXDomain(targetsByAxisId, xDomain) : targetsByAxisId,
+		    yMin = axisId === "y2" ? config.axis_y2_min : config.axis_y_min,
+		    yMax = axisId === "y2" ? config.axis_y2_max : config.axis_y_max,
+		    yDomainMin = $$.getYDomainMin(yTargets),
+		    yDomainMax = $$.getYDomainMax(yTargets),
+		    center = axisId === "y2" ? config.axis_y2_center : config.axis_y_center,
+		    isZeroBased = $$.hasType("bar", yTargets) && config.bar_zerobased || $$.hasType("area", yTargets) && config.area_zerobased,
+		    isInverted = axisId === "y2" ? config.axis_y2_inverted : config.axis_y_inverted,
+		    showHorizontalDataLabel = $$.hasDataLabel() && config.axis_rotated,
+		    showVerticalDataLabel = $$.hasDataLabel() && !config.axis_rotated,
+		    lengths = void 0;
+
+		// MEMO: avoid inverting domain unexpectedly
+
+
+		if (yDomainMin = (0, _util.isValue)(yMin) ? yMin : (0, _util.isValue)(yMax) ? yDomainMin < yMax ? yDomainMin : yMax - 10 : yDomainMin, yDomainMax = (0, _util.isValue)(yMax) ? yMax : (0, _util.isValue)(yMin) ? yMin < yDomainMax ? yDomainMax : yMin + 10 : yDomainMax, yTargets.length === 0) // use current domain if target of axisId is none
+			return axisId === "y2" ? $$.y2.domain() : $$.y.domain();
+
+		isNaN(yDomainMin) && (yDomainMin = 0), isNaN(yDomainMax) && (yDomainMax = yDomainMin), yDomainMin === yDomainMax && (yDomainMin < 0 ? yDomainMax = 0 : yDomainMin = 0);
+
+
+		var isAllPositive = yDomainMin >= 0 && yDomainMax >= 0,
+		    isAllNegative = yDomainMin <= 0 && yDomainMax <= 0;
+		((0, _util.isValue)(yMin) && isAllPositive || (0, _util.isValue)(yMax) && isAllNegative) && (isZeroBased = !1), isZeroBased && (isAllPositive && (yDomainMin = 0), isAllNegative && (yDomainMax = 0));
+
+
+		var domainLength = Math.abs(yDomainMax - yDomainMin),
+		    paddingTop = domainLength * 0.1,
+		    paddingBottom = domainLength * 0.1;
+
+
+		if (typeof center !== "undefined") {
+			var yDomainAbs = Math.max(Math.abs(yDomainMin), Math.abs(yDomainMax));
+
+			yDomainMax = center + yDomainAbs, yDomainMin = center - yDomainAbs;
+		}
+
+		// add padding for data label
+		if (showHorizontalDataLabel) {
+			lengths = $$.getDataLabelLength(yDomainMin, yDomainMax, "width");
+
+			var diff = (0, _util.diffDomain)($$.y.range()),
+			    ratio = [lengths[0] / diff, lengths[1] / diff];
+			paddingTop += domainLength * (ratio[1] / (1 - ratio[0] - ratio[1])), paddingBottom += domainLength * (ratio[0] / (1 - ratio[0] - ratio[1]));
+		} else showVerticalDataLabel && (lengths = $$.getDataLabelLength(yDomainMin, yDomainMax, "height"), paddingTop += $$.axis.convertPixelsToAxisPadding(lengths[1], domainLength), paddingBottom += $$.axis.convertPixelsToAxisPadding(lengths[0], domainLength));
+
+		axisId === "y" && (0, _util.notEmpty)(config.axis_y_padding) && (paddingTop = $$.axis.getPadding(config.axis_y_padding, "top", paddingTop, domainLength), paddingBottom = $$.axis.getPadding(config.axis_y_padding, "bottom", paddingBottom, domainLength)), axisId === "y2" && (0, _util.notEmpty)(config.axis_y2_padding) && (paddingTop = $$.axis.getPadding(config.axis_y2_padding, "top", paddingTop, domainLength), paddingBottom = $$.axis.getPadding(config.axis_y2_padding, "bottom", paddingBottom, domainLength)), isZeroBased && (isAllPositive && (paddingBottom = yDomainMin), isAllNegative && (paddingTop = -yDomainMax));
+
+
+		var domain = [yDomainMin - paddingBottom, yDomainMax + paddingTop];
+
+		return isInverted ? domain.reverse() : domain;
+	},
+	getXDomainMin: function getXDomainMin(targets) {
+		var $$ = this,
+		    config = $$.config;
+
+
+		return (0, _util.isDefined)(config.axis_x_min) ? $$.isTimeSeries() ? this.parseDate(config.axis_x_min) : config.axis_x_min : (0, _d.min)(targets, function (t) {
+			return (0, _d.min)(t.values, function (v) {
+				return v.x;
+			});
+		});
+	},
+	getXDomainMax: function getXDomainMax(targets) {
+		var $$ = this,
+		    config = $$.config;
+
+
+		return (0, _util.isDefined)(config.axis_x_max) ? $$.isTimeSeries() ? this.parseDate(config.axis_x_max) : config.axis_x_max : (0, _d.max)(targets, function (t) {
+			return (0, _d.max)(t.values, function (v) {
+				return v.x;
+			});
+		});
+	},
+	getXDomainPadding: function getXDomainPadding(domain) {
+		var $$ = this,
+		    config = $$.config,
+		    diff = domain[1] - domain[0],
+		    maxDataCount = void 0,
+		    padding = void 0,
+		    paddingLeft = void 0,
+		    paddingRight = void 0;
+
+		return $$.isCategorized() ? padding = 0 : $$.hasType("bar") ? (maxDataCount = $$.getMaxDataCount(), padding = maxDataCount > 1 ? diff / (maxDataCount - 1) / 2 : 0.5) : padding = diff * 0.01, (0, _typeof3.default)(config.axis_x_padding) === "object" && (0, _util.notEmpty)(config.axis_x_padding) ? (paddingLeft = (0, _util.isValue)(config.axis_x_padding.left) ? config.axis_x_padding.left : padding, paddingRight = (0, _util.isValue)(config.axis_x_padding.right) ? config.axis_x_padding.right : padding) : typeof config.axis_x_padding === "number" ? (paddingLeft = config.axis_x_padding, paddingRight = config.axis_x_padding) : (paddingLeft = padding, paddingRight = padding), { left: paddingLeft, right: paddingRight };
+	},
+	getXDomain: function getXDomain(targets) {
+		var $$ = this,
+		    xDomain = [$$.getXDomainMin(targets), $$.getXDomainMax(targets)],
+		    firstX = xDomain[0],
+		    lastX = xDomain[1],
+		    padding = $$.getXDomainPadding(xDomain),
+		    min = 0,
+		    max = 0;
+		// show center of x domain if min and max are the same
+
+		return firstX - lastX !== 0 || $$.isCategorized() || ($$.isTimeSeries() ? (firstX = new Date(firstX.getTime() * 0.5), lastX = new Date(lastX.getTime() * 1.5)) : (firstX = firstX === 0 ? 1 : firstX * 0.5, lastX = lastX === 0 ? -1 : lastX * 1.5)), (firstX || firstX === 0) && (min = $$.isTimeSeries() ? new Date(firstX.getTime() - padding.left) : firstX - padding.left), (lastX || lastX === 0) && (max = $$.isTimeSeries() ? new Date(lastX.getTime() + padding.right) : lastX + padding.right), [min, max];
+	},
+	updateXDomain: function updateXDomain(targets, withUpdateXDomain, withUpdateOrgXDomain, withTrim, domain) {
+		var $$ = this,
+		    config = $$.config;
+
+
+		if (withUpdateOrgXDomain && ($$.x.domain(domain || (0, _d.extent)($$.getXDomain(targets))), $$.orgXDomain = $$.x.domain(), config.zoom_enabled && $$.zoom.updateScaleExtent(), $$.subX.domain($$.x.domain()), $$.brush && $$.brush.scale($$.subX)), withUpdateXDomain) {
+			var domainValue = domain || !$$.brush || $$.brushEmpty() ? $$.orgXDomain : $$.getBrushSelection().map(function (v) {
+				return $$.subX.invert(v);
+			});
+
+			$$.x.domain(domainValue), config.zoom_enabled && $$.zoom.updateScaleExtent();
+		}
+
+		// Trim domain when too big by zoom mousemove event
+
+
+		return withTrim && $$.x.domain($$.trimXDomain($$.x.orgDomain())), $$.x.domain();
+	},
+	trimXDomain: function trimXDomain(domain) {
+		var zoomDomain = this.getZoomDomain(),
+		    min = zoomDomain[0],
+		    max = zoomDomain[1];
+
+
+		return domain[0] <= min && (domain[1] = +domain[1] + (min - domain[0]), domain[0] = min), max <= domain[1] && (domain[0] = +domain[0] - (domain[1] - max), domain[1] = max), domain;
+	}
+}); /**
+     * Copyright (c) 2017 NAVER Corp.
+     * billboard.js project is licensed under the MIT license
+     */
+
+/***/ }),
+/* 42 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _typeof2 = __webpack_require__(5),
+    _typeof3 = _interopRequireDefault(_typeof2),
+    _ChartInternal = __webpack_require__(1),
+    _ChartInternal2 = _interopRequireDefault(_ChartInternal),
+    _util = __webpack_require__(0);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/**
+ * Copyright (c) 2017 NAVER Corp.
+ * billboard.js project is licensed under the MIT license
+ */
+var getFormat = function ($$, typeValue, v) {
+	var config = $$.config,
+	    type = "axis_" + typeValue + "_tick_format",
+	    format = config[type] ? config[type] : $$.defaultValueFormat;
+
+
+	return format(v);
+};
+
+(0, _util.extend)(_ChartInternal2.default.prototype, {
+	getYFormat: function getYFormat(forArc) {
+		var $$ = this,
+		    formatForY = $$.yFormat,
+		    formatForY2 = $$.y2Format;
+
+
+		return forArc && !$$.hasType("gauge") && (formatForY = $$.defaultArcValueFormat, formatForY2 = $$.defaultArcValueFormat), function (v, ratio, id) {
+			var format = $$.axis.getId(id) === "y2" ? formatForY2 : formatForY;
+
+			return format.call($$, v, ratio);
+		};
+	},
+	yFormat: function yFormat(v) {
+		return getFormat(this, "y", v);
+	},
+	y2Format: function y2Format(v) {
+		return getFormat(this, "y2", v);
+	},
+	defaultValueFormat: function defaultValueFormat(v) {
+		return (0, _util.isValue)(v) ? +v : "";
+	},
+	defaultArcValueFormat: function defaultArcValueFormat(v, ratio) {
+		return (ratio * 100).toFixed(1) + "%";
+	},
+	dataLabelFormat: function dataLabelFormat(targetId) {
+		var $$ = this,
+		    dataLabels = $$.config.data_labels,
+		    defaultFormat = function (v) {
+			return (0, _util.isValue)(v) ? +v : "";
+		},
+		    format = void 0;
+
+		// find format according to axis id
+
+
+		return format = typeof dataLabels.format === "function" ? dataLabels.format : (0, _typeof3.default)(dataLabels.format) === "object" ? dataLabels.format[targetId] ? dataLabels.format[targetId] === !0 ? defaultFormat : dataLabels.format[targetId] : function () {
+			return "";
+		} : defaultFormat, format;
+	}
+});
+
+/***/ }),
+/* 43 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _d = __webpack_require__(2),
+    _ChartInternal = __webpack_require__(1),
+    _ChartInternal2 = _interopRequireDefault(_ChartInternal),
+    _classes = __webpack_require__(3),
+    _classes2 = _interopRequireDefault(_classes),
+    _util = __webpack_require__(0);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/**
+ * Copyright (c) 2017 NAVER Corp.
+ * billboard.js project is licensed under the MIT license
+ */
+(0, _util.extend)(_ChartInternal2.default.prototype, {
+	initGrid: function initGrid() {
+		var $$ = this,
+		    config = $$.config;
+		$$.grid = $$.main.append("g").attr("clip-path", $$.clipPathForGrid).attr("class", _classes2.default.grid), config.grid_x_show && $$.grid.append("g").attr("class", _classes2.default.xgrids), config.grid_y_show && $$.grid.append("g").attr("class", _classes2.default.ygrids), config.grid_focus_show && $$.grid.append("g").attr("class", _classes2.default.xgridFocus).append("line").attr("class", _classes2.default.xgridFocus), $$.xgrid = (0, _d.selectAll)([]), config.grid_lines_front || $$.initGridLines();
+	},
+	initGridLines: function initGridLines() {
+		var $$ = this;
+
+		$$.gridLines = $$.main.append("g").attr("clip-path", $$.clipPathForGrid).attr("class", _classes2.default.grid + " " + _classes2.default.gridLines), $$.gridLines.append("g").attr("class", _classes2.default.xgridLines), $$.gridLines.append("g").attr("class", _classes2.default.ygridLines), $$.xgridLines = (0, _d.selectAll)([]);
+	},
+	updateXGrid: function updateXGrid(withoutUpdate) {
+		var $$ = this,
+		    config = $$.config,
+		    xgridData = $$.generateGridData(config.grid_x_type, $$.x),
+		    tickOffset = $$.isCategorized() ? $$.xAxis.tickOffset() : 0;
+		$$.xgridAttr = config.axis_rotated ? {
+			"x1": 0,
+			"x2": $$.width,
+			"y1": function y1(d) {
+				return $$.x(d) - tickOffset;
+			},
+			"y2": function y2(d) {
+				return $$.x(d) - tickOffset;
+			}
+		} : {
+			"x1": function x1(d) {
+				return $$.x(d) + tickOffset;
+			},
+			"x2": function x2(d) {
+				return $$.x(d) + tickOffset;
+			},
+			"y1": 0,
+			"y2": $$.height
+		}, $$.xgrid = $$.main.select("." + _classes2.default.xgrids).selectAll("." + _classes2.default.xgrid).data(xgridData), $$.xgrid.exit().remove(), $$.xgrid = $$.xgrid.enter().append("line").attr("class", _classes2.default.xgrid).merge($$.xgrid), withoutUpdate || $$.xgrid.each(function () {
+			var grid = (0, _d.select)(this);
+
+			Object.keys($$.xgridAttr).forEach(function (id) {
+				grid.attr(id, $$.xgridAttr[id]).style("opacity", function () {
+					return grid.attr(config.axis_rotated ? "y1" : "x1") === (config.axis_rotated ? $$.height : 0) ? "0" : "1";
+				});
+			});
+		});
+	},
+	updateYGrid: function updateYGrid() {
+		var $$ = this,
+		    config = $$.config,
+		    gridValues = $$.yAxis.tickValues() || $$.y.ticks(config.grid_y_ticks);
+		$$.ygrid = $$.main.select("." + _classes2.default.ygrids).selectAll("." + _classes2.default.ygrid).data(gridValues), $$.ygrid.exit().remove(), $$.ygrid = $$.ygrid.enter().append("line").attr("class", _classes2.default.ygrid).merge($$.ygrid), $$.ygrid.attr("x1", config.axis_rotated ? $$.y : 0).attr("x2", config.axis_rotated ? $$.y : $$.width).attr("y1", config.axis_rotated ? 0 : $$.y).attr("y2", config.axis_rotated ? $$.height : $$.y), $$.smoothLines($$.ygrid, "grid");
+	},
+	gridTextAnchor: function gridTextAnchor(d) {
+		return d.position ? d.position : "end";
+	},
+	gridTextDx: function gridTextDx(d) {
+		return d.position === "start" ? 4 : d.position === "middle" ? 0 : -4;
+	},
+	xGridTextX: function xGridTextX(d) {
+		return d.position === "start" ? -this.height : d.position === "middle" ? -this.height / 2 : 0;
+	},
+	yGridTextX: function yGridTextX(d) {
+		return d.position === "start" ? 0 : d.position === "middle" ? this.width / 2 : this.width;
+	},
+	updateGrid: function updateGrid(duration) {
+		var $$ = this,
+		    main = $$.main,
+		    config = $$.config;
+
+
+		// hide if arc type
+		$$.grid.style("visibility", $$.hasArcType() ? "hidden" : "visible"), main.select("line." + _classes2.default.xgridFocus).style("visibility", "hidden"), config.grid_x_show && $$.updateXGrid(), $$.xgridLines = main.select("." + _classes2.default.xgridLines).selectAll("." + _classes2.default.xgridLine).data(config.grid_x_lines), $$.xgridLines.exit().transition().duration(duration).style("opacity", "0").remove();
+
+
+		// enter
+		var xgridLine = $$.xgridLines.enter().append("g").attr("class", function (d) {
+			return _classes2.default.xgridLine + (d.class ? " " + d.class : "");
+		});
+
+		xgridLine.append("line").style("opacity", "0"), xgridLine.append("text").attr("text-anchor", $$.gridTextAnchor).attr("transform", config.axis_rotated ? "" : "rotate(-90)").attr("dx", $$.gridTextDx).attr("dy", -5).style("opacity", "0"), $$.xgridLines = xgridLine.merge($$.xgridLines), config.grid_y_show && $$.updateYGrid(), $$.ygridLines = main.select("." + _classes2.default.ygridLines).selectAll("." + _classes2.default.ygridLine).data(config.grid_y_lines), $$.ygridLines.exit().transition().duration(duration).style("opacity", "0").remove();
+
+
+		// enter
+		var ygridLine = $$.ygridLines.enter().append("g").attr("class", function (d) {
+			return _classes2.default.ygridLine + (d.class ? " " + d.class : "");
+		});
+
+		ygridLine.append("line").style("opacity", "0"), ygridLine.append("text").attr("text-anchor", $$.gridTextAnchor).attr("transform", config.axis_rotated ? "rotate(-90)" : "").attr("dx", $$.gridTextDx).attr("dy", -5).style("opacity", "0"), $$.ygridLines = ygridLine.merge($$.ygridLines);
+
+
+		// update
+		var yv = $$.yv.bind($$);
+
+		$$.ygridLines.select("line").transition().duration(duration).attr("x1", config.axis_rotated ? yv : 0).attr("x2", config.axis_rotated ? yv : $$.width).attr("y1", config.axis_rotated ? 0 : yv).attr("y2", config.axis_rotated ? $$.height : yv).transition().style("opacity", "1"), $$.ygridLines.select("text").transition().duration(duration).attr("x", config.axis_rotated ? $$.xGridTextX.bind($$) : $$.yGridTextX.bind($$)).attr("y", yv).text(function (d) {
+			return d.text;
+		}).transition().style("opacity", "1");
+	},
+	redrawGrid: function redrawGrid(withTransition) {
+		var $$ = this,
+		    rotated = $$.config.axis_rotated,
+		    xv = $$.xv.bind($$),
+		    lines = $$.xgridLines.select("line"),
+		    texts = $$.xgridLines.select("text");
+
+
+		return lines = (withTransition ? lines.transition() : lines).attr("x1", rotated ? 0 : xv).attr("x2", rotated ? $$.width : xv).attr("y1", rotated ? xv : 0).attr("y2", rotated ? xv : $$.height), texts = (withTransition ? texts.transition() : texts).attr("x", rotated ? $$.yGridTextX.bind($$) : $$.xGridTextX.bind($$)).attr("y", xv).text(function (d) {
+			return d.text;
+		}), [(withTransition ? lines.transition() : lines).style("opacity", "1"), (withTransition ? texts.transition() : texts).style("opacity", "1")];
+	},
+	showXGridFocus: function showXGridFocus(selectedData) {
+		var $$ = this,
+		    config = $$.config,
+		    dataToShow = selectedData.filter(function (d) {
+			return d && (0, _util.isValue)(d.value);
+		}),
+		    focusEl = $$.main.selectAll("line." + _classes2.default.xgridFocus),
+		    xx = $$.xx.bind($$);
+		!config.tooltip_show || $$.hasType("scatter") || $$.hasArcType() || (focusEl.style("visibility", "visible").data([dataToShow[0]]).attr(config.axis_rotated ? "y1" : "x1", xx).attr(config.axis_rotated ? "y2" : "x2", xx), $$.smoothLines(focusEl, "grid"));
+
+		// Hide when scatter plot exists
+	},
+	hideXGridFocus: function hideXGridFocus() {
+		this.main.select("line." + _classes2.default.xgridFocus).style("visibility", "hidden");
+	},
+	updateXgridFocus: function updateXgridFocus() {
+		var $$ = this,
+		    config = $$.config;
+		$$.main.select("line." + _classes2.default.xgridFocus).attr("x1", config.axis_rotated ? 0 : -10).attr("x2", config.axis_rotated ? $$.width : -10).attr("y1", config.axis_rotated ? -10 : 0).attr("y2", config.axis_rotated ? -10 : $$.height);
+	},
+	generateGridData: function generateGridData(type, scale) {
+		var $$ = this,
+		    tickNum = $$.main.select("." + _classes2.default.axisX).selectAll(".tick").size(),
+		    gridData = [];
+
+
+		if (type === "year") {
+			var xDomain = $$.getXDomain(),
+			    firstYear = xDomain[0].getFullYear(),
+			    lastYear = xDomain[1].getFullYear();
+
+
+			for (var i = firstYear; i <= lastYear; i++) gridData.push(new Date(i + "-01-01 00:00:00"));
+		} else gridData = scale.ticks(10), gridData.length > tickNum && (gridData = gridData.filter(function (d) {
+				return (d + "").indexOf(".") < 0;
+			}));
+		return gridData;
+	},
+	getGridFilterToRemove: function getGridFilterToRemove(params) {
+		return params ? function (line) {
+			var found = !1;
+
+			return [].concat(params).forEach(function (param) {
+				("value" in param && line.value === param.value || "class" in param && line.class === param.class) && (found = !0);
+			}), found;
+		} : function () {
+			return !0;
+		};
+	},
+	removeGridLines: function removeGridLines(params, forX) {
+		var $$ = this,
+		    config = $$.config,
+		    toRemove = $$.getGridFilterToRemove(params),
+		    toShow = function (line) {
+			return !toRemove(line);
+		},
+		    classLines = forX ? _classes2.default.xgridLines : _classes2.default.ygridLines,
+		    classLine = forX ? _classes2.default.xgridLine : _classes2.default.ygridLine;
+		$$.main.select("." + classLines).selectAll("." + classLine).filter(toRemove).transition().duration(config.transition_duration).style("opacity", "0").remove(), forX ? config.grid_x_lines = config.grid_x_lines.filter(toShow) : config.grid_y_lines = config.grid_y_lines.filter(toShow);
+	}
+});
+
+/***/ }),
+/* 44 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _d = __webpack_require__(2),
+    _ChartInternal = __webpack_require__(1),
+    _ChartInternal2 = _interopRequireDefault(_ChartInternal),
+    _classes = __webpack_require__(3),
+    _classes2 = _interopRequireDefault(_classes),
+    _util = __webpack_require__(0);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/**
+ * Copyright (c) 2017 NAVER Corp.
+ * billboard.js project is licensed under the MIT license
+ */
+(0, _util.extend)(_ChartInternal2.default.prototype, {
+	/**
+  * Initialize the legend.
+  * @private
+  */
+	initLegend: function initLegend() {
+		var $$ = this;
+
+		return $$.legendItemTextBox = {}, $$.legendHasRendered = !1, $$.legend = $$.svg.append("g").attr("transform", $$.getTranslate("legend")), $$.config.legend_show ? void $$.updateLegendWithDefaults() : ($$.legend.style("visibility", "hidden"), void ($$.hiddenLegendIds = $$.mapToIds($$.data.targets)));
+		// MEMO: call here to update legend box and tranlate for all
+		// MEMO: translate will be upated by this, so transform not needed in updateLegend()
+	},
+
+
+	/**
+  * Update the legend to its default value.
+  * @private
+  */
+	updateLegendWithDefaults: function updateLegendWithDefaults() {
+		var $$ = this;
+
+		$$.updateLegend($$.mapToIds($$.data.targets), {
+			withTransform: !1,
+			withTransitionForTransform: !1,
+			withTransition: !1
+		});
+	},
+
+
+	/**
+  * Update the size of the legend.
+  * @private
+  * @param {Number} height
+  * @param {Number} width
+  */
+	updateSizeForLegend: function updateSizeForLegend(legendHeight, legendWidth) {
+		var $$ = this,
+		    config = $$.config,
+		    insetLegendPosition = {
+			top: $$.isLegendTop ? $$.getCurrentPaddingTop() + config.legend_inset_y + 5.5 : $$.currentHeight - legendHeight - $$.getCurrentPaddingBottom() - config.legend_inset_y,
+			left: $$.isLegendLeft ? $$.getCurrentPaddingLeft() + config.legend_inset_x + 0.5 : $$.currentWidth - legendWidth - $$.getCurrentPaddingRight() - config.legend_inset_x + 0.5
+		};
+		$$.margin3 = {
+			top: $$.isLegendRight ? 0 : $$.isLegendInset ? insetLegendPosition.top : $$.currentHeight - legendHeight,
+			right: NaN,
+			bottom: 0,
+			left: $$.isLegendRight ? $$.currentWidth - legendWidth : $$.isLegendInset ? insetLegendPosition.left : 0
+		};
+	},
+
+	/**
+  * Transform Legend
+  * @private
+  * @param {Boolean} whether or not to transition.
+  */
+	transformLegend: function transformLegend(withTransition) {
+		var $$ = this;
+
+		(withTransition ? $$.legend.transition() : $$.legend).attr("transform", $$.getTranslate("legend"));
+	},
+
+
+	/**
+  * Update the legend step
+  * @private
+  * @param {Number} step
+  */
+	updateLegendStep: function updateLegendStep(step) {
+		this.legendStep = step;
+	},
+
+
+	/**
+  * Update legend item width
+  * @private
+  * @param {Number} width
+  */
+	updateLegendItemWidth: function updateLegendItemWidth(w) {
+		this.legendItemWidth = w;
+	},
+
+
+	/**
+  * Update legend item height
+  * @private
+  * @param {Number} height
+  */
+	updateLegendItemHeight: function updateLegendItemHeight(h) {
+		this.legendItemHeight = h;
+	},
+
+
+	/**
+  * Get the width of the legend
+  * @private
+  * @param {Number} width
+  */
+	getLegendWidth: function getLegendWidth() {
+		var $$ = this;
+
+		return $$.config.legend_show ? $$.isLegendRight || $$.isLegendInset ? $$.legendItemWidth * ($$.legendStep + 1) : $$.currentWidth : 0;
+	},
+
+	/**
+  * Get the height of the legend
+  * @private
+  * @param {Number} height
+  */
+	getLegendHeight: function getLegendHeight() {
+		var $$ = this,
+		    h = 0;
+
+		return $$.config.legend_show && ($$.isLegendRight ? h = $$.currentHeight : h = Math.max(20, $$.legendItemHeight) * ($$.legendStep + 1)), h;
+	},
+
+	/**
+  * Get the opacity of the legend
+  * @private
+  * @param {Object} d3.Select
+  * @returns {Number} opacity
+  */
+	opacityForLegend: function opacityForLegend(legendItem) {
+		return legendItem.classed(_classes2.default.legendItemHidden) ? null : "1";
+	},
+
+
+	/**
+  * Get the opacity of the legend that is unfocused
+  * @private
+  * @param {Object} legendItem, d3.Select
+  * @returns {Number} opacity
+  */
+	opacityForUnfocusedLegend: function opacityForUnfocusedLegend(legendItem) {
+		return legendItem.classed(_classes2.default.legendItemHidden) ? null : "0.3";
+	},
+
+	/**
+  * Toggles the focus of the legend
+  * @private
+  * @param {Array} ID's of target
+  * @param {Boolean} whether or not to focus.
+  */
+	toggleFocusLegend: function toggleFocusLegend(targetIds, focus) {
+		var $$ = this,
+		    targetIdz = $$.mapToTargetIds(targetIds);
+		$$.legend.selectAll("." + _classes2.default.legendItem).filter(function (id) {
+			return targetIdz.indexOf(id) >= 0;
+		}).classed(_classes2.default.legendItemFocused, focus).transition().duration(100).style("opacity", function () {
+			var opacity = focus ? $$.opacityForLegend : $$.opacityForUnfocusedLegend;
+
+			return opacity.call($$, (0, _d.select)(this));
+		});
+	},
+
+	/**
+  * Revert the legend to its default state
+  * @private
+  */
+	revertLegend: function revertLegend() {
+		var $$ = this;
+
+		$$.legend.selectAll("." + _classes2.default.legendItem).classed(_classes2.default.legendItemFocused, !1).transition().duration(100).style("opacity", function () {
+			return $$.opacityForLegend((0, _d.select)(this));
+		});
+	},
+
+	/**
+  * Shows the legend
+  * @private
+  * @param {Array} ID's of target
+  */
+	showLegend: function showLegend(targetIds) {
+		var $$ = this,
+		    config = $$.config;
+		config.legend_show || (config.legend_show = !0, $$.legend.style("visibility", "visible"), !$$.legendHasRendered && $$.updateLegendWithDefaults()), $$.removeHiddenLegendIds(targetIds), $$.legend.selectAll($$.selectorLegends(targetIds)).style("visibility", "visible").transition().style("opacity", function () {
+			return $$.opacityForLegend((0, _d.select)(this));
+		});
+	},
+
+	/**
+  * Hide the legend
+  * @private
+  * @param {Array} ID's of target
+  */
+	hideLegend: function hideLegend(targetIds) {
+		var $$ = this,
+		    config = $$.config;
+		config.legend_show && (0, _util.isEmpty)(targetIds) && (config.legend_show = !1, $$.legend.style("visibility", "hidden")), $$.addHiddenLegendIds(targetIds), $$.legend.selectAll($$.selectorLegends(targetIds)).style("opacity", "0").style("visibility", "hidden");
+	},
+
+	/**
+  * Clear the LegendItemTextBox cache.
+  * @private
+  */
+	clearLegendItemTextBoxCache: function clearLegendItemTextBoxCache() {
+		this.legendItemTextBox = {};
+	},
+
+	/**
+  * Update the legend
+  * @private
+  * @param {Array} ID's of target
+  * @param {Object} withTransform : Whether to use the transform property / withTransitionForTransform: Whether transition is used when using the transform property / withTransition : whether or not to transition.
+  * @param {Object} the return value of the generateTransitions
+  */
+	updateLegend: function updateLegend(targetIds, options, transitions) {
+		var $$ = this,
+		    config = $$.config,
+		    posMin = 10,
+		    tileWidth = config.legend_item_tile_width + 5,
+		    isTouch = $$.inputType === "touch",
+		    maxWidth = 0,
+		    maxHeight = 0,
+		    xForLegend = void 0,
+		    yForLegend = void 0,
+		    totalLength = 0,
+		    offsets = {},
+		    widths = {},
+		    heights = {},
+		    margins = [0],
+		    steps = {},
+		    step = 0,
+		    background = void 0,
+		    targetIdz = targetIds.filter(function (id) {
+			return !(0, _util.isDefined)(config.data_names[id]) || config.data_names[id] !== null;
+		}),
+		    optionz = options || {},
+		    withTransition = (0, _util.getOption)(optionz, "withTransition", !0),
+		    withTransitionForTransform = (0, _util.getOption)(optionz, "withTransitionForTransform", !0),
+		    getTextBox = function (textElement, id) {
+			return $$.legendItemTextBox[id] || ($$.legendItemTextBox[id] = $$.getTextRect(textElement.textContent, _classes2.default.legendItem, textElement)), $$.legendItemTextBox[id];
+		},
+		    updatePositions = function (textElement, id, index) {
+			var isLast = index === targetIdz.length - 1,
+			    box = getTextBox(textElement, id),
+			    itemWidth = box.width + tileWidth + (isLast && !($$.isLegendRight || $$.isLegendInset) ? 0 : 10) + config.legend_padding,
+			    itemHeight = box.height + 4,
+			    itemLength = $$.isLegendRight || $$.isLegendInset ? itemHeight : itemWidth,
+			    areaLength = $$.isLegendRight || $$.isLegendInset ? $$.getLegendHeight() : $$.getLegendWidth(),
+			    margin = void 0,
+			    updateValues = function (id2, withoutStep) {
+				withoutStep || (margin = (areaLength - totalLength - itemLength) / 2, margin < posMin && (margin = (areaLength - itemLength) / 2, totalLength = 0, step++)), steps[id2] = step, margins[step] = $$.isLegendInset ? 10 : margin, offsets[id2] = totalLength, totalLength += itemLength;
+			};
+
+			// MEMO: care about condifion of step, totalLength
+
+
+			if (index === 0 && (totalLength = 0, step = 0, maxWidth = 0, maxHeight = 0), config.legend_show && !$$.isLegendToShow(id)) return widths[id] = 0, heights[id] = 0, steps[id] = 0, void (offsets[id] = 0);
+
+			widths[id] = itemWidth, heights[id] = itemHeight, (!maxWidth || itemWidth >= maxWidth) && (maxWidth = itemWidth), (!maxHeight || itemHeight >= maxHeight) && (maxHeight = itemHeight);
+
+
+			var maxLength = $$.isLegendRight || $$.isLegendInset ? maxHeight : maxWidth;
+
+			config.legend_equally ? (Object.keys(widths).forEach(function (id2) {
+				return widths[id2] = maxWidth;
+			}), Object.keys(heights).forEach(function (id2) {
+				return heights[id2] = maxHeight;
+			}), margin = (areaLength - maxLength * targetIdz.length) / 2, margin < posMin ? (totalLength = 0, step = 0, targetIdz.forEach(function (id2) {
+				return updateValues(id2);
+			})) : updateValues(id, !0)) : updateValues(id);
+		};
+		// Skip elements when their name is set to null
+		$$.isLegendInset && (step = config.legend_inset_step ? config.legend_inset_step : targetIdz.length, $$.updateLegendStep(step)), $$.isLegendRight ? (xForLegend = function (id) {
+			return maxWidth * steps[id];
+		}, yForLegend = function (id) {
+			return margins[steps[id]] + offsets[id];
+		}) : $$.isLegendInset ? (xForLegend = function (id) {
+			return maxWidth * steps[id] + 10;
+		}, yForLegend = function (id) {
+			return margins[steps[id]] + offsets[id];
+		}) : (xForLegend = function (id) {
+			return margins[steps[id]] + offsets[id];
+		}, yForLegend = function (id) {
+			return maxHeight * steps[id];
+		});
+
+
+		var xForLegendText = function (id, i) {
+			return xForLegend(id, i) + 4 + config.legend_item_tile_width;
+		},
+		    yForLegendText = function (id, i) {
+			return yForLegend(id, i) + 9;
+		},
+		    xForLegendRect = function (id, i) {
+			return xForLegend(id, i);
+		},
+		    yForLegendRect = function (id, i) {
+			return yForLegend(id, i) - 5;
+		},
+		    x1ForLegendTile = function (id, i) {
+			return xForLegend(id, i) - 2;
+		},
+		    x2ForLegendTile = function (id, i) {
+			return xForLegend(id, i) - 2 + config.legend_item_tile_width;
+		},
+		    yForLegendTile = function (id, i) {
+			return yForLegend(id, i) + 4;
+		},
+		    l = $$.legend.selectAll("." + _classes2.default.legendItem).data(targetIdz).enter().append("g").attr("class", function (id) {
+			return $$.generateClass(_classes2.default.legendItem, id);
+		}).style("visibility", function (id) {
+			return $$.isLegendToShow(id) ? "visible" : "hidden";
+		}).style("cursor", "pointer").on(isTouch ? "touchstart" : "click", function (id) {
+			config.legend_item_onclick ? config.legend_item_onclick.call($$, id) : _d.event.altKey ? ($$.api.hide(), $$.api.show(id)) : ($$.api.toggle(id), $$.isTargetToShow(id) ? $$.api.focus(id) : $$.api.revert()), isTouch && $$.hideTooltip();
+		}).on(isTouch ? undefined : "mouseover", function (id) {
+			config.legend_item_onover ? config.legend_item_onover.call($$, id) : ((0, _d.select)(this).classed(_classes2.default.legendItemFocused, !0), !$$.transiting && $$.isTargetToShow(id) && $$.api.focus(id));
+		}).on(isTouch ? "touchend" : "mouseout", function (id) {
+			config.legend_item_onout ? config.legend_item_onout.call($$, id) : ((0, _d.select)(this).classed(_classes2.default.legendItemFocused, !1), $$.api.revert());
+		});
+
+		// Define g for legend area
+		l.append("text").text(function (id) {
+			return (0, _util.isDefined)(config.data_names[id]) ? config.data_names[id] : id;
+		}).each(function (id, i) {
+			updatePositions(this, id, i);
+		}).style("pointer-events", "none").attr("x", $$.isLegendRight || $$.isLegendInset ? xForLegendText : -200).attr("y", $$.isLegendRight || $$.isLegendInset ? -200 : yForLegendText), l.append("rect").attr("class", _classes2.default.legendItemEvent).style("fill-opacity", "0").attr("x", $$.isLegendRight || $$.isLegendInset ? xForLegendRect : -200).attr("y", $$.isLegendRight || $$.isLegendInset ? -200 : yForLegendRect), l.append("line").attr("class", _classes2.default.legendItemTile).style("stroke", $$.color).style("pointer-events", "none").attr("x1", $$.isLegendRight || $$.isLegendInset ? x1ForLegendTile : -200).attr("y1", $$.isLegendRight || $$.isLegendInset ? -200 : yForLegendTile).attr("x2", $$.isLegendRight || $$.isLegendInset ? x2ForLegendTile : -200).attr("y2", $$.isLegendRight || $$.isLegendInset ? -200 : yForLegendTile).attr("stroke-width", config.legend_item_tile_height), background = $$.legend.select("." + _classes2.default.legendBackground + " rect"), $$.isLegendInset && maxWidth > 0 && background.size() === 0 && (background = $$.legend.insert("g", "." + _classes2.default.legendItem).attr("class", _classes2.default.legendBackground).append("rect"));
+
+
+		var texts = $$.legend.selectAll("text").data(targetIdz).text(function (id) {
+			return (0, _util.isDefined)(config.data_names[id]) ? config.data_names[id] : id;
+		} // MEMO: needed for update
+		).each(function (id, i) {
+			updatePositions(this, id, i);
+		});
+
+		(withTransition ? texts.transition() : texts).attr("x", xForLegendText).attr("y", yForLegendText);
+
+
+		var rects = $$.legend.selectAll("rect." + _classes2.default.legendItemEvent).data(targetIdz);
+
+		(withTransition ? rects.transition() : rects).attr("width", function (id) {
+			return widths[id];
+		}).attr("height", function (id) {
+			return heights[id];
+		}).attr("x", xForLegendRect).attr("y", yForLegendRect);
+
+
+		var tiles = $$.legend.selectAll("line." + _classes2.default.legendItemTile).data(targetIdz);
+
+		(withTransition ? tiles.transition() : tiles).style("stroke", $$.color).attr("x1", x1ForLegendTile).attr("y1", yForLegendTile).attr("x2", x2ForLegendTile).attr("y2", yForLegendTile), background && (withTransition ? background.transition() : background).attr("height", $$.getLegendHeight() - 12).attr("width", maxWidth * (step + 1) + 10), $$.legend.selectAll("." + _classes2.default.legendItem).classed(_classes2.default.legendItemHidden, function (id) {
+			return !$$.isTargetToShow(id);
+		}), $$.updateLegendItemWidth(maxWidth), $$.updateLegendItemHeight(maxHeight), $$.updateLegendStep(step), $$.updateSizes(), $$.updateScales(), $$.updateSvgSize(), $$.transformAll(withTransitionForTransform, transitions), $$.legendHasRendered = !0;
+	}
+});
+
+/***/ }),
+/* 45 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _d = __webpack_require__(2),
+    _ChartInternal = __webpack_require__(1),
+    _ChartInternal2 = _interopRequireDefault(_ChartInternal),
+    _classes = __webpack_require__(3),
+    _classes2 = _interopRequireDefault(_classes),
+    _util = __webpack_require__(0);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/**
+ * Copyright (c) 2017 NAVER Corp.
+ * billboard.js project is licensed under the MIT license
+ */
+(0, _util.extend)(_ChartInternal2.default.prototype, {
+	initRegion: function initRegion() {
+		var $$ = this;
+
+		$$.region = $$.main.append("g").attr("clip-path", $$.clipPath).attr("class", _classes2.default.regions);
+	},
+	updateRegion: function updateRegion(duration) {
+		var $$ = this,
+		    config = $$.config;
+
+
+		// hide if arc type
+		$$.region.style("visibility", $$.hasArcType() ? "hidden" : "visible"), $$.mainRegion = $$.main.select("." + _classes2.default.regions).selectAll("." + _classes2.default.region).data(config.regions), $$.mainRegion.exit().transition().duration(duration).style("opacity", "0").remove(), $$.mainRegion = $$.mainRegion.enter().append("g").merge($$.mainRegion).attr("class", $$.classRegion.bind($$)), $$.mainRegion.append("rect").style("fill-opacity", "0");
+	},
+	redrawRegion: function redrawRegion(withTransition) {
+		var $$ = this,
+		    x = $$.regionX.bind($$),
+		    y = $$.regionY.bind($$),
+		    w = $$.regionWidth.bind($$),
+		    h = $$.regionHeight.bind($$),
+		    regions = $$.mainRegion.select("rect");
+
+
+		return regions = (withTransition ? regions.transition() : regions).attr("x", x).attr("y", y).attr("width", w).attr("height", h), [(withTransition ? regions.transition() : regions).style("fill-opacity", function (d) {
+			return (0, _util.isValue)(d.opacity) ? d.opacity : "0.1";
+		}).on("end", function () {
+			(0, _d.select)(this.parentNode).selectAll("rect:not([x])").remove();
+		})];
+	},
+	regionX: function regionX(d) {
+		var $$ = this,
+		    config = $$.config,
+		    yScale = d.axis === "y" ? $$.y : $$.y2,
+		    xPos = void 0;
+
+
+		return xPos = d.axis === "y" || d.axis === "y2" ? config.axis_rotated ? "start" in d ? yScale(d.start) : 0 : 0 : config.axis_rotated ? 0 : "start" in d ? $$.x($$.isTimeSeries() ? $$.parseDate(d.start) : d.start) : 0, xPos;
+	},
+	regionY: function regionY(d) {
+		var $$ = this,
+		    config = $$.config,
+		    yScale = d.axis === "y" ? $$.y : $$.y2,
+		    yPos = void 0;
+
+
+		return yPos = d.axis === "y" || d.axis === "y2" ? config.axis_rotated ? 0 : "end" in d ? yScale(d.end) : 0 : config.axis_rotated ? "start" in d ? $$.x($$.isTimeSeries() ? $$.parseDate(d.start) : d.start) : 0 : 0, yPos;
+	},
+	regionWidth: function regionWidth(d) {
+		var $$ = this,
+		    config = $$.config,
+		    yScale = d.axis === "y" ? $$.y : $$.y2,
+		    start = $$.regionX(d),
+		    end = void 0;
+
+
+		return end = d.axis === "y" || d.axis === "y2" ? config.axis_rotated ? "end" in d ? yScale(d.end) : $$.width : $$.width : config.axis_rotated ? $$.width : "end" in d ? $$.x($$.isTimeSeries() ? $$.parseDate(d.end) : d.end) : $$.width, end < start ? 0 : end - start;
+	},
+	regionHeight: function regionHeight(d) {
+		var $$ = this,
+		    config = $$.config,
+		    start = this.regionY(d),
+		    end = void 0,
+		    yScale = d.axis === "y" ? $$.y : $$.y2;
+
+
+		return end = d.axis === "y" || d.axis === "y2" ? config.axis_rotated ? $$.height : "start" in d ? yScale(d.start) : $$.height : config.axis_rotated ? "end" in d ? $$.x($$.isTimeSeries() ? $$.parseDate(d.end) : d.end) : $$.height : $$.height, end < start ? 0 : end - start;
+	},
+	isRegionOnX: function isRegionOnX(d) {
+		return !d.axis || d.axis === "x";
+	}
+}); // selection
+
+/***/ }),
+/* 46 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _d = __webpack_require__(2),
+    _ChartInternal = __webpack_require__(1),
+    _ChartInternal2 = _interopRequireDefault(_ChartInternal),
+    _util = __webpack_require__(0);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+(0, _util.extend)(_ChartInternal2.default.prototype, {
+	getScale: function getScale(min, max, forTimeseries) {
+		return (forTimeseries ? (0, _d.scaleTime)() : (0, _d.scaleLinear)()).range([min, max]);
+	},
+	getX: function getX(min, max, domain, offsetValue) {
+		var $$ = this,
+		    scale = $$.getScale(min, max, $$.isTimeSeries()),
+		    _scale = domain ? scale.domain(domain) : scale,
+		    key = void 0,
+		    offset = void 0;
+
+		// Define customized scale if categorized axis
+
+
+		// define functions
+		for (key in $$.isCategorized() ? (offset = offsetValue || function () {
+			return 0;
+		}, scale = function (d, raw) {
+			var v = _scale(d) + offset(d);
+
+			return raw ? v : Math.ceil(v);
+		}) : scale = function (d, raw) {
+			var v = _scale(d);
+
+			return raw ? v : Math.ceil(v);
+		}, _scale) scale[key] = _scale[key];
+
+		return scale.orgDomain = function () {
+			return _scale.domain();
+		}, $$.isCategorized() && (scale.domain = function (domainValue) {
+			var domain = domainValue;
+
+			return arguments.length ? (_scale.domain(domain), scale) : (domain = this.orgDomain(), [domain[0], domain[1] + 1]);
+		}), scale;
+	},
+	getY: function getY(min, max, domain) {
+		var scale = this.getScale(min, max, this.isTimeSeriesY());
+
+		return domain && scale.domain(domain), scale;
+	},
+	getYScale: function getYScale(id) {
+		return this.axis.getId(id) === "y2" ? this.y2 : this.y;
+	},
+	getSubYScale: function getSubYScale(id) {
+		return this.axis.getId(id) === "y2" ? this.subY2 : this.subY;
+	},
+
+
+	/**
+  * Update scale
+  * @private
+  * @param {Boolean} withoutTransitionAtInit - param is given at the init rendering
+  */
+	updateScales: function updateScales(withoutTransitionAtInit) {
+		var $$ = this,
+		    config = $$.config,
+		    forInit = !$$.x;
+
+
+		// update edges
+		$$.xMin = config.axis_rotated ? 1 : 0, $$.xMax = config.axis_rotated ? $$.height : $$.width, $$.yMin = config.axis_rotated ? 0 : $$.height, $$.yMax = config.axis_rotated ? $$.width : 1, $$.subXMin = $$.xMin, $$.subXMax = $$.xMax, $$.subYMin = config.axis_rotated ? 0 : $$.height2, $$.subYMax = config.axis_rotated ? $$.width2 : 1, $$.x = $$.getX($$.xMin, $$.xMax, forInit ? undefined : $$.x.orgDomain(), function () {
+			return $$.xAxis.tickOffset();
+		}), $$.y = $$.getY($$.yMin, $$.yMax, forInit ? config.axis_y_default : $$.y.domain()), $$.y2 = $$.getY($$.yMin, $$.yMax, forInit ? config.axis_y2_default : $$.y2.domain()), $$.subX = $$.getX($$.xMin, $$.xMax, $$.orgXDomain, function (d) {
+			return d % 1 ? 0 : $$.subXAxis.tickOffset();
+		}), $$.subY = $$.getY($$.subYMin, $$.subYMax, forInit ? config.axis_y_default : $$.subY.domain()), $$.subY2 = $$.getY($$.subYMin, $$.subYMax, forInit ? config.axis_y2_default : $$.subY2.domain()), $$.xAxisTickFormat = $$.axis.getXAxisTickFormat(), $$.xAxisTickValues = $$.axis.getXAxisTickValues(), $$.yAxisTickValues = $$.axis.getYAxisTickValues(), $$.y2AxisTickValues = $$.axis.getY2AxisTickValues(), $$.xAxis = $$.axis.getXAxis($$.x, $$.xOrient, $$.xAxisTickFormat, $$.xAxisTickValues, config.axis_x_tick_outer, withoutTransitionAtInit), $$.subXAxis = $$.axis.getXAxis($$.subX, $$.subXOrient, $$.xAxisTickFormat, $$.xAxisTickValues, config.axis_x_tick_outer), $$.yAxis = $$.axis.getYAxis($$.y, $$.yOrient, config.axis_y_tick_format, $$.yAxisTickValues, config.axis_y_tick_outer), $$.y2Axis = $$.axis.getYAxis($$.y2, $$.y2Orient, config.axis_y2_tick_format, $$.y2AxisTickValues, config.axis_y2_tick_outer), $$.updateArc && $$.updateArc();
+	}
+}); /**
+     * Copyright (c) 2017 NAVER Corp.
+     * billboard.js project is licensed under the MIT license
+     */
+
+/***/ }),
+/* 47 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _d = __webpack_require__(2),
+    _ChartInternal = __webpack_require__(1),
+    _ChartInternal2 = _interopRequireDefault(_ChartInternal),
+    _classes = __webpack_require__(3),
+    _classes2 = _interopRequireDefault(_classes),
+    _util = __webpack_require__(0);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/**
+ * Copyright (c) 2017 NAVER Corp.
+ * billboard.js project is licensed under the MIT license
+ */
+(0, _util.extend)(_ChartInternal2.default.prototype, {
+	/**
+  * Select a point
+  * @private
+  * @param {Object} target point
+  * @param {Object} data
+  * @param {Number} index
+  */
+	selectPoint: function selectPoint(target, d, i) {
+		var $$ = this,
+		    config = $$.config,
+		    cx = (config.axis_rotated ? $$.circleY : $$.circleX).bind($$),
+		    cy = (config.axis_rotated ? $$.circleX : $$.circleY).bind($$),
+		    r = $$.pointSelectR.bind($$);
+		config.data_onselected.call($$.api, d, target.node()), $$.main.select("." + _classes2.default.selectedCircles + $$.getTargetSelectorSuffix(d.id)).selectAll("." + _classes2.default.selectedCircle + "-" + i).data([d]).enter().append("circle").attr("class", function () {
+			return $$.generateClass(_classes2.default.selectedCircle, i);
+		}).attr("cx", cx).attr("cy", cy).attr("stroke", function () {
+			return $$.color(d);
+		}).attr("r", function (d2) {
+			return $$.pointSelectR(d2) * 1.4;
+		}).transition().duration(100).attr("r", r);
+	},
+
+
+	/**
+  * Unelect a point
+  * @private
+  * @param {Object} target point
+  * @param {Object} data
+  * @param {Number} index
+  */
+	unselectPoint: function unselectPoint(target, d, i) {
+		var $$ = this;
+
+		$$.config.data_onunselected.call($$.api, d, target.node()), $$.main.select("." + _classes2.default.selectedCircles + $$.getTargetSelectorSuffix(d.id)).selectAll("." + _classes2.default.selectedCircle + "-" + i).transition().duration(100).attr("r", 0).remove();
+	},
+
+
+	/**
+  * Toggles the selection of points
+  * @private
+  * @param {Boolean} whether or not to select.
+  * @param {Object} target point
+  * @param {Object} data
+  * @param {Number} index
+  */
+	togglePoint: function togglePoint(selected, target, d, i) {
+		selected ? this.selectPoint(target, d, i) : this.unselectPoint(target, d, i);
+	},
+
+
+	/**
+  * Select a path
+  * @private
+  * @param {Object} target path
+  * @param {Object} data
+  */
+	selectPath: function selectPath(target, d) {
+		var $$ = this;
+
+		$$.config.data_onselected.call($$, d, target.node()), $$.config.interaction_brighten && target.transition().duration(100).style("fill", function () {
+			return (0, _d.rgb)($$.color(d)).brighter(0.75);
+		});
+	},
+
+
+	/**
+  * Unelect a path
+  * @private
+  * @param {Object} target path
+  * @param {Object} data
+  */
+	unselectPath: function unselectPath(target, d) {
+		var $$ = this;
+
+		$$.config.data_onunselected.call($$, d, target.node()), $$.config.interaction_brighten && target.transition().duration(100).style("fill", function () {
+			return $$.color(d);
+		});
+	},
+
+
+	/**
+  * Toggles the selection of lines
+  * @private
+  * @param {Boolean} whether or not to select.
+  * @param {Object} target shape
+  * @param {Object} data
+  * @param {Number} index
+  */
+	togglePath: function togglePath(selected, target, d, i) {
+		selected ? this.selectPath(target, d, i) : this.unselectPath(target, d, i);
+	},
+
+
+	/**
+  * Returns the toggle method of the target
+  * @private
+  * @param {Object} target shape
+  * @param {Object} data
+  * @returns {Function} toggle method
+  */
+	getToggle: function getToggle(that, d) {
+		var $$ = this,
+		    toggle = void 0;
+
+		return that.nodeName === "circle" ? $$.isStepType(d) ? toggle = function () {} : toggle = $$.togglePoint : that.nodeName === "path" && (toggle = $$.togglePath), toggle;
+	},
+
+
+	/**
+  * Toggles the selection of shapes
+  * @private
+  * @param {Object} target shape
+  * @param {Object} data
+  * @param {Number} index
+  */
+	toggleShape: function toggleShape(that, d, i) {
+		var _this = this,
+		    $$ = this,
+		    config = $$.config,
+		    shape = (0, _d.select)(that),
+		    isSelected = shape.classed(_classes2.default.SELECTED),
+		    toggle = $$.getToggle(that, d).bind($$);
+
+		if (config.data_selection_enabled && config.data_selection_isselectable(d)) {
+			if (!config.data_selection_multiple) {
+				var selecter = "." + _classes2.default.shapes;
+
+				config.data_selection_grouped && (selecter = "." + selecter + $$.getTargetSelectorSuffix(d.id)), $$.main.selectAll(selecter).selectAll("." + _classes2.default.shape).each(function (d, i) {
+					var shape = (0, _d.select)(_this);
+
+					shape.classed(_classes2.default.SELECTED) && toggle(!1, shape.classed(_classes2.default.SELECTED, !1), d, i);
+				});
+			}
+			shape.classed(_classes2.default.SELECTED, !isSelected), toggle(!isSelected, shape, d, i);
+		}
+	}
+});
+
+/***/ }),
+/* 48 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _d = __webpack_require__(2),
+    _classes = __webpack_require__(3),
+    _classes2 = _interopRequireDefault(_classes),
+    _ChartInternal = __webpack_require__(1),
+    _ChartInternal2 = _interopRequireDefault(_ChartInternal),
+    _util = __webpack_require__(0);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/**
+ * Copyright (c) 2017 NAVER Corp.
+ * billboard.js project is licensed under the MIT license
+ */
+(0, _util.extend)(_ChartInternal2.default.prototype, {
+	initBar: function initBar() {
+		var $$ = this;
+
+		$$.main.select("." + _classes2.default.chart).append("g").attr("class", _classes2.default.chartBars);
+	},
+	updateTargetsForBar: function updateTargetsForBar(targets) {
+		var $$ = this,
+		    config = $$.config,
+		    classChartBar = $$.classChartBar.bind($$),
+		    classBars = $$.classBars.bind($$),
+		    classFocus = $$.classFocus.bind($$),
+		    mainBarUpdate = $$.main.select("." + _classes2.default.chartBars).selectAll("." + _classes2.default.chartBar).data(targets).attr("class", function (d) {
+			return classChartBar(d) + classFocus(d);
+		}),
+		    mainBarEnter = mainBarUpdate.enter().append("g").attr("class", classChartBar).style("opacity", "0").style("pointer-events", "none");
+
+
+		// Bars for each data
+		mainBarEnter.append("g").attr("class", classBars).style("cursor", function (d) {
+			return config.data_selection_isselectable(d) ? "pointer" : null;
+		});
+	},
+	updateBar: function updateBar(durationForExit) {
+		var $$ = this,
+		    barData = $$.barData.bind($$),
+		    classBar = $$.classBar.bind($$),
+		    initialOpacity = $$.initialOpacity.bind($$),
+		    color = function (d) {
+			return $$.color(d.id);
+		};
+		$$.mainBar = $$.main.selectAll("." + _classes2.default.bars).selectAll("." + _classes2.default.bar).data(barData), $$.mainBar.exit().transition().duration(durationForExit).style("opacity", "0").remove(), $$.mainBar = $$.mainBar.enter().append("path").attr("class", classBar).style("stroke", color).style("fill", color).merge($$.mainBar).style("opacity", initialOpacity);
+	},
+	redrawBar: function redrawBar(drawBar, withTransition) {
+		return [(withTransition ? this.mainBar.transition(Math.random().toString()) : this.mainBar).attr("d", drawBar).style("fill", this.color).style("opacity", "1")];
+	},
+	getBarW: function getBarW(axis, barTargetsNum) {
+		var $$ = this,
+		    config = $$.config,
+		    w = typeof config.bar_width === "number" ? config.bar_width : barTargetsNum ? axis.tickInterval() * config.bar_width_ratio / barTargetsNum : 0;
+
+
+		return config.bar_width_max && w > config.bar_width_max ? config.bar_width_max : w;
+	},
+	getBars: function getBars(i, id) {
+		var $$ = this,
+		    suffix = (0, _util.isValue)(i) ? "-" + i : "";
+
+
+		return (id ? $$.main.selectAll("." + _classes2.default.bars + $$.getTargetSelectorSuffix(id)) : $$.main).selectAll("." + _classes2.default.bar + suffix);
+	},
+	expandBars: function expandBars(i, id, reset) {
+		var $$ = this;
+
+		reset && $$.unexpandBars(), $$.getBars(i, id).classed(_classes2.default.EXPANDED, !0);
+	},
+	unexpandBars: function unexpandBars(i) {
+		var $$ = this;
+
+		$$.getBars(i).classed(_classes2.default.EXPANDED, !1);
+	},
+	generateDrawBar: function generateDrawBar(barIndices, isSub) {
+		var $$ = this,
+		    config = $$.config,
+		    getPoints = $$.generateGetBarPoints(barIndices, isSub);
+
+
+		return function (d, i) {
+			// 4 points that make a bar
+			var points = getPoints(d, i),
+			    indexX = config.axis_rotated ? 1 : 0,
+			    indexY = config.axis_rotated ? 0 : 1,
+			    path = "M " + points[0][indexX] + "," + points[0][indexY] + "\n\t\t\tL " + points[1][indexX] + "," + points[1][indexY] + "\n\t\t\tL " + points[2][indexX] + "," + points[2][indexY] + "\n\t\t\tL " + points[3][indexX] + "," + points[3][indexY] + " z";
+
+			// switch points if axis is rotated, not applicable for sub chart
+
+
+			return path;
+		};
+	},
+	generateGetBarPoints: function generateGetBarPoints(barIndices, isSub) {
+		var $$ = this,
+		    axis = isSub ? $$.subXAxis : $$.xAxis,
+		    barTargetsNum = barIndices.__max__ + 1,
+		    barW = $$.getBarW(axis, barTargetsNum),
+		    barX = $$.getShapeX(barW, barTargetsNum, barIndices, !!isSub),
+		    barY = $$.getShapeY(!!isSub),
+		    barOffset = $$.getShapeOffset($$.isBarType, barIndices, !!isSub),
+		    yScale = isSub ? $$.getSubYScale : $$.getYScale;
+
+
+		return function (d, i) {
+			var y0 = yScale.call($$, d.id)(0),
+			    offset = barOffset(d, i) || y0,
+			    posX = barX(d),
+			    posY = barY(d); // offset is for stacked bar chart
+
+
+			// fix posY not to overflow opposite quadrant
+
+			// 4 points that make a bar
+			return $$.config.axis_rotated && (d.value > 0 && posY < y0 || d.value < 0 && y0 < posY) && (posY = y0), [[posX, offset], [posX, posY - (y0 - offset)], [posX + barW, posY - (y0 - offset)], [posX + barW, offset]];
+		};
+	},
+	isWithinBar: function isWithinBar(that) {
+		var mouse = (0, _d.mouse)(that),
+		    list = (0, _util.getRectSegList)(that),
+		    box = that.getBBox(),
+		    seg0 = list[0],
+		    seg1 = list[1],
+		    x = Math.min(seg0.x, seg1.x),
+		    y = Math.min(seg0.y, seg1.y),
+		    w = box.width,
+		    h = box.height,
+		    offset = 2,
+		    isIn = x - offset < mouse[0] && mouse[0] < x + w + offset && y - offset < mouse[1] && mouse[1] < y + h + offset;
+
+
+		return isIn;
+	}
+});
+
+/***/ }),
+/* 49 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _d = __webpack_require__(2),
+    _classes = __webpack_require__(3),
+    _classes2 = _interopRequireDefault(_classes),
+    _ChartInternal = __webpack_require__(1),
+    _ChartInternal2 = _interopRequireDefault(_ChartInternal),
+    _util = __webpack_require__(0);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/**
+ * Copyright (c) 2017 NAVER Corp.
+ * billboard.js project is licensed under the MIT license
+ */
+(0, _util.extend)(_ChartInternal2.default.prototype, {
+	getShapeIndices: function getShapeIndices(typeFilter) {
+		var $$ = this,
+		    config = $$.config,
+		    indices = {},
+		    i = 0,
+		    j = void 0,
+		    k = void 0;
+
+		return $$.filterTargetsToShow($$.data.targets.filter(typeFilter, $$)).forEach(function (d) {
+			for (j = 0; j < config.data_groups.length; j++) if (!(config.data_groups[j].indexOf(d.id) < 0)) for (k = 0; k < config.data_groups[j].length; k++) if (config.data_groups[j][k] in indices) {
+					indices[d.id] = indices[config.data_groups[j][k]];
+
+					break;
+				}
+			(0, _util.isUndefined)(indices[d.id]) && (indices[d.id] = i++);
+		}), indices.__max__ = i - 1, indices;
+	},
+	getShapeX: function getShapeX(offset, targetsNum, indices, isSub) {
+		var $$ = this,
+		    scale = isSub ? $$.subX : $$.x;
+
+
+		return function (d) {
+			var index = d.id in indices ? indices[d.id] : 0;
+
+			return d.x || d.x === 0 ? scale(d.x) - offset * (targetsNum / 2 - index) : 0;
+		};
+	},
+	getShapeY: function getShapeY(isSub) {
+		var $$ = this;
+
+		return function (d) {
+			var scale = isSub ? $$.getSubYScale(d.id) : $$.getYScale(d.id);
+
+			return scale(d.value);
+		};
+	},
+	getShapeOffset: function getShapeOffset(typeFilter, indices, isSub) {
+		var $$ = this,
+		    targets = $$.orderTargets($$.filterTargetsToShow($$.data.targets.filter(typeFilter, $$))),
+		    targetIds = targets.map(function (t) {
+			return t.id;
+		});
+
+
+		return function (d, idx) {
+			var scale = isSub ? $$.getSubYScale(d.id) : $$.getYScale(d.id),
+			    y0 = scale(0),
+			    offset = y0,
+			    i = idx;
+
+			return targets.forEach(function (t) {
+				var values = $$.isStepType(d) ? $$.convertValuesToStep(t.values) : t.values;
+
+				t.id === d.id || indices[t.id] !== indices[d.id] || targetIds.indexOf(t.id) < targetIds.indexOf(d.id) && ((typeof values[i] === "undefined" || +values[i].x !== +d.x) && (i = -1, values.forEach(function (v, j) {
+					v.x === d.x && (i = j);
+				})), i in values && values[i].value * d.value >= 0 && (offset += scale(values[i].value) - y0));
+			}), offset;
+		};
+	},
+	isWithinShape: function isWithinShape(that, d) {
+		var $$ = this,
+		    shape = (0, _d.select)(that),
+		    isWithin = void 0;
+
+		return $$.isTargetToShow(d.id) ? that.nodeName === "circle" ? isWithin = $$.isStepType(d) ? $$.isWithinStep(that, $$.getYScale(d.id)(d.value)) : $$.isWithinCircle(that, $$.pointSelectR(d) * 1.5) : that.nodeName === "path" && (isWithin = !shape.classed(_classes2.default.bar) || $$.isWithinBar(that)) : isWithin = !1, isWithin;
+	},
+	getInterpolate: function getInterpolate(d) {
+		var $$ = this,
+		    interpolation = $$.getInterpolateType(d);
+
+
+		return {
+			"basis": _d.curveBasis,
+			"basis-closed": _d.curveBasisClosed,
+			"basis-open": _d.curveBasisOpen,
+			"bundle": _d.curveBundle,
+			"cardinal": _d.curveCardinal,
+			"cardinal-closed": _d.curveCardinalClosed,
+			"cardinal-open": _d.curveCardinalOpen,
+			"catmull-rom": _d.curveCatmullRom,
+			"catmull-rom-closed": _d.curveCatmullRomClosed,
+			"catmull-rom-open": _d.curveCatmullRomOpen,
+			"monotone-x": _d.curveMonotoneX,
+			"monotone-y": _d.curveMonotoneY,
+			"natural": _d.curveNatural,
+			"linear-closed": _d.curveLinearClosed,
+			"linear": _d.curveLinear,
+			"step": _d.curveStep
+		}[interpolation];
+	},
+	getInterpolateType: function getInterpolateType(d) {
+		var $$ = this,
+		    interpolation = $$.isInterpolationType($$.config.spline_interpolation_type) ? $$.config.spline_interpolation_type : "cardinal";
+
+		return interpolation = $$.isSplineType(d) ? interpolation : $$.isStepType(d) ? $$.config.line_step_type : "linear", interpolation;
+	}
+});
+
+/***/ }),
+/* 50 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _d = __webpack_require__(2),
+    _classes = __webpack_require__(3),
+    _classes2 = _interopRequireDefault(_classes),
+    _ChartInternal = __webpack_require__(1),
+    _ChartInternal2 = _interopRequireDefault(_ChartInternal),
+    _util = __webpack_require__(0);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/**
+ * Copyright (c) 2017 NAVER Corp.
+ * billboard.js project is licensed under the MIT license
+ */
+(0, _util.extend)(_ChartInternal2.default.prototype, {
+	initLine: function initLine() {
+		var $$ = this;
+
+		$$.main.select("." + _classes2.default.chart).append("g").attr("class", _classes2.default.chartLines);
+	},
+	updateTargetsForLine: function updateTargetsForLine(targets) {
+		var $$ = this,
+		    config = $$.config,
+		    classChartLine = $$.classChartLine.bind($$),
+		    classLines = $$.classLines.bind($$),
+		    classAreas = $$.classAreas.bind($$),
+		    classCircles = $$.classCircles.bind($$),
+		    classFocus = $$.classFocus.bind($$),
+		    mainLineUpdate = $$.main.select("." + _classes2.default.chartLines).selectAll("." + _classes2.default.chartLine).data(targets).attr("class", function (d) {
+			return classChartLine(d) + classFocus(d);
+		}),
+		    mainLineEnter = mainLineUpdate.enter().append("g").attr("class", classChartLine).style("opacity", "0").style("pointer-events", "none");
+
+
+		// Lines for each data
+		mainLineEnter.append("g").attr("class", classLines), mainLineEnter.append("g").attr("class", classAreas), mainLineEnter.append("g").attr("class", function (d) {
+			return $$.generateClass(_classes2.default.selectedCircles, d.id);
+		}), mainLineEnter.append("g").attr("class", classCircles).style("cursor", function (d) {
+			return config.data_selection_isselectable(d) ? "pointer" : null;
+		}), targets.forEach(function (t) {
+			$$.main.selectAll("." + _classes2.default.selectedCircles + $$.getTargetSelectorSuffix(t.id)).selectAll("" + _classes2.default.selectedCircle).each(function (d) {
+				d.value = t.values[d.index].value;
+			});
+		});
+	},
+	updateLine: function updateLine(durationForExit) {
+		var $$ = this;
+
+		$$.mainLine = $$.main.selectAll("." + _classes2.default.lines).selectAll("." + _classes2.default.line).data($$.lineData.bind($$)), $$.mainLine.exit().transition().duration(durationForExit).style("opacity", "0").remove(), $$.mainLine = $$.mainLine.enter().append("path").attr("class", $$.classLine.bind($$)).style("stroke", $$.color).merge($$.mainLine).style("opacity", $$.initialOpacity.bind($$)).style("shape-rendering", function (d) {
+			return $$.isStepType(d) ? "crispEdges" : "";
+		}).attr("transform", null);
+	},
+	redrawLine: function redrawLine(drawLine, withTransition) {
+		return [(withTransition ? this.mainLine.transition(Math.random().toString()) : this.mainLine).attr("d", drawLine).style("stroke", this.color).style("opacity", "1")];
+	},
+	generateDrawLine: function generateDrawLine(lineIndices, isSub) {
+		var $$ = this,
+		    config = $$.config,
+		    getPoints = $$.generateGetLinePoints(lineIndices, isSub),
+		    yScaleGetter = isSub ? $$.getSubYScale : $$.getYScale,
+		    xValue = function (d) {
+			return (isSub ? $$.subxx : $$.xx).call($$, d);
+		},
+		    yValue = function (d, i) {
+			return config.data_groups.length > 0 ? getPoints(d, i)[0][1] : yScaleGetter.call($$, d.id)(d.value);
+		},
+		    line = (0, _d.line)();
+
+
+		return line = config.axis_rotated ? line.x(yValue).y(xValue) : line.x(xValue).y(yValue), config.line_connectNull || (line = line.defined(function (d) {
+			return d.value !== null;
+		})), function (d) {
+			var x = isSub ? $$.x : $$.subX,
+			    y = yScaleGetter.call($$, d.id),
+			    values = config.line_connectNull ? $$.filterRemoveNull(d.values) : d.values,
+			    x0 = 0,
+			    y0 = 0,
+			    path = void 0;
+
+			return $$.isLineType(d) ? config.data_regions[d.id] ? path = $$.lineWithRegions(values, x, y, config.data_regions[d.id]) : ($$.isStepType(d) && (values = $$.convertValuesToStep(values)), path = line.curve($$.getInterpolate(d))(values)) : (values[0] && (x0 = x(values[0].x), y0 = y(values[0].value)), path = config.axis_rotated ? "M " + y0 + " " + x0 : "M " + x0 + " " + y0), path || "M 0 0";
+		};
+	},
+	generateGetLinePoints: function generateGetLinePoints(lineIndices, isSub) {
+		// partial duplication of generateGetBarPoints
+		var $$ = this,
+		    config = $$.config,
+		    lineTargetsNum = lineIndices.__max__ + 1,
+		    x = $$.getShapeX(0, lineTargetsNum, lineIndices, !!isSub),
+		    y = $$.getShapeY(!!isSub),
+		    lineOffset = $$.getShapeOffset($$.isLineType, lineIndices, !!isSub),
+		    yScale = isSub ? $$.getSubYScale : $$.getYScale;
+
+
+		return function (d, i) {
+			var y0 = yScale.call($$, d.id)(0),
+			    offset = lineOffset(d, i) || y0,
+			    posX = x(d),
+			    posY = y(d); // offset is for stacked area chart
+
+
+			// fix posY not to overflow opposite quadrant
+
+			// 1 point that marks the line position
+			return config.axis_rotated && (d.value > 0 && posY < y0 || d.value < 0 && y0 < posY) && (posY = y0), [[posX, posY - (y0 - offset)], [posX, posY - (y0 - offset)], // needed for compatibility
+			[posX, posY - (y0 - offset)], // needed for compatibility
+			[posX, posY - (y0 - offset)] // needed for compatibility
+			];
+		};
+	},
+	lineWithRegions: function lineWithRegions(d, x, y, _regions) {
+
+		function isWithinRegions(withinX, withinRegions) {
+			var idx = void 0;
+
+			for (idx = 0; idx < withinRegions.length; idx++) if (withinRegions[idx].start < withinX && withinX <= withinRegions[idx].end) return !0;
+			return !1;
+		}
+
+		// Check start/end of regions
+
+
+		// Define svg generator function for region
+		function generateM(points) {
+			return "M" + points[0][0] + " " + points[0][1] + " " + points[1][0] + " " + points[1][1];
+		}
+
+		var $$ = this,
+		    config = $$.config,
+		    xOffset = $$.isCategorized() ? 0.5 : 0,
+		    regions = [],
+		    i = void 0,
+		    j = void 0,
+		    s = "M",
+		    sWithRegion = void 0,
+		    xp = void 0,
+		    yp = void 0,
+		    dx = void 0,
+		    dy = void 0,
+		    dd = void 0,
+		    diff = void 0,
+		    diffx2 = void 0;
+		if ((0, _util.isDefined)(_regions)) for (i = 0; i < _regions.length; i++) regions[i] = {}, regions[i].start = (0, _util.isUndefined)(_regions[i].start) ? d[0].x : $$.isTimeSeries() ? $$.parseDate(_regions[i].start) : _regions[i].start, regions[i].end = (0, _util.isUndefined)(_regions[i].end) ? d[d.length - 1].x : $$.isTimeSeries() ? $$.parseDate(_regions[i].end) : _regions[i].end;
+
+		// Set scales
+		var xValue = config.axis_rotated ? function (dt) {
+			return y(dt.value);
+		} : function (dt) {
+			return x(dt.x);
+		},
+		    yValue = config.axis_rotated ? function (dt) {
+			return x(dt.x);
+		} : function (dt) {
+			return y(dt.value);
+		};
+
+		// Generate
+		for (sWithRegion = $$.isTimeSeries() ? function (d0, d1, k, timeseriesDiff) {
+			var x0 = d0.x.getTime(),
+			    xDiff = d1.x - d0.x,
+			    xv0 = new Date(x0 + xDiff * k),
+			    xv1 = new Date(x0 + xDiff * (k + timeseriesDiff)),
+			    points = void 0;
+
+			return points = config.axis_rotated ? [[y(yp(k)), x(xv0)], [y(yp(k + diff)), x(xv1)]] : [[x(xv0), y(yp(k))], [x(xv1), y(yp(k + diff))]], generateM(points);
+		} : function (d0, d1, k, otherDiff) {
+			var points = void 0;
+
+			return points = config.axis_rotated ? [[y(yp(k), !0), x(xp(k))], [y(yp(k + otherDiff), !0), x(xp(k + otherDiff))]] : [[x(xp(k), !0), y(yp(k))], [x(xp(k + otherDiff), !0), y(yp(k + otherDiff))]], generateM(points);
+		}, i = 0; i < d.length; i++)
+		// Draw as normal
+		if ((0, _util.isUndefined)(regions) || !isWithinRegions(d[i].x, regions)) s += " " + xValue(d[i]) + " " + yValue(d[i]);else for (xp = $$.getScale(d[i - 1].x + xOffset, d[i].x + xOffset, $$.isTimeSeries()), yp = $$.getScale(d[i - 1].value, d[i].value), dx = x(d[i].x) - x(d[i - 1].x), dy = y(d[i].value) - y(d[i - 1].value), dd = Math.sqrt(Math.pow(dx, 2) + Math.pow(dy, 2)), diff = 2 / dd, diffx2 = diff * 2, j = diff; j <= 1; j += diffx2) s += sWithRegion(d[i - 1], d[i], j, diff);
+
+		return s;
+	},
+	updateArea: function updateArea(durationForExit) {
+		var $$ = this;
+
+		$$.mainArea = $$.main.selectAll("." + _classes2.default.areas).selectAll("." + _classes2.default.area).data($$.lineData.bind($$)), $$.mainArea.exit().transition().duration(durationForExit).style("opacity", "0").remove(), $$.mainArea = $$.mainArea.enter().append("path").attr("class", $$.classArea.bind($$)).style("fill", $$.color).style("opacity", function () {
+			return $$.orgAreaOpacity = (0, _d.select)(this).style("opacity"), "0";
+		}).merge($$.mainArea), $$.mainArea.style("opacity", $$.orgAreaOpacity);
+	},
+	redrawArea: function redrawArea(drawArea, withTransition) {
+		return [(withTransition ? this.mainArea.transition(Math.random().toString()) : this.mainArea).attr("d", drawArea).style("fill", this.color).style("opacity", this.orgAreaOpacity)];
+	},
+	generateDrawArea: function generateDrawArea(areaIndices, isSub) {
+		var $$ = this,
+		    config = $$.config,
+		    getPoints = $$.generateGetAreaPoints(areaIndices, isSub),
+		    yScaleGetter = isSub ? $$.getSubYScale : $$.getYScale,
+		    xValue = function (d) {
+			return (isSub ? $$.subxx : $$.xx).call($$, d);
+		},
+		    value0 = function (d, i) {
+			return config.data_groups.length > 0 ? getPoints(d, i)[0][1] : yScaleGetter.call($$, d.id)($$.getAreaBaseValue(d.id));
+		},
+		    value1 = function (d, i) {
+			return config.data_groups.length > 0 ? getPoints(d, i)[1][1] : yScaleGetter.call($$, d.id)(d.value);
+		},
+		    area = (0, _d.area)();
+
+
+		return area = config.axis_rotated ? area.x0(value0).x1(value1).y(xValue) : area.x(xValue).y0(config.area_above ? 0 : value0).y1(value1), config.line_connectNull || (area = area.defined(function (d) {
+			return d.value !== null;
+		})), function (d) {
+			var values = config.line_connectNull ? $$.filterRemoveNull(d.values) : d.values,
+			    x0 = 0,
+			    y0 = 0,
+			    path = void 0;
+
+			return $$.isAreaType(d) ? ($$.isStepType(d) && (values = $$.convertValuesToStep(values)), path = area.curve($$.getInterpolate(d))(values)) : (values[0] && (x0 = $$.x(values[0].x), y0 = $$.getYScale(d.id)(values[0].value)), path = config.axis_rotated ? "M " + y0 + " " + x0 : "M " + x0 + " " + y0), path || "M 0 0";
+		};
+	},
+	getAreaBaseValue: function getAreaBaseValue() {
+		return 0;
+	},
+	generateGetAreaPoints: function generateGetAreaPoints(areaIndices, isSub) {
+		// partial duplication of generateGetBarPoints
+		var $$ = this,
+		    config = $$.config,
+		    areaTargetsNum = areaIndices.__max__ + 1,
+		    x = $$.getShapeX(0, areaTargetsNum, areaIndices, !!isSub),
+		    y = $$.getShapeY(!!isSub),
+		    areaOffset = $$.getShapeOffset($$.isAreaType, areaIndices, !!isSub),
+		    yScale = isSub ? $$.getSubYScale : $$.getYScale;
+
+
+		return function (d, i) {
+			var y0 = yScale.call($$, d.id)(0),
+			    offset = areaOffset(d, i) || y0,
+			    posX = x(d),
+			    posY = y(d); // offset is for stacked area chart
+
+
+			// fix posY not to overflow opposite quadrant
+
+
+			// 1 point that marks the area position
+			return config.axis_rotated && (d.value > 0 && posY < y0 || d.value < 0 && y0 < posY) && (posY = y0), [[posX, offset], [posX, posY - (y0 - offset)], [posX, posY - (y0 - offset)], // needed for compatibility
+			[posX, offset] // needed for compatibility
+			];
+		};
+	},
+	updateCircle: function updateCircle() {
+		var $$ = this;
+
+		$$.mainCircle = $$.main.selectAll("." + _classes2.default.circles).selectAll("." + _classes2.default.circle).data($$.lineOrScatterData.bind($$)), $$.mainCircle.exit().remove(), $$.mainCircle = $$.mainCircle.enter().append("circle").attr("class", $$.classCircle.bind($$)).attr("r", $$.pointR.bind($$)).style("fill", $$.color).merge($$.mainCircle).style("opacity", $$.initialOpacityForCircle.bind($$));
+	},
+	redrawCircle: function redrawCircle(cx, cy, withTransition, flow) {
+		var selectedCircles = this.main.selectAll("." + _classes2.default.selectedCircle),
+		    mainCircles = void 0;
+
+
+		if (withTransition) {
+			var transitionName = Math.random().toString();
+
+			mainCircles = flow ? this.mainCircle.attr("cx", cx).transition(transitionName).attr("cx", cx).attr("cy", cy).transition(transitionName).style("opacity", this.opacityForCircle.bind(this)).style("fill", this.color) : this.mainCircle.transition(transitionName).attr("cx", cx).attr("cy", cy).transition(transitionName).style("opacity", this.opacityForCircle.bind(this)).style("fill", this.color), selectedCircles = selectedCircles.transition(Math.random().toString());
+		} else mainCircles = this.mainCircle.attr("cx", cx).attr("cy", cy).style("opacity", this.opacityForCircle.bind(this)).style("fill", this.color);
+
+		return [mainCircles, selectedCircles.attr("cx", cx).attr("cy", cy)];
+	},
+	circleX: function circleX(d) {
+		return this.config.zoom_enabled && this.zoomScale ? d.x || d.x === 0 ? this.zoomScale(d.x) : null : d.x || d.x === 0 ? this.x(d.x) : null;
+	},
+	updateCircleY: function updateCircleY() {
+		var $$ = this,
+		    lineIndices = void 0,
+		    getPoints = void 0;
+		$$.config.data_groups.length > 0 ? (lineIndices = $$.getShapeIndices($$.isLineType), getPoints = $$.generateGetLinePoints(lineIndices), $$.circleY = function (d, i) {
+			return getPoints(d, i)[0][1];
+		}) : $$.circleY = function (d) {
+			return $$.getYScale(d.id)(d.value);
+		};
+	},
+	getCircles: function getCircles(i, id) {
+		var $$ = this,
+		    suffix = (0, _util.isValue)(i) ? "-" + i : "";
+
+
+		return (id ? $$.main.selectAll("." + _classes2.default.circles + $$.getTargetSelectorSuffix(id)) : $$.main).selectAll("." + _classes2.default.circle + suffix);
+	},
+	expandCircles: function expandCircles(i, id, reset) {
+		var $$ = this,
+		    r = $$.pointExpandedR.bind($$);
+		reset && $$.unexpandCircles(), $$.getCircles(i, id).classed(_classes2.default.EXPANDED, !0).attr("r", r);
+	},
+	unexpandCircles: function unexpandCircles(i) {
+		var $$ = this,
+		    r = $$.pointR.bind($$);
+		$$.getCircles(i).filter(function () {
+			return (0, _d.select)(this).classed(_classes2.default.EXPANDED);
+		}).classed(_classes2.default.EXPANDED, !1).attr("r", r);
+	},
+	pointR: function pointR(d) {
+		var $$ = this,
+		    config = $$.config;
+
+
+		return $$.isStepType(d) ? 0 : (0, _util.isFunction)(config.point_r) ? config.point_r(d) : config.point_r;
+	},
+	pointExpandedR: function pointExpandedR(d) {
+		var $$ = this,
+		    config = $$.config;
+
+
+		return config.point_focus_expand_enabled ? config.point_focus_expand_r ? config.point_focus_expand_r : $$.pointR(d) * 1.75 : $$.pointR(d);
+	},
+	pointSelectR: function pointSelectR(d) {
+		var $$ = this,
+		    config = $$.config;
+
+
+		return (0, _util.isFunction)(config.point_select_r) ? config.point_select_r(d) : config.point_select_r ? config.point_select_r : $$.pointR(d) * 4;
+	},
+	isWithinCircle: function isWithinCircle(that, r) {
+		var mouse = (0, _d.mouse)(that),
+		    d3This = (0, _d.select)(that),
+		    cx = +d3This.attr("cx"),
+		    cy = +d3This.attr("cy");
+
+
+		return Math.sqrt(Math.pow(cx - mouse[0], 2) + Math.pow(cy - mouse[1], 2)) < r;
+	},
+	isWithinStep: function isWithinStep(that, y) {
+		return Math.abs(y - (0, _d.mouse)(that)[1]) < 30;
+	}
+});
+
+/***/ }),
+/* 51 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _ChartInternal = __webpack_require__(1),
+    _ChartInternal2 = _interopRequireDefault(_ChartInternal),
+    _classes = __webpack_require__(3),
+    _classes2 = _interopRequireDefault(_classes),
+    _util = __webpack_require__(0);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+(0, _util.extend)(_ChartInternal2.default.prototype, {
+	getCurrentWidth: function getCurrentWidth() {
+		var $$ = this,
+		    config = $$.config;
+
+
+		return config.size_width ? config.size_width : $$.getParentWidth();
+	},
+	getCurrentHeight: function getCurrentHeight() {
+		var $$ = this,
+		    config = $$.config,
+		    h = config.size_height ? config.size_height : $$.getParentHeight();
+
+
+		return h > 0 ? h : 320 / ($$.hasType("gauge") && !config.gauge_fullCircle ? 2 : 1);
+	},
+	getCurrentPaddingTop: function getCurrentPaddingTop() {
+		var $$ = this,
+		    config = $$.config,
+		    padding = (0, _util.isValue)(config.padding_top) ? config.padding_top : 0;
+
+
+		return $$.title && $$.title.node() && (padding += $$.getTitlePadding()), padding;
+	},
+	getCurrentPaddingBottom: function getCurrentPaddingBottom() {
+		var config = this.config;
+
+		return (0, _util.isValue)(config.padding_bottom) ? config.padding_bottom : 0;
+	},
+	getCurrentPaddingLeft: function getCurrentPaddingLeft(withoutRecompute) {
+		var $$ = this,
+		    config = $$.config,
+		    paddingLeft = void 0;
+
+
+		return paddingLeft = (0, _util.isValue)(config.padding_left) ? config.padding_left : config.axis_rotated ? config.axis_x_show ? Math.max((0, _util.ceil10)($$.getAxisWidthByAxisId("x", withoutRecompute)), 40) : 1 : !config.axis_y_show || config.axis_y_inner ? $$.axis.getYAxisLabelPosition().isOuter ? 30 : 1 : (0, _util.ceil10)($$.getAxisWidthByAxisId("y", withoutRecompute)), paddingLeft;
+	},
+	getCurrentPaddingRight: function getCurrentPaddingRight() {
+		var $$ = this,
+		    config = $$.config,
+		    legendWidthOnRight = $$.isLegendRight ? $$.getLegendWidth() + 20 : 0,
+		    paddingRight = void 0;
+
+
+		return paddingRight = (0, _util.isValue)(config.padding_right) ? config.padding_right + 1 : config.axis_rotated ? 10 + legendWidthOnRight : !config.axis_y2_show || config.axis_y2_inner ? 2 + legendWidthOnRight + ($$.axis.getY2AxisLabelPosition().isOuter ? 20 : 0) : (0, _util.ceil10)($$.getAxisWidthByAxisId("y2")) + legendWidthOnRight, paddingRight;
+	},
+	getParentRectValue: function getParentRectValue(key) {
+		for (var parent = this.selectChart.node(), v = void 0; parent && parent.tagName !== "BODY";) {
+			try {
+				v = parent.getBoundingClientRect()[key];
+			} catch (e) {
+				key === "width" && (v = parent.offsetWidth);
+			}
+
+			if (v) break;
+
+			parent = parent.parentNode;
+		}
+
+		return v;
+	},
+	getParentWidth: function getParentWidth() {
+		return this.getParentRectValue("width");
+	},
+	getParentHeight: function getParentHeight() {
+		var h = this.selectChart.style("height");
+
+		return h.indexOf("px") > 0 ? +h.replace("px", "") : 0;
+	},
+	getSvgLeft: function getSvgLeft(withoutRecompute) {
+		var $$ = this,
+		    config = $$.config,
+		    hasLeftAxisRect = config.axis_rotated || !config.axis_rotated && !config.axis_y_inner,
+		    leftAxisClass = config.axis_rotated ? _classes2.default.axisX : _classes2.default.axisY,
+		    leftAxis = $$.main.select("." + leftAxisClass).node(),
+		    svgRect = leftAxis && hasLeftAxisRect ? leftAxis.getBoundingClientRect() : { right: 0 },
+		    chartRect = $$.selectChart.node().getBoundingClientRect(),
+		    hasArc = $$.hasArcType(),
+		    svgLeft = svgRect.right - chartRect.left - (hasArc ? 0 : $$.getCurrentPaddingLeft(withoutRecompute));
+
+
+		return svgLeft > 0 ? svgLeft : 0;
+	},
+	getAxisWidthByAxisId: function getAxisWidthByAxisId(id, withoutRecompute) {
+		var $$ = this,
+		    position = $$.axis.getLabelPositionById(id);
+
+
+		return $$.axis.getMaxTickWidth(id, withoutRecompute) + (position.isInner ? 20 : 40);
+	},
+	getHorizontalAxisHeight: function getHorizontalAxisHeight(axisId) {
+		var $$ = this,
+		    config = $$.config,
+		    h = 30;
+
+
+		// Calculate x axis height when tick rotated
+		return axisId !== "x" || config.axis_x_show ? axisId === "x" && config.axis_x_height ? config.axis_x_height : axisId !== "y" || config.axis_y_show ? axisId !== "y2" || config.axis_y2_show ? (axisId === "x" && !config.axis_rotated && config.axis_x_tick_rotate && (h = 30 + $$.axis.getMaxTickWidth(axisId) * Math.cos(Math.PI * (90 - config.axis_x_tick_rotate) / 180)), axisId === "y" && config.axis_rotated && config.axis_y_tick_rotate && (h = 30 + $$.axis.getMaxTickWidth(axisId) * Math.cos(Math.PI * (90 - config.axis_y_tick_rotate) / 180)), h + ($$.axis.getLabelPositionById(axisId).isInner ? 0 : 10) + (axisId === "y2" ? -10 : 0)) : $$.rotated_padding_top : !config.legend_show || $$.isLegendRight || $$.isLegendInset ? 1 : 10 : 8;
+	},
+	getEventRectWidth: function getEventRectWidth() {
+		return Math.max(0, this.xAxis.tickInterval());
+	}
+}); /**
+     * Copyright (c) 2017 NAVER Corp.
+     * billboard.js project is licensed under the MIT license
+     */
+
+/***/ }),
+/* 52 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _d = __webpack_require__(2),
+    _ChartInternal = __webpack_require__(1),
+    _ChartInternal2 = _interopRequireDefault(_ChartInternal),
+    _classes = __webpack_require__(3),
+    _classes2 = _interopRequireDefault(_classes),
+    _util = __webpack_require__(0);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/**
+ * Copyright (c) 2017 NAVER Corp.
+ * billboard.js project is licensed under the MIT license
+ */
+(0, _util.extend)(_ChartInternal2.default.prototype, {
+	/**
+  * Initializes the text
+  * @private
+  */
+	initText: function initText() {
+		var $$ = this;
+
+		$$.main.select("." + _classes2.default.chart).append("g").attr("class", _classes2.default.chartTexts), $$.mainText = (0, _d.selectAll)([]);
+	},
+
+
+	/**
+  * Update chartText
+  * @private
+  * @param {Object} $$.data.targets
+  */
+	updateTargetsForText: function updateTargetsForText(targets) {
+		var $$ = this,
+		    classChartText = $$.classChartText.bind($$),
+		    classTexts = $$.classTexts.bind($$),
+		    classFocus = $$.classFocus.bind($$),
+		    mainTextUpdate = $$.main.select("." + _classes2.default.chartTexts).selectAll("." + _classes2.default.chartText).data(targets).attr("class", function (d) {
+			return classChartText(d) + classFocus(d);
+		}),
+		    mainTextEnter = mainTextUpdate.enter().append("g").attr("class", classChartText).style("opacity", "0").style("pointer-events", "none");
+		mainTextEnter.append("g").attr("class", classTexts);
+	},
+
+
+	/**
+  * Update text
+  * @private
+  * @param {Number} Fade-out transition duration
+  */
+	updateText: function updateText(durationForExit) {
+		var $$ = this,
+		    config = $$.config,
+		    barOrLineData = $$.barOrLineData.bind($$),
+		    classText = $$.classText.bind($$);
+		$$.mainText = $$.main.selectAll("." + _classes2.default.texts).selectAll("." + _classes2.default.text).data(barOrLineData), $$.mainText.exit().transition().duration(durationForExit).style("fill-opacity", "0").remove(), $$.mainText = $$.mainText.enter().append("text").attr("class", classText).attr("text-anchor", function (d) {
+			return config.axis_rotated ? d.value < 0 ? "end" : "start" : "middle";
+		}).style("stroke", "none").style("fill", function (d) {
+			return $$.color(d);
+		}).style("fill-opacity", "0").merge($$.mainText).text(function (d, i, j) {
+			return $$.dataLabelFormat(d.id)(d.value, d.id, i, j);
+		});
+	},
+
+
+	/**
+  * Redraw chartText
+  * @private
+  * @param {Number} x Attribute
+  * @param {Number} y Attribute
+  * @param {Object} options.flow
+  * @param {Boolean} indicates transition is enabled
+  * @returns {Object} $$.mainText
+  */
+	redrawText: function redrawText(xForText, yForText, forFlow, withTransition) {
+		return [(withTransition ? this.mainText.transition() : this.mainText).attr("x", xForText).attr("y", yForText).style("fill", this.color).style("fill-opacity", forFlow ? 0 : this.opacityForText.bind(this))];
+	},
+
+
+	/**
+  * Gets the getBoundingClientRect value of the element
+  * @private
+  * @param {String} text
+  * @param {String} class
+  * @param {HTMLElement} element
+  * @returns {Object} value of element.getBoundingClientRect()
+  */
+	getTextRect: function getTextRect(text, cls, element) {
+		var dummy = (0, _d.select)("body").append("div").classed("bb", !0),
+		    svg = dummy.append("svg").style("visibility", "hidden").style("position", "fixed").style("top", "0px").style("left", "0px"),
+		    font = (0, _d.select)(element).style("font"),
+		    rect = void 0;
+
+		return svg.selectAll(".dummy").data([text]).enter().append("text").classed(cls ? cls : "", !0).style("font", font).text(text).each(function () {
+			rect = this.getBoundingClientRect();
+		}), dummy.remove(), rect;
+	},
+
+
+	/**
+  * Gets the x or y coordinate of the text
+  * @private
+  * @param {Object} area Indices
+  * @param {Object} bar Indices
+  * @param {Object} line Indices
+  * @param {Boolean} whether or not to x
+  * @returns {Number} coordinates
+  */
+	generateXYForText: function generateXYForText(areaIndices, barIndices, lineIndices, forX) {
+		var $$ = this,
+		    getAreaPoints = $$.generateGetAreaPoints(areaIndices, !1),
+		    getBarPoints = $$.generateGetBarPoints(barIndices, !1),
+		    getLinePoints = $$.generateGetLinePoints(lineIndices, !1),
+		    getter = forX ? $$.getXForText : $$.getYForText;
+
+
+		return function (d, i) {
+			var getPoints = $$.isBarType(d) ? getBarPoints : getLinePoints;
+
+			return getPoints = $$.isAreaType(d) ? getAreaPoints : getPoints, getter.call($$, getPoints(d, i), d, this);
+		};
+	},
+
+
+	/**
+  * Gets the x coordinate of the text
+  * @private
+  * @param {Object} points
+  * @param {Object} data
+  * @param {HTMLElement} element
+  * @returns {Number} x coordinate
+  */
+	getXForText: function getXForText(points, d, textElement) {
+		var $$ = this,
+		    box = textElement.getBoundingClientRect(),
+		    xPos = void 0,
+		    padding = void 0;
+
+		return $$.config.axis_rotated ? (padding = $$.isBarType(d) ? 4 : 6, xPos = points[2][1] + padding * (d.value < 0 ? -1 : 1)) : xPos = $$.hasType("bar") ? (points[2][0] + points[0][0]) / 2 : points[0][0], d.value === null && (xPos > $$.width ? xPos = $$.width - box.width : xPos < 0 && (xPos = 4)), xPos;
+	},
+
+
+	/**
+  * Gets the y coordinate of the text
+  * @private
+  * @param {Object} points
+  * @param {Object} data
+  * @param {HTMLElement} element
+  * @returns {Number} y coordinate
+  */
+	getYForText: function getYForText(points, d, textElement) {
+		var $$ = this,
+		    box = textElement.getBoundingClientRect(),
+		    yPos = void 0;
+
+		return $$.config.axis_rotated ? yPos = (points[0][0] + points[2][0] + box.height * 0.6) / 2 : (yPos = points[2][1], d.value < 0 || d.value === 0 && !$$.hasPositiveValue ? (yPos += box.height, $$.isBarType(d) && $$.isSafari() ? yPos -= 3 : !$$.isBarType(d) && $$.isChrome() && (yPos += 3)) : yPos += $$.isBarType(d) ? -3 : -6), d.value !== null || $$.config.axis_rotated || (yPos < box.height ? yPos = box.height : yPos > this.height && (yPos = this.height - 4)), yPos;
+	}
+});
+
+/***/ }),
+/* 53 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _ChartInternal = __webpack_require__(1),
+    _ChartInternal2 = _interopRequireDefault(_ChartInternal),
+    _util = __webpack_require__(0);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/**
+ * Copyright (c) 2017 NAVER Corp.
+ * billboard.js project is licensed under the MIT license
+ */
+(0, _util.extend)(_ChartInternal2.default.prototype, {
+	/**
+  * Initializes the title
+  * @private
+  */
+	initTitle: function initTitle() {
+		var $$ = this;
+
+		$$.title = $$.svg.append("text").text($$.config.title_text).attr("class", $$.CLASS.title);
+	},
+
+
+	/**
+  * Redraw title
+  * @private
+  */
+	redrawTitle: function redrawTitle() {
+		var $$ = this;
+
+		$$.title.attr("x", $$.xForTitle.bind($$)).attr("y", $$.yForTitle.bind($$));
+	},
+
+
+	/**
+  * Returns the x attribute value of the title
+  * @private
+  * @returns {Number} x attribute value
+  */
+	xForTitle: function xForTitle() {
+		var $$ = this,
+		    config = $$.config,
+		    position = config.title_position || "left",
+		    x = void 0;
+
+
+		return x = position.indexOf("right") >= 0 ? $$.currentWidth - $$.getTextRect($$.title.node().textContent, $$.CLASS.title, $$.title.node()).width - config.title_padding.right : position.indexOf("center") >= 0 ? ($$.currentWidth - $$.getTextRect($$.title.node().textContent, $$.CLASS.title, $$.title.node()).width) / 2 : config.title_padding.left, x;
+	},
+
+
+	/**
+  * Returns the y attribute value of the title
+  * @private
+  * @returns {Number} y attribute value
+  */
+	yForTitle: function yForTitle() {
+		var $$ = this;
+
+		return $$.config.title_padding.top + $$.getTextRect($$.title.node().textContent, $$.CLASS.title, $$.title.node()).height;
+	},
+
+
+	/**
+  * Get title padding
+  * @private
+  * @returns {Number} padding value
+  */
+	getTitlePadding: function getTitlePadding() {
+		var $$ = this;
+
+		return $$.yForTitle() + $$.config.title_padding.bottom;
+	}
+});
+
+/***/ }),
+/* 54 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _d = __webpack_require__(2),
+    _ChartInternal = __webpack_require__(1),
+    _ChartInternal2 = _interopRequireDefault(_ChartInternal),
+    _classes = __webpack_require__(3),
+    _classes2 = _interopRequireDefault(_classes),
+    _util = __webpack_require__(0);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/**
+ * Copyright (c) 2017 NAVER Corp.
+ * billboard.js project is licensed under the MIT license
+ */
+(0, _util.extend)(_ChartInternal2.default.prototype, {
+	/**
+  * Initializes the tooltip
+  * @private
+  */
+	initTooltip: function initTooltip() {
+		var $$ = this,
+		    config = $$.config,
+		    i = void 0;
+
+
+		// Show tooltip if needed
+		if ($$.tooltip = $$.selectChart.style("position", "relative").append("div").attr("class", _classes2.default.tooltipContainer).style("position", "absolute").style("pointer-events", "none").style("display", "none"), config.tooltip_init_show) {
+			if ($$.isTimeSeries() && (0, _util.isString)(config.tooltip_init_x)) {
+
+				for (config.tooltip_init_x = $$.parseDate(config.tooltip_init_x), i = 0; i < $$.data.targets[0].values.length && $$.data.targets[0].values[i].x - config.tooltip_init_x !== 0; i++);
+
+				config.tooltip_init_x = i;
+			}
+
+			$$.tooltip.html(config.tooltip_contents.call($$, $$.data.targets.map(function (d) {
+				return $$.addName(d.values[config.tooltip_init_x]);
+			}), $$.axis.getXAxisTickFormat(), $$.getYFormat($$.hasArcType()), $$.color)), $$.tooltip.style("top", config.tooltip_init_position.top).style("left", config.tooltip_init_position.left).style("display", "block");
+		}
+	},
+
+	/**
+  * Returns the tooltip content(HTML string)
+  * @private
+  * @param {Object} data
+  * @param {Function} default title format
+  * @param {Function} default format for each data value in the tooltip.
+  * @param {Object} $$.color(generateColor())
+  * @returns {string} html
+  */
+	getTooltipContent: function getTooltipContent(d, defaultTitleFormat, defaultValueFormat, color) {
+		var $$ = this,
+		    config = $$.config,
+		    titleFormat = config.tooltip_format_title || defaultTitleFormat,
+		    nameFormat = config.tooltip_format_name || function (name) {
+			return name;
+		},
+		    valueFormat = config.tooltip_format_value || defaultValueFormat,
+		    orderAsc = $$.isOrderAsc(),
+		    text = void 0,
+		    i = void 0,
+		    title = void 0,
+		    value = void 0,
+		    name = void 0,
+		    bgcolor = void 0;
+
+
+		if (config.data_groups.length === 0) d.sort(function (a, b) {
+				var v1 = a ? a.value : null,
+				    v2 = b ? b.value : null;
+
+
+				return orderAsc ? v1 - v2 : v2 - v1;
+			});else {
+			var ids = $$.orderTargets($$.data.targets).map(function (i2) {
+				return i2.id;
+			});
+
+			d.sort(function (a, b) {
+				var v1 = a ? a.value : null,
+				    v2 = b ? b.value : null;
+
+				return v1 > 0 && v2 > 0 && (v1 = a ? ids.indexOf(a.id) : null, v2 = b ? ids.indexOf(b.id) : null), orderAsc ? v1 - v2 : v2 - v1;
+			});
+		}
+
+		for (i = 0; i < d.length; i++) if (d[i] && (d[i].value || d[i].value === 0) && (text || (title = (0, _util.sanitise)(titleFormat ? titleFormat(d[i].x) : d[i].x), text = title || title === 0 ? "<tr><th colspan=\"2\">" + title + "</th></tr>" : "", text = "<table class=\"" + $$.CLASS.tooltip + "\">" + text), value = (0, _util.sanitise)(valueFormat(d[i].value, d[i].ratio, d[i].id, d[i].index, d)), value !== undefined)) {
+			// Skip elements when their name is set to null
+			if (d[i].name === null) continue;
+			name = (0, _util.sanitise)(nameFormat(d[i].name, d[i].ratio, d[i].id, d[i].index)), bgcolor = $$.levelColor ? $$.levelColor(d[i].value) : color(d[i].id), text += "<tr class=\"" + $$.CLASS.tooltipName + "-" + $$.getTargetSelectorSuffix(d[i].id) + "\">" + ("<td class=\"name\"><span style=\"background-color:" + bgcolor + "\"></span>" + name + "</td>") + ("<td class=\"value\">" + value + "</td></tr>");
+		}
+
+		return text + "</table>";
+	},
+
+	/**
+  * Returns the position of the tooltip
+  * @private
+  * @param {Object} data
+  * @param {String} width
+  * @param {String} hHeight
+  * @param {HTMLElement} element
+  * @returns {Object} top, left value
+  */
+	tooltipPosition: function tooltipPosition(dataToShow, tWidth, tHeight, element) {
+		var $$ = this,
+		    config = $$.config,
+		    forArc = $$.hasArcType(),
+		    isTouch = $$.inputType === "touch",
+		    mouse = (0, _d.mouse)(element),
+		    svgLeft = void 0,
+		    tooltipLeft = void 0,
+		    tooltipRight = void 0,
+		    tooltipTop = void 0,
+		    chartRight = void 0;
+
+		// Determin tooltip position
+
+
+		return forArc ? (tooltipLeft = isTouch ? mouse[0] : ($$.width - ($$.isLegendRight ? $$.getLegendWidth() : 0)) / 2 + mouse[0], tooltipTop = isTouch ? mouse[1] + 20 : $$.height / 2 + mouse[1] + 20) : (svgLeft = $$.getSvgLeft(!0), config.axis_rotated ? (tooltipLeft = svgLeft + mouse[0] + 100, tooltipRight = tooltipLeft + tWidth, chartRight = $$.currentWidth - $$.getCurrentPaddingRight(), tooltipTop = $$.x(dataToShow[0].x) + 20) : (tooltipLeft = svgLeft + $$.getCurrentPaddingLeft(!0) + $$.x(dataToShow[0].x) + 20, tooltipRight = tooltipLeft + tWidth, chartRight = svgLeft + $$.currentWidth - $$.getCurrentPaddingRight(), tooltipTop = mouse[1] + 15), tooltipRight > chartRight && (tooltipLeft -= tooltipRight - chartRight + 20), tooltipTop + tHeight > $$.currentHeight && (tooltipTop -= tHeight + 30)), tooltipTop < 0 && (tooltipTop = 0), {
+			top: tooltipTop,
+			left: tooltipLeft
+		};
+	},
+
+	/**
+  * Show the tooltip
+  * @private
+  * @param {Object} data
+  * @param {HTMLElement} element
+  */
+	showTooltip: function showTooltip(selectedData, element) {
+		var $$ = this,
+		    config = $$.config,
+		    forArc = $$.hasArcType(),
+		    dataToShow = selectedData.filter(function (d) {
+			return d && (0, _util.isValue)(d.value);
+		}),
+		    positionFunction = config.tooltip_position || $$.tooltipPosition;
+
+
+		if (dataToShow.length !== 0 && config.tooltip_show) {
+				$$.tooltip.html(config.tooltip_contents.call($$, selectedData, $$.axis.getXAxisTickFormat(), $$.getYFormat(forArc), $$.color)).style("display", "block");
+
+
+				// Get tooltip dimensions
+				var tWidth = $$.tooltip.property("offsetWidth"),
+				    tHeight = $$.tooltip.property("offsetHeight"),
+				    position = positionFunction.call(this, dataToShow, tWidth, tHeight, element);
+				$$.tooltip.style("top", position.top + "px").style("left", position.left + "px");
+			}
+
+		// Set tooltip
+	},
+
+	/**
+  * Hide the tooltip
+  * @private
+  */
+	hideTooltip: function hideTooltip() {
+		this.tooltip.style("display", "none");
+	}
+});
+
+/***/ }),
+/* 55 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _ChartInternal = __webpack_require__(1),
+    _ChartInternal2 = _interopRequireDefault(_ChartInternal),
+    _util = __webpack_require__(0);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/**
+ * Copyright (c) 2017 NAVER Corp.
+ * billboard.js project is licensed under the MIT license
+ */
+(0, _util.extend)(_ChartInternal2.default.prototype, {
+	setTargetType: function setTargetType(targetIds, type) {
+		var $$ = this,
+		    config = $$.config;
+		$$.mapToTargetIds(targetIds).forEach(function (id) {
+			$$.withoutFadeIn[id] = type === config.data_types[id], config.data_types[id] = type;
+		}), targetIds || (config.data_type = type);
+	},
+	hasType: function hasType(type, targetsValue) {
+		var $$ = this,
+		    types = $$.config.data_types,
+		    targets = targetsValue || $$.data.targets,
+		    has = !1;
+
+
+		return targets && targets.length ? targets.forEach(function (target) {
+			var t = types[target.id];
+
+			(t && t.indexOf(type) >= 0 || !t && type === "line") && (has = !0);
+		}) : Object.keys(types).length ? Object.keys(types).forEach(function (id) {
+			types[id] === type && (has = !0);
+		}) : has = $$.config.data_type === type, has;
+	},
+	hasArcType: function hasArcType(targets) {
+		return this.hasType("pie", targets) || this.hasType("donut", targets) || this.hasType("gauge", targets);
+	},
+	isLineType: function isLineType(d) {
+		var config = this.config,
+		    id = (0, _util.isString)(d) ? d : d.id;
+
+
+		return !config.data_types[id] || ["line", "spline", "area", "area-spline", "step", "area-step"].indexOf(config.data_types[id]) >= 0;
+	},
+	isStepType: function isStepType(d) {
+		var id = (0, _util.isString)(d) ? d : d.id;
+
+		return ["step", "area-step"].indexOf(this.config.data_types[id]) >= 0;
+	},
+	isSplineType: function isSplineType(d) {
+		var id = (0, _util.isString)(d) ? d : d.id;
+
+		return ["spline", "area-spline"].indexOf(this.config.data_types[id]) >= 0;
+	},
+	isAreaType: function isAreaType(d) {
+		var id = (0, _util.isString)(d) ? d : d.id;
+
+		return ["area", "area-spline", "area-step"].indexOf(this.config.data_types[id]) >= 0;
+	},
+	isBarType: function isBarType(d) {
+		var id = (0, _util.isString)(d) ? d : d.id;
+
+		return this.config.data_types[id] === "bar";
+	},
+	isScatterType: function isScatterType(d) {
+		var id = (0, _util.isString)(d) ? d : d.id;
+
+		return this.config.data_types[id] === "scatter";
+	},
+	isPieType: function isPieType(d) {
+		var id = (0, _util.isString)(d) ? d : d.id;
+
+		return this.config.data_types[id] === "pie";
+	},
+	isGaugeType: function isGaugeType(d) {
+		var id = (0, _util.isString)(d) ? d : d.id;
+
+		return this.config.data_types[id] === "gauge";
+	},
+	isDonutType: function isDonutType(d) {
+		var id = (0, _util.isString)(d) ? d : d.id;
+
+		return this.config.data_types[id] === "donut";
+	},
+	isArcType: function isArcType(d) {
+		return this.isPieType(d) || this.isDonutType(d) || this.isGaugeType(d);
+	},
+	lineData: function lineData(d) {
+		return this.isLineType(d) ? [d] : [];
+	},
+	arcData: function arcData(d) {
+		return this.isArcType(d.data) ? [d] : [];
+	},
+	barData: function barData(d) {
+		return this.isBarType(d) ? d.values : [];
+	},
+	lineOrScatterData: function lineOrScatterData(d) {
+		return this.isLineType(d) || this.isScatterType(d) ? d.values : [];
+	},
+	barOrLineData: function barOrLineData(d) {
+		return this.isBarType(d) || this.isLineType(d) ? d.values : [];
+	},
+
+
+	// https://github.com/d3/d3-shape#curves
+	isInterpolationType: function isInterpolationType(type) {
+		return ["basis", "basis-closed", "basis-open", "bundle", "cardinal", "cardinal-closed", "cardinal-open", "catmull-rom", "catmull-rom-closed", "catmull-rom-open", "linear", "linear-closed", "monotone-x", "monotone-y", "natural"].indexOf(type) >= 0;
+	}
+});
+
+/***/ }),
+/* 56 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _ChartInternal = __webpack_require__(1),
+    _ChartInternal2 = _interopRequireDefault(_ChartInternal),
+    _util = __webpack_require__(0);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/**
+ * Copyright (c) 2017 NAVER Corp.
+ * billboard.js project is licensed under the MIT license
+ */
+(0, _util.extend)(_ChartInternal2.default.prototype, {
+	isSafari: function isSafari() {
+		var ua = window.navigator.userAgent;
+
+		return ua.indexOf("Safari") >= 0 && ua.indexOf("Chrome") < 0;
+	},
+	isChrome: function isChrome() {
+		return window.navigator.userAgent.indexOf("Chrome") >= 0;
+	}
+});
+
+/***/ }),
+/* 57 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 58 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+exports.__esModule = !0;
+
+var _classCallCheck2 = __webpack_require__(6),
+    _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/**
+ * Copyright (c) 2017 NAVER Corp.
+ * billboard.js project is licensed under the MIT license
+ */
+/**
+ * Class to set options on generating chart.
+ * - It's instantiated internally, not exposed for public.
+ * @class Options
+ * @see {@link bb.generate} to use these options on generating the chart
+ */
+var Options = function Options() {
+			(0, _classCallCheck3.default)(this, Options), this.value = {
+						/**
+       * bindto The CSS selector or the element which the chart will be set to. D3 selection object can be specified. If other chart is set already, it will be replaced with the new one (only one chart can be set in one element).<br><br>
+       * If this option is not specified, the chart will be generated but not be set. Instead, we can access the element by chart.element and set it by ourselves.<br>
+       * > <b>NOTE:</b> When chart is not binded, bb starts observing if chart.element is binded by MutationObserver. In this case, polyfill is required in IE9 and IE10 becuase they do not support MutationObserver. On the other hand, if chart always will be binded, polyfill will not be required because MutationObserver will never be called.
+       * @name bindto
+       * @memberof Options
+       * @type {String}
+       * @default #chart
+       * @example
+       * bindto: "#myContainer"
+       *
+       * // or element
+       * bindto: document.getElementById("myContainer")
+       *
+       * // or D3 selection object
+       * bindto: d3.select("#myContainer")
+       */
+						bindto: "#chart",
+
+						/**
+       * Set svg element's class name
+       * @name svg
+       * @memberof Options
+       * @type {Object}
+       * @property {String} [svg.classname] class name for svg element
+       * @example
+       * svg: {
+                *   classname: "test_class"
+       * }
+       */
+						svg_classname: undefined,
+
+						/**
+       * The desired size of the chart element.
+       * If value is not specified, the width of the chart will be calculated by the size of the parent element it's appended to.
+       * @name size
+       * @memberof Options
+       * @type {Object}
+       * @property {Number} [size.width] width of the chart element
+       * @property {Number} [size.height] height of the chart element
+       * @example
+       * size: {
+                *   width: 640,
+                *   height: 480
+       * }
+       */
+						size_width: undefined,
+						size_height: undefined,
+
+						/**
+       * The padding of the chart element.
+       * @name padding
+       * @memberof Options
+       * @type {Object}
+       * @property {Number} [padding.top] padding on the top of chart
+       * @property {Number} [padding.right] padding on the right of chart
+       * @property {Number} [padding.bottom] padding on the bottom of chart
+       * @property {Number} [padding.left] padding on the left of chart
+       * @example
+       * padding: {
+                *   top: 20,
+                *   right: 20,
+                *   bottom: 20,
+                *   left: 20
+       * }
+       */
+						padding_left: undefined,
+						padding_right: undefined,
+						padding_top: undefined,
+						padding_bottom: undefined,
+
+						/**
+       * Set chart resize options
+       * @name resize
+       * @memberof Options
+       * @type {Object}
+       * @property {Boolean} [resize.auto=true] Set chart resize automatically on viewport changes.
+       * @example
+       *  resize: {
+       *      auto: false
+       *  }
+       */
+						resize_auto: !0,
+
+						/**
+       * Set zoom options
+       * @name zoom
+       * @memberof Options
+       * @type {Object}
+       * @property {Boolean} [zoom.enabled=false] Enable zooming.
+       * @property {Boolean} [zoom.rescale=false] Enable to rescale after zooming.<br>
+       *  If true set, y domain will be updated according to the zoomed region.
+       * @property {Array} [zoom.extent=[1, 10]] Change zoom extent.
+       * @property {Function} [zoom.onzoom=function(){}] Set callback that is called when the chart is zooming.<br>
+       *  Specified function receives the zoomed domain.
+       * @property {Function} [zoom.onzoomstart=function(){}] Set callback that is called when zooming starts.<br>
+       *  Specified function receives the zoom event.
+       * @property {Function} [zoom.onzoomend=function(){}] Set callback that is called when zooming ends.<br>
+       *  Specified function receives the zoomed domain.
+       * @example
+       *  zoom: {
+       *      enabled: true,
+       *      rescale: true,
+       *      extent: [1, 100]  // enable more zooming
+       *      onzoom: function(domain) { ... },
+       *      onzoomstart: function(event) { ... },
+       *      onzoomend: function(domain) { ... }
+       *  }
+       */
+						zoom_enabled: !1,
+						zoom_extent: undefined,
+						zoom_privileged: !1,
+						zoom_rescale: !1,
+						zoom_onzoom: function zoom_onzoom() {},
+						zoom_onzoomstart: function zoom_onzoomstart() {},
+						zoom_onzoomend: function zoom_onzoomend() {},
+						zoom_x_min: undefined,
+						zoom_x_max: undefined,
+
+						/**
+       * Interaction options
+       * @name interaction
+       * @memberof Options
+       * @type {Object}
+       * @property {Boolean} [interaction.enabled=true] Indicate if the chart should have interactions.<br>
+       *     If `false` is set, all of interactions (showing/hiding tooltip, selection, mouse events, etc) will be disabled.
+       * @property {Boolean} [interaction.brighten=true]
+       * @property {Boolean} [interaction.inputType.mouse=true] enable or disable mouse interaction
+       * @property {Boolean} [interaction.inputType.touch=true] enable or disable  touch interaction
+       * @example
+       * interaction: {
+                *    enabled: false,
+                *    inputType: {
+                *        mouse: true,
+                *        touch: false
+                *    }
+       * }
+       */
+						interaction_brighten: !0,
+						interaction_enabled: !0,
+						interaction_inputType_mouse: !0,
+						interaction_inputType_touch: !0,
+
+						/**
+       * Set a callback to execute when mouse/touch enters the chart.
+       * @name onover
+       * @memberof Options
+       * @type {Function}
+       * @default function(){}
+       * @example
+       * onover: function() {
+       *   ...
+       * }
+       */
+						onover: function onover() {},
+
+						/**
+       * Set a callback to execute when mouse/touch leaves the chart.
+       * @name onout
+       * @memberof Options
+       * @type {Function}
+       * @default function(){}
+       * @example
+       * onout: function() {
+       *   ...
+       * }
+       */
+						onout: function onout() {},
+
+						/**
+       * Set a callback to execute when user resizes the screen.
+       * @name onresize
+       * @memberof Options
+       * @type {Function}
+       * @default function(){}
+       * @example
+       * onresize: function() {
+       *   ...
+       * }
+       */
+						onresize: function onresize() {},
+
+						/**
+       * SSet a callback to execute when screen resize finished.
+       * @name onresized
+       * @memberof Options
+       * @type {Function}
+       * @default function(){}
+       * @example
+       * onresized: function() {
+       *   ...
+       * }
+       */
+						onresized: function onresized() {},
+
+						/**
+       * Set a callback to execute when the chart is initialized.
+       * @name oninit
+       * @memberof Options
+       * @type {Function}
+       * @default function(){}
+       * @example
+       * oninit: function() {
+       *   ...
+       * }
+       */
+						oninit: function oninit() {},
+
+						/**
+       * Set a callback which is executed when the chart is rendered. Basically, this callback will be called in each time when the chart is redrawed.
+       * @name onrendered
+       * @memberof Options
+       * @type {Function}
+       * @default function(){}
+       * @example
+       * onrendered: function() {
+       *   ...
+       * }
+       */
+						onrendered: function onrendered() {},
+
+						/**
+       * Set duration of transition (in milliseconds) for chart animation.<br><br>
+       * <b>NOTE:</b>If `0 `or `null` set, transition will be skipped. So, this makes initial rendering faster especially in case you have a lot of data.
+       * @name transition
+       * @memberof Options
+       * @type {Object}
+       * @property {Number} [transition.duration=350] duration in milliseconds
+       * @example
+       * transition: {
+       *  duration: 500
+       * }
+       */
+						transition_duration: 350,
+
+						/**
+       * Specify the key of x values in the data.<br><br>
+       * We can show the data with non-index x values by this option. This option is required when the type of x axis is timeseries. If this option is set on category axis, the values of the data on the key will be used for category names.
+       * @name data:x
+       * @memberof Options
+       * @type {String}
+       * @default undefined
+       * @example
+       * data: {
+                *   x: "date"
+       * }
+       */
+						data_x: undefined,
+
+						/**
+       * Specify the keys of the x values for each data.<br><br>
+       * This option can be used if we want to show the data that has different x values.
+       * @name data:xs
+       * @memberof Options
+       * @type {Object}
+       * @default {}
+       * @example
+       * data: {
+                *   xs: {
+                *    data1: "x1",
+                *    data2: "x2"
+                *   }
+       * }
+       */
+						data_xs: {},
+
+						/**
+       * Set a format to parse string specifed as x.
+       * @name data:xFormat
+       * @memberof Options
+       * @type {String}
+       * @default %Y-%m-%d
+       * @example
+       * data: {
+                *   xFormat: "%Y-%m-%d %H:%M:%S"
+       * }
+       * @see [D3's time specifier](https://npm.runkit.com/d3-time-format)
+       */
+						data_xFormat: "%Y-%m-%d",
+
+						/**
+       * Set localtime format to parse x axis.
+       * @name data:xLocaltime
+       * @memberof Options
+       * @type {Boolean}
+       * @default true
+       * @example
+       * data: {
+                *   xLocaltime: false
+       * }
+       */
+						data_xLocaltime: !0,
+
+						/**
+       * Sort on x axis.
+       * @name data:xSort
+       * @memberof Options
+       * @type {Boolean}
+       * @default true
+       * @example
+       * data: {
+                *   xSort: false
+       * }
+       */
+						data_xSort: !0,
+						data_idConverter: function data_idConverter(id) {
+									return id;
+						},
+
+						/**
+       * Set custom data name.
+       * @name data:names
+       * @memberof Options
+       * @type {Object}
+       * @default {}
+       * @example
+       * data: {
+                *   names: {
+                *     data1: "Data Name 1",
+                *     data2: "Data Name 2"
+                *   }
+       * }
+       */
+						data_names: {},
+
+						/**
+       * Set custom data class.<br><br>
+       * If this option is specified, the element g for the data has an additional class that has the prefix 'bb-target-' (eg. bb-target-additional-data1-class).
+       * @name data:classes
+       * @memberof Options
+       * @type {Object}
+       * @default {}
+       * @example
+       * data: {
+                *   classes: {
+                *     data1: "additional-data1-class",
+                *     data2: "additional-data2-class"
+                *   }
+       * }
+       */
+						data_classes: {},
+
+						/**
+       * Set groups for the data for stacking.
+       * @name data:groups
+       * @memberof Options
+       * @type {Array}
+       * @default []
+       * @example
+       * data: {
+                *   groups: [
+                *     ["data1", "data2"],
+                *     ["data3"]
+                *   ]
+       * }
+       */
+						data_groups: [],
+
+						/**
+       * Set y axis the data related to. y and y2 can be used.
+       * @name data:axes
+       * @memberof Options
+       * @type {Object}
+       * @default {}
+       * @example
+       * data: {
+       * axes: {
+       *     data1: "y",
+       *     data2: "y2"
+       *   }
+       * }
+       */
+						data_axes: {},
+
+						/**
+       * Set chart type at once.<br><br>
+       * If this option is specified, the type will be applied to every data. This setting can be overwritten by data.types.<br><br>
+       * <b>Available Values:</b>
+       * - line
+       * - spline
+       * - step
+       * - area
+       * - area-spline
+       * - area-step
+       * - bar
+       * - scatter
+       * - pie
+       * - donut
+       * - gauge
+       * @name data:type
+       * @memberof Options
+       * @type {String}
+       * @default line
+       * @example
+       * data: {
+       *  type: "bar"
+       * }
+       */
+						data_type: undefined,
+
+						/**
+       * Set chart type for each data.<br>
+       * This setting overwrites data.type setting.
+       * @name data:types
+       * @memberof Options
+       * @type {Object}
+       * @default {}
+       * @example
+       * data: {
+       *   types: {
+       *     data1: "bar",
+       *     data2: "spline"
+       *   }
+       * }
+       */
+						data_types: {},
+
+						/**
+       * Show labels on each data points.
+       * @name data:labels
+       * @memberof Options
+       * @type {Boolean}
+       * @default false
+       * @example
+       * data: {
+       *   labels: true
+       * }
+       */
+						/**
+       * Set formatter function for data labels.<br>
+       * The formatter function receives 4 arguments such as v, id, i, j and it must return a string that will be shown as the label. The arguments are:<br>
+       *  - `v` is the value of the data point where the label is shown.
+       *  - `id` is the id of the data where the label is shown.
+       *  - `i` is the index of the data point where the label is shown.
+       *  - `j` is the sub index of the data point where the label is shown.<br><br>
+       * Formatter function can be defined for each data by specifying as an object and D3 formatter function can be set (ex. d3.format('$'))
+       * @name data:labels:format
+       * @memberof Options
+       * @type {Object}
+       * @default {}
+       * @example
+       * data: {
+       *   labels: {
+       *     format: function(v, id, i, j) { ... }
+       *     // it's possible to set for each data
+       *     //format: {
+       *     //    data1: function(v, id, i, j) { ... },
+       *     //    ...
+       *     //}
+       *   }
+       * }
+       */
+						data_labels: {},
+
+						/**
+       *  This option changes the order of stacking the data and pieces of pie/donut. If `null` specified, it will be the order the data loaded. If function specified, it will be used to sort the data and it will recieve the data as argument.<br><br>
+       *  <b>Available Values:</b>
+       *  - desc
+       *  - asc
+       *  - function(data1, data2) { ... }
+       *  - null
+       * @name data:order
+       * @memberof Options
+       * @type {String|Function}
+       * @default desc
+       * @example
+       * data: {
+       *   lorder: "asc"
+       * }
+       */
+						data_order: "desc",
+
+						/**
+       * Define regions for each data.<br><br>
+       * The values must be an array for each data and it should include an object that has start, end, style. If start is not set, the start will be the first data point. If end is not set, the end will be the last data point.<br>
+       * Currently this option supports only line chart and dashed style. If this option specified, the line will be dashed only in the regions.
+       * @name data:regions
+       * @memberof Options
+       * @type {Object}
+       * @default {}
+       * @example
+       * data: {
+       *   regions: {
+       *     data1: [{
+       *         "start": 1,
+       *         "end": 2,
+       *         "style": "dashed"
+       *     }, {
+       *         "start":3
+       *     }],
+       *     ...
+       *   }
+       * }
+       */
+						data_regions: {},
+
+						/**
+       * Set color converter function.<br><br>
+       * This option should a function and the specified function receives color (e.g. '#ff0000') and d that has data parameters like id, value, index, etc. And it must return a string that represents color (e.g. '#00ff00').
+       * @name data:color
+       * @memberof Options
+       * @type {Function}
+       * @default undefined
+       * @example
+       * data: {
+       *   color: function(color, d) { ... }
+       * }
+       */
+						data_color: undefined,
+
+						/**
+       * Set color for each data.
+       * @name data:colors
+       * @memberof Options
+       * @type {Object}
+       * @default {}
+       * @example
+       * data: {
+       *   colors: {
+       *     data1: "#ff0000",
+       *     ...
+       *   }
+       * }
+       */
+						data_colors: {},
+
+						/**
+       * Hide each data when the chart appears.<br><br>
+       * If true specified, all of data will be hidden. If multiple ids specified as an array, those will be hidden.
+       * @name data:hide
+       * @memberof Options
+       * @type {Boolean|Array}
+       * @default false
+       * @example
+       * data: {
+       *   // all of data will be hidden
+       *   hide: true
+       *   // specified data will be hidden
+       *   hide: ["data1", ...]
+       * }
+       */
+						data_hide: !1,
+						data_filter: undefined,
+
+						/**
+       * Set data selection enabled.<br><br>
+       * If this option is set true, we can select the data points and get/set its state of selection by API (e.g. select, unselect, selected).
+       * @name data:selection:enabled
+       * @memberof Options
+       * @type {Boolean}
+       * @default false
+       * @example
+       * data: {
+       *     selection: {
+       *       enabled: true
+       *   }
+       * }
+       */
+						data_selection_enabled: !1,
+
+						/**
+       * Set grouped selection enabled.<br><br>
+       * If this option set true, multiple data points that have same x value will be selected by one selection.
+       * @name data:selection:grouped
+       * @memberof Options
+       * @type {Boolean}
+       * @default false
+       * @example
+       * data: {
+       *     selection: {
+       *       grouped: true
+       *   }
+       * }
+       */
+						data_selection_grouped: !1,
+
+						/**
+       * Set a callback for each data point to determine if it's selectable or not.<br><br>
+       * The callback will receive d as an argument and it has some parameters like id, value, index. This callback should return boolean.
+       * @name data:selection:isselectable
+       * @memberof Options
+       * @type {Function}
+       * @default function() { return true; }
+       * @example
+       * data: {
+       *     selection: {
+       *       isselectable: function(d) { ... }
+       *   }
+       * }
+       */
+						data_selection_isselectable: function data_selection_isselectable() {
+									return !0;
+						},
+
+						/**
+       * Set multiple data points selection enabled.<br><br>
+       * If this option set true, multile data points can have the selected state at the same time. If false set, only one data point can have the selected state and the others will be unselected when the new data point is selected.
+       * @name data:selection:multiple
+       * @memberof Options
+       * @type {Boolean}
+       * @default true
+       * @example
+       * data: {
+       *     selection: {
+       *       multiple: false
+       *   }
+       * }
+       */
+						data_selection_multiple: !0,
+
+						/**
+       * Enable to select data points by dragging.<br><br>
+       * If this option set true, data points can be selected by dragging.
+       * <b>Note:</b> If this option set true, scrolling on the chart will be disabled because dragging event will handle the event.
+       * @name data:selection:draggable
+       * @memberof Options
+       * @type {Boolean}
+       * @default false
+       * @example
+       * data: {
+       *     selection: {
+       *       draggable: true
+       *   }
+       * }
+       */
+						data_selection_draggable: !1,
+
+						/**
+       * Set a callback for click event on each data point.<br><br>
+       * This callback will be called when each data point clicked and will receive d and element as the arguments. d is the data clicked and element is the element clicked. In this callback, this will be the Chart object.
+       * @name data:onclick
+       * @memberof Options
+       * @type {Function}
+       * @default function() {}
+       * @example
+       * data: {
+       *     onclick: function(d, element) { ... }
+       * }
+       */
+						data_onclick: function data_onclick() {},
+
+						/**
+       * Set a callback for mouse/touch over event on each data point.<br><br>
+       * This callback will be called when mouse cursor or via touch moves onto each data point and will receive d as the argument. d is the data where mouse cursor moves onto. In this callback, this will be the Chart object.
+       * @name data:onover
+       * @memberof Options
+       * @type {Function}
+       * @default function() {}
+       * @example
+       * data: {
+       *     onover: function(d) { ... }
+       * }
+       */
+						data_onover: function data_onover() {},
+
+						/**
+       * Set a callback for mouse/touch out event on each data point.<br><br>
+       * This callback will be called when mouse cursor or via touch moves out each data point and will receive d as the argument. d is the data where mouse cursor moves out. In this callback, this will be the Chart object.
+       * @name data:onout
+       * @memberof Options
+       * @type {Function}
+       * @default function() {}
+       * @example
+       * data: {
+       *     onout: function(d) { ... }
+       * }
+       */
+						data_onout: function data_onout() {},
+
+						/**
+       * Set a callback for on data selection.
+       * @name data:onselected
+       * @memberof Options
+       * @type {Function}
+       * @default function() {}
+       * @example
+       * data: {
+       *     onselected: function(d) { ... }
+       * }
+       */
+						data_onselected: function data_onselected() {},
+
+						/**
+       * Set a callback for on data un-selection.
+       * @name data:onunselected
+       * @memberof Options
+       * @type {Function}
+       * @default function() {}
+       * @example
+       * data: {
+       *     onunselected: function(d) { ... }
+       * }
+       */
+						data_onunselected: function data_onunselected() {},
+						data_url: undefined,
+						data_headers: undefined,
+						data_json: undefined,
+						data_rows: undefined,
+						data_columns: undefined,
+						data_mimeType: undefined,
+						data_keys: undefined,
+
+						/**
+       * Set text displayed when empty data.
+       * @name data:empty:label:text
+       * @memberof Options
+       * @type {String}
+       * @default ""
+       * @example
+       * data: {
+       *   empty: {
+       *     label: {
+       *       text: "No Data"
+       *     }
+       *   }
+       * }
+       */
+						data_empty_label_text: "",
+
+						/**
+       * Set subchart options
+       * @name subchart
+       * @memberof Options
+       * @type {Object}
+       * @property {Boolean} [subchart.show=false] Show sub chart on the bottom of the chart.
+       * @property {Boolean} [subchart.size.height] Change the height of the subchart.
+       * @property {Boolean} [subchart.onbrush] Set callback for brush event.<br>
+       *  Specified function receives the current zoomed x domain.
+       * @example
+       *  subchart: {
+       *      show: true,
+       *      size: {
+       *          height: 20
+       *      },
+       *      onbrush: function(domain) { ... }
+       *  }
+       */
+						subchart_show: !1,
+						subchart_size_height: 60,
+						subchart_axis_x_show: !0,
+						subchart_onbrush: function subchart_onbrush() {},
+
+						/**
+       * Set color of the data values
+       * @name color
+       * @memberof Options
+       * @type {Object}
+       * @property {Array} [color.pattern] custom color pattern
+       * @property {Object} [color.threshold] color threshold
+       * @property {String} [color.threshold.unit] unit
+       * @property {Array} [color.threshold.value] value
+       * @property {Array} [color.threshold.max=100] max value
+       * @example
+       *  color: {
+       *      pattern: ["#1f77b4", "#aec7e8", ...]
+       *  }
+       */
+						color_pattern: [],
+						color_threshold: {},
+
+						/**
+       * Legend options
+       * @name legend
+       * @memberof Options
+       * @type {Object}
+       * @property {Boolean} [legend.show=true] Show or hide legend.
+       * @property {Boolean} [legend.hide=false] Hide legend
+       *  If true given, all legend will be hidden. If string or array given, only the legend that has the id will be hidden.
+       * @property {String} [legend.position=bottom] Change the position of legend.<br>
+       *  Available values are: `bottom`, `right` and `inset` are supported.
+       *  @property {Object} [legend.inset={anchor: 'top-left',x: 10,y: 0,step: undefined}] Change inset legend attributes.<br>
+       *      This option accepts object that has the keys anchor, x, y and step.
+       *      anchor decides the position of the legend. These anchors are available:
+       *      - top-left
+       *      - top-right
+       *      - bottom-left
+       *      - bottom-right
+       *  x and y set the position of the legend based on the anchor.<br>
+       *  step defines the max step the lagend has (e.g. If 2 set and legend has 3 legend item, the legend 2 columns).
+       * @property {Function} [legend.item.onclick=undefined] Set click event handler to the legend item.
+       * @property {Function} [legend.item.onover=undefined] Set mouse/touch over event handler to the legend item.
+       * @property {Function} [legend.item.onout=undefined] Set mouse/touch out event handler to the legend item.
+       * @example
+       *  legend: {
+       *      show: true,
+       *      hide: true,
+       *      //or hide: "data1"
+                *      //or hide: ["data1", "data2"]
+                *      position: "bottom",  // bottom, right, inset
+       *      inset: {
+       *          anchor: "top-right"  // top-left, top-right, bottom-left, bottom-right
+       *          x: 20,
+       *          y: 10,
+       *          step: 2
+       *      },
+       *      onclick: function(id) { ... },
+       *      onover: function(id) { ... },
+       *      onout: function(id) { ... }
+       *  }
+       */
+						legend_show: !0,
+						legend_hide: !1,
+						legend_position: "bottom",
+						legend_inset_anchor: "top-left",
+						legend_inset_x: 10,
+						legend_inset_y: 0,
+						legend_inset_step: undefined,
+						legend_item_onclick: undefined,
+						legend_item_onover: undefined,
+						legend_item_onout: undefined,
+						legend_equally: !1,
+						legend_padding: 0,
+						legend_item_tile_width: 10,
+						legend_item_tile_height: 10,
+
+						/**
+       * Switch x and y axis position.
+       * @name axis:rotated
+       * @memberof Options
+       * @type {Boolean}
+       * @default false
+       * @example
+       * axis: {
+       *   rotated: true
+       * }
+       */
+						axis_rotated: !1,
+
+						/**
+       * Show or hide x axis.
+       * @name axis:x:show
+       * @memberof Options
+       * @type {Boolean}
+       * @default true
+       * @example
+       * axis: {
+       *   x: {
+       *     show: false
+       *   }
+       * }
+       */
+						axis_x_show: !0,
+
+						/**
+       * Set type of x axis.<br><br>
+       * <b>Available Values:</b>
+       * -timeseries
+       * -category
+       * -indexed
+       * @name axis:x:type
+       * @memberof Options
+       * @type {String}
+       * @default indexed
+       * @example
+       * axis: {
+       *   x: {
+       *     type: "timeseries"
+       *   }
+       * }
+       */
+						axis_x_type: "indexed",
+
+						/**
+       * Set how to treat the timezone of x values.<br>
+       * If true, treat x value as localtime. If false, convert to UTC internally.
+       * @name axis:x:localtime
+       * @memberof Options
+       * @type {Boolean}
+       * @default true
+       * @example
+       * axis: {
+       *   x: {
+       *     localtime: false
+       *   }
+       * }
+       */
+						axis_x_localtime: !0,
+
+						/**
+       * Set category names on category axis.
+       * This must be an array that includes category names in string. If category names are included in the date by data.x option, this is not required.
+       * @name axis:x:categories
+       * @memberof Options
+       * @type {Array}
+       * @default []
+       * @example
+       * axis: {
+       *   x: {
+       *     categories: ["Category 1", "Category 2", ...]
+       *   }
+       * }
+       */
+						axis_x_categories: [],
+
+						/**
+       * Centerise ticks on category axis.
+       * @name axis:x:tick:centered
+       * @memberof Options
+       * @type {Array}
+       * @default false
+       * @example
+       * axis: {
+       *   x: {
+       *     tick: {
+       *       centered: true
+       *     }
+       *   }
+       * }
+       */
+						axis_x_tick_centered: !1,
+
+						/**
+       * A function to format tick value. Format string is also available for timeseries data.
+       * @name axis:x:tick:format
+       * @memberof Options
+       * @type {Function}
+       * @default undefined
+       * @example
+       * axis: {
+       *   x: {
+       *     tick: {
+       *       format: function(x) {
+       *           return x.getFullYear();
+       *       }
+       *     }
+       *   }
+       * }
+       */
+						axis_x_tick_format: undefined,
+
+						/**
+       * Setting for culling ticks.<br><br>
+       * If true is set, the ticks will be culled, then only limitted tick text will be shown. This option does not hide the tick lines. If false is set, all of ticks will be shown.<br><br>
+       * We can change the number of ticks to be shown by axis.x.tick.culling.max.
+       * @name axis:x:tick:culling
+       * @memberof Options
+       * @type {Function}
+       * @default
+       * - true for indexed axis and timeseries axis
+       * - false for category axis
+       * @example
+       * axis: {
+       *   x: {
+       *     tick: {
+       *       culling: false
+       *     }
+       *   }
+       * }
+       */
+						axis_x_tick_culling: {},
+
+						/**
+       * The number of tick texts will be adjusted to less than this value.
+       * @name axis:x:tick:culling:max
+       * @memberof Options
+       * @type {Number}
+       * @default 10
+       * @example
+       * axis: {
+       *   x: {
+       *     tick: {
+       *       culling: {
+       *           max: 5
+       *       }
+       *     }
+       *   }
+       * }
+       */
+						axis_x_tick_culling_max: 10,
+
+						/**
+       * The number of x axis ticks to show.<br><br>
+       * This option hides tick lines together with tick text. If this option is used on timeseries axis, the ticks position will be determined precisely and not nicely positioned (e.g. it will have rough second value).
+       * @name axis:x:tick:count
+       * @memberof Options
+       * @type {Number}
+       * @default undefined
+       * @example
+       * axis: {
+       *   x: {
+       *     tick: {
+       *       count: 5
+       *     }
+       *   }
+       * }
+       */
+						axis_x_tick_count: undefined,
+
+						/**
+       * Fit x axis ticks.<br><br>
+       * If true set, the ticks will be positioned nicely. If false set, the ticks will be positioned according to x value of the data points.
+       * @name axis:x:tick:fit
+       * @memberof Options
+       * @type {Boolean}
+       * @default true
+       * @example
+       * axis: {
+       *   x: {
+       *     tick: {
+       *       fit: false
+       *     }
+       *   }
+       * }
+       */
+						axis_x_tick_fit: !0,
+
+						/**
+       * Set the x values of ticks manually.<br><br>
+       * If this option is provided, the position of the ticks will be determined based on those values. This option works with timeseries data and the x values will be parsed accoding to the type of the value and data.xFormat option.
+       * @name axis:x:tick:values
+       * @memberof Options
+       * @type {Array}
+       * @default null
+       * @example
+       * axis: {
+       *   x: {
+       *     tick: {
+       *       values: [1, 2, 4, 8, 16, 32, ...]
+       *     }
+       *   }
+       * }
+       */
+						axis_x_tick_values: null,
+
+						/**
+       * Rotate x axis tick text.<br>
+       * If you set negative value, it will rotate to opposite direction.
+       * @name axis:x:tick:rotate
+       * @memberof Options
+       * @type {Number}
+       * @default 0
+       * @example
+       * axis: {
+       *   x: {
+       *     tick: {
+       *       rotate: 60
+       *     }
+       *   }
+       * }
+       */
+						axis_x_tick_rotate: 0,
+
+						/**
+       * Show x axis outer tick.
+       * @name axis:x:tick:outer
+       * @memberof Options
+       * @type {Boolean}
+       * @default true
+       * @example
+       * axis: {
+       *   x: {
+       *     tick: {
+       *       outer: false
+       *     }
+       *   }
+       * }
+       */
+						axis_x_tick_outer: !0,
+
+						/**
+       * Set tick text to be multiline
+       * @name axis:x:tick:multiline
+       * @memberof Options
+       * @type {Boolean}
+       * @default true
+       * @example
+       * axis: {
+       *   x: {
+       *     tick: {
+       *       multiline: false
+       *     }
+       *   }
+       * }
+       */
+						axis_x_tick_multiline: !0,
+
+						/**
+       * Set tick width
+       * @name axis:x:tick:width
+       * @memberof Options
+       * @type {Number}
+       * @default null
+       * @example
+       * axis: {
+       *   x: {
+       *     tick: {
+       *       width: 50
+       *     }
+       *   }
+       * }
+       */
+						axis_x_tick_width: null,
+
+						/**
+       * Set max value of x axis range.
+       * @name axis:x:max
+       * @memberof Options
+       * @type {Number}
+       * @default undefined
+       * @example
+       * axis: {
+       *   x: {
+       *     max: 100
+       *   }
+       * }
+       */
+						axis_x_max: undefined,
+
+						/**
+       * Set min value of x axis range.
+       * @name axis:x:min
+       * @memberof Options
+       * @type {Number}
+       * @default undefined
+       * @example
+       * axis: {
+       *   x: {
+       *     min: -100
+       *   }
+       * }
+       */
+						axis_x_min: undefined,
+
+						/**
+       * Set padding for x axis.<br><br>
+       * If this option is set, the range of x axis will increase/decrease according to the values. If no padding is needed in the ragen of x axis, 0 should be set. On category axis, this option will be ignored.
+       * @name axis:x:padding
+       * @memberof Options
+       * @type {Object}
+       * @default {}
+       * @example
+       * axis: {
+       *   x: {
+       *     padding: {
+       *       left: 0,
+       *       right: 0
+       *     }
+       *   }
+       * }
+       */
+						axis_x_padding: {},
+
+						/**
+       * Set height of x axis.<br><br>
+       * The height of x axis can be set manually by this option. If you need more space for x axis, please use this option for that. The unit is pixel.
+       * @name axis:x:height
+       * @memberof Options
+       * @type {Number}
+       * @default undefined
+       * @example
+       * axis: {
+       *   x: {
+       *     height: 20
+       *   }
+       * }
+       */
+						axis_x_height: undefined,
+
+						/**
+       * Set default extent for subchart and zoom. This can be an array or function that returns an array.
+       * @name axis:x:extent
+       * @memberof Options
+       * @type {Array}
+       * @default undefined
+       * @example
+       * axis: {
+       *   x: {
+       *     // [[x0, y0], [x1, y1]], where [x0, y0] is the top-left corner and [x1, y1] is the bottom-right corner
+       *     // https://github.com/d3/d3-brush/blob/master/src/brush.js#L521
+       *     extent: [[0, 0], [200, 60]]
+       *   }
+       * }
+       */
+						axis_x_extent: undefined,
+
+						/**
+       * Set label on x axis.<br><br>
+       *  You can set x axis label and change its position by this option. string and object can be passed and we can change the poisiton by passing object that has position key. Available position differs according to the axis direction (vertical or horizontal). If string set, the position will be the default.
+       *  - If it's horizontal axis:
+       *    - inner-right [default]
+       *    - inner-center
+       *    - inner-left
+       *    - outer-right
+       *    - outer-center
+       *    - outer-left
+       *  - If it's vertical axis:
+       *    - inner-top [default]
+       *    - inner-middle
+       *    - inner-bottom
+       *    - outer-top
+       *    - outer-middle
+       *    - outer-bottom
+       * @name axis:x:label
+       * @memberof Options
+       * @type {String|Object}
+       * @default undefined
+       * @example
+       * axis: {
+       *   x: {
+       *     label: "Your X Axis"
+       *   }
+       * }
+       *
+       * axis: {
+       *   x: {
+       *     label: {
+       *        text: "Your X Axis",
+       *        position: "outer-center"
+       *     }
+       *   }
+       * }
+       */
+						axis_x_label: {},
+
+						/**
+       * Show or hide y axis.
+       * @name axis:y:show
+       * @memberof Options
+       * @type {Boolean}
+       * @default true
+       * @example
+       * axis: {
+       *   y: {
+       *     show: false
+       *   }
+       * }
+       */
+						axis_y_show: !0,
+
+						/**
+       * Set type of y axis.
+       * <b>Available Values:</b>
+       * -timeseries
+       * -category
+       * -indexed
+       * @name axis:y:type
+       * @memberof Options
+       * @type {String}
+       * @default undefined
+       * @example
+       * axis: {
+       *   y: {
+       *     type: "timeseries"
+       *   }
+       * }
+       */
+						axis_y_type: undefined,
+
+						/**
+       * Set max value of y axis.
+       * <b>Note:</b> Padding will be added based on this value, so if you don't need the padding, please set axis.y.padding to disable it (e.g. axis.y.padding = 0).
+       * @name axis:y:max
+       * @memberof Options
+       * @type {Number}
+       * @default undefined
+       * @example
+       * axis: {
+       *   y: {
+       *     max: 1000
+       *   }
+       * }
+       */
+						axis_y_max: undefined,
+
+						/**
+       * Set min value of y axis.
+       * <b>Note:</b> Padding will be added based on this value, so if you don't need the padding, please set axis.y.padding to disable it (e.g. axis.y.padding = 0).
+       * @name axis:y:min
+       * @memberof Options
+       * @type {Number}
+       * @default undefined
+       * @example
+       * axis: {
+       *   y: {
+       *     min: 1000
+       *   }
+       * }
+       */
+						axis_y_min: undefined,
+
+						/**
+       * Change the direction of y axis.<br><br>
+       * If true set, the direction will be from the top to the bottom.
+       * @name axis:y:inverted
+       * @memberof Options
+       * @type {Boolean}
+       * @default false
+       * @example
+       * axis: {
+       *   y: {
+       *     inverted: true
+       *   }
+       * }
+       */
+						axis_y_inverted: !1,
+
+						/**
+       * Set center value of y axis.
+       * @name axis:y:center
+       * @memberof Options
+       * @type {Number}
+       * @default undefined
+       * @example
+       * axis: {
+       *   y: {
+       *     center: 0
+       *   }
+       * }
+       */
+						axis_y_center: undefined,
+
+						/**
+       * Show y axis inside of the chart.
+       * @name axis:y:inner
+       * @memberof Options
+       * @type {Boolean}
+       * @default false
+       * @example
+       * axis: {
+       *   y: {
+       *     inner: true
+       *   }
+       * }
+       */
+						axis_y_inner: !1,
+
+						/**
+       * Set label on y axis.<br><br>
+       * You can set y axis label and change its position by this option. This option works in the same way as axis.x.label.
+       * @name axis:y:label
+       * @memberof Options
+       * @type {String|Object}
+       * @default {}
+       * @example
+       * axis: {
+       *   y: {
+       *     label: "Your Y Axis"
+       *   }
+       * }
+       *
+       * axis: {
+       *   y: {
+       *     label: {
+       *        text: "Your Y Axis",
+       *        position: "outer-middle"
+       *     }
+       *   }
+       * }
+       */
+						axis_y_label: {},
+
+						/**
+       * Set formatter for y axis tick text.<br><br>
+       * This option accepts d3.format object as well as a function you define.
+       * @name axis:y:format
+       * @memberof Options
+       * @type {Function}
+       * @default undefined
+       * @example
+       * axis: {
+       *   x: {
+       *     tick: {
+       *       format: function(x) {
+       *           return x.getFullYear();
+       *       }
+       *     }
+       *   }
+       * }
+       */
+						axis_y_tick_format: undefined,
+
+						/**
+       * Show y axis outer tick.
+       * @name axis:y:tick:outer
+       * @memberof Options
+       * @type {Boolean}
+       * @default true
+       * @example
+       * axis: {
+       *   y: {
+       *     tick: {
+       *       outer: false
+       *     }
+       *   }
+       * }
+       */
+						axis_y_tick_outer: !0,
+
+						/**
+       * Set y axis tick values manually.
+       * @name axis:y:tick:values
+       * @memberof Options
+       * @type {Array}
+       * @default null
+       * @example
+       * axis: {
+       *   y: {
+       *     tick: {
+       *       values: [100, 1000, 10000]
+       *     }
+       *   }
+       * }
+       */
+						axis_y_tick_values: null,
+						axis_y_tick_rotate: 0,
+
+						/**
+       * Set the number of y axis ticks.<br><br>
+       * <b>Note:</b> The position of the ticks will be calculated precisely, so the values on the ticks will not be rounded nicely. In the case, axis.y.tick.format or axis.y.tick.values will be helpful.
+       * @name axis:y:tick:count
+       * @memberof Options
+       * @type {Number}
+       * @default undefined
+       * @example
+       * axis: {
+       *   y: {
+       *     tick: {
+       *       count: 5
+       *     }
+       *   }
+       * }
+       */
+						axis_y_tick_count: undefined,
+
+						/**
+       * Set the number of y axis ticks.<br><br>
+       * <b>Note:</b> The position of the ticks will be calculated precisely, so the values on the ticks will not be rounded nicely. In the case, axis.y.tick.format or axis.y.tick.values will be helpful.
+       * @name axis:y:tick:time
+       * @memberof Options
+       * @private
+       * @type {Object}
+       * @property {Function} [time.value] D3's time interval function (https://github.com/d3/d3-time#intervals)
+       * @example
+       * axis: {
+       *   y: {
+       *     tick: {
+       *       time: {
+       *          // ticks at 15-minute intervals
+       *          // https://github.com/d3/d3-scale/blob/master/README.md#time_ticks
+       *          value: d3.timeMinute.every(15)
+       *       }
+       *     }
+       *   }
+       * }
+       */
+						// @TODO: not fully implemented yet
+						axis_y_tick_time_value: undefined,
+
+						/**
+       * Set padding for y axis.<br><br>
+       * You can set padding for y axis to create more space on the edge of the axis. This option accepts object and it can include top and bottom. top, bottom will be treated as pixels.
+       * @name axis:y:padding
+       * @memberof Options
+       * @type {Object}
+       * @default {}
+       * @example
+       * axis: {
+       *   y: {
+       *     padding: {
+       *       top: 0,
+       *       bottom: 0
+       *     }
+       *   }
+       * }
+       */
+						axis_y_padding: {},
+
+						/**
+       * Set default range of y axis.<br><br>
+       * This option set the default value for y axis when there is no data on init.
+       * @name axis:y:default
+       * @memberof Options
+       * @type {Array}
+       * @default undefined
+       * @example
+       * axis: {
+       *   y: {
+       *     default: [0, 1000]
+       *   }
+       * }
+       */
+						axis_y_default: undefined,
+
+						/**
+       * Show or hide y2 axis.
+       * @name axis:y2:show
+       * @memberof Options
+       * @type {Array}
+       * @default false
+       * @example
+       * axis: {
+       *   y2: {
+       *     show: true
+       *   }
+       * }
+       */
+						axis_y2_show: !1,
+
+						/**
+       * Set max value of y2 axis.
+       * @name axis:y2:max
+       * @memberof Options
+       * @type {Number}
+       * @default undefined
+       * @example
+       * axis: {
+       *   y2: {
+       *     max: 1000
+       *   }
+       * }
+       */
+						axis_y2_max: undefined,
+
+						/**
+       * Set min value of y2 axis.
+       * @name axis:y2:min
+       * @memberof Options
+       * @type {Number}
+       * @default undefined
+       * @example
+       * axis: {
+       *   y2: {
+       *     min: -1000
+       *   }
+       * }
+       */
+						axis_y2_min: undefined,
+
+						/**
+       * Change the direction of y2 axis.<br><br>
+       * If true set, the direction will be from the top to the bottom.
+       * @name axis:y2:inverted
+       * @memberof Options
+       * @type {Boolean}
+       * @default false
+       * @example
+       * axis: {
+       *   y2: {
+       *     inverted: true
+       *   }
+       * }
+       */
+						axis_y2_inverted: !1,
+
+						/**
+       * Set center value of y2 axis.
+       * @name axis:y2:center
+       * @memberof Options
+       * @type {Number}
+       * @default undefined
+       * @example
+       * axis: {
+       *   y2: {
+       *     center: 0
+       *   }
+       * }
+       */
+						axis_y2_center: undefined,
+
+						/**
+       * Show y2 axis inside of the chart.
+       * @name axis:y2:inner
+       * @memberof Options
+       * @type {Boolean}
+       * @default false
+       * @example
+       * axis: {
+       *   y2: {
+       *     inner: true
+       *   }
+       * }
+       */
+						axis_y2_inner: !1,
+
+						/**
+       * Set label on y2 axis.<br><br>
+       * You can set y2 axis label and change its position by this option. This option works in the same way as axis.x.label.
+       * @name axis:y2:label
+       * @memberof Options
+       * @type {String|Object}
+       * @default {}
+       * @example
+       * axis: {
+       *   y2: {
+       *     label: "Your Y2 Axis"
+       *   }
+       * }
+       *
+       * axis: {
+       *   y2: {
+       *     label: {
+       *        text: "Your Y2 Axis",
+       *        position: "outer-middle"
+       *     }
+       *   }
+       * }
+       */
+						axis_y2_label: {},
+
+						/**
+       * Set formatter for y2 axis tick text.<br><br>
+       * This option works in the same way as axis.y.format.
+       * @name axis:y2:tick:format
+       * @memberof Options
+       * @type {Function}
+       * @default undefined
+       * @example
+       * axis: {
+       *   y2: {
+       *     tick: {
+       *       format: d3.format("$,")
+       *       //or format: function(d) { return "$" + d; }
+       *     }
+       *   }
+       * }
+       */
+						axis_y2_tick_format: undefined,
+
+						/**
+       * Show or hide y2 axis outer tick.
+       * @name axis:y2:tick:outer
+       * @memberof Options
+       * @type {Boolean}
+       * @default true
+       * @example
+       * axis: {
+       *   y2: {
+       *     tick: {
+       *       outer: false
+       *     }
+       *   }
+       * }
+       */
+						axis_y2_tick_outer: !0,
+
+						/**
+       * Set y2 axis tick values manually.
+       * @name axis:y2:tick:values
+       * @memberof Options
+       * @type {Array}
+       * @default null
+       * @example
+       * axis: {
+       *   y2: {
+       *     tick: {
+       *       values: [100, 1000, 10000]
+       *     }
+       *   }
+       * }
+       */
+						axis_y2_tick_values: null,
+
+						/**
+       * Set the number of y2 axis ticks.
+       * <b>Note:</b> This works in the same way as axis.y.tick.count.
+       * @name axis:y2:tick:count
+       * @memberof Options
+       * @type {Number}
+       * @default undefined
+       * @example
+       * axis: {
+       *   y2: {
+       *     tick: {
+       *       count: 5
+       *     }
+       *   }
+       * }
+       */
+						axis_y2_tick_count: undefined,
+
+						/**
+       * Set the number of y2 axis ticks.
+       * <b>Note:</b> This works in the same way as axis.y.tick.count.
+       * @name axis:y2:padding
+       * @memberof Options
+       * @type {Number}
+       * @default {}
+       * @example
+       * axis: {
+       *   y2: {
+       *     padding: {
+       *       top: 100,
+       *       bottom: 100
+       *     }
+       *   }
+       * }
+       */
+						axis_y2_padding: {},
+
+						/**
+       * Set default range of y2 axis.<br><br>
+       * This option set the default value for y2 axis when there is no data on init.
+       * @name axis:y2:default
+       * @memberof Options
+       * @type {Array}
+       * @default undefined
+       * @example
+       * axis: {
+       *   y2: {
+       *     default: [0, 1000]
+       *   }
+       * }
+       */
+						axis_y2_default: undefined,
+
+						/**
+       * Set related options
+       * @name grid
+       * @memberof Options
+       * @type {Object}
+       * @property {Boolean} [x.show=false] Show grids along x axis.
+       * @property {Boolean} [x.lines=[]] Show additional grid lines along x axis.<br>
+       *  This option accepts array including object that has value, text, position and class. text, position and class are optional. For position, start, middle and end (default) are available.
+       *  If x axis is category axis, value can be category name. If x axis is timeseries axis, value can be date string, Date object and unixtime integer.
+       * @property {Boolean} [y.show=false] Show grids along x axis.
+       * @property {Boolean} [y.lines=[]] Show additional grid lines along y axis.<br>
+       *  This option accepts array including object that has value, text, position and class.
+       * @property {Boolean} [y.ticks=10]
+       * @property {Boolean} [focus.show=true] Show grids when focus.
+       * @property {Boolean} [lines.front=true]
+       * @default undefined
+       * @example
+       * grid: {
+       *   x: {
+       *     show: true,
+       *     lines: [
+       *       {value: 2, text: "Label on 2"},
+       *       {value: 5, text: "Label on 5", class: "label-5"}
+       *       {value: 6, text: "Label on 6", position: "start"}
+       *     ]
+       *   },
+       * 	 y: {
+       *     show: true,
+       *     lines: [
+       *       {value: 100, text: "Label on 100"},
+       *       {value: 200, text: "Label on 200", class: "label-200"}
+       *       {value: 300, text: "Label on 300", position: 'middle'}
+       *     ],
+       *     ticks: 5
+       *   },
+       *   focus: {
+       *      show: false
+       *   },
+       *   lines: {
+       *      front: false
+       *   }
+       * }
+       */
+						grid_x_show: !1,
+						grid_x_type: "tick",
+						grid_x_lines: [],
+						grid_y_show: !1,
+						grid_y_lines: [],
+						grid_y_ticks: 10,
+						grid_focus_show: !0,
+						grid_lines_front: !0,
+
+						/**
+       * Set point options
+       * @name point
+       * @memberof Options
+       * @type {Object}
+       * @property {Boolean} [point.show=true] Whether to show each point in line.
+       * @property {Number} [point.r=2.5] The radius size of each point.
+       * @property {Boolean} [point.focus.expand.enabled=true] Whether to expand each point on focus.
+       * @property {Boolean} [point.focus.expand.r=point.r*1.75] The radius size of each point on focus.
+       * @property {Number} [point.select.r=point.r*4] The radius size of each point on selected.
+       * @example
+       *  point: {
+       *      show: false,
+       *      r: 5,
+       *      focus: {
+       *          expand: {
+       *              enabled: true,
+       *              r: 1
+       *          }
+       *      },
+       *      select: {
+       *          r: 3
+       *      }
+       *  }
+       */
+						point_show: !0,
+						point_r: 2.5,
+						point_sensitivity: 10,
+						point_focus_expand_enabled: !0,
+						point_focus_expand_r: undefined,
+						point_select_r: undefined,
+
+						/**
+       * Set line options
+       * @name line
+       * @memberof Options
+       * @type {Object}
+       * @property {Boolean} [line.connectNull=false] Set if null data point will be connected or not.<br>
+       *  If true set, the region of null data will be connected without any data point. If false set, the region of null data will not be connected and get empty.
+       * @property {Boolean} [line.step_type=step] Change step type for step chart.<br>
+       * <b>Available values:</b>
+       * - step
+       * - step-before
+       * - step-after
+       * @example
+       *  line: {
+       *      connectNull: true,
+       *      step: {
+       *          type: "step-after"
+       *      }
+       *  }
+       */
+						line_connectNull: !1,
+						line_step_type: "step",
+
+						/**
+       * Set bar options
+       * @name bar
+       * @memberof Options
+       * @type {Object}
+       * @property {Number} [bar.width] Change the width of bar chart.
+       * @property {Number} [bar.width.ratio=0.6] Change the width of bar chart by ratio.
+       * @property {Number} [bar.width.max]
+       * @property {Boolean} [bar.zerobased=true] Set if min or max value will be 0 on bar chart.
+       * @example
+       *  bar: {
+       *      width: 10,
+       *      // or
+       *      width: {
+       *          ratio: 0.2,
+       *          max: 200
+       *      },
+       *      zerobased: false
+       *  }
+       */
+						bar_width: undefined,
+						bar_width_ratio: 0.6,
+						bar_width_max: undefined,
+						bar_zerobased: !0,
+
+						/**
+       * Set area options
+       * @name area
+       * @memberof Options
+       * @type {Object}
+       * @property {Boolean} [area.zerobased=true] Set if min or max value will be 0 on area chart.
+       * @property {Boolean} [area.above=false]
+       * @example
+       *  area: {
+       *      zerobased: false,
+       *      above: true
+       *  }
+       */
+						area_zerobased: !0,
+						area_above: !1,
+
+						/**
+       * Set pie options
+       * @name pie
+       * @memberof Options
+       * @type {Object}
+       * @property {Boolean} [pie.label.show=true] Show or hide label on each pie piece.
+       * @property {Function} [pie.label.format] Set formatter for the label on each pie piece.
+       * @property {Number} [pie.label.threshold=0.05] Set threshold to show/hide labels.
+       * @property {Boolean} [pie.expand=true] Enable or disable expanding pie pieces.
+       * @property {Number} [pie.padAngle=0] Set padding between data.
+       * @example
+       *  pie: {
+       *      label: {
+       *          show: false,
+       *          format: function(value, ratio, id) {
+       *              return d3.format("$")(value);
+       *          },
+       *          threshold: 0.1
+       *      },
+       *      expand: false,
+       *      padAngle: 0.1
+       *  }
+       */
+						pie_label_show: !0,
+						pie_label_format: undefined,
+						pie_label_threshold: 0.05,
+						pie_label_ratio: undefined,
+						pie_expand: {},
+						pie_expand_duration: 50,
+						pie_padAngle: 0,
+
+						/**
+       * Set gauge options
+       * @name gauge
+       * @memberof Options
+       * @type {Object}
+       * @property {Boolean} [gauge.fullCircle=false]
+       * @property {Boolean} [gauge.label.show=true] Show or hide label on gauge.
+       * @property {Function} [gauge.label.format] Set formatter for the label on gauge.
+       * @property {Boolean} [gauge.expand=true] Enable or disable expanding gauge.
+       * @property {Number} [gauge.expand.duration=50]
+       * @property {Number} [gauge.min=0] Set min value of the gauge.
+       * @property {Number} [gauge.max=100] Set max value of the gauge.
+       * @property {Number} [gauge.startingAngle=-1 * Math.PI / 2]
+       * @property {String} [gauge.units] Set units of the gauge.
+       * @property {Number} [gauge.width] Set width of gauge chart.
+       * @example
+       *  gauge: {
+       *      label: {
+       *          show: false,
+       *          format: function(value, ratio) {
+       *              return value;
+       *          }
+       *      },
+       *      expand: false,
+       *      min: -100,
+       *      max: 200,
+       *      units: "%",
+       *      width: 10
+       *  }
+       */
+						gauge_fullCircle: !1,
+						gauge_label_show: !0,
+						gauge_label_format: undefined,
+						gauge_min: 0,
+						gauge_max: 100,
+						gauge_startingAngle: -1 * Math.PI / 2,
+						gauge_label_extents: undefined,
+						gauge_units: undefined,
+						gauge_width: undefined,
+						gauge_expand: {},
+						gauge_expand_duration: 50,
+
+						/**
+       * Set donut options
+       * @name donut
+       * @memberof Options
+       * @type {Object}
+       * @property {Boolean} [donut.label.show=true] Show or hide label on each donut piece.
+       * @property {Function} [donut.label.format] Set formatter for the label on each donut piece.
+       * @property {Number} [donut.label.threshold=0.05] Set threshold to show/hide labels.
+       * @property {Boolean} [donut.expand=true] Enable or disable expanding donut pieces.
+       * @property {Number} [donut.width] Set width of donut chart.
+       * @property {String} [donut.title=""] Set title of donut chart.
+       * @property {Number} [donut.padAngle=0] Set padding between data.
+       * @example
+       *  donut: {
+       *      label: {
+       *          show: false,
+       *          format: function(value, ratio, id) {
+       *              return d3.format("$")(value);
+       *          },
+       *          threshold: 0.1
+       *      },
+       *      expand: false,
+       *      width: 10,
+       *      title: "Donut Title",
+       *      padAngle: 0.2
+       *  }
+       */
+						donut_label_show: !0,
+						donut_label_format: undefined,
+						donut_label_threshold: 0.05,
+						donut_label_ratio: undefined,
+						donut_width: undefined,
+						donut_title: "",
+						donut_expand: {},
+						donut_expand_duration: 50,
+						donut_padAngle: 0,
+
+						/**
+       * Set spline options
+       * @name spline
+       * @memberof Options
+       * @type {Object}
+       * @property {String} [spline.interpolation.type=cardinal]
+       * @example
+       *  spline: {
+       *      interpolation: {
+       *          type: "cardinal"
+       *      }
+       *  }
+       */
+						spline_interpolation_type: "cardinal",
+
+						/**
+       * Show rectangles inside the chart.<br><br>
+       * This option accepts array including object that has axis, start, end and class. The keys start, end and class are optional.
+       * axis must be x, y or y2. start and end should be the value where regions start and end. If not specified, the edge values will be used. If timeseries x axis, date string, Date object and unixtime integer can be used. If class is set, the region element will have it as class.
+       * @name regions
+       * @memberof Options
+       * @type {Array}
+       * @default []
+       * @example
+       *  regions: [
+       *	 {
+       *	     axis: "x",
+       *	     start: 1,
+       *	     end: 4,
+       *	     class: "region-1-4"
+       *	 }
+       *  ]
+       */
+						regions: [],
+
+						/**
+       * Tooltip options
+       * @name tooltip
+       * @memberof Options
+       * @type {Object}
+       * @property {Boolean} [tooltip.show=true] Show or hide tooltip.<br>
+       * @property {Boolean} [tooltip.grouped=true] Set if tooltip is grouped or not for the data points.
+       * @property {Function} [tooltip.format.title] Set format for the title of tooltip.<br>
+       *  Specified function receives x of the data point to show.
+       * @property {Function} [tooltip.format.name] Set format for the name of each data in tooltip.<br>
+       *  Specified function receives name, ratio, id and index of the data point to show. ratio will be undefined if the chart is not donut/pie/gauge.
+       * @property {Function} [tooltip.format.value] Set format for the value of each data in tooltip.<br>
+       *  Specified function receives name, ratio, id and index of the data point to show. ratio will be undefined if the chart is not donut/pie/gauge.
+       *  If undefined returned, the row of that value will be skipped.
+       * @property {function} [tooltip.position] Set custom position for the tooltip.<br>
+       *  This option can be used to modify the tooltip position by returning object that has top and left.
+       * @property {function} [tooltip.contents] Set custom HTML for the tooltip.<br>
+       *  Specified function receives data, defaultTitleFormat, defaultValueFormat and color of the data point to show. If tooltip.grouped is true, data includes multiple data points.
+       * @example
+       *  tooltip: {
+       *      show: true,
+       *      grouped: false,
+       *      format: {
+       *          title: function(x) { return "Data " + x; },
+       *          name: function(name, ratio, id, index) { return name; },
+       *          value: function(value, ratio, id, index) { return ratio; }
+       *      },
+       *      position: function(data, width, height, element) {
+       *          return {top: 0, left: 0}
+      		 *      },
+      		 *      contents: function(d, defaultTitleFormat, defaultValueFormat, color) {
+      		 *          return ... // formatted html as you want
+       		 *      }
+       *  }
+       */
+						tooltip_show: !0,
+						tooltip_grouped: !0,
+						tooltip_format_title: undefined,
+						tooltip_format_name: undefined,
+						tooltip_format_value: undefined,
+						tooltip_position: undefined,
+						tooltip_contents: function tooltip_contents(d, defaultTitleFormat, defaultValueFormat, color) {
+									return this.getTooltipContent ? this.getTooltipContent(d, defaultTitleFormat, defaultValueFormat, color) : "";
+						},
+						tooltip_init_show: !1,
+						tooltip_init_x: 0,
+						tooltip_init_position: {
+									top: "0px",
+									left: "50px"
+						},
+						tooltip_onshow: function tooltip_onshow() {},
+						tooltip_onhide: function tooltip_onhide() {},
+
+						/**
+       * Set title options
+       * @name title
+       * @memberof Options
+       * @type {Object}
+       * @property {String} [title.text]
+       * @property {Number} [title.padding.top=0]
+       * @property {Number} [title.padding.right=0]
+       * @property {Number} [title.padding.bottom=0]
+       * @property {Number} [title.padding.left=0]
+       * @property {String} [title.position=top-center]
+       * @example
+       *  title: {
+       *      text: "Title Text",
+       *      padding: {
+       *          top: 10,
+       *          right: 10,
+       *          bottom: 10,
+       *          left: 10
+       *      },
+       *      position: "top-center"
+       *  }
+       */
+						title_text: undefined,
+						title_padding: {
+									top: 0,
+									right: 0,
+									bottom: 0,
+									left: 0
+						},
+						title_position: "top-center"
+			};
+};
+
+exports.default = Options;
+module.exports = exports["default"];
+
+/***/ }),
+/* 59 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+exports.__esModule = !0;
+exports.d3 = exports.bb = undefined;
+
+var _d = __webpack_require__(2),
+    d3 = _interopRequireWildcard(_d),
+    _Chart = __webpack_require__(4),
+    _Chart2 = _interopRequireDefault(_Chart),
+    _ChartInternal = __webpack_require__(1),
+    _ChartInternal2 = _interopRequireDefault(_ChartInternal),
+    _Axis = __webpack_require__(7),
+    _Axis2 = _interopRequireDefault(_Axis),
+    _util = __webpack_require__(0),
+    util = _interopRequireWildcard(_util);
+
+__webpack_require__(57);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _interopRequireWildcard(obj) { if (obj && obj.__esModule) return obj; var newObj = {}; if (obj != null) for (var key in obj) Object.prototype.hasOwnProperty.call(obj, key) && (newObj[key] = obj[key]); return newObj.default = obj, newObj; }
+
+/**
+ * @namespace bb
+ * @version 1.0.0
+ */
+/**
+ * Copyright (c) 2017 NAVER Corp.
+ * billboard.js project is licensed under the MIT license
+ */
+var bb = {
+	/**
+  * Version information
+  * @property {String} version version
+  * @example
+  * 	bb.version;  // "1.0.0"
+  * @memberof bb
+  */
+	version: "1.0.0",
+	/**
+  * generate charts
+  * @param {Options} options chart options
+  * @memberof bb
+  * @return {Chart}
+  * @see {@link Options} for different generation options
+  * @see {@link Chart} for different methods API
+  * @example
+  *  <!-- chart holder -->
+  * <div id="LineChart"></div>
+  * @example
+  *   // generate chart with options
+  *  var chart = bb.generate({
+  *      "bindto": "#LineChart"
+  *      "data": {
+  *          "columns": [
+  *              ["data1", 30, 200, 100, 400, 150, 250],
+  *              ["data2", 50, 20, 10, 40, 15, 25]
+  *           ]
+  *      }
+  *  });
+  *
+  *  // call some API
+  *  // ex) get the data of 'data1'
+  *  chart.data("data1");
+  */
+	generate: function generate(config) {
+		return new _Chart2.default(config);
+	},
+
+	chart: {
+		fn: _Chart2.default.prototype,
+		internal: {
+			fn: _ChartInternal2.default.prototype,
+			axis: {
+				fn: _Axis2.default.prototype
+			}
+		}
+	}
+};
+
+for (var p in util) /^__/.test(p) || (_ChartInternal2.default.prototype[p] = util[p]);
+
+__webpack_require__(27), __webpack_require__(46), __webpack_require__(41), __webpack_require__(29), __webpack_require__(28), __webpack_require__(30), __webpack_require__(37), __webpack_require__(32), __webpack_require__(51), __webpack_require__(49), __webpack_require__(50), __webpack_require__(48), __webpack_require__(52), __webpack_require__(55), __webpack_require__(43), __webpack_require__(54), __webpack_require__(44), __webpack_require__(53), __webpack_require__(39), __webpack_require__(35), __webpack_require__(45), __webpack_require__(31), __webpack_require__(47), __webpack_require__(33), __webpack_require__(34), __webpack_require__(40), __webpack_require__(42), __webpack_require__(36), __webpack_require__(38), __webpack_require__(15), __webpack_require__(22), __webpack_require__(26), __webpack_require__(19), __webpack_require__(14), __webpack_require__(21), __webpack_require__(24), __webpack_require__(17), __webpack_require__(16), __webpack_require__(20), __webpack_require__(13), __webpack_require__(10), __webpack_require__(12), __webpack_require__(25), __webpack_require__(9), __webpack_require__(18), __webpack_require__(11), __webpack_require__(23), __webpack_require__(8), __webpack_require__(56);
+exports.bb = bb;
+exports.d3 = d3;
+
+/***/ }),
+/* 60 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+exports.__esModule = !0;
+/**
+ * Copyright (c) 2017 NAVER Corp.
+ * billboard.js project is licensed under the MIT license
+ */
+/* eslint-disable no-new-func, no-nested-ternary */
+var win = typeof window !== "undefined" && window.Math === Math ? window : typeof self !== "undefined" && self.Math === Math ? self : Function("return this")();
+/* eslint-enable no-new-func, no-nested-ternary */
+
+exports.window = win;
+var document = exports.document = win.document;
+
+/***/ })
+/******/ ]);
+});
+//# sourceMappingURL=billboard.js.map
+
+
+ + + + +
+ +
+ + + + + + + diff --git a/doc/index.html b/doc/index.html new file mode 100644 index 000000000..69da69617 --- /dev/null +++ b/doc/index.html @@ -0,0 +1,228 @@ + + + + + Home - Documentation + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+

billboard.js

billboard.js is a re-usable easy interface JavaScript chart library, based on D3 v4+.

+
+

The name "billboard" came from the famous billboard chart which everybody knows.

+

This project was forked from C3.js v0.4.11.

+ +
+

Documents

+

Download and Installation

Download dist files from repo directly or install it via npm.

+

For development (Uncompressed)

You can download the uncompressed files for development

+

Latest

    +
  • http://naver.github.io/billboard.js/release/latest/dist/billboard.js
  • +
  • http://naver.github.io/billboard.js/release/latest/dist/billboard.css
  • +
+

Specific version

    +
  • http://naver.github.io/billboard.js/release/[VERSION]/dist/billboard.js
  • +
  • http://naver.github.io/billboard.js/release/[VERSION]/dist/billboard.css
  • +
+

For production (Compressed)

You can download the compressed files for production

+

Latest

    +
  • http://naver.github.io/billboard.js/release/latest/dist/billboard.min.js
  • +
  • http://naver.github.io/billboard.js/release/latest/dist/billboard.min.css
  • +
+

Specific version

    +
  • http://naver.github.io/billboard.js/release/[VERSION]/dist/billboard.min.js
  • +
  • http://naver.github.io/billboard.js/release/[VERSION]/dist/billboard.min.css
  • +
+

Packaged version (with D3.js inclusion)

+

Packaged version is not an official distribution. +Is just to provide for ease use of 'billboard.js' with dependency.

+
+
    +
  • Latest
      +
    • http://naver.github.io/billboard.js/release/latest/dist/billboard.pkgd.js
    • +
    • http://naver.github.io/billboard.js/release/latest/dist/billboard.pkgd.min.js
    • +
    +
  • +
  • Specific version
      +
    • http://naver.github.io/billboard.js/release/[VERSION]/dist/billboard.pkgd.js
    • +
    • http://naver.github.io/billboard.js/release/[VERSION]/dist/billboard.pkgd.min.js
    • +
    +
  • +
+

Installation with npm

The following command shows how to install billboard.js using npm.

+
$ npm install billboard.js

Supported Browsers

+

Basically will work on all browsers which has SVG support.

+
+ + + + + + + + + + + + + + + + + + + + + +
Internet ExplorerChromeFirefoxSafariiOSAndroid
9+LatestLatestLatest8+4+
+

Dependency

+ + + + + + + + + + +
D3 (required)
4+
+

Load billboard.js after D3.js.

+
<!-- 1) Load D3.js and billboard.js separately -->
+    <!-- Load D3 -->
+    <script src="https://d3js.org/d3.v4.min.js"></script>
+
+    <!-- Load billboard.js with base style -->
+    <link rel="stylesheet" href="billboard.css">
+    <script src="billboard.js"></script>
+
+<!-- 2) or Load billboard.js packaged with D3.js -->
+    <link rel="stylesheet" href="billboard.css">
+    <script src="billboard.pkgd.js"></script>
+

Note
For migration from C3.js, checkout the migration guide

+
+

Basic usage example

1) Create chart holder element

<div id="chart"></div>

2) Generate chart with options

// generate the chart
+var chart = bb.generate({
+    bindto: "#chart",
+    data: {
+        type: "line",
+        columns: [
+            ["data1", 30, 200, 100, 400, 150, 250]
+        ]
+    }
+});
+
+// call some API
+chart.load( ... );

How to start developing billboard.js?

For anyone interested to develop billboard.js, follow the instructions below.

+

Development Environment

1. Clone the repository

Clone the billboard.js repository and install the dependency modules.

+
# Create and move a folder.
+$ mkdir billboard.js && cd billboard.js
+
+# Clone the repository.
+$ git clone https://github.com/naver/billboard.js.git

2. Install dependencies

npm and Yarn are supported.

+
# Install the dependency modules.
+$ npm install
+
+# or
+$ yarn

3. Build

Use npm script to build billboard.js

+
# Run webpack-dev-server for development
+$ npm start
+
+# Build
+$ npm run build
+
+# Generate jsdoc
+$ npm run jsdoc

Two folders will be created after complete build is completed.

+
    +
  • dist folder: Includes the billboard.js and billboard.min.js files.
  • +
  • doc folder: Includes API documentation. The home page for the documentation is doc/index.html.
  • +
+

Linting

To keep the same code style, we adopted ESLint to maintain our code quality. The rules are modified version based on Airbnb JavaScript Style Guide. +Setup your editor for check or run below command for linting.

+
$ npm run lint

Test

Once you created a branch and done with development, you must perform a test running npm run test command before you push code to a remote repository.

+
$ npm run test

Running a npm run test command will start Mocha tests via Karma-runner.

+

Bug Report

If you find a bug, please report to us posting issues on GitHub.

+

License

billboard.js is released under the MIT license.

+
Copyright (c) 2017 NAVER Corp.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+ + + + + + +
+ +
+ + + + + + + \ No newline at end of file diff --git a/doc/scripts/linenumber.js b/doc/scripts/linenumber.js new file mode 100644 index 000000000..8d52f7eaf --- /dev/null +++ b/doc/scripts/linenumber.js @@ -0,0 +1,25 @@ +/*global document */ +(function() { + var source = document.getElementsByClassName('prettyprint source linenums'); + var i = 0; + var lineNumber = 0; + var lineId; + var lines; + var totalLines; + var anchorHash; + + if (source && source[0]) { + anchorHash = document.location.hash.substring(1); + lines = source[0].getElementsByTagName('li'); + totalLines = lines.length; + + for (; i < totalLines; i++) { + lineNumber++; + lineId = 'line' + lineNumber; + lines[i].id = lineId; + if (lineId === anchorHash) { + lines[i].className += ' selected'; + } + } + } +})(); diff --git a/doc/scripts/prettify/Apache-License-2.0.txt b/doc/scripts/prettify/Apache-License-2.0.txt new file mode 100644 index 000000000..d64569567 --- /dev/null +++ b/doc/scripts/prettify/Apache-License-2.0.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/doc/scripts/prettify/lang-css.js b/doc/scripts/prettify/lang-css.js new file mode 100644 index 000000000..041e1f590 --- /dev/null +++ b/doc/scripts/prettify/lang-css.js @@ -0,0 +1,2 @@ +PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\f\r ]+/,null," \t\r\n "]],[["str",/^"(?:[^\n\f\r"\\]|\\(?:\r\n?|\n|\f)|\\[\S\s])*"/,null],["str",/^'(?:[^\n\f\r'\\]|\\(?:\r\n?|\n|\f)|\\[\S\s])*'/,null],["lang-css-str",/^url\(([^"')]*)\)/i],["kwd",/^(?:url|rgb|!important|@import|@page|@media|@charset|inherit)(?=[^\w-]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*)\s*:/i],["com",/^\/\*[^*]*\*+(?:[^*/][^*]*\*+)*\//],["com", +/^(?:<\!--|--\>)/],["lit",/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],["lit",/^#[\da-f]{3,6}/i],["pln",/^-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*/i],["pun",/^[^\s\w"']+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[["kwd",/^-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[["str",/^[^"')]+/]]),["css-str"]); diff --git a/doc/scripts/prettify/prettify.js b/doc/scripts/prettify/prettify.js new file mode 100644 index 000000000..eef5ad7e6 --- /dev/null +++ b/doc/scripts/prettify/prettify.js @@ -0,0 +1,28 @@ +var q=null;window.PR_SHOULD_USE_CONTINUATION=!0; +(function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var b=a.charAt(1);return(f=r[b])?f:"0"<=b&&b<="7"?parseInt(a.substring(1),8):b==="u"||b==="x"?parseInt(a.substring(2),16):a.charCodeAt(1)}function e(a){if(a<32)return(a<16?"\\x0":"\\x")+a.toString(16);a=String.fromCharCode(a);if(a==="\\"||a==="-"||a==="["||a==="]")a="\\"+a;return a}function h(a){for(var f=a.substring(1,a.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),a= +[],b=[],o=f[0]==="^",c=o?1:0,i=f.length;c122||(d<65||j>90||b.push([Math.max(65,j)|32,Math.min(d,90)|32]),d<97||j>122||b.push([Math.max(97,j)&-33,Math.min(d,122)&-33]))}}b.sort(function(a,f){return a[0]-f[0]||f[1]-a[1]});f=[];j=[NaN,NaN];for(c=0;ci[0]&&(i[1]+1>i[0]&&b.push("-"),b.push(e(i[1])));b.push("]");return b.join("")}function y(a){for(var f=a.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),b=f.length,d=[],c=0,i=0;c=2&&a==="["?f[c]=h(j):a!=="\\"&&(f[c]=j.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return f.join("")}for(var t=0,s=!1,l=!1,p=0,d=a.length;p=5&&"lang-"===b.substring(0,5))&&!(o&&typeof o[1]==="string"))c=!1,b="src";c||(r[f]=b)}i=d;d+=f.length;if(c){c=o[1];var j=f.indexOf(c),k=j+c.length;o[2]&&(k=f.length-o[2].length,j=k-c.length);b=b.substring(5);B(l+i,f.substring(0,j),e,p);B(l+i+j,c,C(b,c),p);B(l+i+k,f.substring(k),e,p)}else p.push(l+i,b)}a.e=p}var h={},y;(function(){for(var e=a.concat(m), +l=[],p={},d=0,g=e.length;d=0;)h[n.charAt(k)]=r;r=r[1];n=""+r;p.hasOwnProperty(n)||(l.push(r),p[n]=q)}l.push(/[\S\s]/);y=L(l)})();var t=m.length;return e}function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?m.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/, +q,"'\"`"]):m.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&e.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var h=a.hashComments;h&&(a.cStyleComments?(h>1?m.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):m.push(["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),e.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,q])):m.push(["com",/^#[^\n\r]*/, +q,"#"]));a.cStyleComments&&(e.push(["com",/^\/\/[^\n\r]*/,q]),e.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));a.regexLiterals&&e.push(["lang-regex",/^(?:^^\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\(|\*|\*=|\+=|,|-=|->|\/|\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\^=|\^\^|\^\^=|{|\||\|=|\|\||\|\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\s*(\/(?=[^*/])(?:[^/[\\]|\\[\S\s]|\[(?:[^\\\]]|\\[\S\s])*(?:]|$))+\/)/]);(h=a.types)&&e.push(["typ",h]);a=(""+a.keywords).replace(/^ | $/g, +"");a.length&&e.push(["kwd",RegExp("^(?:"+a.replace(/[\s,]+/g,"|")+")\\b"),q]);m.push(["pln",/^\s+/,q," \r\n\t\xa0"]);e.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,q],["pun",/^.[^\s\w"-$'./@\\`]*/,q]);return x(m,e)}function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.className))break;if("BR"===a.nodeName)h(a), +a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)e(a);break;case 3:case 4:if(p){var b=a.nodeValue,d=b.match(t);if(d){var c=b.substring(0,d.index);a.nodeValue=c;(b=b.substring(d.index+d[0].length))&&a.parentNode.insertBefore(s.createTextNode(b),a.nextSibling);h(a);c||a.parentNode.removeChild(a)}}}}function h(a){function b(a,d){var e=d?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),g=a.nextSibling;f.appendChild(e);for(var h=g;h;h=g)g=h.nextSibling,f.appendChild(h)}return e} +for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),e;(e=a.parentNode)&&e.nodeType===1;)a=e;d.push(a)}var k=/(?:^|\s)nocode(?:\s|$)/,t=/\r\n?|\n/,s=a.ownerDocument,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=s.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);for(l=s.createElement("LI");a.firstChild;)l.appendChild(a.firstChild);for(var d=[l],g=0;g=0;){var h=m[e];A.hasOwnProperty(h)?window.console&&console.warn("cannot override language handler %s",h):A[h]=a}}function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\s*=o&&(h+=2);e>=c&&(a+=2)}}catch(w){"console"in window&&console.log(w&&w.stack?w.stack:w)}}var v=["break,continue,do,else,for,if,return,while"],w=[[v,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"], +"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],F=[w,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],G=[w,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"], +H=[G,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"],w=[w,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],I=[v,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"], +J=[v,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],v=[v,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],K=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/,N=/\S/,O=u({keywords:[F,H,w,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END"+ +I,J,v],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),A={};k(O,["default-code"]);k(x([],[["pln",/^[^]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]), +["default-markup","htm","html","mxml","xhtml","xml","xsl"]);k(x([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css", +/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);k(x([],[["atv",/^[\S\s]+/]]),["uq.val"]);k(u({keywords:F,hashComments:!0,cStyleComments:!0,types:K}),["c","cc","cpp","cxx","cyc","m"]);k(u({keywords:"null,true,false"}),["json"]);k(u({keywords:H,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:K}),["cs"]);k(u({keywords:G,cStyleComments:!0}),["java"]);k(u({keywords:v,hashComments:!0,multiLineStrings:!0}),["bsh","csh","sh"]);k(u({keywords:I,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}), +["cv","py"]);k(u({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["perl","pl","pm"]);k(u({keywords:J,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb"]);k(u({keywords:w,cStyleComments:!0,regexLiterals:!0}),["js"]);k(u({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes", +hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);k(x([],[["str",/^[\S\s]+/]]),["regex"]);window.prettyPrintOne=function(a,m,e){var h=document.createElement("PRE");h.innerHTML=a;e&&D(h,e);E({g:m,i:e,h:h});return h.innerHTML};window.prettyPrint=function(a){function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Infinity;p=0){var k=k.match(g),f,b;if(b= +!k){b=n;for(var o=void 0,c=b.firstChild;c;c=c.nextSibling)var i=c.nodeType,o=i===1?o?b:c:i===3?N.test(c.nodeValue)?b:o:o;b=(f=o===b?void 0:o)&&"CODE"===f.tagName}b&&(k=f.className.match(g));k&&(k=k[1]);b=!1;for(o=n.parentNode;o;o=o.parentNode)if((o.tagName==="pre"||o.tagName==="code"||o.tagName==="xmp")&&o.className&&o.className.indexOf("prettyprint")>=0){b=!0;break}b||((b=(b=n.className.match(/\blinenums\b(?::(\d+))?/))?b[1]&&b[1].length?+b[1]:!0:!1)&&D(n,b),d={g:k,h:n,i:b},E(d))}}p ul { + padding: 0 10px; +} + +nav > ul > li > a { + color: #606; +} + +nav ul ul { + margin-bottom: 10px +} + +nav ul ul + ul { + margin-top: -10px; +} + +nav ul ul a { + color: hsl(207, 1%, 60%); + border-left: 1px solid hsl(207, 10%, 86%); +} + +nav ul ul a, +nav ul ul a:active { + padding-left: 20px +} + +nav h2 { + font-size: 12px; + margin: 0; + padding: 0; +} + +nav > h2 > a { + display: block; + margin: 10px 0 -10px; + color: #606 !important; +} + +footer { + color: hsl(0, 0%, 28%); + margin-left: 250px; + display: block; + padding: 15px; + font-style: italic; + font-size: 90%; +} + +.ancestors { + color: #999 +} + +.ancestors a { + color: #999 !important; +} + +.clear { + clear: both +} + +.important { + font-weight: bold; + color: #950B02; +} + +.yes-def { + text-indent: -1000px +} + +.type-signature { + color: #CA79CA +} + +.type-signature:last-child { + color: #eee; +} + +.name, .signature { + font-family: Consolas, Monaco, 'Andale Mono', monospace +} + +.signature { + color: #fc83ff; +} + +.details { + margin-top: 6px; + border-left: 2px solid #DDD; + line-height: 20px; + font-size: 14px; +} + +.details dt { + width: 120px; + float: left; + padding-left: 10px; +} + +.details dd { + margin-left: 70px; + margin-top: 6px; + margin-bottom: 6px; +} + +.details ul { + margin: 0 +} + +.details ul { + list-style-type: none +} + +.details pre.prettyprint { + margin: 0 +} + +.details .object-value { + padding-top: 0 +} + +.description { + margin-bottom: 1em; + margin-top: 1em; +} + +.code-caption { + font-style: italic; + font-size: 107%; + margin: 0; +} + +.prettyprint { + font-size: 14px; + overflow: auto; +} + +.prettyprint.source { + width: inherit; + line-height: 18px; + display: block; + background-color: #0d152a; + color: #aeaeae; +} + +.prettyprint code { + line-height: 18px; + display: block; + background-color: #0d152a; + color: #4D4E53; +} + +.prettyprint > code { + padding: 15px; +} + +.prettyprint .linenums code { + padding: 0 15px +} + +.prettyprint .linenums li:first-of-type code { + padding-top: 15px +} + +.prettyprint code span.line { + display: inline-block +} + +.prettyprint.linenums { + padding-left: 70px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.prettyprint.linenums ol { + padding-left: 0 +} + +.prettyprint.linenums li { + border-left: 3px #34446B solid; +} + +.prettyprint.linenums li.selected, .prettyprint.linenums li.selected * { + background-color: #34446B; +} + +.prettyprint.linenums li * { + -webkit-user-select: text; + -moz-user-select: text; + -ms-user-select: text; + user-select: text; +} + +.params, .props { + border-spacing: 0; + border: 1px solid #ddd; + border-collapse: collapse; + border-radius: 3px; + box-shadow: 0 1px 3px rgba(0,0,0,0.1); + width: 100%; + font-size: 14px; + margin: 1em 0; +} + +.params .type { + white-space: nowrap; +} + +.params code { + white-space: pre; +} + +.params td, .params .name, .props .name, .name code { + color: #4D4E53; + font-family: Consolas, Monaco, 'Andale Mono', monospace; + font-size: 100%; +} + +.params td, .params th, .props td, .props th { + margin: 0px; + text-align: left; + vertical-align: top; + padding: 10px; + display: table-cell; +} + +.params td { + border-top: 1px solid #eee +} + +.params thead tr, .props thead tr { + background-color: #fff; + font-weight: bold; +} + +.params .params thead tr, .props .props thead tr { + background-color: #fff; + font-weight: bold; +} + +.params td.description > p:first-child, .props td.description > p:first-child { + margin-top: 0; + padding-top: 0; +} + +.params td.description > p:last-child, .props td.description > p:last-child { + margin-bottom: 0; + padding-bottom: 0; +} + +span.param-type, .params td .param-type, .param-type dd { + color: #606; + font-family: Consolas, Monaco, 'Andale Mono', monospace +} + +.param-type dt, .param-type dd { + display: inline-block +} + +.param-type { + margin: 14px 0; +} + +.disabled { + color: #454545 +} + +/* navicon button */ +.navicon-button { + display: none; + position: relative; + padding: 2.0625rem 1.5rem; + transition: 0.25s; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + opacity: .8; +} +.navicon-button .navicon:before, .navicon-button .navicon:after { + transition: 0.25s; +} +.navicon-button:hover { + transition: 0.5s; + opacity: 1; +} +.navicon-button:hover .navicon:before, .navicon-button:hover .navicon:after { + transition: 0.25s; +} +.navicon-button:hover .navicon:before { + top: .825rem; +} +.navicon-button:hover .navicon:after { + top: -.825rem; +} + +/* navicon */ +.navicon { + position: relative; + width: 2.5em; + height: .3125rem; + background: #000; + transition: 0.3s; + border-radius: 2.5rem; +} +.navicon:before, .navicon:after { + display: block; + content: ""; + height: .3125rem; + width: 2.5rem; + background: #000; + position: absolute; + z-index: -1; + transition: 0.3s 0.25s; + border-radius: 1rem; +} +.navicon:before { + top: .625rem; +} +.navicon:after { + top: -.625rem; +} + +/* open */ +.nav-trigger:checked + label:not(.steps) .navicon:before, +.nav-trigger:checked + label:not(.steps) .navicon:after { + top: 0 !important; +} + +.nav-trigger:checked + label .navicon:before, +.nav-trigger:checked + label .navicon:after { + transition: 0.5s; +} + +/* Minus */ +.nav-trigger:checked + label { + -webkit-transform: scale(0.75); + transform: scale(0.75); +} + +/* × and + */ +.nav-trigger:checked + label.plus .navicon, +.nav-trigger:checked + label.x .navicon { + background: transparent; +} + +.nav-trigger:checked + label.plus .navicon:before, +.nav-trigger:checked + label.x .navicon:before { + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); + background: #FFF; +} + +.nav-trigger:checked + label.plus .navicon:after, +.nav-trigger:checked + label.x .navicon:after { + -webkit-transform: rotate(45deg); + transform: rotate(45deg); + background: #FFF; +} + +.nav-trigger:checked + label.plus { + -webkit-transform: scale(0.75) rotate(45deg); + transform: scale(0.75) rotate(45deg); +} + +.nav-trigger:checked ~ nav { + left: 0 !important; +} + +.nav-trigger:checked ~ .overlay { + display: block; +} + +.nav-trigger { + position: fixed; + top: 0; + clip: rect(0, 0, 0, 0); +} + +.overlay { + display: none; + position: fixed; + top: 0; + bottom: 0; + left: 0; + right: 0; + width: 100%; + height: 100%; + background: hsla(0, 0%, 0%, 0.5); + z-index: 1; +} + +@media only screen and (min-width: 320px) and (max-width: 680px) { + body { + overflow-x: hidden; + } + + nav { + background: #FFF; + width: 250px; + height: 100%; + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: -250px; + z-index: 3; + padding: 0 10px; + transition: left 0.2s; + } + + .navicon-button { + display: inline-block; + position: fixed; + top: 1.5em; + right: 0; + z-index: 2; + } + + #main { + width: 100%; + min-width: 360px; + } + + #main h1.page-title { + margin: 1em 0; + } + + #main section { + padding: 0; + } + + footer { + margin-left: 0; + } +} + +/** Add a '#' to static members */ +[data-type="member"] a::before { + content: '#'; + display: inline-block; + margin-left: -14px; + margin-right: 5px; +} diff --git a/doc/styles/prettify.css b/doc/styles/prettify.css new file mode 100644 index 000000000..d9521ec85 --- /dev/null +++ b/doc/styles/prettify.css @@ -0,0 +1,79 @@ +.pln { + color: #ddd; +} + +/* string content */ +.str { + color: #61ce3c; +} + +/* a keyword */ +.kwd { + color: #fbde2d; +} + +/* a comment */ +.com { + color: #aeaeae; +} + +/* a type name */ +.typ { + color: #8da6ce; +} + +/* a literal value */ +.lit { + color: #fbde2d; +} + +/* punctuation */ +.pun { + color: #ddd; +} + +/* lisp open bracket */ +.opn { + color: #000000; +} + +/* lisp close bracket */ +.clo { + color: #000000; +} + +/* a markup tag name */ +.tag { + color: #8da6ce; +} + +/* a markup attribute name */ +.atn { + color: #fbde2d; +} + +/* a markup attribute value */ +.atv { + color: #ddd; +} + +/* a declaration */ +.dec { + color: #EF5050; +} + +/* a variable name */ +.var { + color: #c82829; +} + +/* a function name */ +.fun { + color: #4271ae; +} + +/* Specify class=linenums on a pre to get line numbering */ +ol.linenums { + margin-top: 0; + margin-bottom: 0; +} diff --git a/package.json b/package.json index f7587a695..06de3dcbb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "billboard.js", - "version": "1.0.0-snapshot", + "version": "1.0.0", "description": "Re-usable easy interface JavaScript chart library, based on D3 v4+", "homepage": "http://naver.github.io/billboard.js/", "main": "dist/billboard.js",